Files
paper-mc/paper-server/patches/features/0015-Rewrite-dataconverter-system.patch
Spottedleaf 692e93a91f Fix MC-299110
When converting entity/poi data (SimpleRegionStorage),
we need to insert the new data version so that force upgrading
will write the data back with the correct version.
2025-06-25 12:25:45 -07:00

32679 lines
2.0 MiB

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Sat, 19 Jun 2021 10:43:01 -0700
Subject: [PATCH] Rewrite dataconverter system
Please see https://github.com/PaperMC/DataConverter
for details.
diff --git a/ca/spottedleaf/dataconverter/converters/DataConverter.java b/ca/spottedleaf/dataconverter/converters/DataConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..1863c606be715683d53863a0c9293525d199c9cf
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/converters/DataConverter.java
@@ -0,0 +1,54 @@
+package ca.spottedleaf.dataconverter.converters;
+
+import java.util.Comparator;
+
+public abstract class DataConverter<T, R> {
+
+ public static final Comparator<DataConverter<?, ?>> LOWEST_VERSION_COMPARATOR = (x, y) -> {
+ return Long.compare(x.getEncodedVersion(), y.getEncodedVersion());
+ };
+
+ protected final int toVersion;
+ protected final int versionStep;
+
+ public DataConverter(final int toVersion) {
+ this.toVersion = toVersion;
+ this.versionStep = 0;
+ }
+
+ public DataConverter(final int toVersion, final int versionStep) {
+ this.toVersion = toVersion;
+ this.versionStep = versionStep;
+ }
+
+ public final int getToVersion() {
+ return this.toVersion;
+ }
+
+ public final int getVersionStep() {
+ return this.versionStep;
+ }
+
+ public final long getEncodedVersion() {
+ return encodeVersions(this.toVersion, this.versionStep);
+ }
+
+ public abstract R convert(final T data, final long sourceVersion, final long toVersion);
+
+ // step must be in the lower bits, so that encodeVersions(version, step) < encodeVersions(version, step + 1)
+ public static long encodeVersions(final int version, final int step) {
+ return ((long)version << 32) | (step & 0xFFFFFFFFL);
+ }
+
+ public static int getVersion(final long encoded) {
+ return (int)(encoded >>> 32);
+ }
+
+ public static int getStep(final long encoded) {
+ return (int)encoded;
+ }
+
+ public static String encodedToString(final long encoded) {
+ return getVersion(encoded) + "." + getStep(encoded);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/converters/datatypes/DataHook.java b/ca/spottedleaf/dataconverter/converters/datatypes/DataHook.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b92c5c66ad3a5198873f98287a5ced71c231d09
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/converters/datatypes/DataHook.java
@@ -0,0 +1,9 @@
+package ca.spottedleaf.dataconverter.converters.datatypes;
+
+public interface DataHook<T, R> {
+
+ public R preHook(final T data, final long fromVersion, final long toVersion);
+
+ public R postHook(final T data, final long fromVersion, final long toVersion);
+
+}
diff --git a/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java b/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java
new file mode 100644
index 0000000000000000000000000000000000000000..52f2a3131f314e723a31194c517e7756983482b9
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java
@@ -0,0 +1,15 @@
+package ca.spottedleaf.dataconverter.converters.datatypes;
+
+public abstract class DataType<T, R> {
+
+ public final R convertOrOriginal(final T data, final long fromVersion, final long toVersion) {
+ final R replaced = this.convert(data, fromVersion, toVersion);
+ if (replaced != null) {
+ return replaced;
+ }
+ return (R)data;
+ }
+
+ public abstract R convert(final T data, final long fromVersion, final long toVersion);
+
+}
diff --git a/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java b/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java
new file mode 100644
index 0000000000000000000000000000000000000000..a57dd1e28fd7a1e7d832833f820186dacac407d4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java
@@ -0,0 +1,15 @@
+package ca.spottedleaf.dataconverter.converters.datatypes;
+
+public interface DataWalker<T> {
+
+ public static final DataWalker<?> NO_OP = (final Object data, final long fromVersion, final long toVersion) -> {
+ return null;
+ };
+
+ public static <T> DataWalker<T> noOp() {
+ return (DataWalker<T>)NO_OP;
+ }
+
+ public T walk(final T data, final long fromVersion, final long toVersion);
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java b/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..515f6691c72ffa82ac8b92646768be7a17931efb
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java
@@ -0,0 +1,86 @@
+package ca.spottedleaf.dataconverter.minecraft;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataType;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType;
+import ca.spottedleaf.dataconverter.minecraft.versions.V99;
+import ca.spottedleaf.dataconverter.types.json.JsonMapType;
+import ca.spottedleaf.dataconverter.types.nbt.NBTMapType;
+import com.google.gson.JsonObject;
+import it.unimi.dsi.fastutil.longs.LongArrayList;
+import net.minecraft.nbt.CompoundTag;
+
+public final class MCDataConverter {
+
+ private static final LongArrayList BREAKPOINTS = MCVersionRegistry.getBreakpoints();
+
+ public static <T> T copy(final T type) {
+ if (type instanceof CompoundTag) {
+ return (T)((CompoundTag)type).copy();
+ } else if (type instanceof JsonObject) {
+ return (T)((JsonObject)type).deepCopy();
+ }
+
+ return type;
+ }
+
+ public static CompoundTag convertTag(final MCDataType type, final CompoundTag data, final int fromVersion, final int toVersion) {
+ final NBTMapType wrapped = new NBTMapType(data);
+
+ final NBTMapType replaced = (NBTMapType)convert(type, wrapped, fromVersion, toVersion);
+
+ return replaced == null ? wrapped.getTag() : replaced.getTag();
+ }
+
+ public static JsonObject convertJson(final MCDataType type, final JsonObject data, final boolean compressed, final int fromVersion, final int toVersion) {
+ final JsonMapType wrapped = new JsonMapType(data, compressed);
+
+ final JsonMapType replaced = (JsonMapType)convert(type, wrapped, fromVersion, toVersion);
+
+ return replaced == null ? wrapped.getJson() : replaced.getJson();
+ }
+
+ public static <T, R> R convert(final DataType<T, R> type, final T data, final int fromVersion, final int toVersion) {
+ return convertWithSubVersion(
+ type, data,
+ DataConverter.encodeVersions(Math.max(fromVersion, V99.VERSION), Integer.MAX_VALUE),
+ DataConverter.encodeVersions(toVersion, Integer.MAX_VALUE)
+ );
+ }
+
+ public static <T, R> R convertWithSubVersion(final DataType<T, R> type, final T data, final long fromVersion, final long toVersion) {
+ Object ret = data;
+
+ long currentVersion = fromVersion;
+
+ for (int i = 0, len = BREAKPOINTS.size(); i < len; ++i) {
+ final long breakpoint = BREAKPOINTS.getLong(i);
+
+ if (currentVersion >= breakpoint) {
+ continue;
+ }
+
+ final Object converted = type.convert((T)ret, currentVersion, Math.min(toVersion, breakpoint - 1L));
+ if (converted != null) {
+ ret = converted;
+ }
+
+ currentVersion = Math.min(toVersion, breakpoint - 1L);
+
+ if (currentVersion == toVersion) {
+ break;
+ }
+ }
+
+ if (currentVersion != toVersion) {
+ final Object converted = type.convert((T)ret, currentVersion, toVersion);
+ if (converted != null) {
+ ret = converted;
+ }
+ }
+
+ return (R)ret;
+ }
+
+ private MCDataConverter() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java b/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ed6c1512139c33dd695e4b3523b0382e4cde0ff
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java
@@ -0,0 +1,487 @@
+package ca.spottedleaf.dataconverter.minecraft;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.versions.V4290;
+import com.mojang.logging.LogUtils;
+import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet;
+import it.unimi.dsi.fastutil.ints.IntRBTreeSet;
+import it.unimi.dsi.fastutil.longs.LongArrayList;
+import it.unimi.dsi.fastutil.longs.LongComparator;
+import it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet;
+import org.slf4j.Logger;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Locale;
+
+public final class MCVersionRegistry {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static final Int2ObjectLinkedOpenHashMap<String> VERSION_NAMES = new Int2ObjectLinkedOpenHashMap<>();
+ private static final IntArrayList VERSION_LIST;
+ private static final LongArrayList DATA_VERSION_LIST;
+
+ private static final IntArrayList DATACONVERTER_VERSIONS_LIST;
+ private static final IntLinkedOpenHashSet DATACONVERTER_VERSIONS_MAJOR = new IntLinkedOpenHashSet();
+ private static final LongLinkedOpenHashSet DATACONVERTER_VERSIONS = new LongLinkedOpenHashSet();
+ private static final Int2ObjectLinkedOpenHashMap<IntArrayList> SUBVERSIONS = new Int2ObjectLinkedOpenHashMap<>();
+ private static final LongArrayList BREAKPOINTS = new LongArrayList();
+ static {
+ // Note: Some of these are nameless.
+ // Unless a data version is specified here, it will NOT have converters ran for it. Please add them on update!
+ final int[] converterVersions = new int[] {
+ 99,
+ 100,
+ 101,
+ 102,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 113,
+ 135,
+ 143,
+ 147,
+ 165,
+ 501,
+ 502,
+ 505,
+ 700,
+ 701,
+ 702,
+ 703,
+ 704,
+ 705,
+ 804,
+ 806,
+ 808,
+ 808,
+ 813,
+ 816,
+ 820,
+ 1022,
+ 1125,
+ 1344,
+ 1446,
+ 1450,
+ 1451,
+ 1451,
+ 1451,
+ 1451,
+ 1451,
+ 1451,
+ 1451,
+ 1451,
+ 1451,
+ 1456,
+ 1458,
+ 1460,
+ 1466,
+ 1470,
+ 1474,
+ 1475,
+ 1480,
+ 1481,
+ 1483,
+ 1484,
+ 1486,
+ 1487,
+ 1488,
+ 1490,
+ 1492,
+ 1494,
+ 1496,
+ 1500,
+ 1501,
+ 1502,
+ 1506,
+ 1510,
+ 1514,
+ 1515,
+ 1624,
+ 1800,
+ 1801,
+ 1802,
+ 1803,
+ 1904,
+ 1905,
+ 1906,
+ 1909,
+ 1911,
+ 1914,
+ 1917,
+ 1918,
+ 1920,
+ 1925,
+ 1928,
+ 1929,
+ 1931,
+ 1936,
+ 1946,
+ 1948,
+ 1953,
+ 1955,
+ 1961,
+ 1963,
+ 2100,
+ 2202,
+ 2209,
+ 2211,
+ 2218,
+ 2501,
+ 2502,
+ 2503,
+ 2505,
+ 2508,
+ 2509,
+ 2511,
+ 2514,
+ 2516,
+ 2518,
+ 2519,
+ 2522,
+ 2523,
+ 2527,
+ 2528,
+ 2529,
+ 2531,
+ 2533,
+ 2535,
+ 2537,
+ 2538,
+ 2550,
+ 2551,
+ 2552,
+ 2553,
+ 2558,
+ 2568,
+ 2671,
+ 2679,
+ 2680,
+ 2684,
+ 2686,
+ 2688,
+ 2690,
+ 2691,
+ 2693,
+ 2696,
+ 2700,
+ 2701,
+ 2702,
+ 2704,
+ 2707,
+ 2710,
+ 2717,
+ 2825,
+ 2831,
+ 2832,
+ 2833,
+ 2838,
+ 2841,
+ 2842,
+ 2843,
+ 2846,
+ 2852,
+ 2967,
+ 2970,
+ 3077,
+ 3078,
+ 3081,
+ 3082,
+ 3083,
+ 3084,
+ 3086,
+ 3087,
+ 3088,
+ 3090,
+ 3093,
+ 3094,
+ 3097,
+ 3108,
+ 3201,
+ 3203,
+ 3204,
+ 3209,
+ 3214,
+ 3319,
+ 3322,
+ 3438,
+ 3439,
+ 3440,
+ 3441,
+ 3447,
+ 3448,
+ 3450,
+ 3451,
+ 3459,
+ 3564,
+ 3565,
+ 3566,
+ 3568,
+ 3683,
+ 3685,
+ 3692,
+ 3800,
+ 3803,
+ 3807,
+ 3808,
+ 3809,
+ 3812,
+ 3813,
+ 3814,
+ 3818,
+ 3820,
+ 3825,
+ 3828,
+ 3833,
+ 3939,
+ 3943,
+ 3945,
+ 4054,
+ 4055,
+ 4057,
+ 4059,
+ 4061,
+ 4064,
+ 4067,
+ 4068,
+ 4081,
+ 4173,
+ 4175,
+ 4176,
+ 4180,
+ 4181,
+ 4185,
+ 4187,
+ 4290,
+ 4291,
+ 4292,
+ 4293,
+ 4294,
+ 4295,
+ 4296,
+ 4297,
+ 4299,
+ 4300,
+ 4301,
+ 4302,
+ 4303,
+ 4305,
+ 4306,
+ 4307,
+ 4309,
+ 4311,
+ 4312,
+ 4314,
+ 4420,
+ 4424,
+ // All up to 1.21.6
+ };
+ Arrays.sort(converterVersions);
+
+ DATACONVERTER_VERSIONS_MAJOR.addAll(DATACONVERTER_VERSIONS_LIST = new IntArrayList(converterVersions));
+
+ // add sub versions
+ registerSubVersion(MCVersions.V16W38A + 1, 1);
+
+ registerSubVersion(MCVersions.V17W47A, 1);
+ registerSubVersion(MCVersions.V17W47A, 2);
+ registerSubVersion(MCVersions.V17W47A, 3);
+ registerSubVersion(MCVersions.V17W47A, 4);
+ registerSubVersion(MCVersions.V17W47A, 5);
+ registerSubVersion(MCVersions.V17W47A, 6);
+ registerSubVersion(MCVersions.V17W47A, 7);
+
+ registerSubVersion(MCVersions.V24W04A + 1, 1);
+ registerSubVersion(MCVersions.V24W04A + 2, 1);
+ registerSubVersion(MCVersions.V24W04A + 2, 2);
+
+ registerSubVersion(MCVersions.V24W07A + 1, 1);
+ registerSubVersion(MCVersions.V24W07A + 1, 2);
+ registerSubVersion(MCVersions.V24W07A + 1, 4);
+ registerSubVersion(MCVersions.V24W07A + 1, 5);
+ registerSubVersion(MCVersions.V24W07A + 1, 6);
+
+ registerSubVersion(V4290.VERSION, 1);
+
+ // register breakpoints here
+ // for all major releases after 1.16, add them. this reduces the work required to determine if a breakpoint
+ // is needed for new converters
+
+ // Too much changed in this version.
+ registerBreakpoint(MCVersions.V17W47A);
+ registerBreakpointAfter(MCVersions.V17W47A, Integer.MAX_VALUE);
+
+ // final release of major version
+ registerBreakpointAfter(MCVersions.V1_17_1, Integer.MAX_VALUE);
+
+ // final release of major version
+ registerBreakpointAfter(MCVersions.V1_18_2, Integer.MAX_VALUE);
+
+ // final release of major version
+ registerBreakpointAfter(MCVersions.V1_19_4, Integer.MAX_VALUE);
+
+ // Too much changed in this version.
+ registerBreakpoint(MCVersions.V24W07A + 1, 5);
+ registerBreakpointAfter(MCVersions.V24W07A + 1, Integer.MAX_VALUE);
+
+ // final release of major version
+ registerBreakpointAfter(MCVersions.V1_20_6, Integer.MAX_VALUE);
+
+ // There is a read of entity sub data in V4299 (salmon) which was written to after V1_20_6
+ // There is also a sub type read in V4290 as it reads and converts all data within a text component
+ registerBreakpointAfter(V4290.VERSION);
+ }
+
+ static {
+ final Field[] fields = MCVersions.class.getDeclaredFields();
+ for (final Field field : fields) {
+ final String name = field.getName();
+ final int value;
+ try {
+ value = field.getInt(null);
+ } catch (final Exception ex) {
+ throw new RuntimeException(ex);
+ }
+
+ // Mojang registered 15w33a and 15w33b under the same id.
+ // Mojang registered 1.21.5-pre2 and 1.21.5-pre3 under the same id.
+ if (VERSION_NAMES.containsKey(value) && value != MCVersions.V15W33B && value != MCVersions.V1_21_5_PRE3) {
+ LOGGER.warn("Error registering version \"" + name + "\", version number '" + value + "' is already associated with \"" + VERSION_NAMES.get(value) + "\"");
+ }
+
+ VERSION_NAMES.put(value, name.substring(1).replace("_PRE", "-PRE").replace("_RC", "-RC").replace('_', '.').toLowerCase(Locale.ROOT));
+ }
+
+ for (final int version : DATACONVERTER_VERSIONS_MAJOR) {
+ if (VERSION_NAMES.containsKey(version)) {
+ continue;
+ }
+
+ // find closest greatest version above this one
+ int closest = Integer.MAX_VALUE;
+ String closestName = null;
+ for (final int v : VERSION_NAMES.keySet()) {
+ if (v > version && v < closest) {
+ closest = v;
+ closestName = VERSION_NAMES.get(v);
+ }
+ }
+
+ if (closestName == null) {
+ VERSION_NAMES.put(version, "unregistered_v" + version);
+ } else {
+ VERSION_NAMES.put(version, closestName + "-dev" + (closest - version));
+ }
+ }
+
+ // Explicit override for V99, as 99 is very special.
+ VERSION_NAMES.put(99, "pre_converter");
+
+ VERSION_LIST = new IntArrayList(new IntRBTreeSet(VERSION_NAMES.keySet()));
+
+ DATA_VERSION_LIST = new LongArrayList();
+ for (final int version : VERSION_LIST) {
+ DATA_VERSION_LIST.add(DataConverter.encodeVersions(version, 0));
+
+ final IntArrayList subVersions = SUBVERSIONS.get(version);
+ if (subVersions == null) {
+ continue;
+ }
+
+ for (final int step : subVersions) {
+ DATA_VERSION_LIST.add(DataConverter.encodeVersions(version, step));
+ }
+ }
+
+ DATA_VERSION_LIST.sort((LongComparator)null);
+
+ for (final int version : DATACONVERTER_VERSIONS_MAJOR) {
+ DATACONVERTER_VERSIONS.add(DataConverter.encodeVersions(version, 0));
+
+ final IntArrayList subVersions = SUBVERSIONS.get(version);
+ if (subVersions == null) {
+ continue;
+ }
+
+ for (final int step : subVersions) {
+ DATACONVERTER_VERSIONS.add(DataConverter.encodeVersions(version, step));
+ }
+ }
+ }
+
+ private static void registerSubVersion(final int version, final int step) {
+ if (DATA_VERSION_LIST != null) {
+ throw new IllegalStateException("Added too late!");
+ }
+ SUBVERSIONS.computeIfAbsent(version, (final int keyInMap) -> {
+ return new IntArrayList();
+ }).add(step);
+ }
+
+ private static void registerBreakpointBefore(final int version) {
+ registerBreakpointBefore(version, 0);
+ }
+
+ private static void registerBreakpointBefore(final int version, final int step) {
+ BREAKPOINTS.add(DataConverter.encodeVersions(version, step) - 1L);
+ }
+
+ private static void registerBreakpoint(final int version) {
+ registerBreakpoint(version, 0);
+ }
+
+ private static void registerBreakpoint(final int version, final int step) {
+ BREAKPOINTS.add(DataConverter.encodeVersions(version, step));
+ }
+
+ private static void registerBreakpointAfter(final int version) {
+ registerBreakpointAfter(version, 0);
+ }
+
+ private static void registerBreakpointAfter(final int version, final int step) {
+ BREAKPOINTS.add(DataConverter.encodeVersions(version, step) + 1L);
+ }
+
+ // returns only versions that have dataconverters
+ public static boolean hasDataConverters(final int version) {
+ return DATACONVERTER_VERSIONS_MAJOR.contains(version);
+ }
+
+ public String getVersionName(final int version) {
+ return VERSION_NAMES.get(version);
+ }
+
+ public boolean isRegisteredVersion(final int version) {
+ return VERSION_NAMES.containsKey(version);
+ }
+
+ public static IntArrayList getVersionList() {
+ return VERSION_LIST;
+ }
+
+ public static LongArrayList getDataVersionList() {
+ return DATA_VERSION_LIST;
+ }
+
+ public static int getMaxVersion() {
+ return VERSION_LIST.getInt(VERSION_LIST.size() - 1);
+ }
+
+ public static LongArrayList getBreakpoints() {
+ return BREAKPOINTS;
+ }
+
+ public static void checkVersion(final long version) {
+ if (!DATACONVERTER_VERSIONS.contains(version)) {
+ throw new IllegalStateException("Version " + DataConverter.encodedToString(version) + " is not registered to have dataconverters, yet has a dataconverter");
+ }
+ }
+
+ private MCVersionRegistry() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/MCVersions.java b/ca/spottedleaf/dataconverter/minecraft/MCVersions.java
new file mode 100644
index 0000000000000000000000000000000000000000..03cf3ecebdb6629f11465d842bdd6263f19863c6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/MCVersions.java
@@ -0,0 +1,597 @@
+package ca.spottedleaf.dataconverter.minecraft;
+
+@SuppressWarnings("unused")
+public final class MCVersions {
+
+ /* https://minecraft.wiki/w/Data_version */
+
+ public static final int V15W32A = 100;
+ public static final int V15W32B = 103;
+ public static final int V15W32C = 104;
+ public static final int V15W33A = 111;
+ public static final int V15W33B = 111;
+ public static final int V15W33C = 112;
+ public static final int V15W34A = 114;
+ public static final int V15W34B = 115;
+ public static final int V15W34C = 116;
+ public static final int V15W34D = 117;
+ public static final int V15W35A = 118;
+ public static final int V15W35B = 119;
+ public static final int V15W35C = 120;
+ public static final int V15W35D = 121;
+ public static final int V15W35E = 122;
+ public static final int V15W36A = 123;
+ public static final int V15W36B = 124;
+ public static final int V15W36C = 125;
+ public static final int V15W36D = 126;
+ public static final int V15W37A = 127;
+ public static final int V15W38A = 128;
+ public static final int V15W38B = 129;
+ public static final int V15W39A = 130;
+ public static final int V15W39B = 131;
+ public static final int V15W39C = 132;
+ public static final int V15W40A = 133;
+ public static final int V15W40B = 134;
+ public static final int V15W41A = 136;
+ public static final int V15W41B = 137;
+ public static final int V15W42A = 138;
+ public static final int V15W43A = 139;
+ public static final int V15W43B = 140;
+ public static final int V15W43C = 141;
+ public static final int V15W44A = 142;
+ public static final int V15W44B = 143;
+ public static final int V15W45A = 145;
+ public static final int V15W46A = 146;
+ public static final int V15W47A = 148;
+ public static final int V15W47B = 149;
+ public static final int V15W47C = 150;
+ public static final int V15W49A = 151;
+ public static final int V15W49B = 152;
+ public static final int V15W50A = 153;
+ public static final int V15W51A = 154;
+ public static final int V15W51B = 155;
+ public static final int V16W02A = 156;
+ public static final int V16W03A = 157;
+ public static final int V16W04A = 158;
+ public static final int V16W05A = 159;
+ public static final int V16W05B = 160;
+ public static final int V16W06A = 161;
+ public static final int V16W07A = 162;
+ public static final int V16W07B = 163;
+ public static final int V1_9_PRE1 = 164;
+ public static final int V1_9_PRE2 = 165;
+ public static final int V1_9_PRE3 = 167;
+ public static final int V1_9_PRE4 = 168;
+ public static final int V1_9 = 169;
+ public static final int V1_9_1_PRE1 = 170;
+ public static final int V1_9_1_PRE2 = 171;
+ public static final int V1_9_1_PRE3 = 172;
+ public static final int V1_9_1 = 175;
+ public static final int V1_9_2 = 176;
+ public static final int V16W14A = 177;
+ public static final int V16W15A = 178;
+ public static final int V16W15B = 179;
+ public static final int V1_9_3_PRE1 = 180;
+ public static final int V1_9_3_PRE2 = 181;
+ public static final int V1_9_3_PRE3 = 182;
+ public static final int V1_9_3 = 183;
+ public static final int V1_9_4 = 184;
+ public static final int V16W20A = 501;
+ public static final int V16W21A = 503;
+ public static final int V16W21B = 504;
+ public static final int V1_10_PRE1 = 506;
+ public static final int V1_10_PRE2 = 507;
+ public static final int V1_10 = 510;
+ public static final int V1_10_1 = 511;
+ public static final int V1_10_2 = 512;
+ public static final int V16W32A = 800;
+ public static final int V16W32B = 801;
+ public static final int V16W33A = 802;
+ public static final int V16W35A = 803;
+ public static final int V16W36A = 805;
+ public static final int V16W38A = 807;
+ public static final int V16W39A = 809;
+ public static final int V16W39B = 811;
+ public static final int V16W39C = 812;
+ public static final int V16W40A = 813;
+ public static final int V16W41A = 814;
+ public static final int V16W42A = 815;
+ public static final int V16W43A = 816;
+ public static final int V16W44A = 817;
+ public static final int V1_11_PRE1 = 818;
+ public static final int V1_11 = 819;
+ public static final int V16W50A = 920;
+ public static final int V1_11_1 = 921;
+ public static final int V1_11_2 = 922;
+ public static final int V17W06A = 1022;
+ public static final int V17W13A = 1122;
+ public static final int V17W13B = 1123;
+ public static final int V17W14A = 1124;
+ public static final int V17W15A = 1125;
+ public static final int V17W16A = 1126;
+ public static final int V17W16B = 1127;
+ public static final int V17W17A = 1128;
+ public static final int V17W17B = 1129;
+ public static final int V17W18A = 1130;
+ public static final int V17W18B = 1131;
+ public static final int V1_12_PRE1 = 1132;
+ public static final int V1_12_PRE2 = 1133;
+ public static final int V1_12_PRE3 = 1134;
+ public static final int V1_12_PRE4 = 1135;
+ public static final int V1_12_PRE5 = 1136;
+ public static final int V1_12_PRE6 = 1137;
+ public static final int V1_12_PRE7 = 1138;
+ public static final int V1_12 = 1139;
+ public static final int V17W31A = 1239;
+ public static final int V1_12_1_PRE1 = 1240;
+ public static final int V1_12_1 = 1241;
+ public static final int V1_12_2_PRE1 = 1341;
+ public static final int V1_12_2_PRE2 = 1342;
+ public static final int V1_12_2 = 1343;
+ public static final int V17W43A = 1444;
+ public static final int V17W43B = 1445;
+ public static final int V17W45A = 1447;
+ public static final int V17W45B = 1448;
+ public static final int V17W46A = 1449;
+ public static final int V17W47A = 1451;
+ public static final int V17W47B = 1452;
+ public static final int V17W48A = 1453;
+ public static final int V17W49A = 1454;
+ public static final int V17W49B = 1455;
+ public static final int V17W50A = 1457;
+ public static final int V18W01A = 1459;
+ public static final int V18W02A = 1461;
+ public static final int V18W03A = 1462;
+ public static final int V18W03B = 1463;
+ public static final int V18W05A = 1464;
+ public static final int V18W06A = 1466;
+ public static final int V18W07A = 1467;
+ public static final int V18W07B = 1468;
+ public static final int V18W07C = 1469;
+ public static final int V18W08A = 1470;
+ public static final int V18W08B = 1471;
+ public static final int V18W09A = 1472;
+ public static final int V18W10A = 1473;
+ public static final int V18W10B = 1474;
+ public static final int V18W10C = 1476;
+ public static final int V18W10D = 1477;
+ public static final int V18W11A = 1478;
+ public static final int V18W14A = 1479;
+ public static final int V18W14B = 1481;
+ public static final int V18W15A = 1482;
+ public static final int V18W16A = 1483;
+ public static final int V18W19A = 1484;
+ public static final int V18W19B = 1485;
+ public static final int V18W20A = 1489;
+ public static final int V18W20B = 1491;
+ public static final int V18W20C = 1493;
+ public static final int V18W21A = 1495;
+ public static final int V18W21B = 1496;
+ public static final int V18W22A = 1497;
+ public static final int V18W22B = 1498;
+ public static final int V18W22C = 1499;
+ public static final int V1_13_PRE1 = 1501;
+ public static final int V1_13_PRE2 = 1502;
+ public static final int V1_13_PRE3 = 1503;
+ public static final int V1_13_PRE4 = 1504;
+ public static final int V1_13_PRE5 = 1511;
+ public static final int V1_13_PRE6 = 1512;
+ public static final int V1_13_PRE7 = 1513;
+ public static final int V1_13_PRE8 = 1516;
+ public static final int V1_13_PRE9 = 1517;
+ public static final int V1_13_PRE10 = 1518;
+ public static final int V1_13 = 1519;
+ public static final int V18W30A = 1620;
+ public static final int V18W30B = 1621;
+ public static final int V18W31A = 1622;
+ public static final int V18W32A = 1623;
+ public static final int V18W33A = 1625;
+ public static final int V1_13_1_PRE1 = 1626;
+ public static final int V1_13_1_PRE2 = 1627;
+ public static final int V1_13_1 = 1628;
+ public static final int V1_13_2_PRE1 = 1629;
+ public static final int V1_13_2_PRE2 = 1630;
+ public static final int V1_13_2 = 1631;
+ public static final int V18W43A = 1901;
+ public static final int V18W43B = 1902;
+ public static final int V18W43C = 1903;
+ public static final int V18W44A = 1907;
+ public static final int V18W45A = 1908;
+ public static final int V18W46A = 1910;
+ public static final int V18W47A = 1912;
+ public static final int V18W47B = 1913;
+ public static final int V18W48A = 1914;
+ public static final int V18W48B = 1915;
+ public static final int V18W49A = 1916;
+ public static final int V18W50A = 1919;
+ public static final int V19W02A = 1921;
+ public static final int V19W03A = 1922;
+ public static final int V19W03B = 1923;
+ public static final int V19W03C = 1924;
+ public static final int V19W04A = 1926;
+ public static final int V19W04B = 1927;
+ public static final int V19W05A = 1930;
+ public static final int V19W06A = 1931;
+ public static final int V19W07A = 1932;
+ public static final int V19W08A = 1933;
+ public static final int V19W08B = 1934;
+ public static final int V19W09A = 1935;
+ public static final int V19W11A = 1937;
+ public static final int V19W11B = 1938;
+ public static final int V19W12A = 1940;
+ public static final int V19W12B = 1941;
+ public static final int V19W13A = 1942;
+ public static final int V19W13B = 1943;
+ public static final int V19W14A = 1944;
+ public static final int V19W14B = 1945;
+ public static final int V1_14_PRE1 = 1947;
+ public static final int V1_14_PRE2 = 1948;
+ public static final int V1_14_PRE3 = 1949;
+ public static final int V1_14_PRE4 = 1950;
+ public static final int V1_14_PRE5 = 1951;
+ public static final int V1_14 = 1952;
+ public static final int V1_14_1_PRE1 = 1955;
+ public static final int V1_14_1_PRE2 = 1956;
+ public static final int V1_14_1 = 1957;
+ public static final int V1_14_2_PRE1 = 1958;
+ public static final int V1_14_2_PRE2 = 1959;
+ public static final int V1_14_2_PRE3 = 1960;
+ public static final int V1_14_2_PRE4 = 1962;
+ public static final int V1_14_2 = 1963;
+ public static final int V1_14_3_PRE1 = 1964;
+ public static final int V1_14_3_PRE2 = 1965;
+ public static final int V1_14_3_PRE3 = 1966;
+ public static final int V1_14_3_PRE4 = 1967;
+ public static final int V1_14_3 = 1968;
+ public static final int V1_14_4_PRE1 = 1969;
+ public static final int V1_14_4_PRE2 = 1970;
+ public static final int V1_14_4_PRE3 = 1971;
+ public static final int V1_14_4_PRE4 = 1972;
+ public static final int V1_14_4_PRE5 = 1973;
+ public static final int V1_14_4_PRE6 = 1974;
+ public static final int V1_14_4_PRE7 = 1975;
+ public static final int V1_14_4 = 1976;
+ public static final int V19W34A = 2200;
+ public static final int V19W35A = 2201;
+ public static final int V19W36A = 2203;
+ public static final int V19W37A = 2204;
+ public static final int V19W38A = 2205;
+ public static final int V19W38B = 2206;
+ public static final int V19W39A = 2207;
+ public static final int V19W40A = 2208;
+ public static final int V19W41A = 2210;
+ public static final int V19W42A = 2212;
+ public static final int V19W44A = 2213;
+ public static final int V19W45A = 2214;
+ public static final int V19W45B = 2215;
+ public static final int V19W46A = 2216;
+ public static final int V19W46B = 2217;
+ public static final int V1_15_PRE1 = 2218;
+ public static final int V1_15_PRE2 = 2219;
+ public static final int V1_15_PRE3 = 2220;
+ public static final int V1_15_PRE4 = 2221;
+ public static final int V1_15_PRE5 = 2222;
+ public static final int V1_15_PRE6 = 2223;
+ public static final int V1_15_PRE7 = 2224;
+ public static final int V1_15 = 2225;
+ public static final int V1_15_1_PRE1 = 2226;
+ public static final int V1_15_1 = 2227;
+ public static final int V1_15_2_PRE1 = 2228;
+ public static final int V1_15_2_PRE2 = 2229;
+ public static final int V1_15_2 = 2230;
+ public static final int V20W06A = 2504;
+ public static final int V20W07A = 2506;
+ public static final int V20W08A = 2507;
+ public static final int V20W09A = 2510;
+ public static final int V20W10A = 2512;
+ public static final int V20W11A = 2513;
+ public static final int V20W12A = 2515;
+ public static final int V20W13A = 2520;
+ public static final int V20W13B = 2521;
+ public static final int V20W14A = 2524;
+ public static final int V20W15A = 2525;
+ public static final int V20W16A = 2526;
+ public static final int V20W17A = 2529;
+ public static final int V20W18A = 2532;
+ public static final int V20W19A = 2534;
+ public static final int V20W20A = 2536;
+ public static final int V20W20B = 2537;
+ public static final int V20W21A = 2554;
+ public static final int V20W22A = 2555;
+ public static final int V1_16_PRE1 = 2556;
+ public static final int V1_16_PRE2 = 2557;
+ public static final int V1_16_PRE3 = 2559;
+ public static final int V1_16_PRE4 = 2560;
+ public static final int V1_16_PRE5 = 2561;
+ public static final int V1_16_PRE6 = 2562;
+ public static final int V1_16_PRE7 = 2563;
+ public static final int V1_16_PRE8 = 2564;
+ public static final int V1_16_RC1 = 2565;
+ public static final int V1_16 = 2566;
+ public static final int V1_16_1 = 2567;
+ public static final int V20W27A = 2569;
+ public static final int V20W28A = 2570;
+ public static final int V20W29A = 2571;
+ public static final int V20W30A = 2572;
+ public static final int V1_16_2_PRE1 = 2573;
+ public static final int V1_16_2_PRE2 = 2574;
+ public static final int V1_16_2_PRE3 = 2575;
+ public static final int V1_16_2_RC1 = 2576;
+ public static final int V1_16_2_RC2 = 2577;
+ public static final int V1_16_2 = 2578;
+ public static final int V1_16_3_RC1 = 2579;
+ public static final int V1_16_3 = 2580;
+ public static final int V1_16_4_PRE1 = 2581;
+ public static final int V1_16_4_PRE2 = 2582;
+ public static final int V1_16_4_RC1 = 2583;
+ public static final int V1_16_4 = 2584;
+ public static final int V1_16_5_RC1 = 2585;
+ public static final int V1_16_5 = 2586;
+ public static final int V20W45A = 2681;
+ public static final int V20W46A = 2682;
+ public static final int V20W48A = 2683;
+ public static final int V20W49A = 2685;
+ public static final int V20W51A = 2687;
+ public static final int V21W03A = 2689;
+ public static final int V21W05A = 2690;
+ public static final int V21W05B = 2692;
+ public static final int V21W06A = 2694;
+ public static final int V21W07A = 2695;
+ public static final int V21W08A = 2697;
+ public static final int V21W08B = 2698;
+ public static final int V21W10A = 2699;
+ public static final int V21W11A = 2703;
+ public static final int V21W13A = 2705;
+ public static final int V21W14A = 2706;
+ public static final int V21W15A = 2709;
+ public static final int V21W16A = 2711;
+ public static final int V21W17A = 2712;
+ public static final int V21W18A = 2713;
+ public static final int V21W19A = 2714;
+ public static final int V21W20A = 2715;
+ public static final int V1_17_PRE1 = 2716;
+ public static final int V1_17_PRE2 = 2718;
+ public static final int V1_17_PRE3 = 2719;
+ public static final int V1_17_PRE4 = 2720;
+ public static final int V1_17_PRE5 = 2721;
+ public static final int V1_17_RC1 = 2722;
+ public static final int V1_17_RC2 = 2723;
+ public static final int V1_17 = 2724;
+ public static final int V1_17_1_PRE1 = 2725;
+ public static final int V1_17_1_PRE2 = 2726;
+ public static final int V1_17_1_PRE3 = 2727;
+ public static final int V1_17_1_RC1 = 2728;
+ public static final int V1_17_1_RC2 = 2729;
+ public static final int V1_17_1 = 2730;
+ public static final int V21W37A = 2834;
+ public static final int V21W38A = 2835;
+ public static final int V21W39A = 2836;
+ public static final int V21W40A = 2838;
+ public static final int V21W41A = 2839;
+ public static final int V21W42A = 2840;
+ public static final int V21W43A = 2844;
+ public static final int V21W44A = 2845;
+ public static final int V1_18_PRE1 = 2847;
+ public static final int V1_18_PRE2 = 2848;
+ public static final int V1_18_PRE3 = 2849;
+ public static final int V1_18_PRE4 = 2850;
+ public static final int V1_18_PRE5 = 2851;
+ public static final int V1_18_PRE6 = 2853;
+ public static final int V1_18_PRE7 = 2854;
+ public static final int V1_18_PRE8 = 2855;
+ public static final int V1_18_RC1 = 2856;
+ public static final int V1_18_RC2 = 2857;
+ public static final int V1_18_RC3 = 2858;
+ public static final int V1_18_RC4 = 2859;
+ public static final int V1_18 = 2860;
+ public static final int V1_18_1_PRE1 = 2861;
+ public static final int V1_18_1_RC1 = 2862;
+ public static final int V1_18_1_RC2 = 2863;
+ public static final int V1_18_1_RC3 = 2864;
+ public static final int V1_18_1 = 2865;
+ public static final int V22W03A = 2966;
+ public static final int V22W05A = 2967;
+ public static final int V22W06A = 2968;
+ public static final int V22W07A = 2969;
+ public static final int V1_18_2_PRE1 = 2971;
+ public static final int V1_18_2_PRE2 = 2972;
+ public static final int V1_18_2_PRE3 = 2973;
+ public static final int V1_18_2_RC1 = 2974;
+ public static final int V1_18_2 = 2975;
+ public static final int V22W11A = 3080;
+ public static final int V22W12A = 3082;
+ public static final int V22W13A = 3085;
+ public static final int V22W14A = 3088;
+ public static final int V22W15A = 3089;
+ public static final int V22W16A = 3091;
+ public static final int V22W16B = 3092;
+ public static final int V22W17A = 3093;
+ public static final int V22W18A = 3095;
+ public static final int V22W19A = 3096;
+ public static final int V1_19_PRE1 = 3098;
+ public static final int V1_19_PRE2 = 3099;
+ public static final int V1_19_PRE3 = 3100;
+ public static final int V1_19_PRE4 = 3101;
+ public static final int V1_19_PRE5 = 3102;
+ public static final int V1_19_RC1 = 3103;
+ public static final int V1_19_RC2 = 3104;
+ public static final int V1_19 = 3105;
+ public static final int V22W24A = 3106;
+ public static final int V1_19_1_PRE1 = 3107;
+ public static final int V1_19_1_RC1 = 3109;
+ public static final int V1_19_1_PRE2 = 3110;
+ public static final int V1_19_1_PRE3 = 3111;
+ public static final int V1_19_1_PRE4 = 3112;
+ public static final int V1_19_1_PRE5 = 3113;
+ public static final int V1_19_1_PRE6 = 3114;
+ public static final int V1_19_1_RC2 = 3115;
+ public static final int V1_19_1_RC3 = 3116;
+ public static final int V1_19_1 = 3117;
+ public static final int V1_19_2_RC1 = 3118;
+ public static final int V1_19_2_RC2 = 3119;
+ public static final int V1_19_2 = 3120;
+ public static final int V22W42A = 3205;
+ public static final int V22W43A = 3206;
+ public static final int V22W44A = 3207;
+ public static final int V22W45A = 3208;
+ public static final int V22W46A = 3210;
+ public static final int V1_19_3_PRE1 = 3211;
+ public static final int V1_19_3_PRE2 = 3212;
+ public static final int V1_19_3_PRE3 = 3213;
+ public static final int V1_19_3_RC1 = 3215;
+ public static final int V1_19_3 = 3218;
+ public static final int V23W03A = 3320;
+ public static final int V23W04A = 3321;
+ public static final int V23W05A = 3323;
+ public static final int V23W06A = 3326;
+ public static final int V23W07A = 3329;
+ public static final int V1_19_4_PRE1 = 3330;
+ public static final int V1_19_4_PRE2 = 3331;
+ public static final int V1_19_4_PRE3 = 3332;
+ public static final int V1_19_4_PRE4 = 3333;
+ public static final int V1_19_4_RC1 = 3334;
+ public static final int V1_19_4_RC2 = 3335;
+ public static final int V1_19_4_RC3 = 3336;
+ public static final int V1_19_4 = 3337;
+ public static final int V23W12A = 3442;
+ public static final int V23W13A = 3443;
+ public static final int V23W14A = 3445;
+ public static final int V23W16A = 3449;
+ public static final int V23W17A = 3452;
+ public static final int V23W19A = 3453;
+ public static final int V1_20_PRE1 = 3454;
+ public static final int V1_20_PRE2 = 3455;
+ public static final int V1_20_PRE3 = 3456;
+ public static final int V1_20_PRE4 = 3457;
+ public static final int V1_20_PRE5 = 3458;
+ public static final int V1_20_PRE6 = 3460;
+ public static final int V1_20_PRE7 = 3461;
+ public static final int V1_20_RC1 = 3462;
+ public static final int V1_20 = 3463;
+ public static final int V1_20_1_RC1 = 3464;
+ public static final int V1_20_1 = 3465;
+ public static final int V23W31A = 3567;
+ public static final int V23W32A = 3569;
+ public static final int V23W33A = 3570;
+ public static final int V23W35A = 3571;
+ public static final int V1_20_2_PRE1 = 3572;
+ public static final int V1_20_2_PRE2 = 3573;
+ public static final int V1_20_2_PRE3 = 3574;
+ public static final int V1_20_2_PRE4 = 3575;
+ public static final int V1_20_2_RC1 = 3576;
+ public static final int V1_20_2_RC2 = 3577;
+ public static final int V1_20_2 = 3578;
+ public static final int V23W40A = 3679;
+ public static final int V23W41A = 3681;
+ public static final int V23W42A = 3684;
+ public static final int V23W43A = 3686;
+ public static final int V23W43B = 3687;
+ public static final int V23W44A = 3688;
+ public static final int V23W45A = 3690;
+ public static final int V23W46A = 3691;
+ public static final int V1_20_3_PRE1 = 3693;
+ public static final int V1_20_3_PRE2 = 3694;
+ public static final int V1_20_3_PRE3 = 3695;
+ public static final int V1_20_3_PRE4 = 3696;
+ public static final int V1_20_3_RC1 = 3697;
+ public static final int V1_20_3 = 3698;
+ public static final int V1_20_4_RC1 = 3699;
+ public static final int V1_20_4 = 3700;
+ public static final int V23W51A = 3801;
+ public static final int V23W51B = 3802;
+ public static final int V24W03A = 3804;
+ public static final int V24W03B = 3805;
+ public static final int V24W04A = 3806;
+ public static final int V24W05A = 3809;
+ public static final int V24W05B = 3811;
+ public static final int V24W06A = 3815;
+ public static final int V24W07A = 3817;
+ public static final int V24W09A = 3819;
+ public static final int V24W10A = 3821;
+ public static final int V24W11A = 3823;
+ public static final int V24W12A = 3824;
+ public static final int V24W13A = 3826;
+ public static final int V24W14A = 3827;
+ public static final int V1_20_5_PRE1 = 3829;
+ public static final int V1_20_5_PRE2 = 3830;
+ public static final int V1_20_5_PRE3 = 3831;
+ public static final int V1_20_5_PRE4 = 3832;
+ public static final int V1_20_5_RC1 = 3834;
+ public static final int V1_20_5_RC2 = 3835;
+ public static final int V1_20_5_RC3 = 3836;
+ public static final int V1_20_5 = 3837;
+ public static final int V1_20_6_RC1 = 3838;
+ public static final int V1_20_6 = 3839;
+ public static final int V24W18A = 3940;
+ public static final int V24W19A = 3941;
+ public static final int V24W19B = 3942;
+ public static final int V24W20A = 3944;
+ public static final int V24W21A = 3946;
+ public static final int V24W21B = 3947;
+ public static final int V1_21_PRE1 = 3948;
+ public static final int V1_21_PRE2 = 3949;
+ public static final int V1_21_PRE3 = 3950;
+ public static final int V1_21_PRE4 = 3951;
+ public static final int V1_21_RC1 = 3952;
+ public static final int V1_21 = 3953;
+ public static final int V1_21_RC = 3954;
+ public static final int V1_21_1 = 3955;
+ public static final int V24W33A = 4058;
+ public static final int V24W34A = 4060;
+ public static final int V24W35A = 4062;
+ public static final int V24W36A = 4063;
+ public static final int V24W37A = 4065;
+ public static final int V24W38A = 4066;
+ public static final int V24W39A = 4069;
+ public static final int V24W40A = 4072;
+ public static final int V1_21_2_PRE1 = 4073;
+ public static final int V1_21_2_PRE2 = 4074;
+ public static final int V1_21_2_PRE3 = 4075;
+ public static final int V1_21_2_PRE4 = 4076;
+ public static final int V1_21_2_PRE5 = 4077;
+ public static final int V1_21_2_RC1 = 4078;
+ public static final int V1_21_2_RC2 = 4079;
+ public static final int V1_21_2 = 4080;
+ public static final int V1_21_3 = 4082;
+ public static final int V24W44A = 4174;
+ public static final int V24W45A = 4177;
+ public static final int V24W46A = 4178;
+ public static final int V1_21_4_PRE1 = 4179;
+ public static final int V1_21_4_PRE2 = 4182;
+ public static final int V1_21_4_PRE3 = 4183;
+ public static final int V1_21_4_RC1 = 4184;
+ public static final int V1_21_4_RC2 = 4186;
+ public static final int V1_21_4_RC3 = 4188;
+ public static final int V1_21_4 = 4189;
+ public static final int V25W02A = 4298;
+ public static final int V25W03A = 4304;
+ public static final int V25W04A = 4308;
+ public static final int V25W05A = 4310;
+ public static final int V25W06A = 4313;
+ public static final int V25W07A = 4315;
+ public static final int V25W08A = 4316;
+ public static final int V25W09A = 4317;
+ public static final int V25W09B = 4318;
+ public static final int V25W10A = 4319;
+ public static final int V1_21_5_PRE1 = 4320;
+ public static final int V1_21_5_PRE2 = 4321;
+ public static final int V1_21_5_PRE3 = 4321;
+ public static final int V1_21_5_RC1 = 4323;
+ public static final int V1_21_5_RC2 = 4324;
+ public static final int V1_21_5 = 4325;
+ public static final int V25W15A = 4422;
+ public static final int V25W16A = 4423;
+ public static final int V25W17A = 4425;
+ public static final int V25W18A = 4426;
+ public static final int V25W19A = 4427;
+ public static final int V25W20A = 4428;
+ public static final int V25W21A = 4429;
+ public static final int V1_21_6_PRE1 = 4430;
+ public static final int V1_21_6_PRE2 = 4431;
+ public static final int V1_21_6_PRE3 = 4432;
+ public static final int V1_21_6_PRE4 = 4433;
+ public static final int V1_21_6_RC1 = 4434;
+ public static final int V1_21_6 = 4435;
+
+ private MCVersions() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..9022385edc8dd887780aa0881741d6d042fe2bc4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.advancements;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.ArrayList;
+import java.util.function.Function;
+
+public final class ConverterAbstractAdvancementsRename {
+
+ private ConverterAbstractAdvancementsRename() {}
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ MCTypeRegistry.ADVANCEMENTS.addStructureConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameKeys(data, renamer);
+ return null;
+ }
+ });
+ }
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterCriteriaRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterCriteriaRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..72d0d70b5ade04469aaecbf454b37a2643923a97
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterCriteriaRename.java
@@ -0,0 +1,42 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.advancements;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.function.Function;
+
+public final class ConverterCriteriaRename extends DataConverter<MapType, MapType> {
+
+ public final String path;
+ public final Function<String, String> conversion;
+
+ public ConverterCriteriaRename(final int toVersion, final String path, final Function<String, String> conversion) {
+ super(toVersion);
+ this.path = path;
+ this.conversion = conversion;
+ }
+
+ public ConverterCriteriaRename(final int toVersion, final int versionStep, final String path, final Function<String, String> conversion) {
+ super(toVersion, versionStep);
+ this.path = path;
+ this.conversion = conversion;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType advancement = data.getMap(this.path);
+ if (advancement == null) {
+ return null;
+ }
+
+ final MapType criteria = advancement.getMap("criteria");
+ if (criteria == null) {
+ return null;
+ }
+
+ RenameHelper.renameKeys(criteria, this.conversion);
+
+ return null;
+ }
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..75efa3e470e3d386f993064b3af7f67d82ca4b50
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.java
@@ -0,0 +1,60 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.attributes;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import java.util.function.Function;
+
+public final class ConverterAbstractAttributesRename {
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int versionStep, final Function<String, String> renamer) {
+ MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(version, versionStep) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType attributeModifiers = data.getMap("minecraft:attribute_modifiers");
+ if (attributeModifiers == null) {
+ return null;
+ }
+
+ final ListType modifiers = attributeModifiers.getList("modifiers", ObjectType.MAP);
+ if (modifiers == null) {
+ return null;
+ }
+
+ for (int i = 0, len = modifiers.size(); i < len; ++i) {
+ RenameHelper.renameString(modifiers.getMap(i), "type", renamer);
+ }
+
+ return null;
+ }
+ });
+
+ final DataConverter<MapType, MapType> entityConverter = new DataConverter<>(version, versionStep) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType modifiers = data.getList("attributes", ObjectType.MAP);
+ if (modifiers == null) {
+ return null;
+ }
+
+ for (int i = 0, len = modifiers.size(); i < len; ++i) {
+ RenameHelper.renameString(modifiers.getMap(i), "id", renamer);
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addStructureConverter(entityConverter);
+ MCTypeRegistry.PLAYER.addStructureConverter(entityConverter);
+ }
+
+ private ConverterAbstractAttributesRename() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractOldAttributesRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractOldAttributesRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a6d02df13f3461402fed429f7fbdb5acee877c4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractOldAttributesRename.java
@@ -0,0 +1,57 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.attributes;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import java.util.function.Function;
+
+public final class ConverterAbstractOldAttributesRename {
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int versionStep, final Function<String, String> renamer) {
+ final DataConverter<MapType, MapType> entityConverter = new DataConverter<>(version, versionStep) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType attributes = data.getList("Attributes", ObjectType.MAP);
+
+ if (attributes == null) {
+ return null;
+ }
+
+ for (int i = 0, len = attributes.size(); i < len; ++i) {
+ RenameHelper.renameString(attributes.getMap(i), "Name", renamer);
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addStructureConverter(entityConverter);
+ MCTypeRegistry.PLAYER.addStructureConverter(entityConverter);
+
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(version, versionStep) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType attributes = data.getList("AttributeModifiers", ObjectType.MAP);
+
+ if (attributes == null) {
+ return null;
+ }
+
+ for (int i = 0, len = attributes.size(); i < len; ++i) {
+ RenameHelper.renameString(attributes.getMap(i), "AttributeName", renamer);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private ConverterAbstractOldAttributesRename() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterEntityAttributesBaseValueUpdater.java b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterEntityAttributesBaseValueUpdater.java
new file mode 100644
index 0000000000000000000000000000000000000000..071272260593f834b03b195a1e4c71c81a051be5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterEntityAttributesBaseValueUpdater.java
@@ -0,0 +1,45 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.attributes;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import java.util.function.DoubleUnaryOperator;
+
+public final class ConverterEntityAttributesBaseValueUpdater extends DataConverter<MapType, MapType> {
+
+ private final String targetId;
+ private final DoubleUnaryOperator updater;
+
+ public ConverterEntityAttributesBaseValueUpdater(final int toVersion, final String targetId, final DoubleUnaryOperator updater) {
+ this(toVersion, 0, targetId, updater);
+ }
+
+ public ConverterEntityAttributesBaseValueUpdater(final int toVersion, final int versionStep, final String targetId,
+ final DoubleUnaryOperator updater) {
+ super(toVersion, versionStep);
+ this.targetId = targetId;
+ this.updater = updater;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType modifiers = data.getList("attributes", ObjectType.MAP);
+ if (modifiers == null) {
+ return null;
+ }
+
+ for (int i = 0, len = modifiers.size(); i < len; ++i) {
+ final MapType modifier = modifiers.getMap(i);
+
+ if (!this.targetId.equals(NamespaceUtil.correctNamespace(modifier.getString("id", "")))) {
+ continue;
+ }
+
+ modifier.setDouble("base", this.updater.applyAsDouble(modifier.getDouble("base", 0.0)));
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/blockname/ConverterAbstractBlockRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/blockname/ConverterAbstractBlockRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..316bc54366bb1ba2273e52dc52aaef6c8e43a2c3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/blockname/ConverterAbstractBlockRename.java
@@ -0,0 +1,64 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.blockname;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.function.Function;
+
+public final class ConverterAbstractBlockRename {
+
+ private ConverterAbstractBlockRename() {}
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ ConverterAbstractStringValueTypeRename.register(version, subVersion, MCTypeRegistry.BLOCK_NAME, renamer);
+ MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String name = data.getString("Name");
+ if (name != null) {
+ final String converted = renamer.apply(name);
+ if (converted != null) {
+ data.setString("Name", converted);
+ }
+ }
+ return null;
+ }
+ });
+ MCTypeRegistry.FLAT_BLOCK_STATE.addConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public Object convert(final Object data, final long sourceVersion, final long toVersion) {
+ if (!(data instanceof String string)) {
+ return null;
+ }
+
+ if (string.isEmpty()) {
+ return null;
+ }
+
+ final int nbtStart1 = string.indexOf('[');
+ final int nbtStart2 = string.indexOf('{');
+ int stateNameEnd = string.length();
+ if (nbtStart1 > 0) {
+ stateNameEnd = nbtStart1;
+ }
+
+ if (nbtStart2 > 0) {
+ stateNameEnd = Math.min(stateNameEnd, nbtStart2);
+ }
+
+ final String blockStateName = string.substring(0, stateNameEnd);
+ final String converted = renamer.apply(blockStateName);
+ if (converted == null) {
+ return null;
+ }
+
+ return converted.concat(string.substring(stateNameEnd));
+ }
+ });
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterAddBlendingData.java b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterAddBlendingData.java
new file mode 100644
index 0000000000000000000000000000000000000000..038f19b72870aee2b94e6691c03074e464e7d253
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterAddBlendingData.java
@@ -0,0 +1,65 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.chunk;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class ConverterAddBlendingData extends DataConverter<MapType, MapType> {
+
+ private static final Set<String> STATUSES_TO_SKIP_BLENDING = new HashSet<>(
+ Arrays.asList(
+ "minecraft:empty",
+ "minecraft:structure_starts",
+ "minecraft:structure_references",
+ "minecraft:biomes"
+ )
+ );
+
+ public ConverterAddBlendingData(final int toVersion) {
+ super(toVersion);
+ }
+
+ public ConverterAddBlendingData(final int toVersion, final int versionStep) {
+ super(toVersion, versionStep);
+ }
+
+ private static MapType createBlendingData(final int height, final int minY) {
+ final MapType ret = Types.NBT.createEmptyMap();
+
+ ret.setInt("min_section", minY >> 4);
+ ret.setInt("max_section", (minY + height) >> 4);
+
+ return ret;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.remove("blending_data");
+ final MapType context = data.getMap("__context");
+ if (!"minecraft:overworld".equals(context == null ? null : context.getString("dimension"))) {
+ return null;
+ }
+
+ final String status = NamespaceUtil.correctNamespace(data.getString("Status"));
+ if (status == null) {
+ return null;
+ }
+
+ final MapType belowZeroRetrogen = data.getMap("below_zero_retrogen");
+
+ if (!STATUSES_TO_SKIP_BLENDING.contains(status)) {
+ data.setMap("blending_data", createBlendingData(384, -64));
+ } else if (belowZeroRetrogen != null) {
+ final String realStatus = NamespaceUtil.correctNamespace(belowZeroRetrogen.getString("target_status", "empty"));
+ if (!STATUSES_TO_SKIP_BLENDING.contains(realStatus)) {
+ data.setMap("blending_data", createBlendingData(256, 0));
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterFlattenChunk.java b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterFlattenChunk.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed7468f57047ad4ec7bf58680871848efe350182
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterFlattenChunk.java
@@ -0,0 +1,1016 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.chunk;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperItemNameV102;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.mojang.datafixers.DataFixUtils;
+import com.mojang.logging.LogUtils;
+import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntIterator;
+import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap;
+import net.minecraft.util.datafix.PackedBitStorage;
+import org.slf4j.Logger;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+
+import static it.unimi.dsi.fastutil.HashCommon.arraySize;
+
+public final class ConverterFlattenChunk extends DataConverter<MapType, MapType> {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ static final BitSet VIRTUAL_SET = new BitSet(256);
+ static final BitSet IDS_NEEDING_FIX_SET = new BitSet(256);
+
+ static {
+ IDS_NEEDING_FIX_SET.set(2);
+ IDS_NEEDING_FIX_SET.set(3);
+ IDS_NEEDING_FIX_SET.set(110);
+ IDS_NEEDING_FIX_SET.set(140);
+ IDS_NEEDING_FIX_SET.set(144);
+ IDS_NEEDING_FIX_SET.set(25);
+ IDS_NEEDING_FIX_SET.set(86);
+ IDS_NEEDING_FIX_SET.set(26);
+ IDS_NEEDING_FIX_SET.set(176);
+ IDS_NEEDING_FIX_SET.set(177);
+ IDS_NEEDING_FIX_SET.set(175);
+ IDS_NEEDING_FIX_SET.set(64);
+ IDS_NEEDING_FIX_SET.set(71);
+ IDS_NEEDING_FIX_SET.set(193);
+ IDS_NEEDING_FIX_SET.set(194);
+ IDS_NEEDING_FIX_SET.set(195);
+ IDS_NEEDING_FIX_SET.set(196);
+ IDS_NEEDING_FIX_SET.set(197);
+
+ VIRTUAL_SET.set(54);
+ VIRTUAL_SET.set(146);
+ VIRTUAL_SET.set(25);
+ VIRTUAL_SET.set(26);
+ VIRTUAL_SET.set(51);
+ VIRTUAL_SET.set(53);
+ VIRTUAL_SET.set(67);
+ VIRTUAL_SET.set(108);
+ VIRTUAL_SET.set(109);
+ VIRTUAL_SET.set(114);
+ VIRTUAL_SET.set(128);
+ VIRTUAL_SET.set(134);
+ VIRTUAL_SET.set(135);
+ VIRTUAL_SET.set(136);
+ VIRTUAL_SET.set(156);
+ VIRTUAL_SET.set(163);
+ VIRTUAL_SET.set(164);
+ VIRTUAL_SET.set(180);
+ VIRTUAL_SET.set(203);
+ VIRTUAL_SET.set(55);
+ VIRTUAL_SET.set(85);
+ VIRTUAL_SET.set(113);
+ VIRTUAL_SET.set(188);
+ VIRTUAL_SET.set(189);
+ VIRTUAL_SET.set(190);
+ VIRTUAL_SET.set(191);
+ VIRTUAL_SET.set(192);
+ VIRTUAL_SET.set(93);
+ VIRTUAL_SET.set(94);
+ VIRTUAL_SET.set(101);
+ VIRTUAL_SET.set(102);
+ VIRTUAL_SET.set(160);
+ VIRTUAL_SET.set(106);
+ VIRTUAL_SET.set(107);
+ VIRTUAL_SET.set(183);
+ VIRTUAL_SET.set(184);
+ VIRTUAL_SET.set(185);
+ VIRTUAL_SET.set(186);
+ VIRTUAL_SET.set(187);
+ VIRTUAL_SET.set(132);
+ VIRTUAL_SET.set(139);
+ VIRTUAL_SET.set(199);
+ }
+
+ static final boolean[] VIRTUAL = toBooleanArray(VIRTUAL_SET);
+ static final boolean[] IDS_NEEDING_FIX = toBooleanArray(IDS_NEEDING_FIX_SET);
+
+ private static boolean[] toBooleanArray(final BitSet set) {
+ final boolean[] ret = new boolean[4096];
+ for (int i = 0; i < 4096; ++i) {
+ ret[i] = set.get(i);
+ }
+
+ return ret;
+ }
+
+ static final MapType PUMPKIN = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:pumpkin'}");
+ static final MapType SNOWY_PODZOL = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:podzol',Properties:{snowy:'true'}}");
+ static final MapType SNOWY_GRASS = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:grass_block',Properties:{snowy:'true'}}");
+ static final MapType SNOWY_MYCELIUM = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:mycelium',Properties:{snowy:'true'}}");
+ static final MapType UPPER_SUNFLOWER = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:sunflower',Properties:{half:'upper'}}");
+ static final MapType UPPER_LILAC = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:lilac',Properties:{half:'upper'}}");
+ static final MapType UPPER_TALL_GRASS = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:tall_grass',Properties:{half:'upper'}}");
+ static final MapType UPPER_LARGE_FERN = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:large_fern',Properties:{half:'upper'}}");
+ static final MapType UPPER_ROSE_BUSH = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:rose_bush',Properties:{half:'upper'}}");
+ static final MapType UPPER_PEONY = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:peony',Properties:{half:'upper'}}");
+
+ static final Map<String, MapType> FLOWER_POT_MAP = new HashMap<>();
+ static {
+ FLOWER_POT_MAP.put("minecraft:air0", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:flower_pot'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower0", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_poppy'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower1", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_blue_orchid'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower2", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_allium'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower3", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_azure_bluet'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower4", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_red_tulip'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower5", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_orange_tulip'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower6", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_white_tulip'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower7", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_pink_tulip'}"));
+ FLOWER_POT_MAP.put("minecraft:red_flower8", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_oxeye_daisy'}"));
+ FLOWER_POT_MAP.put("minecraft:yellow_flower0", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_dandelion'}"));
+ FLOWER_POT_MAP.put("minecraft:sapling0", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_oak_sapling'}"));
+ FLOWER_POT_MAP.put("minecraft:sapling1", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_spruce_sapling'}"));
+ FLOWER_POT_MAP.put("minecraft:sapling2", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_birch_sapling'}"));
+ FLOWER_POT_MAP.put("minecraft:sapling3", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_jungle_sapling'}"));
+ FLOWER_POT_MAP.put("minecraft:sapling4", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_acacia_sapling'}"));
+ FLOWER_POT_MAP.put("minecraft:sapling5", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_dark_oak_sapling'}"));
+ FLOWER_POT_MAP.put("minecraft:red_mushroom0", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_red_mushroom'}"));
+ FLOWER_POT_MAP.put("minecraft:brown_mushroom0", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_brown_mushroom'}"));
+ FLOWER_POT_MAP.put("minecraft:deadbush0", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_dead_bush'}"));
+ FLOWER_POT_MAP.put("minecraft:tallgrass2", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_fern'}"));
+ FLOWER_POT_MAP.put("minecraft:cactus0", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:potted_cactus'}")); // we change default to empty
+ }
+
+ static final Map<String, MapType> SKULL_MAP = new HashMap<>();
+ static {
+ mapSkull(SKULL_MAP, 0, "skeleton", "skull");
+ mapSkull(SKULL_MAP, 1, "wither_skeleton", "skull");
+ mapSkull(SKULL_MAP, 2, "zombie", "head");
+ mapSkull(SKULL_MAP, 3, "player", "head");
+ mapSkull(SKULL_MAP, 4, "creeper", "head");
+ mapSkull(SKULL_MAP, 5, "dragon", "head");
+ };
+
+ private static void mapSkull(final Map<String, MapType> into, final int oldId, final String newId, final String skullType) {
+ into.put(oldId + "north", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + newId + "_wall_" + skullType + "',Properties:{facing:'north'}}"));
+ into.put(oldId + "east", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + newId + "_wall_" + skullType + "',Properties:{facing:'east'}}"));
+ into.put(oldId + "south", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + newId + "_wall_" + skullType + "',Properties:{facing:'south'}}"));
+ into.put(oldId + "west", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + newId + "_wall_" + skullType + "',Properties:{facing:'west'}}"));
+
+ for (int rotation = 0; rotation < 16; ++rotation) {
+ into.put(oldId + "" + rotation,
+ HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + newId + "_" + skullType + "',Properties:{rotation:'" + rotation + "'}}"));
+ }
+ }
+
+ static final Map<String, MapType> DOOR_MAP = new HashMap<>();
+ static {
+ mapDoor(DOOR_MAP, "oak_door", 1024);
+ mapDoor(DOOR_MAP, "iron_door", 1136);
+ mapDoor(DOOR_MAP, "spruce_door", 3088);
+ mapDoor(DOOR_MAP, "birch_door", 3104);
+ mapDoor(DOOR_MAP, "jungle_door", 3120);
+ mapDoor(DOOR_MAP, "acacia_door", 3136);
+ mapDoor(DOOR_MAP, "dark_oak_door", 3152);
+ };
+
+ private static void mapDoor(final Map<String, MapType> into, final String type, final int oldId) {
+ into.put("minecraft:" + type + "eastlowerleftfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "eastlowerleftfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "eastlowerlefttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "eastlowerlefttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "eastlowerrightfalsefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId)));
+ into.put("minecraft:" + type + "eastlowerrightfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "eastlowerrighttruefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 4)));
+ into.put("minecraft:" + type + "eastlowerrighttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "eastupperleftfalsefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 8)));
+ into.put("minecraft:" + type + "eastupperleftfalsetrue", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 10)));
+ into.put("minecraft:" + type + "eastupperlefttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "eastupperlefttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "eastupperrightfalsefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 9)));
+ into.put("minecraft:" + type + "eastupperrightfalsetrue", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 11)));
+ into.put("minecraft:" + type + "eastupperrighttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "eastupperrighttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "northlowerleftfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "northlowerleftfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "northlowerlefttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "northlowerlefttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "northlowerrightfalsefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 3)));
+ into.put("minecraft:" + type + "northlowerrightfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "northlowerrighttruefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 7)));
+ into.put("minecraft:" + type + "northlowerrighttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "northupperleftfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "northupperleftfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "northupperlefttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "northupperlefttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "northupperrightfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "northupperrightfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "northupperrighttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "northupperrighttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "southlowerleftfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "southlowerleftfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "southlowerlefttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "southlowerlefttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "southlowerrightfalsefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 1)));
+ into.put("minecraft:" + type + "southlowerrightfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "southlowerrighttruefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 5)));
+ into.put("minecraft:" + type + "southlowerrighttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "southupperleftfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "southupperleftfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "southupperlefttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "southupperlefttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "southupperrightfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "southupperrightfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "southupperrighttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "southupperrighttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "westlowerleftfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "westlowerleftfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "westlowerlefttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "westlowerlefttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "westlowerrightfalsefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 2)));
+ into.put("minecraft:" + type + "westlowerrightfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "westlowerrighttruefalse", Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(oldId + 6)));
+ into.put("minecraft:" + type + "westlowerrighttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "westupperleftfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "westupperleftfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "westupperlefttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "westupperlefttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"));
+ into.put("minecraft:" + type + "westupperrightfalsefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}"));
+ into.put("minecraft:" + type + "westupperrightfalsetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}"));
+ into.put("minecraft:" + type + "westupperrighttruefalse", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"));
+ into.put("minecraft:" + type + "westupperrighttruetrue", HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + type + "',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"));
+ }
+
+ static final Map<String, MapType> NOTE_BLOCK_MAP = new HashMap<>();
+ static {
+ for(int note = 0; note < 26; ++note) {
+ NOTE_BLOCK_MAP.put("true" + note, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:note_block',Properties:{powered:'true',note:'" + note + "'}}"));
+ NOTE_BLOCK_MAP.put("false" + note, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:note_block',Properties:{powered:'false',note:'" + note + "'}}"));
+ }
+ }
+
+ static final Int2ObjectOpenHashMap<String> DYE_COLOR_MAP = new Int2ObjectOpenHashMap<>();
+ static {
+ DYE_COLOR_MAP.put(0, "white");
+ DYE_COLOR_MAP.put(1, "orange");
+ DYE_COLOR_MAP.put(2, "magenta");
+ DYE_COLOR_MAP.put(3, "light_blue");
+ DYE_COLOR_MAP.put(4, "yellow");
+ DYE_COLOR_MAP.put(5, "lime");
+ DYE_COLOR_MAP.put(6, "pink");
+ DYE_COLOR_MAP.put(7, "gray");
+ DYE_COLOR_MAP.put(8, "light_gray");
+ DYE_COLOR_MAP.put(9, "cyan");
+ DYE_COLOR_MAP.put(10, "purple");
+ DYE_COLOR_MAP.put(11, "blue");
+ DYE_COLOR_MAP.put(12, "brown");
+ DYE_COLOR_MAP.put(13, "green");
+ DYE_COLOR_MAP.put(14, "red");
+ DYE_COLOR_MAP.put(15, "black");
+ }
+
+ static final Map<String, MapType> BED_BLOCK_MAP = new HashMap<>();
+
+ static {
+ for (final Int2ObjectMap.Entry<String> entry : DYE_COLOR_MAP.int2ObjectEntrySet()) {
+ if (!Objects.equals(entry.getValue(), "red")) {
+ addBeds(BED_BLOCK_MAP, entry.getIntKey(), entry.getValue());
+ }
+ }
+ }
+
+ private static void addBeds(final Map<String, MapType> into, final int colourId, final String colourName) {
+ into.put("southfalsefoot" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'south',occupied:'false',part:'foot'}}"));
+ into.put("westfalsefoot" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'west',occupied:'false',part:'foot'}}"));
+ into.put("northfalsefoot" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'north',occupied:'false',part:'foot'}}"));
+ into.put("eastfalsefoot" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'east',occupied:'false',part:'foot'}}"));
+ into.put("southfalsehead" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'south',occupied:'false',part:'head'}}"));
+ into.put("westfalsehead" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'west',occupied:'false',part:'head'}}"));
+ into.put("northfalsehead" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'north',occupied:'false',part:'head'}}"));
+ into.put("eastfalsehead" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'east',occupied:'false',part:'head'}}"));
+ into.put("southtruehead" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'south',occupied:'true',part:'head'}}"));
+ into.put("westtruehead" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'west',occupied:'true',part:'head'}}"));
+ into.put("northtruehead" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'north',occupied:'true',part:'head'}}"));
+ into.put("easttruehead" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_bed',Properties:{facing:'east',occupied:'true',part:'head'}}"));
+ }
+
+ static final Map<String, MapType> BANNER_BLOCK_MAP = new HashMap<>();
+
+ static {
+ for (final Int2ObjectMap.Entry<String> entry : DYE_COLOR_MAP.int2ObjectEntrySet()) {
+ if (!Objects.equals(entry.getValue(), "white")) {
+ addBanners(BANNER_BLOCK_MAP, 15 - entry.getIntKey(), entry.getValue());
+ }
+ }
+ }
+
+ private static void addBanners(final Map<String, MapType> into, final int colourId, final String colourName) {
+ for(int rotation = 0; rotation < 16; ++rotation) {
+ into.put("" + rotation + "_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_banner',Properties:{rotation:'" + rotation + "'}}"));
+ }
+
+ into.put("north_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_wall_banner',Properties:{facing:'north'}}"));
+ into.put("south_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_wall_banner',Properties:{facing:'south'}}"));
+ into.put("west_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_wall_banner',Properties:{facing:'west'}}"));
+ into.put("east_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_wall_banner',Properties:{facing:'east'}}"));
+ }
+
+ static final MapType AIR = Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(0));
+
+ public ConverterFlattenChunk() {
+ super(MCVersions.V17W47A, 1);
+ }
+
+ static String getName(final MapType blockState) {
+ return blockState.getString("Name");
+ }
+
+ static String getProperty(final MapType blockState, final String propertyName) {
+ final MapType properties = blockState.getMap("Properties");
+ if (properties == null) {
+ return "";
+ }
+
+ return properties.getString(propertyName, "");
+ }
+
+ static int getSideMask(final boolean noLeft, final boolean noRight, final boolean noBack, final boolean noForward) {
+ if (noBack) {
+ if (noRight) {
+ return 2;
+ } else if (noLeft) {
+ return 128;
+ } else {
+ return 1;
+ }
+ } else if (noForward) {
+ if (noLeft) {
+ return 32;
+ } else if (noRight) {
+ return 8;
+ } else {
+ return 16;
+ }
+ } else if (noRight) {
+ return 4;
+ } else if (noLeft) {
+ return 64;
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ if (!level.hasKey("Sections", ObjectType.LIST)) {
+ return null;
+ }
+
+ data.setMap("Level", new UpgradeChunk(level).writeBackToLevel());
+
+ return null;
+ }
+
+ static enum Direction {
+ DOWN(AxisDirection.NEGATIVE, Axis.Y),
+ UP(AxisDirection.POSITIVE, Axis.Y),
+ NORTH(AxisDirection.NEGATIVE, Axis.Z),
+ SOUTH(AxisDirection.POSITIVE, Axis.Z),
+ WEST(AxisDirection.NEGATIVE, Axis.X),
+ EAST(AxisDirection.POSITIVE, Axis.X);
+
+ private final Axis axis;
+ private final AxisDirection axisDirection;
+
+ private Direction(final AxisDirection axisDirection, final Axis axis) {
+ this.axis = axis;
+ this.axisDirection = axisDirection;
+ }
+
+ public AxisDirection getAxisDirection() {
+ return this.axisDirection;
+ }
+
+ public Axis getAxis() {
+ return this.axis;
+ }
+
+ public static enum AxisDirection {
+ POSITIVE(1),
+ NEGATIVE(-1);
+
+ private final int step;
+
+ private AxisDirection(final int step) {
+ this.step = step;
+ }
+
+ public int getStep() {
+ return this.step;
+ }
+ }
+
+ public static enum Axis {
+ X, Y, Z;
+ }
+ }
+
+ static class DataLayer {
+ private final byte[] data;
+
+ public DataLayer() {
+ this.data = new byte[2048];
+ }
+
+ public DataLayer(final byte[] data) {
+ this.data = data;
+ if (data.length != 2048) {
+ throw new IllegalArgumentException("ChunkNibbleArrays should be 2048 bytes not: " + data.length);
+ }
+ }
+
+ public static DataLayer getOrNull(final byte[] data) {
+ return data == null ? null : new DataLayer(data);
+ }
+
+ public static DataLayer getOrCreate(final byte[] data) {
+ return data == null ? new DataLayer() : new DataLayer(data);
+ }
+
+ public int get(final int index) {
+ final byte value = this.data[index >>> 1];
+
+ // if we are an even index, we want lower 4 bits
+ // if we are an odd index, we want upper 4 bits
+ return ((value >>> ((index & 1) << 2)) & 0xF);
+ }
+
+ public int get(final int x, final int y, final int z) {
+ final int index = y << 8 | z << 4 | x;
+ final byte value = this.data[index >>> 1];
+
+ // if we are an even index, we want lower 4 bits
+ // if we are an odd index, we want upper 4 bits
+ return ((value >>> ((index & 1) << 2)) & 0xF);
+ }
+ }
+
+ static final class UpgradeChunk {
+ int sides;
+
+ final Section[] sections = new Section[16];
+ final MapType level;
+ final int blockX;
+ final int blockZ;
+ final Int2ObjectLinkedOpenHashMap<MapType> tileEntities = new Int2ObjectLinkedOpenHashMap<>(16);
+
+ public UpgradeChunk(final MapType level) {
+ this.level = level;
+ this.blockX = level.getInt("xPos") << 4;
+ this.blockZ = level.getInt("zPos") << 4;
+
+ final ListType tileEntities = level.getList("TileEntities", ObjectType.MAP);
+ if (tileEntities != null) {
+ for (int i = 0, len = tileEntities.size(); i < len; ++i) {
+ final MapType tileEntity = tileEntities.getMap(i);
+
+ final int x = (tileEntity.getInt("x") - this.blockX) & 15;
+ final int y = tileEntity.getInt("y");
+ final int z = (tileEntity.getInt("z") - this.blockZ) & 15;
+ final int index = (y << 8) | (z << 4) | x;
+ if (this.tileEntities.put(index, tileEntity) != null) {
+ LOGGER.warn("In chunk: {}x{} found a duplicate block entity at position (ConverterFlattenChunk): [{}, {}, {}]", this.blockX, this.blockZ, x, y, z);
+ }
+ }
+ }
+
+ final boolean convertedFromAlphaFormat = level.getBoolean("convertedFromAlphaFormat");
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections != null) {
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType sectionData = sections.getMap(i);
+ final Section section = new Section(sectionData);
+
+ if (section.y < 0 || section.y > 15) {
+ LOGGER.warn("In chunk: {}x{} found an invalid chunk section y (ConverterFlattenChunk): {}", this.blockX, this.blockZ, section.y);
+ continue;
+ }
+
+ if (this.sections[section.y] != null) {
+ LOGGER.warn("In chunk: {}x{} found a duplicate chunk section (ConverterFlattenChunk): {}", this.blockX, this.blockZ, section.y);
+ }
+
+ this.sides = section.upgrade(this.sides);
+ this.sections[section.y] = section;
+ }
+ }
+
+ for (final Section section : this.sections) {
+ if (section == null) {
+ continue;
+ }
+
+ final int yIndex = section.y << (8 + 4);
+
+ for (final Iterator<Int2ObjectMap.Entry<IntArrayList>> iterator = section.toFix.int2ObjectEntrySet().fastIterator(); iterator.hasNext();) {
+ final Int2ObjectMap.Entry<IntArrayList> fixEntry = iterator.next();
+ final IntIterator positionIterator = fixEntry.getValue().iterator();
+ switch (fixEntry.getIntKey()) {
+ case 2: { // grass block
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType blockState = this.getBlock(position);
+ if (!"minecraft:grass_block".equals(getName(blockState))) {
+ continue;
+ }
+
+ final String blockAbove = getName(getBlock(relative(position, Direction.UP)));
+ if ("minecraft:snow".equals(blockAbove) || "minecraft:snow_layer".equals(blockAbove)) {
+ this.setBlock(position, SNOWY_GRASS);
+ }
+ }
+ break;
+ }
+ case 3: { // dirt
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType blockState = this.getBlock(position);
+ if (!"minecraft:podzol".equals(getName(blockState))) {
+ continue;
+ }
+
+ final String blockAbove = getName(getBlock(relative(position, Direction.UP)));
+ if ("minecraft:snow".equals(blockAbove) || "minecraft:snow_layer".equals(blockAbove)) {
+ this.setBlock(position, SNOWY_PODZOL);
+ }
+ }
+ break;
+ }
+ case 25: { // note block
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType tile = this.removeBlockEntity(position);
+ if (tile != null) {
+ final String state = Boolean.toString(tile.getBoolean("powered")) + (byte) Math.min(Math.max(tile.getInt("note"), 0), 24);
+ this.setBlock(position, NOTE_BLOCK_MAP.getOrDefault(state, NOTE_BLOCK_MAP.get("false0")));
+ }
+ }
+ break;
+ }
+ case 26: { // bed
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType tile = this.getBlockEntity(position);
+
+ if (tile == null) {
+ continue;
+ }
+
+ final MapType blockState = this.getBlock(position);
+
+ final int colour = tile.getInt("color");
+ if (colour != 14 && colour >= 0 && colour < 16) {
+ final String state = getProperty(blockState, "facing") + getProperty(blockState, "occupied") + getProperty(blockState, "part") + colour;
+
+ final MapType update = BED_BLOCK_MAP.get(state);
+ if (update != null) {
+ this.setBlock(position, update);
+ }
+ }
+ }
+ break;
+ }
+ case 64: // oak door
+ case 71: // iron door
+ case 193: // spruce door
+ case 194: // birch door
+ case 195: // jungle door
+ case 196: // acacia door
+ case 197: { // dark oak door
+ // aka the door updater
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType blockState = this.getBlock(position);
+ if (!getName(blockState).endsWith("_door")) {
+ continue;
+ }
+
+ if (!"lower".equals(getProperty(blockState, "half"))) {
+ continue;
+ }
+
+ final int positionAbove = relative(position, Direction.UP);
+ final MapType blockStateAbove = this.getBlock(positionAbove);
+
+ final String name = getName(blockState);
+ if (name.equals(getName(blockStateAbove))) {
+ final String facingBelow = getProperty(blockState, "facing");
+ final String openBelow = getProperty(blockState, "open");
+ final String hingeAbove = convertedFromAlphaFormat ? "left" : getProperty(blockStateAbove, "hinge");
+ final String poweredAbove = convertedFromAlphaFormat ? "false" : getProperty(blockStateAbove, "powered");
+
+ this.setBlock(position, DOOR_MAP.get(name + facingBelow + "lower" + hingeAbove + openBelow + poweredAbove));
+ this.setBlock(positionAbove, DOOR_MAP.get(name + facingBelow + "upper" + hingeAbove + openBelow + poweredAbove));
+ }
+ }
+ break;
+ }
+ case 86: { // pumpkin
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType blockState = this.getBlock(position);
+
+ // I guess this is some terrible hack to convert carved pumpkins from world gen into
+ // regular pumpkins?
+
+ if ("minecraft:carved_pumpkin".equals(getName(blockState))) {
+ final String downName = getName(this.getBlock(relative(position, Direction.DOWN)));
+ if ("minecraft:grass_block".equals(downName) || "minecraft:dirt".equals(downName)) {
+ this.setBlock(position, PUMPKIN);
+ }
+ }
+ }
+ break;
+ }
+ case 110: { // mycelium
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType blockState = this.getBlock(position);
+ if ("minecraft:mycelium".equals(getName(blockState))) {
+ final String nameAbove = getName(this.getBlock(relative(position, Direction.UP)));
+ if ("minecraft:snow".equals(nameAbove) || "minecraft:snow_layer".equals(nameAbove)) {
+ this.setBlock(position, SNOWY_MYCELIUM);
+ }
+ }
+ }
+ break;
+ }
+ case 140: { // flower pot
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType tile = this.removeBlockEntity(position);
+ if (tile == null) {
+ continue;
+ }
+
+ final String item;
+ if (tile.hasKey("Item", ObjectType.NUMBER)) {
+ // the item name converter should have migrated to number, however no legacy converter
+ // ever did this. so we can get data with versions above v102 (old worlds, converted prior to DFU)
+ // that didn't convert. so just do it here.
+ item = HelperItemNameV102.getNameFromId(tile.getInt("Item"));
+ } else {
+ item = tile.getString("Item", "");
+ }
+
+ final String state = item + tile.getInt("Data");
+ this.setBlock(position, FLOWER_POT_MAP.getOrDefault(state, FLOWER_POT_MAP.get("minecraft:air0")));
+ }
+ break;
+ }
+ case 144: { // mob head
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType tile = this.getBlockEntity(position);
+ if (tile == null) {
+ continue;
+ }
+
+ final String typeString = Integer.toString(tile.getInt("SkullType"));
+ final String facing = getProperty(this.getBlock(position), "facing");
+ final String state;
+ if (!"up".equals(facing) && !"down".equals(facing)) {
+ state = typeString + facing;
+ } else {
+ state = typeString + tile.getInt("Rot");
+ }
+
+ tile.remove("SkullType");
+ tile.remove("facing");
+ tile.remove("Rot");
+
+ this.setBlock(position, SKULL_MAP.getOrDefault(state, SKULL_MAP.get("0north")));
+ }
+ break;
+ }
+ case 175: { // sunflower
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType blockState = this.getBlock(position);
+ if (!"upper".equals(getProperty(blockState, "half"))) {
+ continue;
+ }
+
+ final MapType blockStateBelow = this.getBlock(relative(position, Direction.DOWN));
+ final String nameBelow = getName(blockStateBelow);
+ switch (nameBelow) {
+ case "minecraft:sunflower":
+ this.setBlock(position, UPPER_SUNFLOWER);
+ break;
+ case "minecraft:lilac":
+ this.setBlock(position, UPPER_LILAC);
+ break;
+ case "minecraft:tall_grass":
+ this.setBlock(position, UPPER_TALL_GRASS);
+ break;
+ case "minecraft:large_fern":
+ this.setBlock(position, UPPER_LARGE_FERN);
+ break;
+ case "minecraft:rose_bush":
+ this.setBlock(position, UPPER_ROSE_BUSH);
+ break;
+ case "minecraft:peony":
+ this.setBlock(position, UPPER_PEONY);
+ break;
+ }
+ }
+ break;
+ }
+ case 176: // free standing banner
+ case 177: { // wall mounted banner
+ while (positionIterator.hasNext()) {
+ final int position = positionIterator.nextInt() | yIndex;
+ final MapType tile = this.getBlockEntity(position);
+
+ if (tile == null) {
+ continue;
+ }
+
+ final MapType blockState = this.getBlock(position);
+
+ final int base = tile.getInt("Base");
+ if (base != 15 && base >= 0 && base < 16) {
+ final String state = getProperty(blockState, fixEntry.getIntKey() == 176 ? "rotation" : "facing") + "_" + base;
+ final MapType update = BANNER_BLOCK_MAP.get(state);
+ if (update != null) {
+ this.setBlock(position, update);
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ private MapType getBlockEntity(final int index) {
+ return this.tileEntities.get(index);
+ }
+
+ private MapType removeBlockEntity(final int index) {
+ return this.tileEntities.remove(index);
+ }
+
+ public static int relative(final int index, final Direction direction) {
+ switch (direction.getAxis()) {
+ case X:
+ int j = (index & 15) + direction.getAxisDirection().getStep();
+ return j >= 0 && j <= 15 ? index & -16 | j : -1;
+ case Y:
+ int k = (index >> 8) + direction.getAxisDirection().getStep();
+ return k >= 0 && k <= 255 ? index & 255 | k << 8 : -1;
+ case Z:
+ int l = (index >> 4 & 15) + direction.getAxisDirection().getStep();
+ return l >= 0 && l <= 15 ? index & -241 | l << 4 : -1;
+ default:
+ return -1;
+ }
+ }
+
+ private void setBlock(final int index, final MapType blockState) {
+ if (index >= 0 && index <= 65535) {
+ final Section section = this.getSection(index);
+ if (section != null) {
+ section.setBlock(index & 4095, blockState);
+ }
+ }
+ }
+
+ private Section getSection(final int index) {
+ final int y = index >> 12;
+ return y < this.sections.length ? this.sections[y] : null;
+ }
+
+ public MapType getBlock(int i) {
+ if (i >= 0 && i <= 65535) {
+ final Section section = this.getSection(i);
+ return section == null ? AIR : section.getBlock(i & 4095);
+ } else {
+ return AIR;
+ }
+ }
+
+ public MapType writeBackToLevel() {
+ if (this.tileEntities.isEmpty()) {
+ this.level.remove("TileEntities");
+ } else {
+ final ListType tileEntities = Types.NBT.createEmptyList();
+ this.tileEntities.values().forEach(tileEntities::addMap);
+ this.level.setList("TileEntities", tileEntities);
+ }
+
+ final MapType indices = Types.NBT.createEmptyMap();
+ final ListType sections = Types.NBT.createEmptyList();
+ for (final Section section : this.sections) {
+ if (section == null) {
+ continue;
+ }
+
+ sections.addMap(section.writeBackToSection());
+ indices.setInts(Integer.toString(section.y), Arrays.copyOf(section.update.elements(), section.update.size()));
+ }
+
+ this.level.setList("Sections", sections);
+
+ final MapType upgradeData = Types.NBT.createEmptyMap();
+ upgradeData.setByte("Sides", (byte)this.sides);
+ upgradeData.setMap("Indices", indices);
+
+ this.level.setMap("UpgradeData", upgradeData);
+
+ return this.level;
+ }
+ }
+
+ static class Section {
+ final Palette palette = new Palette();
+
+ static final class Palette extends Reference2IntOpenHashMap<MapType> {
+
+ final ListType paletteStates = Types.NBT.createEmptyList();
+
+ private int find(final MapType k) {
+ if (((k) == (null)))
+ return containsNullKey ? n : -(n + 1);
+ MapType curr;
+ final Object[] key = this.key;
+ int pos;
+ // The starting point.
+ if (((curr = (MapType)key[pos = (it.unimi.dsi.fastutil.HashCommon.mix(System.identityHashCode(k))) & mask]) == (null)))
+ return -(pos + 1);
+ if (((k) == (curr)))
+ return pos;
+ // There's always an unused entry.
+ while (true) {
+ if (((curr = (MapType)key[pos = (pos + 1) & mask]) == (null)))
+ return -(pos + 1);
+ if (((k) == (curr)))
+ return pos;
+ }
+ }
+
+ private void insert(final int pos, final MapType k, final int v) {
+ if (pos == n)
+ containsNullKey = true;
+ ((Object[])key)[pos] = k;
+ value[pos] = v;
+ if (size++ >= maxFill)
+ rehash(arraySize(size + 1, f));
+ }
+
+ private MapType[] byId = new MapType[4];
+ private MapType last = null;
+
+ public int getOrCreateId(final MapType k) {
+ if (k == this.last) {
+ return this.size - 1;
+ }
+ final int pos = find(k);
+ if (pos >= 0) {
+ return this.value[pos];
+ }
+
+ final int insert = this.size;
+ MapType inPalette = k;
+
+ if ("%%FILTER_ME%%".equals(getName(k))) {
+ inPalette = AIR;
+ }
+
+ if (insert >= this.byId.length) {
+ this.byId = Arrays.copyOf(this.byId, this.byId.length * 2);
+ this.byId[insert] = k;
+ } else {
+ this.byId[insert] = k;
+ }
+ this.paletteStates.addMap(inPalette);
+
+ this.last = k;
+
+ this.insert(-pos - 1, k, insert);
+
+ return insert;
+ }
+
+ }
+
+ final MapType section;
+ final boolean hasData;
+ final Int2ObjectLinkedOpenHashMap<IntArrayList> toFix = new Int2ObjectLinkedOpenHashMap<>();
+ final IntArrayList update = new IntArrayList();
+ final int y;
+ final int[] buffer = new int[4096];
+
+ public Section(final MapType section) {
+ this.section = section;
+ this.y = section.getInt("Y");
+ this.hasData = section.hasKey("Blocks", ObjectType.BYTE_ARRAY);
+ }
+
+ public MapType getBlock(final int index) {
+ if (index >= 0 && index <= 4095) {
+ final MapType state = this.palette.byId[this.buffer[index]];
+ return state == null ? AIR : state;
+ } else {
+ return AIR;
+ }
+ }
+
+ public void setBlock(final int index, final MapType blockState) {
+ this.buffer[index] = this.palette.getOrCreateId(blockState);
+ }
+
+ public int upgrade(int sides) {
+ if (!this.hasData) {
+ return sides;
+ }
+
+ final byte[] blocks = this.section.getBytes("Blocks");
+ final DataLayer data = DataLayer.getOrNull(this.section.getBytes("Data"));
+ final DataLayer add = DataLayer.getOrNull(this.section.getBytes("Add"));
+
+ this.palette.getOrCreateId(AIR);
+
+ for (int index = 0; index < 4096; ++index) {
+ final int x = index & 15;
+ final int z = index >> 4 & 15;
+
+ int blockStateId = (blocks[index] & 255) << 4;
+ if (data != null) {
+ blockStateId |= data.get(index);
+ }
+ if (add != null) {
+ blockStateId |= add.get(index) << 12;
+ }
+ if (IDS_NEEDING_FIX[blockStateId >>> 4]) {
+ this.addFix(blockStateId >>> 4, index);
+ }
+
+ if (VIRTUAL[blockStateId >>> 4]) {
+ final int additionalSides = getSideMask(x == 0, x == 15, z == 0, z == 15);
+ if (additionalSides == 0) {
+ this.update.add(index);
+ } else {
+ sides |= additionalSides;
+ }
+ }
+
+ this.setBlock(index, HelperBlockFlatteningV1450.getNBTForId(blockStateId));
+ }
+
+ return sides;
+ }
+
+ private void addFix(final int block, final int index) {
+ this.toFix.computeIfAbsent(block, (final int keyInMap) -> {
+ return new IntArrayList();
+ }).add(index);
+ }
+
+ // Note: modifies the current section and returns it.
+ public MapType writeBackToSection() {
+ if (!this.hasData) {
+ return this.section;
+ }
+
+ this.section.setList("Palette", this.palette.paletteStates.copy()); // deep copy to ensure palette compound tags are NOT shared
+
+ final int bitSize = Math.max(4, DataFixUtils.ceillog2(this.palette.size()));
+ final PackedBitStorage packedIds = new PackedBitStorage(bitSize, 4096);
+
+ for(int index = 0; index < this.buffer.length; ++index) {
+ packedIds.set(index, this.buffer[index]);
+ }
+
+ this.section.setLongs("BlockStates", packedIds.getRaw());
+
+ this.section.remove("Blocks");
+ this.section.remove("Data");
+ this.section.remove("Add");
+
+ return this.section;
+ }
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterRenameStatus.java b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterRenameStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ba45909b5e60655f83ba96a8dc9ae43077c9fa4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterRenameStatus.java
@@ -0,0 +1,32 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.chunk;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import java.util.function.Function;
+
+public final class ConverterRenameStatus extends DataConverter<MapType, MapType> {
+
+ private final Function<String, String> renamer;
+
+ public ConverterRenameStatus(final int toVersion, final Function<String, String> renamer) {
+ this(toVersion, 0, renamer);
+ }
+
+ public ConverterRenameStatus(final int toVersion, final int versionStep, final Function<String, String> renamer) {
+ super(toVersion, versionStep);
+ this.renamer = renamer;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ // Note: DFU technically enforces namespace due to how they wrote their converter, so we will do the same.
+ NamespaceUtil.enforceForPath(data, "Status");
+ RenameHelper.renameString(data, "Status", this.renamer);
+
+ NamespaceUtil.enforceForPath(data.getMap("below_zero_retrogen"), "target_status");
+ RenameHelper.renameString(data.getMap("below_zero_retrogen"), "target_status", this.renamer);
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterAbstractEntityRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterAbstractEntityRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7e34dd98541f28a9d9abd43c65c0772062e6de2
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterAbstractEntityRename.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.entity;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.function.Function;
+
+public final class ConverterAbstractEntityRename {
+
+ private ConverterAbstractEntityRename() {}
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+ if (id == null) {
+ return null;
+ }
+
+ final String converted = renamer.apply(id);
+
+ if (converted != null) {
+ data.setString("id", converted);
+ }
+
+ return null;
+ }
+ });
+ ConverterAbstractStringValueTypeRename.register(version, subVersion, MCTypeRegistry.ENTITY_NAME, renamer);
+ }
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityToVariant.java b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityToVariant.java
new file mode 100644
index 0000000000000000000000000000000000000000..915df90809ca5614393c851da2603920893c4251
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityToVariant.java
@@ -0,0 +1,44 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.entity;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.function.IntFunction;
+
+public final class ConverterEntityToVariant extends DataConverter<MapType, MapType> {
+
+ public final String path;
+ public final IntFunction<String> conversion;
+
+ public ConverterEntityToVariant(final int toVersion, final String path, final IntFunction<String> conversion) {
+ super(toVersion);
+ this.path = path;
+ this.conversion = conversion;
+ }
+
+ public ConverterEntityToVariant(final int toVersion, final int versionStep, final String path, final IntFunction<String> conversion) {
+ super(toVersion, versionStep);
+ this.path = path;
+ this.conversion = conversion;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final Number value = data.getNumber(this.path);
+ if (value == null) {
+ // nothing to do, DFU does the same
+ return null;
+ }
+
+ final String converted = this.conversion.apply(value.intValue());
+
+ if (converted == null) {
+ throw new NullPointerException("Conversion " + this.conversion + " cannot return null value!");
+ }
+
+ // DFU doesn't appear to remove the old field, so why should we?
+
+ data.setString("variant", converted);
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityVariantRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityVariantRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..81385ba3acb471437eb36cd289ad0548cb59b93b
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityVariantRename.java
@@ -0,0 +1,37 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.entity;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.function.Function;
+
+public final class ConverterEntityVariantRename extends DataConverter<MapType, MapType> {
+
+ private final Function<String, String> renamer;
+
+ public ConverterEntityVariantRename(final int toVersion, final Function<String, String> renamer) {
+ super(toVersion);
+ this.renamer = renamer;
+ }
+
+ public ConverterEntityVariantRename(final int toVersion, final int versionStep, final Function<String, String> renamer) {
+ super(toVersion, versionStep);
+ this.renamer = renamer;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String variant = data.getString("variant");
+
+ if (variant == null) {
+ return null;
+ }
+
+ final String rename = this.renamer.apply(variant);
+
+ if (rename != null) {
+ data.setString("variant", rename);
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterFlattenEntity.java b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterFlattenEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..610cafc176ca951b49b0db1b9f9386d3c3fa2ce3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterFlattenEntity.java
@@ -0,0 +1,371 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.entity;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public final class ConverterFlattenEntity extends DataConverter<MapType, MapType> {
+
+ private static final Map<String, Integer> BLOCK_NAME_TO_ID = new HashMap<>();
+ static {
+ BLOCK_NAME_TO_ID.put("minecraft:air", 0);
+ BLOCK_NAME_TO_ID.put("minecraft:stone", 1);
+ BLOCK_NAME_TO_ID.put("minecraft:grass", 2);
+ BLOCK_NAME_TO_ID.put("minecraft:dirt", 3);
+ BLOCK_NAME_TO_ID.put("minecraft:cobblestone", 4);
+ BLOCK_NAME_TO_ID.put("minecraft:planks", 5);
+ BLOCK_NAME_TO_ID.put("minecraft:sapling", 6);
+ BLOCK_NAME_TO_ID.put("minecraft:bedrock", 7);
+ BLOCK_NAME_TO_ID.put("minecraft:flowing_water", 8);
+ BLOCK_NAME_TO_ID.put("minecraft:water", 9);
+ BLOCK_NAME_TO_ID.put("minecraft:flowing_lava", 10);
+ BLOCK_NAME_TO_ID.put("minecraft:lava", 11);
+ BLOCK_NAME_TO_ID.put("minecraft:sand", 12);
+ BLOCK_NAME_TO_ID.put("minecraft:gravel", 13);
+ BLOCK_NAME_TO_ID.put("minecraft:gold_ore", 14);
+ BLOCK_NAME_TO_ID.put("minecraft:iron_ore", 15);
+ BLOCK_NAME_TO_ID.put("minecraft:coal_ore", 16);
+ BLOCK_NAME_TO_ID.put("minecraft:log", 17);
+ BLOCK_NAME_TO_ID.put("minecraft:leaves", 18);
+ BLOCK_NAME_TO_ID.put("minecraft:sponge", 19);
+ BLOCK_NAME_TO_ID.put("minecraft:glass", 20);
+ BLOCK_NAME_TO_ID.put("minecraft:lapis_ore", 21);
+ BLOCK_NAME_TO_ID.put("minecraft:lapis_block", 22);
+ BLOCK_NAME_TO_ID.put("minecraft:dispenser", 23);
+ BLOCK_NAME_TO_ID.put("minecraft:sandstone", 24);
+ BLOCK_NAME_TO_ID.put("minecraft:noteblock", 25);
+ BLOCK_NAME_TO_ID.put("minecraft:bed", 26);
+ BLOCK_NAME_TO_ID.put("minecraft:golden_rail", 27);
+ BLOCK_NAME_TO_ID.put("minecraft:detector_rail", 28);
+ BLOCK_NAME_TO_ID.put("minecraft:sticky_piston", 29);
+ BLOCK_NAME_TO_ID.put("minecraft:web", 30);
+ BLOCK_NAME_TO_ID.put("minecraft:tallgrass", 31);
+ BLOCK_NAME_TO_ID.put("minecraft:deadbush", 32);
+ BLOCK_NAME_TO_ID.put("minecraft:piston", 33);
+ BLOCK_NAME_TO_ID.put("minecraft:piston_head", 34);
+ BLOCK_NAME_TO_ID.put("minecraft:wool", 35);
+ BLOCK_NAME_TO_ID.put("minecraft:piston_extension", 36);
+ BLOCK_NAME_TO_ID.put("minecraft:yellow_flower", 37);
+ BLOCK_NAME_TO_ID.put("minecraft:red_flower", 38);
+ BLOCK_NAME_TO_ID.put("minecraft:brown_mushroom", 39);
+ BLOCK_NAME_TO_ID.put("minecraft:red_mushroom", 40);
+ BLOCK_NAME_TO_ID.put("minecraft:gold_block", 41);
+ BLOCK_NAME_TO_ID.put("minecraft:iron_block", 42);
+ BLOCK_NAME_TO_ID.put("minecraft:double_stone_slab", 43);
+ BLOCK_NAME_TO_ID.put("minecraft:stone_slab", 44);
+ BLOCK_NAME_TO_ID.put("minecraft:brick_block", 45);
+ BLOCK_NAME_TO_ID.put("minecraft:tnt", 46);
+ BLOCK_NAME_TO_ID.put("minecraft:bookshelf", 47);
+ BLOCK_NAME_TO_ID.put("minecraft:mossy_cobblestone", 48);
+ BLOCK_NAME_TO_ID.put("minecraft:obsidian", 49);
+ BLOCK_NAME_TO_ID.put("minecraft:torch", 50);
+ BLOCK_NAME_TO_ID.put("minecraft:fire", 51);
+ BLOCK_NAME_TO_ID.put("minecraft:mob_spawner", 52);
+ BLOCK_NAME_TO_ID.put("minecraft:oak_stairs", 53);
+ BLOCK_NAME_TO_ID.put("minecraft:chest", 54);
+ BLOCK_NAME_TO_ID.put("minecraft:redstone_wire", 55);
+ BLOCK_NAME_TO_ID.put("minecraft:diamond_ore", 56);
+ BLOCK_NAME_TO_ID.put("minecraft:diamond_block", 57);
+ BLOCK_NAME_TO_ID.put("minecraft:crafting_table", 58);
+ BLOCK_NAME_TO_ID.put("minecraft:wheat", 59);
+ BLOCK_NAME_TO_ID.put("minecraft:farmland", 60);
+ BLOCK_NAME_TO_ID.put("minecraft:furnace", 61);
+ BLOCK_NAME_TO_ID.put("minecraft:lit_furnace", 62);
+ BLOCK_NAME_TO_ID.put("minecraft:standing_sign", 63);
+ BLOCK_NAME_TO_ID.put("minecraft:wooden_door", 64);
+ BLOCK_NAME_TO_ID.put("minecraft:ladder", 65);
+ BLOCK_NAME_TO_ID.put("minecraft:rail", 66);
+ BLOCK_NAME_TO_ID.put("minecraft:stone_stairs", 67);
+ BLOCK_NAME_TO_ID.put("minecraft:wall_sign", 68);
+ BLOCK_NAME_TO_ID.put("minecraft:lever", 69);
+ BLOCK_NAME_TO_ID.put("minecraft:stone_pressure_plate", 70);
+ BLOCK_NAME_TO_ID.put("minecraft:iron_door", 71);
+ BLOCK_NAME_TO_ID.put("minecraft:wooden_pressure_plate", 72);
+ BLOCK_NAME_TO_ID.put("minecraft:redstone_ore", 73);
+ BLOCK_NAME_TO_ID.put("minecraft:lit_redstone_ore", 74);
+ BLOCK_NAME_TO_ID.put("minecraft:unlit_redstone_torch", 75);
+ BLOCK_NAME_TO_ID.put("minecraft:redstone_torch", 76);
+ BLOCK_NAME_TO_ID.put("minecraft:stone_button", 77);
+ BLOCK_NAME_TO_ID.put("minecraft:snow_layer", 78);
+ BLOCK_NAME_TO_ID.put("minecraft:ice", 79);
+ BLOCK_NAME_TO_ID.put("minecraft:snow", 80);
+ BLOCK_NAME_TO_ID.put("minecraft:cactus", 81);
+ BLOCK_NAME_TO_ID.put("minecraft:clay", 82);
+ BLOCK_NAME_TO_ID.put("minecraft:reeds", 83);
+ BLOCK_NAME_TO_ID.put("minecraft:jukebox", 84);
+ BLOCK_NAME_TO_ID.put("minecraft:fence", 85);
+ BLOCK_NAME_TO_ID.put("minecraft:pumpkin", 86);
+ BLOCK_NAME_TO_ID.put("minecraft:netherrack", 87);
+ BLOCK_NAME_TO_ID.put("minecraft:soul_sand", 88);
+ BLOCK_NAME_TO_ID.put("minecraft:glowstone", 89);
+ BLOCK_NAME_TO_ID.put("minecraft:portal", 90);
+ BLOCK_NAME_TO_ID.put("minecraft:lit_pumpkin", 91);
+ BLOCK_NAME_TO_ID.put("minecraft:cake", 92);
+ BLOCK_NAME_TO_ID.put("minecraft:unpowered_repeater", 93);
+ BLOCK_NAME_TO_ID.put("minecraft:powered_repeater", 94);
+ BLOCK_NAME_TO_ID.put("minecraft:stained_glass", 95);
+ BLOCK_NAME_TO_ID.put("minecraft:trapdoor", 96);
+ BLOCK_NAME_TO_ID.put("minecraft:monster_egg", 97);
+ BLOCK_NAME_TO_ID.put("minecraft:stonebrick", 98);
+ BLOCK_NAME_TO_ID.put("minecraft:brown_mushroom_block", 99);
+ BLOCK_NAME_TO_ID.put("minecraft:red_mushroom_block", 100);
+ BLOCK_NAME_TO_ID.put("minecraft:iron_bars", 101);
+ BLOCK_NAME_TO_ID.put("minecraft:glass_pane", 102);
+ BLOCK_NAME_TO_ID.put("minecraft:melon_block", 103);
+ BLOCK_NAME_TO_ID.put("minecraft:pumpkin_stem", 104);
+ BLOCK_NAME_TO_ID.put("minecraft:melon_stem", 105);
+ BLOCK_NAME_TO_ID.put("minecraft:vine", 106);
+ BLOCK_NAME_TO_ID.put("minecraft:fence_gate", 107);
+ BLOCK_NAME_TO_ID.put("minecraft:brick_stairs", 108);
+ BLOCK_NAME_TO_ID.put("minecraft:stone_brick_stairs", 109);
+ BLOCK_NAME_TO_ID.put("minecraft:mycelium", 110);
+ BLOCK_NAME_TO_ID.put("minecraft:waterlily", 111);
+ BLOCK_NAME_TO_ID.put("minecraft:nether_brick", 112);
+ BLOCK_NAME_TO_ID.put("minecraft:nether_brick_fence", 113);
+ BLOCK_NAME_TO_ID.put("minecraft:nether_brick_stairs", 114);
+ BLOCK_NAME_TO_ID.put("minecraft:nether_wart", 115);
+ BLOCK_NAME_TO_ID.put("minecraft:enchanting_table", 116);
+ BLOCK_NAME_TO_ID.put("minecraft:brewing_stand", 117);
+ BLOCK_NAME_TO_ID.put("minecraft:cauldron", 118);
+ BLOCK_NAME_TO_ID.put("minecraft:end_portal", 119);
+ BLOCK_NAME_TO_ID.put("minecraft:end_portal_frame", 120);
+ BLOCK_NAME_TO_ID.put("minecraft:end_stone", 121);
+ BLOCK_NAME_TO_ID.put("minecraft:dragon_egg", 122);
+ BLOCK_NAME_TO_ID.put("minecraft:redstone_lamp", 123);
+ BLOCK_NAME_TO_ID.put("minecraft:lit_redstone_lamp", 124);
+ BLOCK_NAME_TO_ID.put("minecraft:double_wooden_slab", 125);
+ BLOCK_NAME_TO_ID.put("minecraft:wooden_slab", 126);
+ BLOCK_NAME_TO_ID.put("minecraft:cocoa", 127);
+ BLOCK_NAME_TO_ID.put("minecraft:sandstone_stairs", 128);
+ BLOCK_NAME_TO_ID.put("minecraft:emerald_ore", 129);
+ BLOCK_NAME_TO_ID.put("minecraft:ender_chest", 130);
+ BLOCK_NAME_TO_ID.put("minecraft:tripwire_hook", 131);
+ BLOCK_NAME_TO_ID.put("minecraft:tripwire", 132);
+ BLOCK_NAME_TO_ID.put("minecraft:emerald_block", 133);
+ BLOCK_NAME_TO_ID.put("minecraft:spruce_stairs", 134);
+ BLOCK_NAME_TO_ID.put("minecraft:birch_stairs", 135);
+ BLOCK_NAME_TO_ID.put("minecraft:jungle_stairs", 136);
+ BLOCK_NAME_TO_ID.put("minecraft:command_block", 137);
+ BLOCK_NAME_TO_ID.put("minecraft:beacon", 138);
+ BLOCK_NAME_TO_ID.put("minecraft:cobblestone_wall", 139);
+ BLOCK_NAME_TO_ID.put("minecraft:flower_pot", 140);
+ BLOCK_NAME_TO_ID.put("minecraft:carrots", 141);
+ BLOCK_NAME_TO_ID.put("minecraft:potatoes", 142);
+ BLOCK_NAME_TO_ID.put("minecraft:wooden_button", 143);
+ BLOCK_NAME_TO_ID.put("minecraft:skull", 144);
+ BLOCK_NAME_TO_ID.put("minecraft:anvil", 145);
+ BLOCK_NAME_TO_ID.put("minecraft:trapped_chest", 146);
+ BLOCK_NAME_TO_ID.put("minecraft:light_weighted_pressure_plate", 147);
+ BLOCK_NAME_TO_ID.put("minecraft:heavy_weighted_pressure_plate", 148);
+ BLOCK_NAME_TO_ID.put("minecraft:unpowered_comparator", 149);
+ BLOCK_NAME_TO_ID.put("minecraft:powered_comparator", 150);
+ BLOCK_NAME_TO_ID.put("minecraft:daylight_detector", 151);
+ BLOCK_NAME_TO_ID.put("minecraft:redstone_block", 152);
+ BLOCK_NAME_TO_ID.put("minecraft:quartz_ore", 153);
+ BLOCK_NAME_TO_ID.put("minecraft:hopper", 154);
+ BLOCK_NAME_TO_ID.put("minecraft:quartz_block", 155);
+ BLOCK_NAME_TO_ID.put("minecraft:quartz_stairs", 156);
+ BLOCK_NAME_TO_ID.put("minecraft:activator_rail", 157);
+ BLOCK_NAME_TO_ID.put("minecraft:dropper", 158);
+ BLOCK_NAME_TO_ID.put("minecraft:stained_hardened_clay", 159);
+ BLOCK_NAME_TO_ID.put("minecraft:stained_glass_pane", 160);
+ BLOCK_NAME_TO_ID.put("minecraft:leaves2", 161);
+ BLOCK_NAME_TO_ID.put("minecraft:log2", 162);
+ BLOCK_NAME_TO_ID.put("minecraft:acacia_stairs", 163);
+ BLOCK_NAME_TO_ID.put("minecraft:dark_oak_stairs", 164);
+ BLOCK_NAME_TO_ID.put("minecraft:slime", 165);
+ BLOCK_NAME_TO_ID.put("minecraft:barrier", 166);
+ BLOCK_NAME_TO_ID.put("minecraft:iron_trapdoor", 167);
+ BLOCK_NAME_TO_ID.put("minecraft:prismarine", 168);
+ BLOCK_NAME_TO_ID.put("minecraft:sea_lantern", 169);
+ BLOCK_NAME_TO_ID.put("minecraft:hay_block", 170);
+ BLOCK_NAME_TO_ID.put("minecraft:carpet", 171);
+ BLOCK_NAME_TO_ID.put("minecraft:hardened_clay", 172);
+ BLOCK_NAME_TO_ID.put("minecraft:coal_block", 173);
+ BLOCK_NAME_TO_ID.put("minecraft:packed_ice", 174);
+ BLOCK_NAME_TO_ID.put("minecraft:double_plant", 175);
+ BLOCK_NAME_TO_ID.put("minecraft:standing_banner", 176);
+ BLOCK_NAME_TO_ID.put("minecraft:wall_banner", 177);
+ BLOCK_NAME_TO_ID.put("minecraft:daylight_detector_inverted", 178);
+ BLOCK_NAME_TO_ID.put("minecraft:red_sandstone", 179);
+ BLOCK_NAME_TO_ID.put("minecraft:red_sandstone_stairs", 180);
+ BLOCK_NAME_TO_ID.put("minecraft:double_stone_slab2", 181);
+ BLOCK_NAME_TO_ID.put("minecraft:stone_slab2", 182);
+ BLOCK_NAME_TO_ID.put("minecraft:spruce_fence_gate", 183);
+ BLOCK_NAME_TO_ID.put("minecraft:birch_fence_gate", 184);
+ BLOCK_NAME_TO_ID.put("minecraft:jungle_fence_gate", 185);
+ BLOCK_NAME_TO_ID.put("minecraft:dark_oak_fence_gate", 186);
+ BLOCK_NAME_TO_ID.put("minecraft:acacia_fence_gate", 187);
+ BLOCK_NAME_TO_ID.put("minecraft:spruce_fence", 188);
+ BLOCK_NAME_TO_ID.put("minecraft:birch_fence", 189);
+ BLOCK_NAME_TO_ID.put("minecraft:jungle_fence", 190);
+ BLOCK_NAME_TO_ID.put("minecraft:dark_oak_fence", 191);
+ BLOCK_NAME_TO_ID.put("minecraft:acacia_fence", 192);
+ BLOCK_NAME_TO_ID.put("minecraft:spruce_door", 193);
+ BLOCK_NAME_TO_ID.put("minecraft:birch_door", 194);
+ BLOCK_NAME_TO_ID.put("minecraft:jungle_door", 195);
+ BLOCK_NAME_TO_ID.put("minecraft:acacia_door", 196);
+ BLOCK_NAME_TO_ID.put("minecraft:dark_oak_door", 197);
+ BLOCK_NAME_TO_ID.put("minecraft:end_rod", 198);
+ BLOCK_NAME_TO_ID.put("minecraft:chorus_plant", 199);
+ BLOCK_NAME_TO_ID.put("minecraft:chorus_flower", 200);
+ BLOCK_NAME_TO_ID.put("minecraft:purpur_block", 201);
+ BLOCK_NAME_TO_ID.put("minecraft:purpur_pillar", 202);
+ BLOCK_NAME_TO_ID.put("minecraft:purpur_stairs", 203);
+ BLOCK_NAME_TO_ID.put("minecraft:purpur_double_slab", 204);
+ BLOCK_NAME_TO_ID.put("minecraft:purpur_slab", 205);
+ BLOCK_NAME_TO_ID.put("minecraft:end_bricks", 206);
+ BLOCK_NAME_TO_ID.put("minecraft:beetroots", 207);
+ BLOCK_NAME_TO_ID.put("minecraft:grass_path", 208);
+ BLOCK_NAME_TO_ID.put("minecraft:end_gateway", 209);
+ BLOCK_NAME_TO_ID.put("minecraft:repeating_command_block", 210);
+ BLOCK_NAME_TO_ID.put("minecraft:chain_command_block", 211);
+ BLOCK_NAME_TO_ID.put("minecraft:frosted_ice", 212);
+ BLOCK_NAME_TO_ID.put("minecraft:magma", 213);
+ BLOCK_NAME_TO_ID.put("minecraft:nether_wart_block", 214);
+ BLOCK_NAME_TO_ID.put("minecraft:red_nether_brick", 215);
+ BLOCK_NAME_TO_ID.put("minecraft:bone_block", 216);
+ BLOCK_NAME_TO_ID.put("minecraft:structure_void", 217);
+ BLOCK_NAME_TO_ID.put("minecraft:observer", 218);
+ BLOCK_NAME_TO_ID.put("minecraft:white_shulker_box", 219);
+ BLOCK_NAME_TO_ID.put("minecraft:orange_shulker_box", 220);
+ BLOCK_NAME_TO_ID.put("minecraft:magenta_shulker_box", 221);
+ BLOCK_NAME_TO_ID.put("minecraft:light_blue_shulker_box", 222);
+ BLOCK_NAME_TO_ID.put("minecraft:yellow_shulker_box", 223);
+ BLOCK_NAME_TO_ID.put("minecraft:lime_shulker_box", 224);
+ BLOCK_NAME_TO_ID.put("minecraft:pink_shulker_box", 225);
+ BLOCK_NAME_TO_ID.put("minecraft:gray_shulker_box", 226);
+ BLOCK_NAME_TO_ID.put("minecraft:silver_shulker_box", 227);
+ BLOCK_NAME_TO_ID.put("minecraft:cyan_shulker_box", 228);
+ BLOCK_NAME_TO_ID.put("minecraft:purple_shulker_box", 229);
+ BLOCK_NAME_TO_ID.put("minecraft:blue_shulker_box", 230);
+ BLOCK_NAME_TO_ID.put("minecraft:brown_shulker_box", 231);
+ BLOCK_NAME_TO_ID.put("minecraft:green_shulker_box", 232);
+ BLOCK_NAME_TO_ID.put("minecraft:red_shulker_box", 233);
+ BLOCK_NAME_TO_ID.put("minecraft:black_shulker_box", 234);
+ BLOCK_NAME_TO_ID.put("minecraft:white_glazed_terracotta", 235);
+ BLOCK_NAME_TO_ID.put("minecraft:orange_glazed_terracotta", 236);
+ BLOCK_NAME_TO_ID.put("minecraft:magenta_glazed_terracotta", 237);
+ BLOCK_NAME_TO_ID.put("minecraft:light_blue_glazed_terracotta", 238);
+ BLOCK_NAME_TO_ID.put("minecraft:yellow_glazed_terracotta", 239);
+ BLOCK_NAME_TO_ID.put("minecraft:lime_glazed_terracotta", 240);
+ BLOCK_NAME_TO_ID.put("minecraft:pink_glazed_terracotta", 241);
+ BLOCK_NAME_TO_ID.put("minecraft:gray_glazed_terracotta", 242);
+ BLOCK_NAME_TO_ID.put("minecraft:silver_glazed_terracotta", 243);
+ BLOCK_NAME_TO_ID.put("minecraft:cyan_glazed_terracotta", 244);
+ BLOCK_NAME_TO_ID.put("minecraft:purple_glazed_terracotta", 245);
+ BLOCK_NAME_TO_ID.put("minecraft:blue_glazed_terracotta", 246);
+ BLOCK_NAME_TO_ID.put("minecraft:brown_glazed_terracotta", 247);
+ BLOCK_NAME_TO_ID.put("minecraft:green_glazed_terracotta", 248);
+ BLOCK_NAME_TO_ID.put("minecraft:red_glazed_terracotta", 249);
+ BLOCK_NAME_TO_ID.put("minecraft:black_glazed_terracotta", 250);
+ BLOCK_NAME_TO_ID.put("minecraft:concrete", 251);
+ BLOCK_NAME_TO_ID.put("minecraft:concrete_powder", 252);
+ BLOCK_NAME_TO_ID.put("minecraft:structure_block", 255);
+ }
+
+ protected static final int VERSION = MCVersions.V17W47A;
+
+ protected final String[] paths;
+
+ public ConverterFlattenEntity(final String... paths) {
+ super(VERSION, 3);
+ this.paths = paths;
+ }
+
+ private static void register(final String id, final String... paths) {
+ MCTypeRegistry.ENTITY.addConverterForId(id, new ConverterFlattenEntity(paths));
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:falling_block", new DataConverter<>(VERSION, 3) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int blockId;
+ if (data.hasKey("Block")) {
+ final Number id = data.getNumber("Block");
+ if (id != null) {
+ blockId = id.intValue();
+ } else {
+ blockId = getBlockId(data.getString("Block"));
+ }
+ } else {
+ final Number tileId = data.getNumber("TileID");
+ if (tileId != null) {
+ blockId = tileId.intValue();
+ } else {
+ blockId = data.getByte("Tile") & 255;
+ }
+ }
+
+ final int blockData = data.getInt("Data") & 15;
+
+ data.remove("Block"); // from type update
+ data.remove("Data");
+ data.remove("TileID");
+ data.remove("Tile");
+
+ // key is from type update
+ data.setMap("BlockState", HelperBlockFlatteningV1450.getNBTForId((blockId << 4) | blockData).copy()); // copy to avoid problems with later state datafixers
+
+ return null;
+ }
+ });
+ register("minecraft:enderman", "carried", "carriedData", "carriedBlockState");
+ register("minecraft:arrow", "inTile", "inData", "inBlockState");
+ register("minecraft:spectral_arrow", "inTile", "inData", "inBlockState");
+ register("minecraft:egg", "inTile");
+ register("minecraft:ender_pearl", "inTile");
+ register("minecraft:fireball", "inTile");
+ register("minecraft:potion", "inTile");
+ register("minecraft:small_fireball", "inTile");
+ register("minecraft:snowball", "inTile");
+ register("minecraft:wither_skull", "inTile");
+ register("minecraft:xp_bottle", "inTile");
+ register("minecraft:commandblock_minecart", "DisplayTile", "DisplayData", "DisplayState");
+ register("minecraft:minecart", "DisplayTile", "DisplayData", "DisplayState");
+ register("minecraft:chest_minecart", "DisplayTile", "DisplayData", "DisplayState");
+ register("minecraft:furnace_minecart", "DisplayTile", "DisplayData", "DisplayState");
+ register("minecraft:tnt_minecart", "DisplayTile", "DisplayData", "DisplayState");
+ register("minecraft:hopper_minecart", "DisplayTile", "DisplayData", "DisplayState");
+ register("minecraft:spawner_minecart", "DisplayTile", "DisplayData", "DisplayState");
+ }
+
+ public static int getBlockId(final String block) {
+ final Integer ret = BLOCK_NAME_TO_ID.get(block);
+ return ret == null ? 0 : ret.intValue();
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (this.paths.length == 1) {
+ data.remove(this.paths[0]);
+ return null;
+ }
+ final String idPath = this.paths[0];
+ final String dataPath = this.paths[1];
+ final String outputStatePath = this.paths[2];
+
+ final int blockId;
+ if (data.hasKey(idPath, ObjectType.NUMBER)) {
+ blockId = data.getInt(idPath);
+ } else {
+ blockId = getBlockId(data.getString(idPath));
+ }
+
+ final int blockData = data.getInt(dataPath) & 15;
+
+ data.remove(idPath); // from type update
+ data.remove(dataPath);
+
+ data.setMap(outputStatePath, HelperBlockFlatteningV1450.getNBTForId((blockId << 4) | blockData).copy()); // copy to avoid problems with later state datafixers
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/AddFlagIfAbsent.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/AddFlagIfAbsent.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ebc450551fe75bc3d22c8162eda91bd4105b80a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/AddFlagIfAbsent.java
@@ -0,0 +1,30 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.helpers;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class AddFlagIfAbsent extends DataConverter<MapType, MapType> {
+
+ public final String path;
+ public final boolean dfl;
+
+ public AddFlagIfAbsent(final int toVersion, final String path, final boolean dfl) {
+ super(toVersion);
+ this.path = path;
+ this.dfl = dfl;
+ }
+
+ public AddFlagIfAbsent(final int toVersion, final int versionStep, final String path, final boolean dfl) {
+ super(toVersion, versionStep);
+ this.path = path;
+ this.dfl = dfl;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!data.hasKey(this.path)) {
+ data.setBoolean(this.path, this.dfl);
+ }
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/ConverterAbstractStringValueTypeRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/ConverterAbstractStringValueTypeRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc79670f47aaa413ea3e96ef6a32e14099ad8a58
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/ConverterAbstractStringValueTypeRename.java
@@ -0,0 +1,24 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.helpers;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCValueType;
+import java.util.function.Function;
+
+public final class ConverterAbstractStringValueTypeRename {
+
+ private ConverterAbstractStringValueTypeRename() {}
+
+ public static void register(final int version, final MCValueType type, final Function<String, String> renamer) {
+ register(version, 0, type, renamer);
+ }
+ public static void register(final int version, final int subVersion, final MCValueType type, final Function<String, String> renamer) {
+ type.addConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public Object convert(final Object data, final long sourceVersion, final long toVersion) {
+ final String ret = (data instanceof String) ? renamer.apply((String)data) : null;
+ return ret == data ? null : ret;
+ }
+ });
+ }
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/CopyHelper.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/CopyHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..549c997463df2d5c9e0d1c29a6df8ba8eeecfce8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/CopyHelper.java
@@ -0,0 +1,79 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.helpers;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class CopyHelper {
+
+ // sets value at dstPath in dst to a copied value of the value at srcPath in src
+ public static boolean copy(final MapType src, final String srcPath, final MapType dst, final String dstPath) {
+ final Object val = src.getGeneric(srcPath);
+ if (val == null) {
+ dst.remove(dstPath);
+ return false;
+ }
+
+ dst.setGeneric(dstPath, copyGeneric(val));
+ return true;
+ }
+
+ // moves the value at dstPath in dst to srcPath in src
+ public static boolean move(final MapType src, final String srcPath, final MapType dst, final String dstPath) {
+ final Object val = src.getGeneric(srcPath);
+ src.remove(srcPath);
+ if (val == null) {
+ dst.remove(dstPath);
+ return false;
+ }
+
+ dst.setGeneric(dstPath, val);
+ return true;
+ }
+
+ public static Number sanitizeNumber(final Number input) {
+ return switch (input) {
+ case Byte b -> b;
+ case Short s -> s;
+ case Integer i -> i;
+ case Long l -> l;
+ case Float f -> f;
+ case Double d -> d;
+ default -> null;
+ };
+ }
+
+ public static Object copyGeneric(final Object value) {
+ if (value == null || value instanceof String || value instanceof Boolean) {
+ // immutable
+ return value;
+ }
+ if (value instanceof Number number) {
+ if (sanitizeNumber(number) == null) {
+ throw new IllegalArgumentException("Unknown type: " + value.getClass());
+ }
+ return number;
+ }
+
+ if (value instanceof MapType mapType) {
+ return mapType.copy();
+ }
+
+ if (value instanceof ListType listType) {
+ return listType.copy();
+ }
+
+ if (value.getClass().isArray()) {
+ if (value instanceof byte[] bytes) {
+ return bytes.clone();
+ } else if (value instanceof short[] shorts) {
+ return shorts.clone();
+ } else if (value instanceof int[] ints) {
+ return ints.clone();
+ } else if (value instanceof long[] longs) {
+ return longs.clone();
+ } // else: fall through to throw
+ }
+
+ throw new IllegalArgumentException("Unknown type: " + value.getClass());
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperBlockFlatteningV1450.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperBlockFlatteningV1450.java
new file mode 100644
index 0000000000000000000000000000000000000000..f632da9870305e96d51f7b5abd33749a4a15916d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperBlockFlatteningV1450.java
@@ -0,0 +1,1829 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.helpers;
+
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.nbt.NBTMapType;
+import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import net.minecraft.nbt.TagParser;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class HelperBlockFlatteningV1450 {
+
+ protected static final MapType[] FLATTENED_BY_ID = new MapType[4096];
+ protected static final MapType[] BLOCK_DEFAULTS = new MapType[4096];
+
+ private static final Object2IntOpenHashMap<MapType> ID_BY_OLD_NBT = new Object2IntOpenHashMap<MapType>(64, 0.7f) {
+ @Override
+ public int put(final MapType o, final int v) {
+ if (this.containsKey(o)) {
+ throw new RuntimeException("Already contains mapping for " + o);
+ }
+
+ return super.put(o, v);
+ }
+ };
+ static {
+ ID_BY_OLD_NBT.defaultReturnValue(-1);
+ }
+
+ private static final Object2IntOpenHashMap<String> ID_BY_OLD_NAME = new Object2IntOpenHashMap<String>(64, 0.7f) {
+ @Override
+ public int put(final String o, final int v) {
+ if (this.containsKey(o)) {
+ throw new RuntimeException("Already contains mapping for " + o);
+ }
+
+ return super.put(o, v);
+ }
+ };
+ static {
+ ID_BY_OLD_NAME.defaultReturnValue(-1);
+ }
+
+ // map used to ensure that each parsed block state contains no duplicates
+ protected static final Map<MapType, MapType> IDENTITY_ENSURE = new HashMap<>();
+
+ public static MapType parseTag(final String blockstate) {
+ try {
+ final MapType ret = new NBTMapType(TagParser.parseCompoundFully(blockstate.replace('\'', '"')));
+
+ synchronized (IDENTITY_ENSURE) {
+ final MapType identity = IDENTITY_ENSURE.putIfAbsent(ret, ret);
+
+ return identity == null ? ret : identity;
+ }
+
+ } catch (final Exception ex) {
+ throw new RuntimeException("Exception parsing " + blockstate, ex);
+ }
+ }
+
+ private static void register(final int id, final String flattened, final String... preFlattenings) {
+ final MapType flattenedNBT = parseTag(flattened);
+ if (FLATTENED_BY_ID[id] != null) {
+ throw new RuntimeException("Mapping already exists for id " + id);
+ }
+ FLATTENED_BY_ID[id] = flattenedNBT;
+
+ // it's important that we register ids from smallest to largest, so that
+ // the default is going to be correct
+ final int block = id >> 4;
+ if (BLOCK_DEFAULTS[block] == null) {
+ BLOCK_DEFAULTS[block] = flattenedNBT;
+ }
+
+ for (final String preFlattening : preFlattenings) {
+ final MapType preFlatteningNBT = parseTag(preFlattening);
+ final String name = preFlatteningNBT.getString("Name");
+ if (name == null) {
+ throw new RuntimeException("Name does not exist for pre flattenings for id " + id);
+ }
+
+ // putIfAbsent so we default to the lowest id, which is going to be the block default
+ ID_BY_OLD_NAME.putIfAbsent(name, id);
+ ID_BY_OLD_NBT.put(preFlatteningNBT, id);
+ }
+ }
+
+ private static void finalizeMaps() {
+ for(int i = 0; i < FLATTENED_BY_ID.length; ++i) {
+ if (FLATTENED_BY_ID[i] == null) {
+ FLATTENED_BY_ID[i] = BLOCK_DEFAULTS[i >> 4];
+ }
+ }
+ }
+
+ public static MapType flattenNBT(final MapType old) {
+ final int id = ID_BY_OLD_NBT.getInt(old);
+ final MapType ret = getNBTForIdRaw(id);
+
+ return ret == null ? old : ret;
+ }
+
+ public static String getNewBlockName(final String old) {
+ final int id = ID_BY_OLD_NAME.getInt(old);
+ final MapType ret = getNBTForIdRaw(id);
+ return ret == null ? old : ret.getString("Name");
+ }
+
+ public static String getNameForId(final int block) {
+ final MapType nbt = getNBTForIdRaw(block);
+ return nbt == null ? "minecraft:air" : nbt.getString("Name");
+ }
+
+ protected static MapType getNBTForIdRaw(final int block) {
+ return block >= 0 && block < FLATTENED_BY_ID.length ? FLATTENED_BY_ID[block] : null;
+ }
+
+ public static MapType getNBTForId(final int block) {
+ MapType ret = getNBTForIdRaw(block);
+ return ret == null ? FLATTENED_BY_ID[0] : ret;
+ }
+
+ private HelperBlockFlatteningV1450() {}
+
+ static {
+ ID_BY_OLD_NBT.defaultReturnValue(-1);
+ register(0, "{Name:'minecraft:air'}", "{Name:'minecraft:air'}");
+ register(16, "{Name:'minecraft:stone'}", "{Name:'minecraft:stone',Properties:{variant:'stone'}}");
+ register(17, "{Name:'minecraft:granite'}", "{Name:'minecraft:stone',Properties:{variant:'granite'}}");
+ register(18, "{Name:'minecraft:polished_granite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_granite'}}");
+ register(19, "{Name:'minecraft:diorite'}", "{Name:'minecraft:stone',Properties:{variant:'diorite'}}");
+ register(20, "{Name:'minecraft:polished_diorite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_diorite'}}");
+ register(21, "{Name:'minecraft:andesite'}", "{Name:'minecraft:stone',Properties:{variant:'andesite'}}");
+ register(22, "{Name:'minecraft:polished_andesite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_andesite'}}");
+ register(32, "{Name:'minecraft:grass_block',Properties:{snowy:'false'}}", "{Name:'minecraft:grass',Properties:{snowy:'false'}}", "{Name:'minecraft:grass',Properties:{snowy:'true'}}");
+ register(48, "{Name:'minecraft:dirt'}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'dirt'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'dirt'}}");
+ register(49, "{Name:'minecraft:coarse_dirt'}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'coarse_dirt'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'coarse_dirt'}}");
+ register(50, "{Name:'minecraft:podzol',Properties:{snowy:'false'}}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'podzol'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'podzol'}}");
+ register(64, "{Name:'minecraft:cobblestone'}", "{Name:'minecraft:cobblestone'}");
+ register(80, "{Name:'minecraft:oak_planks'}", "{Name:'minecraft:planks',Properties:{variant:'oak'}}");
+ register(81, "{Name:'minecraft:spruce_planks'}", "{Name:'minecraft:planks',Properties:{variant:'spruce'}}");
+ register(82, "{Name:'minecraft:birch_planks'}", "{Name:'minecraft:planks',Properties:{variant:'birch'}}");
+ register(83, "{Name:'minecraft:jungle_planks'}", "{Name:'minecraft:planks',Properties:{variant:'jungle'}}");
+ register(84, "{Name:'minecraft:acacia_planks'}", "{Name:'minecraft:planks',Properties:{variant:'acacia'}}");
+ register(85, "{Name:'minecraft:dark_oak_planks'}", "{Name:'minecraft:planks',Properties:{variant:'dark_oak'}}");
+ register(96, "{Name:'minecraft:oak_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'oak'}}");
+ register(97, "{Name:'minecraft:spruce_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'spruce'}}");
+ register(98, "{Name:'minecraft:birch_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'birch'}}");
+ register(99, "{Name:'minecraft:jungle_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'jungle'}}");
+ register(100, "{Name:'minecraft:acacia_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'acacia'}}");
+ register(101, "{Name:'minecraft:dark_oak_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'dark_oak'}}");
+ register(104, "{Name:'minecraft:oak_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'oak'}}");
+ register(105, "{Name:'minecraft:spruce_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'spruce'}}");
+ register(106, "{Name:'minecraft:birch_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'birch'}}");
+ register(107, "{Name:'minecraft:jungle_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'jungle'}}");
+ register(108, "{Name:'minecraft:acacia_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'acacia'}}");
+ register(109, "{Name:'minecraft:dark_oak_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'dark_oak'}}");
+ register(112, "{Name:'minecraft:bedrock'}", "{Name:'minecraft:bedrock'}");
+ register(128, "{Name:'minecraft:water',Properties:{level:'0'}}", "{Name:'minecraft:flowing_water',Properties:{level:'0'}}");
+ register(129, "{Name:'minecraft:water',Properties:{level:'1'}}", "{Name:'minecraft:flowing_water',Properties:{level:'1'}}");
+ register(130, "{Name:'minecraft:water',Properties:{level:'2'}}", "{Name:'minecraft:flowing_water',Properties:{level:'2'}}");
+ register(131, "{Name:'minecraft:water',Properties:{level:'3'}}", "{Name:'minecraft:flowing_water',Properties:{level:'3'}}");
+ register(132, "{Name:'minecraft:water',Properties:{level:'4'}}", "{Name:'minecraft:flowing_water',Properties:{level:'4'}}");
+ register(133, "{Name:'minecraft:water',Properties:{level:'5'}}", "{Name:'minecraft:flowing_water',Properties:{level:'5'}}");
+ register(134, "{Name:'minecraft:water',Properties:{level:'6'}}", "{Name:'minecraft:flowing_water',Properties:{level:'6'}}");
+ register(135, "{Name:'minecraft:water',Properties:{level:'7'}}", "{Name:'minecraft:flowing_water',Properties:{level:'7'}}");
+ register(136, "{Name:'minecraft:water',Properties:{level:'8'}}", "{Name:'minecraft:flowing_water',Properties:{level:'8'}}");
+ register(137, "{Name:'minecraft:water',Properties:{level:'9'}}", "{Name:'minecraft:flowing_water',Properties:{level:'9'}}");
+ register(138, "{Name:'minecraft:water',Properties:{level:'10'}}", "{Name:'minecraft:flowing_water',Properties:{level:'10'}}");
+ register(139, "{Name:'minecraft:water',Properties:{level:'11'}}", "{Name:'minecraft:flowing_water',Properties:{level:'11'}}");
+ register(140, "{Name:'minecraft:water',Properties:{level:'12'}}", "{Name:'minecraft:flowing_water',Properties:{level:'12'}}");
+ register(141, "{Name:'minecraft:water',Properties:{level:'13'}}", "{Name:'minecraft:flowing_water',Properties:{level:'13'}}");
+ register(142, "{Name:'minecraft:water',Properties:{level:'14'}}", "{Name:'minecraft:flowing_water',Properties:{level:'14'}}");
+ register(143, "{Name:'minecraft:water',Properties:{level:'15'}}", "{Name:'minecraft:flowing_water',Properties:{level:'15'}}");
+ register(144, "{Name:'minecraft:water',Properties:{level:'0'}}", "{Name:'minecraft:water',Properties:{level:'0'}}");
+ register(145, "{Name:'minecraft:water',Properties:{level:'1'}}", "{Name:'minecraft:water',Properties:{level:'1'}}");
+ register(146, "{Name:'minecraft:water',Properties:{level:'2'}}", "{Name:'minecraft:water',Properties:{level:'2'}}");
+ register(147, "{Name:'minecraft:water',Properties:{level:'3'}}", "{Name:'minecraft:water',Properties:{level:'3'}}");
+ register(148, "{Name:'minecraft:water',Properties:{level:'4'}}", "{Name:'minecraft:water',Properties:{level:'4'}}");
+ register(149, "{Name:'minecraft:water',Properties:{level:'5'}}", "{Name:'minecraft:water',Properties:{level:'5'}}");
+ register(150, "{Name:'minecraft:water',Properties:{level:'6'}}", "{Name:'minecraft:water',Properties:{level:'6'}}");
+ register(151, "{Name:'minecraft:water',Properties:{level:'7'}}", "{Name:'minecraft:water',Properties:{level:'7'}}");
+ register(152, "{Name:'minecraft:water',Properties:{level:'8'}}", "{Name:'minecraft:water',Properties:{level:'8'}}");
+ register(153, "{Name:'minecraft:water',Properties:{level:'9'}}", "{Name:'minecraft:water',Properties:{level:'9'}}");
+ register(154, "{Name:'minecraft:water',Properties:{level:'10'}}", "{Name:'minecraft:water',Properties:{level:'10'}}");
+ register(155, "{Name:'minecraft:water',Properties:{level:'11'}}", "{Name:'minecraft:water',Properties:{level:'11'}}");
+ register(156, "{Name:'minecraft:water',Properties:{level:'12'}}", "{Name:'minecraft:water',Properties:{level:'12'}}");
+ register(157, "{Name:'minecraft:water',Properties:{level:'13'}}", "{Name:'minecraft:water',Properties:{level:'13'}}");
+ register(158, "{Name:'minecraft:water',Properties:{level:'14'}}", "{Name:'minecraft:water',Properties:{level:'14'}}");
+ register(159, "{Name:'minecraft:water',Properties:{level:'15'}}", "{Name:'minecraft:water',Properties:{level:'15'}}");
+ register(160, "{Name:'minecraft:lava',Properties:{level:'0'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'0'}}");
+ register(161, "{Name:'minecraft:lava',Properties:{level:'1'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'1'}}");
+ register(162, "{Name:'minecraft:lava',Properties:{level:'2'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'2'}}");
+ register(163, "{Name:'minecraft:lava',Properties:{level:'3'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'3'}}");
+ register(164, "{Name:'minecraft:lava',Properties:{level:'4'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'4'}}");
+ register(165, "{Name:'minecraft:lava',Properties:{level:'5'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'5'}}");
+ register(166, "{Name:'minecraft:lava',Properties:{level:'6'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'6'}}");
+ register(167, "{Name:'minecraft:lava',Properties:{level:'7'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'7'}}");
+ register(168, "{Name:'minecraft:lava',Properties:{level:'8'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'8'}}");
+ register(169, "{Name:'minecraft:lava',Properties:{level:'9'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'9'}}");
+ register(170, "{Name:'minecraft:lava',Properties:{level:'10'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'10'}}");
+ register(171, "{Name:'minecraft:lava',Properties:{level:'11'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'11'}}");
+ register(172, "{Name:'minecraft:lava',Properties:{level:'12'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'12'}}");
+ register(173, "{Name:'minecraft:lava',Properties:{level:'13'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'13'}}");
+ register(174, "{Name:'minecraft:lava',Properties:{level:'14'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'14'}}");
+ register(175, "{Name:'minecraft:lava',Properties:{level:'15'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'15'}}");
+ register(176, "{Name:'minecraft:lava',Properties:{level:'0'}}", "{Name:'minecraft:lava',Properties:{level:'0'}}");
+ register(177, "{Name:'minecraft:lava',Properties:{level:'1'}}", "{Name:'minecraft:lava',Properties:{level:'1'}}");
+ register(178, "{Name:'minecraft:lava',Properties:{level:'2'}}", "{Name:'minecraft:lava',Properties:{level:'2'}}");
+ register(179, "{Name:'minecraft:lava',Properties:{level:'3'}}", "{Name:'minecraft:lava',Properties:{level:'3'}}");
+ register(180, "{Name:'minecraft:lava',Properties:{level:'4'}}", "{Name:'minecraft:lava',Properties:{level:'4'}}");
+ register(181, "{Name:'minecraft:lava',Properties:{level:'5'}}", "{Name:'minecraft:lava',Properties:{level:'5'}}");
+ register(182, "{Name:'minecraft:lava',Properties:{level:'6'}}", "{Name:'minecraft:lava',Properties:{level:'6'}}");
+ register(183, "{Name:'minecraft:lava',Properties:{level:'7'}}", "{Name:'minecraft:lava',Properties:{level:'7'}}");
+ register(184, "{Name:'minecraft:lava',Properties:{level:'8'}}", "{Name:'minecraft:lava',Properties:{level:'8'}}");
+ register(185, "{Name:'minecraft:lava',Properties:{level:'9'}}", "{Name:'minecraft:lava',Properties:{level:'9'}}");
+ register(186, "{Name:'minecraft:lava',Properties:{level:'10'}}", "{Name:'minecraft:lava',Properties:{level:'10'}}");
+ register(187, "{Name:'minecraft:lava',Properties:{level:'11'}}", "{Name:'minecraft:lava',Properties:{level:'11'}}");
+ register(188, "{Name:'minecraft:lava',Properties:{level:'12'}}", "{Name:'minecraft:lava',Properties:{level:'12'}}");
+ register(189, "{Name:'minecraft:lava',Properties:{level:'13'}}", "{Name:'minecraft:lava',Properties:{level:'13'}}");
+ register(190, "{Name:'minecraft:lava',Properties:{level:'14'}}", "{Name:'minecraft:lava',Properties:{level:'14'}}");
+ register(191, "{Name:'minecraft:lava',Properties:{level:'15'}}", "{Name:'minecraft:lava',Properties:{level:'15'}}");
+ register(192, "{Name:'minecraft:sand'}", "{Name:'minecraft:sand',Properties:{variant:'sand'}}");
+ register(193, "{Name:'minecraft:red_sand'}", "{Name:'minecraft:sand',Properties:{variant:'red_sand'}}");
+ register(208, "{Name:'minecraft:gravel'}", "{Name:'minecraft:gravel'}");
+ register(224, "{Name:'minecraft:gold_ore'}", "{Name:'minecraft:gold_ore'}");
+ register(240, "{Name:'minecraft:iron_ore'}", "{Name:'minecraft:iron_ore'}");
+ register(256, "{Name:'minecraft:coal_ore'}", "{Name:'minecraft:coal_ore'}");
+ register(272, "{Name:'minecraft:oak_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'oak'}}");
+ register(273, "{Name:'minecraft:spruce_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'spruce'}}");
+ register(274, "{Name:'minecraft:birch_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'birch'}}");
+ register(275, "{Name:'minecraft:jungle_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'jungle'}}");
+ register(276, "{Name:'minecraft:oak_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'oak'}}");
+ register(277, "{Name:'minecraft:spruce_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'spruce'}}");
+ register(278, "{Name:'minecraft:birch_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'birch'}}");
+ register(279, "{Name:'minecraft:jungle_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'jungle'}}");
+ register(280, "{Name:'minecraft:oak_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'oak'}}");
+ register(281, "{Name:'minecraft:spruce_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'spruce'}}");
+ register(282, "{Name:'minecraft:birch_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'birch'}}");
+ register(283, "{Name:'minecraft:jungle_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'jungle'}}");
+ register(284, "{Name:'minecraft:oak_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'oak'}}");
+ register(285, "{Name:'minecraft:spruce_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'spruce'}}");
+ register(286, "{Name:'minecraft:birch_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'birch'}}");
+ register(287, "{Name:'minecraft:jungle_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'jungle'}}");
+ register(288, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'oak'}}");
+ register(289, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'spruce'}}");
+ register(290, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'birch'}}");
+ register(291, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'jungle'}}");
+ register(292, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'oak'}}");
+ register(293, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'spruce'}}");
+ register(294, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'birch'}}");
+ register(295, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'jungle'}}");
+ register(296, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'oak'}}");
+ register(297, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'spruce'}}");
+ register(298, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'birch'}}");
+ register(299, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'jungle'}}");
+ register(300, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'oak'}}");
+ register(301, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'spruce'}}");
+ register(302, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'birch'}}");
+ register(303, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'jungle'}}");
+ register(304, "{Name:'minecraft:sponge'}", "{Name:'minecraft:sponge',Properties:{wet:'false'}}");
+ register(305, "{Name:'minecraft:wet_sponge'}", "{Name:'minecraft:sponge',Properties:{wet:'true'}}");
+ register(320, "{Name:'minecraft:glass'}", "{Name:'minecraft:glass'}");
+ register(336, "{Name:'minecraft:lapis_ore'}", "{Name:'minecraft:lapis_ore'}");
+ register(352, "{Name:'minecraft:lapis_block'}", "{Name:'minecraft:lapis_block'}");
+ register(368, "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'false'}}");
+ register(369, "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'false'}}");
+ register(370, "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'false'}}");
+ register(371, "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'false'}}");
+ register(372, "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'false'}}");
+ register(373, "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'false'}}");
+ register(376, "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'true'}}");
+ register(377, "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'true'}}");
+ register(378, "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'true'}}");
+ register(379, "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'true'}}");
+ register(380, "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'true'}}");
+ register(381, "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'true'}}");
+ register(384, "{Name:'minecraft:sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'sandstone'}}");
+ register(385, "{Name:'minecraft:chiseled_sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'chiseled_sandstone'}}");
+ register(386, "{Name:'minecraft:cut_sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'smooth_sandstone'}}");
+ register(400, "{Name:'minecraft:note_block'}", "{Name:'minecraft:noteblock'}");
+ register(416, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'true',part:'foot'}}");
+ register(417, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'true',part:'foot'}}");
+ register(418, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'true',part:'foot'}}");
+ register(419, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'true',part:'foot'}}");
+ register(424, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'false',part:'head'}}");
+ register(425, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'false',part:'head'}}");
+ register(426, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'false',part:'head'}}");
+ register(427, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'false',part:'head'}}");
+ register(428, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'true',part:'head'}}");
+ register(429, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'true',part:'head'}}");
+ register(430, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'true',part:'head'}}");
+ register(431, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'true',part:'head'}}");
+ register(432, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'north_south'}}");
+ register(433, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'east_west'}}");
+ register(434, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_east'}}");
+ register(435, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_west'}}");
+ register(436, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_north'}}");
+ register(437, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_south'}}");
+ register(440, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'north_south'}}");
+ register(441, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'east_west'}}");
+ register(442, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_east'}}");
+ register(443, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_west'}}");
+ register(444, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_north'}}");
+ register(445, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_south'}}");
+ register(448, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'north_south'}}");
+ register(449, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'east_west'}}");
+ register(450, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_east'}}");
+ register(451, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_west'}}");
+ register(452, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_north'}}");
+ register(453, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_south'}}");
+ register(456, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'north_south'}}");
+ register(457, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'east_west'}}");
+ register(458, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_east'}}");
+ register(459, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_west'}}");
+ register(460, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_north'}}");
+ register(461, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_south'}}");
+ register(464, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'down'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'down'}}");
+ register(465, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'up'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'up'}}");
+ register(466, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'north'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'north'}}");
+ register(467, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'south'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'south'}}");
+ register(468, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'west'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'west'}}");
+ register(469, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'east'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'east'}}");
+ register(472, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'down'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'down'}}");
+ register(473, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'up'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'up'}}");
+ register(474, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'north'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'north'}}");
+ register(475, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'south'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'south'}}");
+ register(476, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'west'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'west'}}");
+ register(477, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'east'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'east'}}");
+ register(480, "{Name:'minecraft:cobweb'}", "{Name:'minecraft:web'}");
+ register(496, "{Name:'minecraft:dead_bush'}", "{Name:'minecraft:tallgrass',Properties:{type:'dead_bush'}}");
+ register(497, "{Name:'minecraft:grass'}", "{Name:'minecraft:tallgrass',Properties:{type:'tall_grass'}}");
+ register(498, "{Name:'minecraft:fern'}", "{Name:'minecraft:tallgrass',Properties:{type:'fern'}}");
+ register(512, "{Name:'minecraft:dead_bush'}", "{Name:'minecraft:deadbush'}");
+ register(528, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'down'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'down'}}");
+ register(529, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'up'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'up'}}");
+ register(530, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'north'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'north'}}");
+ register(531, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'south'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'south'}}");
+ register(532, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'west'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'west'}}");
+ register(533, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'east'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'east'}}");
+ register(536, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'down'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'down'}}");
+ register(537, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'up'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'up'}}");
+ register(538, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'north'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'north'}}");
+ register(539, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'south'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'south'}}");
+ register(540, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'west'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'west'}}");
+ register(541, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'east'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'east'}}");
+ register(544, "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'true',type:'normal'}}");
+ register(545, "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'true',type:'normal'}}");
+ register(546, "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'true',type:'normal'}}");
+ register(547, "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'true',type:'normal'}}");
+ register(548, "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'true',type:'normal'}}");
+ register(549, "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'true',type:'normal'}}");
+ register(552, "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'true',type:'sticky'}}");
+ register(553, "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'true',type:'sticky'}}");
+ register(554, "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'true',type:'sticky'}}");
+ register(555, "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'true',type:'sticky'}}");
+ register(556, "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'true',type:'sticky'}}");
+ register(557, "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'true',type:'sticky'}}");
+ register(560, "{Name:'minecraft:white_wool'}", "{Name:'minecraft:wool',Properties:{color:'white'}}");
+ register(561, "{Name:'minecraft:orange_wool'}", "{Name:'minecraft:wool',Properties:{color:'orange'}}");
+ register(562, "{Name:'minecraft:magenta_wool'}", "{Name:'minecraft:wool',Properties:{color:'magenta'}}");
+ register(563, "{Name:'minecraft:light_blue_wool'}", "{Name:'minecraft:wool',Properties:{color:'light_blue'}}");
+ register(564, "{Name:'minecraft:yellow_wool'}", "{Name:'minecraft:wool',Properties:{color:'yellow'}}");
+ register(565, "{Name:'minecraft:lime_wool'}", "{Name:'minecraft:wool',Properties:{color:'lime'}}");
+ register(566, "{Name:'minecraft:pink_wool'}", "{Name:'minecraft:wool',Properties:{color:'pink'}}");
+ register(567, "{Name:'minecraft:gray_wool'}", "{Name:'minecraft:wool',Properties:{color:'gray'}}");
+ register(568, "{Name:'minecraft:light_gray_wool'}", "{Name:'minecraft:wool',Properties:{color:'silver'}}");
+ register(569, "{Name:'minecraft:cyan_wool'}", "{Name:'minecraft:wool',Properties:{color:'cyan'}}");
+ register(570, "{Name:'minecraft:purple_wool'}", "{Name:'minecraft:wool',Properties:{color:'purple'}}");
+ register(571, "{Name:'minecraft:blue_wool'}", "{Name:'minecraft:wool',Properties:{color:'blue'}}");
+ register(572, "{Name:'minecraft:brown_wool'}", "{Name:'minecraft:wool',Properties:{color:'brown'}}");
+ register(573, "{Name:'minecraft:green_wool'}", "{Name:'minecraft:wool',Properties:{color:'green'}}");
+ register(574, "{Name:'minecraft:red_wool'}", "{Name:'minecraft:wool',Properties:{color:'red'}}");
+ register(575, "{Name:'minecraft:black_wool'}", "{Name:'minecraft:wool',Properties:{color:'black'}}");
+ register(576, "{Name:'minecraft:moving_piston',Properties:{facing:'down',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'down',type:'normal'}}");
+ register(577, "{Name:'minecraft:moving_piston',Properties:{facing:'up',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'up',type:'normal'}}");
+ register(578, "{Name:'minecraft:moving_piston',Properties:{facing:'north',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'north',type:'normal'}}");
+ register(579, "{Name:'minecraft:moving_piston',Properties:{facing:'south',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'south',type:'normal'}}");
+ register(580, "{Name:'minecraft:moving_piston',Properties:{facing:'west',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'west',type:'normal'}}");
+ register(581, "{Name:'minecraft:moving_piston',Properties:{facing:'east',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'east',type:'normal'}}");
+ register(584, "{Name:'minecraft:moving_piston',Properties:{facing:'down',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'down',type:'sticky'}}");
+ register(585, "{Name:'minecraft:moving_piston',Properties:{facing:'up',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'up',type:'sticky'}}");
+ register(586, "{Name:'minecraft:moving_piston',Properties:{facing:'north',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'north',type:'sticky'}}");
+ register(587, "{Name:'minecraft:moving_piston',Properties:{facing:'south',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'south',type:'sticky'}}");
+ register(588, "{Name:'minecraft:moving_piston',Properties:{facing:'west',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'west',type:'sticky'}}");
+ register(589, "{Name:'minecraft:moving_piston',Properties:{facing:'east',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'east',type:'sticky'}}");
+ register(592, "{Name:'minecraft:dandelion'}", "{Name:'minecraft:yellow_flower',Properties:{type:'dandelion'}}");
+ register(608, "{Name:'minecraft:poppy'}", "{Name:'minecraft:red_flower',Properties:{type:'poppy'}}");
+ register(609, "{Name:'minecraft:blue_orchid'}", "{Name:'minecraft:red_flower',Properties:{type:'blue_orchid'}}");
+ register(610, "{Name:'minecraft:allium'}", "{Name:'minecraft:red_flower',Properties:{type:'allium'}}");
+ register(611, "{Name:'minecraft:azure_bluet'}", "{Name:'minecraft:red_flower',Properties:{type:'houstonia'}}");
+ register(612, "{Name:'minecraft:red_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'red_tulip'}}");
+ register(613, "{Name:'minecraft:orange_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'orange_tulip'}}");
+ register(614, "{Name:'minecraft:white_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'white_tulip'}}");
+ register(615, "{Name:'minecraft:pink_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'pink_tulip'}}");
+ register(616, "{Name:'minecraft:oxeye_daisy'}", "{Name:'minecraft:red_flower',Properties:{type:'oxeye_daisy'}}");
+ register(624, "{Name:'minecraft:brown_mushroom'}", "{Name:'minecraft:brown_mushroom'}");
+ register(640, "{Name:'minecraft:red_mushroom'}", "{Name:'minecraft:red_mushroom'}");
+ register(656, "{Name:'minecraft:gold_block'}", "{Name:'minecraft:gold_block'}");
+ register(672, "{Name:'minecraft:iron_block'}", "{Name:'minecraft:iron_block'}");
+ register(688, "{Name:'minecraft:stone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'stone'}}");
+ register(689, "{Name:'minecraft:sandstone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'sandstone'}}");
+ register(690, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'wood_old'}}");
+ register(691, "{Name:'minecraft:cobblestone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'cobblestone'}}");
+ register(692, "{Name:'minecraft:brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'brick'}}");
+ register(693, "{Name:'minecraft:stone_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'stone_brick'}}");
+ register(694, "{Name:'minecraft:nether_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'nether_brick'}}");
+ register(695, "{Name:'minecraft:quartz_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'quartz'}}");
+ register(696, "{Name:'minecraft:smooth_stone'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'stone'}}");
+ register(697, "{Name:'minecraft:smooth_sandstone'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'sandstone'}}");
+ register(698, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'wood_old'}}");
+ register(699, "{Name:'minecraft:cobblestone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'cobblestone'}}");
+ register(700, "{Name:'minecraft:brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'brick'}}");
+ register(701, "{Name:'minecraft:stone_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'stone_brick'}}");
+ register(702, "{Name:'minecraft:nether_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'nether_brick'}}");
+ register(703, "{Name:'minecraft:smooth_quartz'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'quartz'}}");
+ register(704, "{Name:'minecraft:stone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'stone'}}");
+ register(705, "{Name:'minecraft:sandstone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'sandstone'}}");
+ register(706, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'wood_old'}}");
+ register(707, "{Name:'minecraft:cobblestone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'cobblestone'}}");
+ register(708, "{Name:'minecraft:brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'brick'}}");
+ register(709, "{Name:'minecraft:stone_brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'stone_brick'}}");
+ register(710, "{Name:'minecraft:nether_brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'nether_brick'}}");
+ register(711, "{Name:'minecraft:quartz_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'quartz'}}");
+ register(712, "{Name:'minecraft:stone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'stone'}}");
+ register(713, "{Name:'minecraft:sandstone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'sandstone'}}");
+ register(714, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'wood_old'}}");
+ register(715, "{Name:'minecraft:cobblestone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'cobblestone'}}");
+ register(716, "{Name:'minecraft:brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'brick'}}");
+ register(717, "{Name:'minecraft:stone_brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'stone_brick'}}");
+ register(718, "{Name:'minecraft:nether_brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'nether_brick'}}");
+ register(719, "{Name:'minecraft:quartz_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'quartz'}}");
+ register(720, "{Name:'minecraft:bricks'}", "{Name:'minecraft:brick_block'}");
+ register(736, "{Name:'minecraft:tnt',Properties:{unstable:'false'}}", "{Name:'minecraft:tnt',Properties:{explode:'false'}}");
+ register(737, "{Name:'minecraft:tnt',Properties:{unstable:'true'}}", "{Name:'minecraft:tnt',Properties:{explode:'true'}}");
+ register(752, "{Name:'minecraft:bookshelf'}", "{Name:'minecraft:bookshelf'}");
+ register(768, "{Name:'minecraft:mossy_cobblestone'}", "{Name:'minecraft:mossy_cobblestone'}");
+ register(784, "{Name:'minecraft:obsidian'}", "{Name:'minecraft:obsidian'}");
+ register(801, "{Name:'minecraft:wall_torch',Properties:{facing:'east'}}", "{Name:'minecraft:torch',Properties:{facing:'east'}}");
+ register(802, "{Name:'minecraft:wall_torch',Properties:{facing:'west'}}", "{Name:'minecraft:torch',Properties:{facing:'west'}}");
+ register(803, "{Name:'minecraft:wall_torch',Properties:{facing:'south'}}", "{Name:'minecraft:torch',Properties:{facing:'south'}}");
+ register(804, "{Name:'minecraft:wall_torch',Properties:{facing:'north'}}", "{Name:'minecraft:torch',Properties:{facing:'north'}}");
+ register(805, "{Name:'minecraft:torch'}", "{Name:'minecraft:torch',Properties:{facing:'up'}}");
+ register(816, "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(817, "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(818, "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(819, "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(820, "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(821, "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(822, "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(823, "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(824, "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(825, "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(826, "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(827, "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(828, "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(829, "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(830, "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(831, "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(832, "{Name:'minecraft:mob_spawner'}", "{Name:'minecraft:mob_spawner'}");
+ register(848, "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(849, "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(850, "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(851, "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(852, "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(853, "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(854, "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(855, "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(866, "{Name:'minecraft:chest',Properties:{facing:'north',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'north'}}");
+ register(867, "{Name:'minecraft:chest',Properties:{facing:'south',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'south'}}");
+ register(868, "{Name:'minecraft:chest',Properties:{facing:'west',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'west'}}");
+ register(869, "{Name:'minecraft:chest',Properties:{facing:'east',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'east'}}");
+ register(880, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'up'}}");
+ register(881, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'up'}}");
+ register(882, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'up'}}");
+ register(883, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'up'}}");
+ register(884, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'up'}}");
+ register(885, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'up'}}");
+ register(886, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'up'}}");
+ register(887, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'up'}}");
+ register(888, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'up'}}");
+ register(889, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'up'}}");
+ register(890, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'up'}}");
+ register(891, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'up'}}");
+ register(892, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'up'}}");
+ register(893, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'up'}}");
+ register(894, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'up'}}");
+ register(895, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'up'}}");
+ register(896, "{Name:'minecraft:diamond_ore'}", "{Name:'minecraft:diamond_ore'}");
+ register(912, "{Name:'minecraft:diamond_block'}", "{Name:'minecraft:diamond_block'}");
+ register(928, "{Name:'minecraft:crafting_table'}", "{Name:'minecraft:crafting_table'}");
+ register(944, "{Name:'minecraft:wheat',Properties:{age:'0'}}", "{Name:'minecraft:wheat',Properties:{age:'0'}}");
+ register(945, "{Name:'minecraft:wheat',Properties:{age:'1'}}", "{Name:'minecraft:wheat',Properties:{age:'1'}}");
+ register(946, "{Name:'minecraft:wheat',Properties:{age:'2'}}", "{Name:'minecraft:wheat',Properties:{age:'2'}}");
+ register(947, "{Name:'minecraft:wheat',Properties:{age:'3'}}", "{Name:'minecraft:wheat',Properties:{age:'3'}}");
+ register(948, "{Name:'minecraft:wheat',Properties:{age:'4'}}", "{Name:'minecraft:wheat',Properties:{age:'4'}}");
+ register(949, "{Name:'minecraft:wheat',Properties:{age:'5'}}", "{Name:'minecraft:wheat',Properties:{age:'5'}}");
+ register(950, "{Name:'minecraft:wheat',Properties:{age:'6'}}", "{Name:'minecraft:wheat',Properties:{age:'6'}}");
+ register(951, "{Name:'minecraft:wheat',Properties:{age:'7'}}", "{Name:'minecraft:wheat',Properties:{age:'7'}}");
+ register(960, "{Name:'minecraft:farmland',Properties:{moisture:'0'}}", "{Name:'minecraft:farmland',Properties:{moisture:'0'}}");
+ register(961, "{Name:'minecraft:farmland',Properties:{moisture:'1'}}", "{Name:'minecraft:farmland',Properties:{moisture:'1'}}");
+ register(962, "{Name:'minecraft:farmland',Properties:{moisture:'2'}}", "{Name:'minecraft:farmland',Properties:{moisture:'2'}}");
+ register(963, "{Name:'minecraft:farmland',Properties:{moisture:'3'}}", "{Name:'minecraft:farmland',Properties:{moisture:'3'}}");
+ register(964, "{Name:'minecraft:farmland',Properties:{moisture:'4'}}", "{Name:'minecraft:farmland',Properties:{moisture:'4'}}");
+ register(965, "{Name:'minecraft:farmland',Properties:{moisture:'5'}}", "{Name:'minecraft:farmland',Properties:{moisture:'5'}}");
+ register(966, "{Name:'minecraft:farmland',Properties:{moisture:'6'}}", "{Name:'minecraft:farmland',Properties:{moisture:'6'}}");
+ register(967, "{Name:'minecraft:farmland',Properties:{moisture:'7'}}", "{Name:'minecraft:farmland',Properties:{moisture:'7'}}");
+ register(978, "{Name:'minecraft:furnace',Properties:{facing:'north',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'north'}}");
+ register(979, "{Name:'minecraft:furnace',Properties:{facing:'south',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'south'}}");
+ register(980, "{Name:'minecraft:furnace',Properties:{facing:'west',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'west'}}");
+ register(981, "{Name:'minecraft:furnace',Properties:{facing:'east',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'east'}}");
+ register(994, "{Name:'minecraft:furnace',Properties:{facing:'north',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'north'}}");
+ register(995, "{Name:'minecraft:furnace',Properties:{facing:'south',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'south'}}");
+ register(996, "{Name:'minecraft:furnace',Properties:{facing:'west',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'west'}}");
+ register(997, "{Name:'minecraft:furnace',Properties:{facing:'east',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'east'}}");
+ register(1008, "{Name:'minecraft:sign',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'0'}}");
+ register(1009, "{Name:'minecraft:sign',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'1'}}");
+ register(1010, "{Name:'minecraft:sign',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'2'}}");
+ register(1011, "{Name:'minecraft:sign',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'3'}}");
+ register(1012, "{Name:'minecraft:sign',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'4'}}");
+ register(1013, "{Name:'minecraft:sign',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'5'}}");
+ register(1014, "{Name:'minecraft:sign',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'6'}}");
+ register(1015, "{Name:'minecraft:sign',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'7'}}");
+ register(1016, "{Name:'minecraft:sign',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'8'}}");
+ register(1017, "{Name:'minecraft:sign',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'9'}}");
+ register(1018, "{Name:'minecraft:sign',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'10'}}");
+ register(1019, "{Name:'minecraft:sign',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'11'}}");
+ register(1020, "{Name:'minecraft:sign',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'12'}}");
+ register(1021, "{Name:'minecraft:sign',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'13'}}");
+ register(1022, "{Name:'minecraft:sign',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'14'}}");
+ register(1023, "{Name:'minecraft:sign',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'15'}}");
+ register(1024, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(1025, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(1026, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(1027, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(1028, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(1029, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(1030, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(1031, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(1032, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1033, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}");
+ register(1034, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}");
+ register(1035, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}");
+ register(1036, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1037, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1038, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1039, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1042, "{Name:'minecraft:ladder',Properties:{facing:'north'}}", "{Name:'minecraft:ladder',Properties:{facing:'north'}}");
+ register(1043, "{Name:'minecraft:ladder',Properties:{facing:'south'}}", "{Name:'minecraft:ladder',Properties:{facing:'south'}}");
+ register(1044, "{Name:'minecraft:ladder',Properties:{facing:'west'}}", "{Name:'minecraft:ladder',Properties:{facing:'west'}}");
+ register(1045, "{Name:'minecraft:ladder',Properties:{facing:'east'}}", "{Name:'minecraft:ladder',Properties:{facing:'east'}}");
+ register(1056, "{Name:'minecraft:rail',Properties:{shape:'north_south'}}", "{Name:'minecraft:rail',Properties:{shape:'north_south'}}");
+ register(1057, "{Name:'minecraft:rail',Properties:{shape:'east_west'}}", "{Name:'minecraft:rail',Properties:{shape:'east_west'}}");
+ register(1058, "{Name:'minecraft:rail',Properties:{shape:'ascending_east'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_east'}}");
+ register(1059, "{Name:'minecraft:rail',Properties:{shape:'ascending_west'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_west'}}");
+ register(1060, "{Name:'minecraft:rail',Properties:{shape:'ascending_north'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_north'}}");
+ register(1061, "{Name:'minecraft:rail',Properties:{shape:'ascending_south'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_south'}}");
+ register(1062, "{Name:'minecraft:rail',Properties:{shape:'south_east'}}", "{Name:'minecraft:rail',Properties:{shape:'south_east'}}");
+ register(1063, "{Name:'minecraft:rail',Properties:{shape:'south_west'}}", "{Name:'minecraft:rail',Properties:{shape:'south_west'}}");
+ register(1064, "{Name:'minecraft:rail',Properties:{shape:'north_west'}}", "{Name:'minecraft:rail',Properties:{shape:'north_west'}}");
+ register(1065, "{Name:'minecraft:rail',Properties:{shape:'north_east'}}", "{Name:'minecraft:rail',Properties:{shape:'north_east'}}");
+ register(1072, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(1073, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(1074, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(1075, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(1076, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(1077, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(1078, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(1079, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(1090, "{Name:'minecraft:wall_sign',Properties:{facing:'north'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'north'}}");
+ register(1091, "{Name:'minecraft:wall_sign',Properties:{facing:'south'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'south'}}");
+ register(1092, "{Name:'minecraft:wall_sign',Properties:{facing:'west'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'west'}}");
+ register(1093, "{Name:'minecraft:wall_sign',Properties:{facing:'east'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'east'}}");
+ register(1104, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'down_x',powered:'false'}}");
+ register(1105, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'east',powered:'false'}}");
+ register(1106, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'west',powered:'false'}}");
+ register(1107, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'south',powered:'false'}}");
+ register(1108, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'north',powered:'false'}}");
+ register(1109, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'up_z',powered:'false'}}");
+ register(1110, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'up_x',powered:'false'}}");
+ register(1111, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'down_z',powered:'false'}}");
+ register(1112, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'down_x',powered:'true'}}");
+ register(1113, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'east',powered:'true'}}");
+ register(1114, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'west',powered:'true'}}");
+ register(1115, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'south',powered:'true'}}");
+ register(1116, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'north',powered:'true'}}");
+ register(1117, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'up_z',powered:'true'}}");
+ register(1118, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'up_x',powered:'true'}}");
+ register(1119, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'down_z',powered:'true'}}");
+ register(1120, "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'false'}}", "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'false'}}");
+ register(1121, "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'true'}}", "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'true'}}");
+ register(1136, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(1137, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(1138, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(1139, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(1140, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(1141, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(1142, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(1143, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(1144, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1145, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}");
+ register(1146, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}");
+ register(1147, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}");
+ register(1148, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1149, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1150, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1151, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(1152, "{Name:'minecraft:oak_pressure_plate',Properties:{powered:'false'}}", "{Name:'minecraft:wooden_pressure_plate',Properties:{powered:'false'}}");
+ register(1153, "{Name:'minecraft:oak_pressure_plate',Properties:{powered:'true'}}", "{Name:'minecraft:wooden_pressure_plate',Properties:{powered:'true'}}");
+ register(1168, "{Name:'minecraft:redstone_ore',Properties:{lit:'false'}}", "{Name:'minecraft:redstone_ore'}");
+ register(1184, "{Name:'minecraft:redstone_ore',Properties:{lit:'true'}}", "{Name:'minecraft:lit_redstone_ore'}");
+ register(1201, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'east',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'east'}}");
+ register(1202, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'west',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'west'}}");
+ register(1203, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'south',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'south'}}");
+ register(1204, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'north',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'north'}}");
+ register(1205, "{Name:'minecraft:redstone_torch',Properties:{lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'up'}}");
+ register(1217, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'east',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'east'}}");
+ register(1218, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'west',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'west'}}");
+ register(1219, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'south',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'south'}}");
+ register(1220, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'north',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'north'}}");
+ register(1221, "{Name:'minecraft:redstone_torch',Properties:{lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'up'}}");
+ register(1232, "{Name:'minecraft:stone_button',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'down',powered:'false'}}");
+ register(1233, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'east',powered:'false'}}");
+ register(1234, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'west',powered:'false'}}");
+ register(1235, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'south',powered:'false'}}");
+ register(1236, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'north',powered:'false'}}");
+ register(1237, "{Name:'minecraft:stone_button',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'up',powered:'false'}}");
+ register(1240, "{Name:'minecraft:stone_button',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'down',powered:'true'}}");
+ register(1241, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'east',powered:'true'}}");
+ register(1242, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'west',powered:'true'}}");
+ register(1243, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'south',powered:'true'}}");
+ register(1244, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'north',powered:'true'}}");
+ register(1245, "{Name:'minecraft:stone_button',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'up',powered:'true'}}");
+ register(1248, "{Name:'minecraft:snow',Properties:{layers:'1'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'1'}}");
+ register(1249, "{Name:'minecraft:snow',Properties:{layers:'2'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'2'}}");
+ register(1250, "{Name:'minecraft:snow',Properties:{layers:'3'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'3'}}");
+ register(1251, "{Name:'minecraft:snow',Properties:{layers:'4'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'4'}}");
+ register(1252, "{Name:'minecraft:snow',Properties:{layers:'5'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'5'}}");
+ register(1253, "{Name:'minecraft:snow',Properties:{layers:'6'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'6'}}");
+ register(1254, "{Name:'minecraft:snow',Properties:{layers:'7'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'7'}}");
+ register(1255, "{Name:'minecraft:snow',Properties:{layers:'8'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'8'}}");
+ register(1264, "{Name:'minecraft:ice'}", "{Name:'minecraft:ice'}");
+ register(1280, "{Name:'minecraft:snow_block'}", "{Name:'minecraft:snow'}");
+ register(1296, "{Name:'minecraft:cactus',Properties:{age:'0'}}", "{Name:'minecraft:cactus',Properties:{age:'0'}}");
+ register(1297, "{Name:'minecraft:cactus',Properties:{age:'1'}}", "{Name:'minecraft:cactus',Properties:{age:'1'}}");
+ register(1298, "{Name:'minecraft:cactus',Properties:{age:'2'}}", "{Name:'minecraft:cactus',Properties:{age:'2'}}");
+ register(1299, "{Name:'minecraft:cactus',Properties:{age:'3'}}", "{Name:'minecraft:cactus',Properties:{age:'3'}}");
+ register(1300, "{Name:'minecraft:cactus',Properties:{age:'4'}}", "{Name:'minecraft:cactus',Properties:{age:'4'}}");
+ register(1301, "{Name:'minecraft:cactus',Properties:{age:'5'}}", "{Name:'minecraft:cactus',Properties:{age:'5'}}");
+ register(1302, "{Name:'minecraft:cactus',Properties:{age:'6'}}", "{Name:'minecraft:cactus',Properties:{age:'6'}}");
+ register(1303, "{Name:'minecraft:cactus',Properties:{age:'7'}}", "{Name:'minecraft:cactus',Properties:{age:'7'}}");
+ register(1304, "{Name:'minecraft:cactus',Properties:{age:'8'}}", "{Name:'minecraft:cactus',Properties:{age:'8'}}");
+ register(1305, "{Name:'minecraft:cactus',Properties:{age:'9'}}", "{Name:'minecraft:cactus',Properties:{age:'9'}}");
+ register(1306, "{Name:'minecraft:cactus',Properties:{age:'10'}}", "{Name:'minecraft:cactus',Properties:{age:'10'}}");
+ register(1307, "{Name:'minecraft:cactus',Properties:{age:'11'}}", "{Name:'minecraft:cactus',Properties:{age:'11'}}");
+ register(1308, "{Name:'minecraft:cactus',Properties:{age:'12'}}", "{Name:'minecraft:cactus',Properties:{age:'12'}}");
+ register(1309, "{Name:'minecraft:cactus',Properties:{age:'13'}}", "{Name:'minecraft:cactus',Properties:{age:'13'}}");
+ register(1310, "{Name:'minecraft:cactus',Properties:{age:'14'}}", "{Name:'minecraft:cactus',Properties:{age:'14'}}");
+ register(1311, "{Name:'minecraft:cactus',Properties:{age:'15'}}", "{Name:'minecraft:cactus',Properties:{age:'15'}}");
+ register(1312, "{Name:'minecraft:clay'}", "{Name:'minecraft:clay'}");
+ register(1328, "{Name:'minecraft:sugar_cane',Properties:{age:'0'}}", "{Name:'minecraft:reeds',Properties:{age:'0'}}");
+ register(1329, "{Name:'minecraft:sugar_cane',Properties:{age:'1'}}", "{Name:'minecraft:reeds',Properties:{age:'1'}}");
+ register(1330, "{Name:'minecraft:sugar_cane',Properties:{age:'2'}}", "{Name:'minecraft:reeds',Properties:{age:'2'}}");
+ register(1331, "{Name:'minecraft:sugar_cane',Properties:{age:'3'}}", "{Name:'minecraft:reeds',Properties:{age:'3'}}");
+ register(1332, "{Name:'minecraft:sugar_cane',Properties:{age:'4'}}", "{Name:'minecraft:reeds',Properties:{age:'4'}}");
+ register(1333, "{Name:'minecraft:sugar_cane',Properties:{age:'5'}}", "{Name:'minecraft:reeds',Properties:{age:'5'}}");
+ register(1334, "{Name:'minecraft:sugar_cane',Properties:{age:'6'}}", "{Name:'minecraft:reeds',Properties:{age:'6'}}");
+ register(1335, "{Name:'minecraft:sugar_cane',Properties:{age:'7'}}", "{Name:'minecraft:reeds',Properties:{age:'7'}}");
+ register(1336, "{Name:'minecraft:sugar_cane',Properties:{age:'8'}}", "{Name:'minecraft:reeds',Properties:{age:'8'}}");
+ register(1337, "{Name:'minecraft:sugar_cane',Properties:{age:'9'}}", "{Name:'minecraft:reeds',Properties:{age:'9'}}");
+ register(1338, "{Name:'minecraft:sugar_cane',Properties:{age:'10'}}", "{Name:'minecraft:reeds',Properties:{age:'10'}}");
+ register(1339, "{Name:'minecraft:sugar_cane',Properties:{age:'11'}}", "{Name:'minecraft:reeds',Properties:{age:'11'}}");
+ register(1340, "{Name:'minecraft:sugar_cane',Properties:{age:'12'}}", "{Name:'minecraft:reeds',Properties:{age:'12'}}");
+ register(1341, "{Name:'minecraft:sugar_cane',Properties:{age:'13'}}", "{Name:'minecraft:reeds',Properties:{age:'13'}}");
+ register(1342, "{Name:'minecraft:sugar_cane',Properties:{age:'14'}}", "{Name:'minecraft:reeds',Properties:{age:'14'}}");
+ register(1343, "{Name:'minecraft:sugar_cane',Properties:{age:'15'}}", "{Name:'minecraft:reeds',Properties:{age:'15'}}");
+ register(1344, "{Name:'minecraft:jukebox',Properties:{has_record:'false'}}", "{Name:'minecraft:jukebox',Properties:{has_record:'false'}}");
+ register(1345, "{Name:'minecraft:jukebox',Properties:{has_record:'true'}}", "{Name:'minecraft:jukebox',Properties:{has_record:'true'}}");
+ register(1360, "{Name:'minecraft:oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(1376, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'south'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'south'}}");
+ register(1377, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'west'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'west'}}");
+ register(1378, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'north'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'north'}}");
+ register(1379, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'east'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'east'}}");
+ register(1392, "{Name:'minecraft:netherrack'}", "{Name:'minecraft:netherrack'}");
+ register(1408, "{Name:'minecraft:soul_sand'}", "{Name:'minecraft:soul_sand'}");
+ register(1424, "{Name:'minecraft:glowstone'}", "{Name:'minecraft:glowstone'}");
+ register(1441, "{Name:'minecraft:portal',Properties:{axis:'x'}}", "{Name:'minecraft:portal',Properties:{axis:'x'}}");
+ register(1442, "{Name:'minecraft:portal',Properties:{axis:'z'}}", "{Name:'minecraft:portal',Properties:{axis:'z'}}");
+ register(1456, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'south'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'south'}}");
+ register(1457, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'west'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'west'}}");
+ register(1458, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'north'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'north'}}");
+ register(1459, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'east'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'east'}}");
+ register(1472, "{Name:'minecraft:cake',Properties:{bites:'0'}}", "{Name:'minecraft:cake',Properties:{bites:'0'}}");
+ register(1473, "{Name:'minecraft:cake',Properties:{bites:'1'}}", "{Name:'minecraft:cake',Properties:{bites:'1'}}");
+ register(1474, "{Name:'minecraft:cake',Properties:{bites:'2'}}", "{Name:'minecraft:cake',Properties:{bites:'2'}}");
+ register(1475, "{Name:'minecraft:cake',Properties:{bites:'3'}}", "{Name:'minecraft:cake',Properties:{bites:'3'}}");
+ register(1476, "{Name:'minecraft:cake',Properties:{bites:'4'}}", "{Name:'minecraft:cake',Properties:{bites:'4'}}");
+ register(1477, "{Name:'minecraft:cake',Properties:{bites:'5'}}", "{Name:'minecraft:cake',Properties:{bites:'5'}}");
+ register(1478, "{Name:'minecraft:cake',Properties:{bites:'6'}}", "{Name:'minecraft:cake',Properties:{bites:'6'}}");
+ register(1488, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'south',locked:'true'}}");
+ register(1489, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'west',locked:'true'}}");
+ register(1490, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'north',locked:'true'}}");
+ register(1491, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'east',locked:'true'}}");
+ register(1492, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'south',locked:'true'}}");
+ register(1493, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'west',locked:'true'}}");
+ register(1494, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'north',locked:'true'}}");
+ register(1495, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'east',locked:'true'}}");
+ register(1496, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'south',locked:'true'}}");
+ register(1497, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'west',locked:'true'}}");
+ register(1498, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'north',locked:'true'}}");
+ register(1499, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'east',locked:'true'}}");
+ register(1500, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'south',locked:'true'}}");
+ register(1501, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'west',locked:'true'}}");
+ register(1502, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'north',locked:'true'}}");
+ register(1503, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'east',locked:'true'}}");
+ register(1504, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'south',locked:'true'}}");
+ register(1505, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'west',locked:'true'}}");
+ register(1506, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'north',locked:'true'}}");
+ register(1507, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'east',locked:'true'}}");
+ register(1508, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'south',locked:'true'}}");
+ register(1509, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'west',locked:'true'}}");
+ register(1510, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'north',locked:'true'}}");
+ register(1511, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'east',locked:'true'}}");
+ register(1512, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'south',locked:'true'}}");
+ register(1513, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'west',locked:'true'}}");
+ register(1514, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'north',locked:'true'}}");
+ register(1515, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'east',locked:'true'}}");
+ register(1516, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'south',locked:'true'}}");
+ register(1517, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'west',locked:'true'}}");
+ register(1518, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'north',locked:'true'}}");
+ register(1519, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'east',locked:'true'}}");
+ register(1520, "{Name:'minecraft:white_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'white'}}");
+ register(1521, "{Name:'minecraft:orange_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'orange'}}");
+ register(1522, "{Name:'minecraft:magenta_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'magenta'}}");
+ register(1523, "{Name:'minecraft:light_blue_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'light_blue'}}");
+ register(1524, "{Name:'minecraft:yellow_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'yellow'}}");
+ register(1525, "{Name:'minecraft:lime_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'lime'}}");
+ register(1526, "{Name:'minecraft:pink_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'pink'}}");
+ register(1527, "{Name:'minecraft:gray_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'gray'}}");
+ register(1528, "{Name:'minecraft:light_gray_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'silver'}}");
+ register(1529, "{Name:'minecraft:cyan_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'cyan'}}");
+ register(1530, "{Name:'minecraft:purple_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'purple'}}");
+ register(1531, "{Name:'minecraft:blue_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'blue'}}");
+ register(1532, "{Name:'minecraft:brown_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'brown'}}");
+ register(1533, "{Name:'minecraft:green_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'green'}}");
+ register(1534, "{Name:'minecraft:red_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'red'}}");
+ register(1535, "{Name:'minecraft:black_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'black'}}");
+ register(1536, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}");
+ register(1537, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}");
+ register(1538, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}");
+ register(1539, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}");
+ register(1540, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}");
+ register(1541, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}");
+ register(1542, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}");
+ register(1543, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}");
+ register(1544, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'top',open:'false'}}");
+ register(1545, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'top',open:'false'}}");
+ register(1546, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'top',open:'false'}}");
+ register(1547, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'top',open:'false'}}");
+ register(1548, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'top',open:'true'}}");
+ register(1549, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'top',open:'true'}}");
+ register(1550, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'top',open:'true'}}");
+ register(1551, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'top',open:'true'}}");
+ register(1552, "{Name:'minecraft:infested_stone'}", "{Name:'minecraft:monster_egg',Properties:{variant:'stone'}}");
+ register(1553, "{Name:'minecraft:infested_cobblestone'}", "{Name:'minecraft:monster_egg',Properties:{variant:'cobblestone'}}");
+ register(1554, "{Name:'minecraft:infested_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'stone_brick'}}");
+ register(1555, "{Name:'minecraft:infested_mossy_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'mossy_brick'}}");
+ register(1556, "{Name:'minecraft:infested_cracked_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'cracked_brick'}}");
+ register(1557, "{Name:'minecraft:infested_chiseled_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'chiseled_brick'}}");
+ register(1568, "{Name:'minecraft:stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'stonebrick'}}");
+ register(1569, "{Name:'minecraft:mossy_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'mossy_stonebrick'}}");
+ register(1570, "{Name:'minecraft:cracked_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'cracked_stonebrick'}}");
+ register(1571, "{Name:'minecraft:chiseled_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'chiseled_stonebrick'}}");
+ register(1584, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_inside'}}");
+ register(1585, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north_west'}}");
+ register(1586, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north'}}");
+ register(1587, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north_east'}}");
+ register(1588, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'west'}}");
+ register(1589, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'center'}}");
+ register(1590, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'east'}}");
+ register(1591, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south_west'}}");
+ register(1592, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south'}}");
+ register(1593, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'true',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south_east'}}");
+ register(1594, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'false',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'stem'}}");
+ register(1595, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}");
+ register(1596, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}");
+ register(1597, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}");
+ register(1598, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_outside'}}");
+ register(1599, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_stem'}}");
+ register(1600, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_inside'}}");
+ register(1601, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north_west'}}");
+ register(1602, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north'}}");
+ register(1603, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north_east'}}");
+ register(1604, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'west'}}");
+ register(1605, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'center'}}");
+ register(1606, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'east'}}");
+ register(1607, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south_west'}}");
+ register(1608, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south'}}");
+ register(1609, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'true',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south_east'}}");
+ register(1610, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'false',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'stem'}}");
+ register(1611, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}");
+ register(1612, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}");
+ register(1613, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}");
+ register(1614, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_outside'}}");
+ register(1615, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_stem'}}");
+ register(1616, "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(1632, "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(1648, "{Name:'minecraft:melon_block'}", "{Name:'minecraft:melon_block'}");
+ register(1664, "{Name:'minecraft:pumpkin_stem',Properties:{age:'0'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'west'}}");
+ register(1665, "{Name:'minecraft:pumpkin_stem',Properties:{age:'1'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'west'}}");
+ register(1666, "{Name:'minecraft:pumpkin_stem',Properties:{age:'2'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'west'}}");
+ register(1667, "{Name:'minecraft:pumpkin_stem',Properties:{age:'3'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'west'}}");
+ register(1668, "{Name:'minecraft:pumpkin_stem',Properties:{age:'4'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'west'}}");
+ register(1669, "{Name:'minecraft:pumpkin_stem',Properties:{age:'5'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'west'}}");
+ register(1670, "{Name:'minecraft:pumpkin_stem',Properties:{age:'6'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'west'}}");
+ register(1671, "{Name:'minecraft:pumpkin_stem',Properties:{age:'7'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'west'}}");
+ register(1680, "{Name:'minecraft:melon_stem',Properties:{age:'0'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'west'}}");
+ register(1681, "{Name:'minecraft:melon_stem',Properties:{age:'1'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'west'}}");
+ register(1682, "{Name:'minecraft:melon_stem',Properties:{age:'2'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'west'}}");
+ register(1683, "{Name:'minecraft:melon_stem',Properties:{age:'3'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'west'}}");
+ register(1684, "{Name:'minecraft:melon_stem',Properties:{age:'4'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'west'}}");
+ register(1685, "{Name:'minecraft:melon_stem',Properties:{age:'5'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'west'}}");
+ register(1686, "{Name:'minecraft:melon_stem',Properties:{age:'6'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'west'}}");
+ register(1687, "{Name:'minecraft:melon_stem',Properties:{age:'7'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'west'}}");
+ register(1696, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'false'}}");
+ register(1697, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'false'}}");
+ register(1698, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'true'}}");
+ register(1699, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'true'}}");
+ register(1700, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'false'}}");
+ register(1701, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'false'}}");
+ register(1702, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'true'}}");
+ register(1703, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'true'}}");
+ register(1704, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'false'}}");
+ register(1705, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'false'}}");
+ register(1706, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'true'}}");
+ register(1707, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'true'}}");
+ register(1708, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'false'}}");
+ register(1709, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'false'}}");
+ register(1710, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'true'}}");
+ register(1711, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(1712, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}");
+ register(1713, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}");
+ register(1714, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}");
+ register(1715, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}");
+ register(1716, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}");
+ register(1717, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}");
+ register(1718, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}");
+ register(1719, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}");
+ register(1720, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}");
+ register(1721, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}");
+ register(1722, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}");
+ register(1723, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}");
+ register(1724, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}");
+ register(1725, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}");
+ register(1726, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}");
+ register(1727, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}");
+ register(1728, "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(1729, "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(1730, "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(1731, "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(1732, "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(1733, "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(1734, "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(1735, "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(1744, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(1745, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(1746, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(1747, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(1748, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(1749, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(1750, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(1751, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(1760, "{Name:'minecraft:mycelium',Properties:{snowy:'false'}}", "{Name:'minecraft:mycelium',Properties:{snowy:'false'}}", "{Name:'minecraft:mycelium',Properties:{snowy:'true'}}");
+ register(1776, "{Name:'minecraft:lily_pad'}", "{Name:'minecraft:waterlily'}");
+ register(1792, "{Name:'minecraft:nether_bricks'}", "{Name:'minecraft:nether_brick'}");
+ register(1808, "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(1824, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(1825, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(1826, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(1827, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(1828, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(1829, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(1830, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(1831, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(1840, "{Name:'minecraft:nether_wart',Properties:{age:'0'}}", "{Name:'minecraft:nether_wart',Properties:{age:'0'}}");
+ register(1841, "{Name:'minecraft:nether_wart',Properties:{age:'1'}}", "{Name:'minecraft:nether_wart',Properties:{age:'1'}}");
+ register(1842, "{Name:'minecraft:nether_wart',Properties:{age:'2'}}", "{Name:'minecraft:nether_wart',Properties:{age:'2'}}");
+ register(1843, "{Name:'minecraft:nether_wart',Properties:{age:'3'}}", "{Name:'minecraft:nether_wart',Properties:{age:'3'}}");
+ register(1856, "{Name:'minecraft:enchanting_table'}", "{Name:'minecraft:enchanting_table'}");
+ register(1872, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'false'}}");
+ register(1873, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'false'}}");
+ register(1874, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'false'}}");
+ register(1875, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'false'}}");
+ register(1876, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'true'}}");
+ register(1877, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'true'}}");
+ register(1878, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'true'}}");
+ register(1879, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'true'}}");
+ register(1888, "{Name:'minecraft:cauldron',Properties:{level:'0'}}", "{Name:'minecraft:cauldron',Properties:{level:'0'}}");
+ register(1889, "{Name:'minecraft:cauldron',Properties:{level:'1'}}", "{Name:'minecraft:cauldron',Properties:{level:'1'}}");
+ register(1890, "{Name:'minecraft:cauldron',Properties:{level:'2'}}", "{Name:'minecraft:cauldron',Properties:{level:'2'}}");
+ register(1891, "{Name:'minecraft:cauldron',Properties:{level:'3'}}", "{Name:'minecraft:cauldron',Properties:{level:'3'}}");
+ register(1904, "{Name:'minecraft:end_portal'}", "{Name:'minecraft:end_portal'}");
+ register(1920, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'south'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'south'}}");
+ register(1921, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'west'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'west'}}");
+ register(1922, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'north'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'north'}}");
+ register(1923, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'east'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'east'}}");
+ register(1924, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'south'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'south'}}");
+ register(1925, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'west'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'west'}}");
+ register(1926, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'north'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'north'}}");
+ register(1927, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'east'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'east'}}");
+ register(1936, "{Name:'minecraft:end_stone'}", "{Name:'minecraft:end_stone'}");
+ register(1952, "{Name:'minecraft:dragon_egg'}", "{Name:'minecraft:dragon_egg'}");
+ register(1968, "{Name:'minecraft:redstone_lamp',Properties:{lit:'false'}}", "{Name:'minecraft:redstone_lamp'}");
+ register(1984, "{Name:'minecraft:redstone_lamp',Properties:{lit:'true'}}", "{Name:'minecraft:lit_redstone_lamp'}");
+ register(2000, "{Name:'minecraft:oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'oak'}}");
+ register(2001, "{Name:'minecraft:spruce_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'spruce'}}");
+ register(2002, "{Name:'minecraft:birch_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'birch'}}");
+ register(2003, "{Name:'minecraft:jungle_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'jungle'}}");
+ register(2004, "{Name:'minecraft:acacia_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'acacia'}}");
+ register(2005, "{Name:'minecraft:dark_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'dark_oak'}}");
+ register(2016, "{Name:'minecraft:oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'oak'}}");
+ register(2017, "{Name:'minecraft:spruce_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'spruce'}}");
+ register(2018, "{Name:'minecraft:birch_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'birch'}}");
+ register(2019, "{Name:'minecraft:jungle_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'jungle'}}");
+ register(2020, "{Name:'minecraft:acacia_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'acacia'}}");
+ register(2021, "{Name:'minecraft:dark_oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'dark_oak'}}");
+ register(2024, "{Name:'minecraft:oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'oak'}}");
+ register(2025, "{Name:'minecraft:spruce_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'spruce'}}");
+ register(2026, "{Name:'minecraft:birch_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'birch'}}");
+ register(2027, "{Name:'minecraft:jungle_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'jungle'}}");
+ register(2028, "{Name:'minecraft:acacia_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'acacia'}}");
+ register(2029, "{Name:'minecraft:dark_oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'dark_oak'}}");
+ register(2032, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'south'}}");
+ register(2033, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'west'}}");
+ register(2034, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'north'}}");
+ register(2035, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'east'}}");
+ register(2036, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'south'}}");
+ register(2037, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'west'}}");
+ register(2038, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'north'}}");
+ register(2039, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'east'}}");
+ register(2040, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'south'}}");
+ register(2041, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'west'}}");
+ register(2042, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'north'}}");
+ register(2043, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'east'}}");
+ register(2048, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(2049, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(2050, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(2051, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(2052, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(2053, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(2054, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(2055, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(2064, "{Name:'minecraft:emerald_ore'}", "{Name:'minecraft:emerald_ore'}");
+ register(2082, "{Name:'minecraft:ender_chest',Properties:{facing:'north'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'north'}}");
+ register(2083, "{Name:'minecraft:ender_chest',Properties:{facing:'south'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'south'}}");
+ register(2084, "{Name:'minecraft:ender_chest',Properties:{facing:'west'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'west'}}");
+ register(2085, "{Name:'minecraft:ender_chest',Properties:{facing:'east'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'east'}}");
+ register(2096, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'false'}}");
+ register(2097, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'false'}}");
+ register(2098, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'false'}}");
+ register(2099, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'false'}}");
+ register(2100, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'false'}}");
+ register(2101, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'false'}}");
+ register(2102, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'false'}}");
+ register(2103, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'false'}}");
+ register(2104, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'true'}}");
+ register(2105, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'true'}}");
+ register(2106, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'true'}}");
+ register(2107, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'true'}}");
+ register(2108, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'true'}}");
+ register(2109, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'true'}}");
+ register(2110, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'true'}}");
+ register(2111, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'true'}}");
+ register(2112, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'true'}}");
+ register(2113, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'true'}}");
+ register(2114, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}");
+ register(2115, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}");
+ register(2116, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'true'}}");
+ register(2117, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'true'}}");
+ register(2118, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}");
+ register(2119, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}");
+ register(2120, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'true'}}");
+ register(2121, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'true'}}");
+ register(2122, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}");
+ register(2123, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}");
+ register(2124, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'true'}}");
+ register(2125, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'true'}}");
+ register(2126, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}");
+ register(2128, "{Name:'minecraft:emerald_block'}", "{Name:'minecraft:emerald_block'}");
+ register(2144, "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(2145, "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(2146, "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(2147, "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(2148, "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(2149, "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(2150, "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(2151, "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(2160, "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(2161, "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(2162, "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(2163, "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(2164, "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(2165, "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(2166, "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(2167, "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(2176, "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(2177, "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(2178, "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(2179, "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(2180, "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(2181, "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(2182, "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(2183, "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(2192, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'down'}}");
+ register(2193, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'up'}}");
+ register(2194, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'north'}}");
+ register(2195, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'south'}}");
+ register(2196, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'west'}}");
+ register(2197, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'east'}}");
+ register(2200, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'down'}}");
+ register(2201, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'up'}}");
+ register(2202, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'north'}}");
+ register(2203, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'south'}}");
+ register(2204, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'west'}}");
+ register(2205, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'east'}}");
+ register(2208, "{Name:'minecraft:beacon'}", "{Name:'minecraft:beacon'}");
+ register(2224, "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'cobblestone',west:'true'}}");
+ register(2225, "{Name:'minecraft:mossy_cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}");
+ // There are a few changes made to flower pot here, notably handling how legacy data is handled.
+ // The TE itself should contain the target item and from there the proper state can be determined. However, there are
+ // blocks that do not contain a TE. So we need to make sure there is a default to fall on.
+ // I simply followed the legacy handling from BlockFlowerPot from 1.8.8 to find what legacy data mapped to what.
+ // It's better than defaulting everything to a cactus.
+ register(2240, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'0'}}");
+ register(2241, "{Name:'minecraft:potted_poppy'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'1'}}");
+ register(2242, "{Name:'minecraft:potted_dandelion'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'2'}}");
+ register(2243, "{Name:'minecraft:potted_oak_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'3'}}");
+ register(2244, "{Name:'minecraft:potted_spruce_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'4'}}");
+ register(2245, "{Name:'minecraft:potted_birch_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'5'}}");
+ register(2246, "{Name:'minecraft:potted_jungle_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'6'}}");
+ register(2247, "{Name:'minecraft:potted_red_mushroom'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'7'}}");
+ register(2248, "{Name:'minecraft:potted_brown_mushroom'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'8'}}");
+ register(2249, "{Name:'minecraft:potted_cactus'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'9'}}");
+ register(2250, "{Name:'minecraft:potted_dead_bush'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'10'}}");
+ register(2251, "{Name:'minecraft:potted_fern'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'11'}}");
+ register(2252, "{Name:'minecraft:potted_acacia_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'12'}}");
+ register(2253, "{Name:'minecraft:potted_dark_oak_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'13'}}");
+ register(2254, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'14'}}");
+ register(2255, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'15'}}");
+ register(2256, "{Name:'minecraft:carrots',Properties:{age:'0'}}", "{Name:'minecraft:carrots',Properties:{age:'0'}}");
+ register(2257, "{Name:'minecraft:carrots',Properties:{age:'1'}}", "{Name:'minecraft:carrots',Properties:{age:'1'}}");
+ register(2258, "{Name:'minecraft:carrots',Properties:{age:'2'}}", "{Name:'minecraft:carrots',Properties:{age:'2'}}");
+ register(2259, "{Name:'minecraft:carrots',Properties:{age:'3'}}", "{Name:'minecraft:carrots',Properties:{age:'3'}}");
+ register(2260, "{Name:'minecraft:carrots',Properties:{age:'4'}}", "{Name:'minecraft:carrots',Properties:{age:'4'}}");
+ register(2261, "{Name:'minecraft:carrots',Properties:{age:'5'}}", "{Name:'minecraft:carrots',Properties:{age:'5'}}");
+ register(2262, "{Name:'minecraft:carrots',Properties:{age:'6'}}", "{Name:'minecraft:carrots',Properties:{age:'6'}}");
+ register(2263, "{Name:'minecraft:carrots',Properties:{age:'7'}}", "{Name:'minecraft:carrots',Properties:{age:'7'}}");
+ register(2272, "{Name:'minecraft:potatoes',Properties:{age:'0'}}", "{Name:'minecraft:potatoes',Properties:{age:'0'}}");
+ register(2273, "{Name:'minecraft:potatoes',Properties:{age:'1'}}", "{Name:'minecraft:potatoes',Properties:{age:'1'}}");
+ register(2274, "{Name:'minecraft:potatoes',Properties:{age:'2'}}", "{Name:'minecraft:potatoes',Properties:{age:'2'}}");
+ register(2275, "{Name:'minecraft:potatoes',Properties:{age:'3'}}", "{Name:'minecraft:potatoes',Properties:{age:'3'}}");
+ register(2276, "{Name:'minecraft:potatoes',Properties:{age:'4'}}", "{Name:'minecraft:potatoes',Properties:{age:'4'}}");
+ register(2277, "{Name:'minecraft:potatoes',Properties:{age:'5'}}", "{Name:'minecraft:potatoes',Properties:{age:'5'}}");
+ register(2278, "{Name:'minecraft:potatoes',Properties:{age:'6'}}", "{Name:'minecraft:potatoes',Properties:{age:'6'}}");
+ register(2279, "{Name:'minecraft:potatoes',Properties:{age:'7'}}", "{Name:'minecraft:potatoes',Properties:{age:'7'}}");
+ register(2288, "{Name:'minecraft:oak_button',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'down',powered:'false'}}");
+ register(2289, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'east',powered:'false'}}");
+ register(2290, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'west',powered:'false'}}");
+ register(2291, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'south',powered:'false'}}");
+ register(2292, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'north',powered:'false'}}");
+ register(2293, "{Name:'minecraft:oak_button',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'up',powered:'false'}}");
+ register(2296, "{Name:'minecraft:oak_button',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'down',powered:'true'}}");
+ register(2297, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'east',powered:'true'}}");
+ register(2298, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'west',powered:'true'}}");
+ register(2299, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'south',powered:'true'}}");
+ register(2300, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'north',powered:'true'}}");
+ register(2301, "{Name:'minecraft:oak_button',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'up',powered:'true'}}");
+ register(2304, "{Name:'%%FILTER_ME%%',Properties:{facing:'down',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'down',nodrop:'false'}}");
+ register(2305, "{Name:'%%FILTER_ME%%',Properties:{facing:'up',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'up',nodrop:'false'}}");
+ register(2306, "{Name:'%%FILTER_ME%%',Properties:{facing:'north',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'north',nodrop:'false'}}");
+ register(2307, "{Name:'%%FILTER_ME%%',Properties:{facing:'south',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'south',nodrop:'false'}}");
+ register(2308, "{Name:'%%FILTER_ME%%',Properties:{facing:'west',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'west',nodrop:'false'}}");
+ register(2309, "{Name:'%%FILTER_ME%%',Properties:{facing:'east',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'east',nodrop:'false'}}");
+ register(2312, "{Name:'%%FILTER_ME%%',Properties:{facing:'down',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'down',nodrop:'true'}}");
+ register(2313, "{Name:'%%FILTER_ME%%',Properties:{facing:'up',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'up',nodrop:'true'}}");
+ register(2314, "{Name:'%%FILTER_ME%%',Properties:{facing:'north',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'north',nodrop:'true'}}");
+ register(2315, "{Name:'%%FILTER_ME%%',Properties:{facing:'south',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'south',nodrop:'true'}}");
+ register(2316, "{Name:'%%FILTER_ME%%',Properties:{facing:'west',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'west',nodrop:'true'}}");
+ register(2317, "{Name:'%%FILTER_ME%%',Properties:{facing:'east',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'east',nodrop:'true'}}");
+ register(2320, "{Name:'minecraft:anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'south'}}");
+ register(2321, "{Name:'minecraft:anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'west'}}");
+ register(2322, "{Name:'minecraft:anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'north'}}");
+ register(2323, "{Name:'minecraft:anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'east'}}");
+ register(2324, "{Name:'minecraft:chipped_anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'south'}}");
+ register(2325, "{Name:'minecraft:chipped_anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'west'}}");
+ register(2326, "{Name:'minecraft:chipped_anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'north'}}");
+ register(2327, "{Name:'minecraft:chipped_anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'east'}}");
+ register(2328, "{Name:'minecraft:damaged_anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'south'}}");
+ register(2329, "{Name:'minecraft:damaged_anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'west'}}");
+ register(2330, "{Name:'minecraft:damaged_anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'north'}}");
+ register(2331, "{Name:'minecraft:damaged_anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'east'}}");
+ register(2338, "{Name:'minecraft:trapped_chest',Properties:{facing:'north',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'north'}}");
+ register(2339, "{Name:'minecraft:trapped_chest',Properties:{facing:'south',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'south'}}");
+ register(2340, "{Name:'minecraft:trapped_chest',Properties:{facing:'west',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'west'}}");
+ register(2341, "{Name:'minecraft:trapped_chest',Properties:{facing:'east',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'east'}}");
+ register(2352, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'0'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'0'}}");
+ register(2353, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'1'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'1'}}");
+ register(2354, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'2'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'2'}}");
+ register(2355, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'3'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'3'}}");
+ register(2356, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'4'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'4'}}");
+ register(2357, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'5'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'5'}}");
+ register(2358, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'6'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'6'}}");
+ register(2359, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'7'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'7'}}");
+ register(2360, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'8'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'8'}}");
+ register(2361, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'9'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'9'}}");
+ register(2362, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'10'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'10'}}");
+ register(2363, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'11'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'11'}}");
+ register(2364, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'12'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'12'}}");
+ register(2365, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'13'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'13'}}");
+ register(2366, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'14'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'14'}}");
+ register(2367, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'15'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'15'}}");
+ register(2368, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'0'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'0'}}");
+ register(2369, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'1'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'1'}}");
+ register(2370, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'2'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'2'}}");
+ register(2371, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'3'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'3'}}");
+ register(2372, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'4'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'4'}}");
+ register(2373, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'5'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'5'}}");
+ register(2374, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'6'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'6'}}");
+ register(2375, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'7'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'7'}}");
+ register(2376, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'8'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'8'}}");
+ register(2377, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'9'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'9'}}");
+ register(2378, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'10'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'10'}}");
+ register(2379, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'11'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'11'}}");
+ register(2380, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'12'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'12'}}");
+ register(2381, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'13'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'13'}}");
+ register(2382, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'14'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'14'}}");
+ register(2383, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'15'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'15'}}");
+ register(2384, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}");
+ register(2385, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}");
+ register(2386, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}");
+ register(2387, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}");
+ register(2388, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}");
+ register(2389, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}");
+ register(2390, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}");
+ register(2391, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}");
+ register(2392, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}");
+ register(2393, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}");
+ register(2394, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}");
+ register(2395, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}");
+ register(2396, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}");
+ register(2397, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}");
+ register(2398, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}");
+ register(2399, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}");
+ register(2400, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}");
+ register(2401, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}");
+ register(2402, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}");
+ register(2403, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}");
+ register(2404, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}");
+ register(2405, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}");
+ register(2406, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}");
+ register(2407, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}");
+ register(2408, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}");
+ register(2409, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}");
+ register(2410, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}");
+ register(2411, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}");
+ register(2412, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}");
+ register(2413, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}");
+ register(2414, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}");
+ register(2415, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}");
+ register(2416, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'0'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'0'}}");
+ register(2417, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'1'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'1'}}");
+ register(2418, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'2'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'2'}}");
+ register(2419, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'3'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'3'}}");
+ register(2420, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'4'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'4'}}");
+ register(2421, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'5'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'5'}}");
+ register(2422, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'6'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'6'}}");
+ register(2423, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'7'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'7'}}");
+ register(2424, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'8'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'8'}}");
+ register(2425, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'9'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'9'}}");
+ register(2426, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'10'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'10'}}");
+ register(2427, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'11'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'11'}}");
+ register(2428, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'12'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'12'}}");
+ register(2429, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'13'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'13'}}");
+ register(2430, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'14'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'14'}}");
+ register(2431, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'15'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'15'}}");
+ register(2432, "{Name:'minecraft:redstone_block'}", "{Name:'minecraft:redstone_block'}");
+ register(2448, "{Name:'minecraft:nether_quartz_ore'}", "{Name:'minecraft:quartz_ore'}");
+ register(2464, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'down'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'down'}}");
+ register(2466, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'north'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'north'}}");
+ register(2467, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'south'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'south'}}");
+ register(2468, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'west'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'west'}}");
+ register(2469, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'east'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'east'}}");
+ register(2472, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'down'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'down'}}");
+ register(2474, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'north'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'north'}}");
+ register(2475, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'south'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'south'}}");
+ register(2476, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'west'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'west'}}");
+ register(2477, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'east'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'east'}}");
+ register(2480, "{Name:'minecraft:quartz_block'}", "{Name:'minecraft:quartz_block',Properties:{variant:'default'}}");
+ register(2481, "{Name:'minecraft:chiseled_quartz_block'}", "{Name:'minecraft:quartz_block',Properties:{variant:'chiseled'}}");
+ register(2482, "{Name:'minecraft:quartz_pillar',Properties:{axis:'y'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_y'}}");
+ register(2483, "{Name:'minecraft:quartz_pillar',Properties:{axis:'x'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_x'}}");
+ register(2484, "{Name:'minecraft:quartz_pillar',Properties:{axis:'z'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_z'}}");
+ register(2496, "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(2497, "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(2498, "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(2499, "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(2500, "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(2501, "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(2502, "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(2503, "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(2512, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'north_south'}}");
+ register(2513, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'east_west'}}");
+ register(2514, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_east'}}");
+ register(2515, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_west'}}");
+ register(2516, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_north'}}");
+ register(2517, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_south'}}");
+ register(2520, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'north_south'}}");
+ register(2521, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'east_west'}}");
+ register(2522, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_east'}}");
+ register(2523, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_west'}}");
+ register(2524, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_north'}}");
+ register(2525, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_south'}}");
+ register(2528, "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'false'}}");
+ register(2529, "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'false'}}");
+ register(2530, "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'false'}}");
+ register(2531, "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'false'}}");
+ register(2532, "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'false'}}");
+ register(2533, "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'false'}}");
+ register(2536, "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'true'}}");
+ register(2537, "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'true'}}");
+ register(2538, "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'true'}}");
+ register(2539, "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'true'}}");
+ register(2540, "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'true'}}");
+ register(2541, "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'true'}}");
+ register(2544, "{Name:'minecraft:white_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'white'}}");
+ register(2545, "{Name:'minecraft:orange_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'orange'}}");
+ register(2546, "{Name:'minecraft:magenta_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'magenta'}}");
+ register(2547, "{Name:'minecraft:light_blue_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'light_blue'}}");
+ register(2548, "{Name:'minecraft:yellow_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'yellow'}}");
+ register(2549, "{Name:'minecraft:lime_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'lime'}}");
+ register(2550, "{Name:'minecraft:pink_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'pink'}}");
+ register(2551, "{Name:'minecraft:gray_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'gray'}}");
+ register(2552, "{Name:'minecraft:light_gray_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'silver'}}");
+ register(2553, "{Name:'minecraft:cyan_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'cyan'}}");
+ register(2554, "{Name:'minecraft:purple_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'purple'}}");
+ register(2555, "{Name:'minecraft:blue_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'blue'}}");
+ register(2556, "{Name:'minecraft:brown_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'brown'}}");
+ register(2557, "{Name:'minecraft:green_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'green'}}");
+ register(2558, "{Name:'minecraft:red_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'red'}}");
+ register(2559, "{Name:'minecraft:black_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'black'}}");
+ register(2560, "{Name:'minecraft:white_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2561, "{Name:'minecraft:orange_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2562, "{Name:'minecraft:magenta_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2563, "{Name:'minecraft:light_blue_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2564, "{Name:'minecraft:yellow_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2565, "{Name:'minecraft:lime_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2566, "{Name:'minecraft:pink_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2567, "{Name:'minecraft:gray_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2568, "{Name:'minecraft:light_gray_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2569, "{Name:'minecraft:cyan_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2570, "{Name:'minecraft:purple_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2571, "{Name:'minecraft:blue_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2572, "{Name:'minecraft:brown_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2573, "{Name:'minecraft:green_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2574, "{Name:'minecraft:red_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2575, "{Name:'minecraft:black_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'true',west:'true'}}");
+ register(2576, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'true',variant:'acacia'}}");
+ register(2577, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'true',variant:'dark_oak'}}");
+ register(2580, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'false',variant:'acacia'}}");
+ register(2581, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'false',variant:'dark_oak'}}");
+ register(2584, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'true',variant:'acacia'}}");
+ register(2585, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'true',variant:'dark_oak'}}");
+ register(2588, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'false',variant:'acacia'}}");
+ register(2589, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'false',variant:'dark_oak'}}");
+ register(2592, "{Name:'minecraft:acacia_log',Properties:{axis:'y'}}", "{Name:'minecraft:log2',Properties:{axis:'y',variant:'acacia'}}");
+ register(2593, "{Name:'minecraft:dark_oak_log',Properties:{axis:'y'}}", "{Name:'minecraft:log2',Properties:{axis:'y',variant:'dark_oak'}}");
+ register(2596, "{Name:'minecraft:acacia_log',Properties:{axis:'x'}}", "{Name:'minecraft:log2',Properties:{axis:'x',variant:'acacia'}}");
+ register(2597, "{Name:'minecraft:dark_oak_log',Properties:{axis:'x'}}", "{Name:'minecraft:log2',Properties:{axis:'x',variant:'dark_oak'}}");
+ register(2600, "{Name:'minecraft:acacia_log',Properties:{axis:'z'}}", "{Name:'minecraft:log2',Properties:{axis:'z',variant:'acacia'}}");
+ register(2601, "{Name:'minecraft:dark_oak_log',Properties:{axis:'z'}}", "{Name:'minecraft:log2',Properties:{axis:'z',variant:'dark_oak'}}");
+ register(2604, "{Name:'minecraft:acacia_bark'}", "{Name:'minecraft:log2',Properties:{axis:'none',variant:'acacia'}}");
+ register(2605, "{Name:'minecraft:dark_oak_bark'}", "{Name:'minecraft:log2',Properties:{axis:'none',variant:'dark_oak'}}");
+ register(2608, "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(2609, "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(2610, "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(2611, "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(2612, "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(2613, "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(2614, "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(2615, "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(2624, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(2625, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(2626, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(2627, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(2628, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(2629, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(2630, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(2631, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(2640, "{Name:'minecraft:slime_block'}", "{Name:'minecraft:slime'}");
+ register(2656, "{Name:'minecraft:barrier'}", "{Name:'minecraft:barrier'}");
+ register(2672, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}");
+ register(2673, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}");
+ register(2674, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}");
+ register(2675, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}");
+ register(2676, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}");
+ register(2677, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}");
+ register(2678, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}");
+ register(2679, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}");
+ register(2680, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}");
+ register(2681, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}");
+ register(2682, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}");
+ register(2683, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}");
+ register(2684, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}");
+ register(2685, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}");
+ register(2686, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}");
+ register(2687, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}");
+ register(2688, "{Name:'minecraft:prismarine'}", "{Name:'minecraft:prismarine',Properties:{variant:'prismarine'}}");
+ register(2689, "{Name:'minecraft:prismarine_bricks'}", "{Name:'minecraft:prismarine',Properties:{variant:'prismarine_bricks'}}");
+ register(2690, "{Name:'minecraft:dark_prismarine'}", "{Name:'minecraft:prismarine',Properties:{variant:'dark_prismarine'}}");
+ register(2704, "{Name:'minecraft:sea_lantern'}", "{Name:'minecraft:sea_lantern'}");
+ register(2720, "{Name:'minecraft:hay_block',Properties:{axis:'y'}}", "{Name:'minecraft:hay_block',Properties:{axis:'y'}}");
+ register(2724, "{Name:'minecraft:hay_block',Properties:{axis:'x'}}", "{Name:'minecraft:hay_block',Properties:{axis:'x'}}");
+ register(2728, "{Name:'minecraft:hay_block',Properties:{axis:'z'}}", "{Name:'minecraft:hay_block',Properties:{axis:'z'}}");
+ register(2736, "{Name:'minecraft:white_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'white'}}");
+ register(2737, "{Name:'minecraft:orange_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'orange'}}");
+ register(2738, "{Name:'minecraft:magenta_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'magenta'}}");
+ register(2739, "{Name:'minecraft:light_blue_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'light_blue'}}");
+ register(2740, "{Name:'minecraft:yellow_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'yellow'}}");
+ register(2741, "{Name:'minecraft:lime_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'lime'}}");
+ register(2742, "{Name:'minecraft:pink_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'pink'}}");
+ register(2743, "{Name:'minecraft:gray_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'gray'}}");
+ register(2744, "{Name:'minecraft:light_gray_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'silver'}}");
+ register(2745, "{Name:'minecraft:cyan_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'cyan'}}");
+ register(2746, "{Name:'minecraft:purple_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'purple'}}");
+ register(2747, "{Name:'minecraft:blue_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'blue'}}");
+ register(2748, "{Name:'minecraft:brown_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'brown'}}");
+ register(2749, "{Name:'minecraft:green_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'green'}}");
+ register(2750, "{Name:'minecraft:red_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'red'}}");
+ register(2751, "{Name:'minecraft:black_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'black'}}");
+ register(2752, "{Name:'minecraft:terracotta'}", "{Name:'minecraft:hardened_clay'}");
+ register(2768, "{Name:'minecraft:coal_block'}", "{Name:'minecraft:coal_block'}");
+ register(2784, "{Name:'minecraft:packed_ice'}", "{Name:'minecraft:packed_ice'}");
+ register(2800, "{Name:'minecraft:sunflower',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'sunflower'}}");
+ register(2801, "{Name:'minecraft:lilac',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'syringa'}}");
+ register(2802, "{Name:'minecraft:tall_grass',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_grass'}}");
+ register(2803, "{Name:'minecraft:large_fern',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_fern'}}");
+ register(2804, "{Name:'minecraft:rose_bush',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_rose'}}");
+ register(2805, "{Name:'minecraft:peony',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'paeonia'}}");
+ register(2808, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'syringa'}}");
+ register(2809, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'syringa'}}");
+ register(2810, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'syringa'}}");
+ register(2811, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'syringa'}}");
+ register(2816, "{Name:'minecraft:white_banner',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'0'}}");
+ register(2817, "{Name:'minecraft:white_banner',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'1'}}");
+ register(2818, "{Name:'minecraft:white_banner',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'2'}}");
+ register(2819, "{Name:'minecraft:white_banner',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'3'}}");
+ register(2820, "{Name:'minecraft:white_banner',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'4'}}");
+ register(2821, "{Name:'minecraft:white_banner',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'5'}}");
+ register(2822, "{Name:'minecraft:white_banner',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'6'}}");
+ register(2823, "{Name:'minecraft:white_banner',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'7'}}");
+ register(2824, "{Name:'minecraft:white_banner',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'8'}}");
+ register(2825, "{Name:'minecraft:white_banner',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'9'}}");
+ register(2826, "{Name:'minecraft:white_banner',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'10'}}");
+ register(2827, "{Name:'minecraft:white_banner',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'11'}}");
+ register(2828, "{Name:'minecraft:white_banner',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'12'}}");
+ register(2829, "{Name:'minecraft:white_banner',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'13'}}");
+ register(2830, "{Name:'minecraft:white_banner',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'14'}}");
+ register(2831, "{Name:'minecraft:white_banner',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'15'}}");
+ register(2834, "{Name:'minecraft:white_wall_banner',Properties:{facing:'north'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'north'}}");
+ register(2835, "{Name:'minecraft:white_wall_banner',Properties:{facing:'south'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'south'}}");
+ register(2836, "{Name:'minecraft:white_wall_banner',Properties:{facing:'west'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'west'}}");
+ register(2837, "{Name:'minecraft:white_wall_banner',Properties:{facing:'east'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'east'}}");
+ register(2848, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'0'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'0'}}");
+ register(2849, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'1'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'1'}}");
+ register(2850, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'2'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'2'}}");
+ register(2851, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'3'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'3'}}");
+ register(2852, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'4'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'4'}}");
+ register(2853, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'5'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'5'}}");
+ register(2854, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'6'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'6'}}");
+ register(2855, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'7'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'7'}}");
+ register(2856, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'8'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'8'}}");
+ register(2857, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'9'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'9'}}");
+ register(2858, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'10'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'10'}}");
+ register(2859, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'11'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'11'}}");
+ register(2860, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'12'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'12'}}");
+ register(2861, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'13'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'13'}}");
+ register(2862, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'14'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'14'}}");
+ register(2863, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'15'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'15'}}");
+ register(2864, "{Name:'minecraft:red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'red_sandstone'}}");
+ register(2865, "{Name:'minecraft:chiseled_red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'chiseled_red_sandstone'}}");
+ register(2866, "{Name:'minecraft:cut_red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'smooth_red_sandstone'}}");
+ register(2880, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(2881, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(2882, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(2883, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(2884, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(2885, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(2886, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(2887, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(2896, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab2',Properties:{seamless:'false',variant:'red_sandstone'}}");
+ register(2904, "{Name:'minecraft:smooth_red_sandstone'}", "{Name:'minecraft:double_stone_slab2',Properties:{seamless:'true',variant:'red_sandstone'}}");
+ register(2912, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab2',Properties:{half:'bottom',variant:'red_sandstone'}}");
+ register(2920, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab2',Properties:{half:'top',variant:'red_sandstone'}}");
+ register(2928, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}");
+ register(2929, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}");
+ register(2930, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}");
+ register(2931, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}");
+ register(2932, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}");
+ register(2933, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}");
+ register(2934, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}");
+ register(2935, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}");
+ register(2936, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}");
+ register(2937, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}");
+ register(2938, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}");
+ register(2939, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}");
+ register(2940, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}");
+ register(2941, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}");
+ register(2942, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}");
+ register(2943, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}");
+ register(2944, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}");
+ register(2945, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}");
+ register(2946, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}");
+ register(2947, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}");
+ register(2948, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}");
+ register(2949, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}");
+ register(2950, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}");
+ register(2951, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}");
+ register(2952, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}");
+ register(2953, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}");
+ register(2954, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}");
+ register(2955, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}");
+ register(2956, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}");
+ register(2957, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}");
+ register(2958, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}");
+ register(2959, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}");
+ register(2960, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}");
+ register(2961, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}");
+ register(2962, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}");
+ register(2963, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}");
+ register(2964, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}");
+ register(2965, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}");
+ register(2966, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}");
+ register(2967, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}");
+ register(2968, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}");
+ register(2969, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}");
+ register(2970, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}");
+ register(2971, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}");
+ register(2972, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}");
+ register(2973, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}");
+ register(2974, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}");
+ register(2975, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}");
+ register(2976, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}");
+ register(2977, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}");
+ register(2978, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}");
+ register(2979, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}");
+ register(2980, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}");
+ register(2981, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}");
+ register(2982, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}");
+ register(2983, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}");
+ register(2984, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}");
+ register(2985, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}");
+ register(2986, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}");
+ register(2987, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}");
+ register(2988, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}");
+ register(2989, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}");
+ register(2990, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}");
+ register(2991, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}");
+ register(2992, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}");
+ register(2993, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}");
+ register(2994, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}");
+ register(2995, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}");
+ register(2996, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}");
+ register(2997, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}");
+ register(2998, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}");
+ register(2999, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}");
+ register(3000, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}");
+ register(3001, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}");
+ register(3002, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}");
+ register(3003, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}");
+ register(3004, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}");
+ register(3005, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}");
+ register(3006, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}");
+ register(3007, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}");
+ register(3008, "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(3024, "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(3040, "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(3056, "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(3072, "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}");
+ register(3088, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3089, "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3090, "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3091, "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3092, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3093, "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3094, "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3095, "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3096, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(3097, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}");
+ register(3098, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}");
+ register(3099, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}");
+ register(3104, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3105, "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3106, "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3107, "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3108, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3109, "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3110, "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3111, "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3112, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(3113, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}");
+ register(3114, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}");
+ register(3115, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}");
+ register(3120, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3121, "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3122, "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3123, "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3124, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3125, "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3126, "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3127, "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3128, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(3129, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}");
+ register(3130, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}");
+ register(3131, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}");
+ register(3136, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3137, "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3138, "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3139, "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3140, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3141, "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3142, "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3143, "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3144, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(3145, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}");
+ register(3146, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}");
+ register(3147, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}");
+ register(3152, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3153, "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3154, "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3155, "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}");
+ register(3156, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3157, "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3158, "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3159, "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}");
+ register(3160, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}");
+ register(3161, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}");
+ register(3162, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}");
+ register(3163, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}");
+ register(3168, "{Name:'minecraft:end_rod',Properties:{facing:'down'}}", "{Name:'minecraft:end_rod',Properties:{facing:'down'}}");
+ register(3169, "{Name:'minecraft:end_rod',Properties:{facing:'up'}}", "{Name:'minecraft:end_rod',Properties:{facing:'up'}}");
+ register(3170, "{Name:'minecraft:end_rod',Properties:{facing:'north'}}", "{Name:'minecraft:end_rod',Properties:{facing:'north'}}");
+ register(3171, "{Name:'minecraft:end_rod',Properties:{facing:'south'}}", "{Name:'minecraft:end_rod',Properties:{facing:'south'}}");
+ register(3172, "{Name:'minecraft:end_rod',Properties:{facing:'west'}}", "{Name:'minecraft:end_rod',Properties:{facing:'west'}}");
+ register(3173, "{Name:'minecraft:end_rod',Properties:{facing:'east'}}", "{Name:'minecraft:end_rod',Properties:{facing:'east'}}");
+ register(3184, "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'true',west:'true'}}");
+ register(3200, "{Name:'minecraft:chorus_flower',Properties:{age:'0'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'0'}}");
+ register(3201, "{Name:'minecraft:chorus_flower',Properties:{age:'1'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'1'}}");
+ register(3202, "{Name:'minecraft:chorus_flower',Properties:{age:'2'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'2'}}");
+ register(3203, "{Name:'minecraft:chorus_flower',Properties:{age:'3'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'3'}}");
+ register(3204, "{Name:'minecraft:chorus_flower',Properties:{age:'4'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'4'}}");
+ register(3205, "{Name:'minecraft:chorus_flower',Properties:{age:'5'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'5'}}");
+ register(3216, "{Name:'minecraft:purpur_block'}", "{Name:'minecraft:purpur_block'}");
+ register(3232, "{Name:'minecraft:purpur_pillar',Properties:{axis:'y'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'y'}}");
+ register(3236, "{Name:'minecraft:purpur_pillar',Properties:{axis:'x'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'x'}}");
+ register(3240, "{Name:'minecraft:purpur_pillar',Properties:{axis:'z'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'z'}}");
+ register(3248, "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}");
+ register(3249, "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}");
+ register(3250, "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}");
+ register(3251, "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}");
+ register(3252, "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}");
+ register(3253, "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}");
+ register(3254, "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}");
+ register(3255, "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}");
+ register(3264, "{Name:'minecraft:purpur_slab',Properties:{type:'double'}}", "{Name:'minecraft:purpur_double_slab',Properties:{variant:'default'}}");
+ register(3280, "{Name:'minecraft:purpur_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:purpur_slab',Properties:{half:'bottom',variant:'default'}}");
+ register(3288, "{Name:'minecraft:purpur_slab',Properties:{type:'top'}}", "{Name:'minecraft:purpur_slab',Properties:{half:'top',variant:'default'}}");
+ register(3296, "{Name:'minecraft:end_stone_bricks'}", "{Name:'minecraft:end_bricks'}");
+ register(3312, "{Name:'minecraft:beetroots',Properties:{age:'0'}}", "{Name:'minecraft:beetroots',Properties:{age:'0'}}");
+ register(3313, "{Name:'minecraft:beetroots',Properties:{age:'1'}}", "{Name:'minecraft:beetroots',Properties:{age:'1'}}");
+ register(3314, "{Name:'minecraft:beetroots',Properties:{age:'2'}}", "{Name:'minecraft:beetroots',Properties:{age:'2'}}");
+ register(3315, "{Name:'minecraft:beetroots',Properties:{age:'3'}}", "{Name:'minecraft:beetroots',Properties:{age:'3'}}");
+ register(3328, "{Name:'minecraft:grass_path'}", "{Name:'minecraft:grass_path'}");
+ register(3344, "{Name:'minecraft:end_gateway'}", "{Name:'minecraft:end_gateway'}");
+ register(3360, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'down'}}");
+ register(3361, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'up'}}");
+ register(3362, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'north'}}");
+ register(3363, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'south'}}");
+ register(3364, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'west'}}");
+ register(3365, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'east'}}");
+ register(3368, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'down'}}");
+ register(3369, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'up'}}");
+ register(3370, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'north'}}");
+ register(3371, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'south'}}");
+ register(3372, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'west'}}");
+ register(3373, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'east'}}");
+ register(3376, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'down'}}");
+ register(3377, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'up'}}");
+ register(3378, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'north'}}");
+ register(3379, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'south'}}");
+ register(3380, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'west'}}");
+ register(3381, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'east'}}");
+ register(3384, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'down'}}");
+ register(3385, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'up'}}");
+ register(3386, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'north'}}");
+ register(3387, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'south'}}");
+ register(3388, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'west'}}");
+ register(3389, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'east'}}");
+ register(3392, "{Name:'minecraft:frosted_ice',Properties:{age:'0'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'0'}}");
+ register(3393, "{Name:'minecraft:frosted_ice',Properties:{age:'1'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'1'}}");
+ register(3394, "{Name:'minecraft:frosted_ice',Properties:{age:'2'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'2'}}");
+ register(3395, "{Name:'minecraft:frosted_ice',Properties:{age:'3'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'3'}}");
+ register(3408, "{Name:'minecraft:magma_block'}", "{Name:'minecraft:magma'}");
+ register(3424, "{Name:'minecraft:nether_wart_block'}", "{Name:'minecraft:nether_wart_block'}");
+ register(3440, "{Name:'minecraft:red_nether_bricks'}", "{Name:'minecraft:red_nether_brick'}");
+ register(3456, "{Name:'minecraft:bone_block',Properties:{axis:'y'}}", "{Name:'minecraft:bone_block',Properties:{axis:'y'}}");
+ register(3460, "{Name:'minecraft:bone_block',Properties:{axis:'x'}}", "{Name:'minecraft:bone_block',Properties:{axis:'x'}}");
+ register(3464, "{Name:'minecraft:bone_block',Properties:{axis:'z'}}", "{Name:'minecraft:bone_block',Properties:{axis:'z'}}");
+ register(3472, "{Name:'minecraft:structure_void'}", "{Name:'minecraft:structure_void'}");
+ register(3488, "{Name:'minecraft:observer',Properties:{facing:'down',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'down',powered:'false'}}");
+ register(3489, "{Name:'minecraft:observer',Properties:{facing:'up',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'up',powered:'false'}}");
+ register(3490, "{Name:'minecraft:observer',Properties:{facing:'north',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'north',powered:'false'}}");
+ register(3491, "{Name:'minecraft:observer',Properties:{facing:'south',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'south',powered:'false'}}");
+ register(3492, "{Name:'minecraft:observer',Properties:{facing:'west',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'west',powered:'false'}}");
+ register(3493, "{Name:'minecraft:observer',Properties:{facing:'east',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'east',powered:'false'}}");
+ register(3496, "{Name:'minecraft:observer',Properties:{facing:'down',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'down',powered:'true'}}");
+ register(3497, "{Name:'minecraft:observer',Properties:{facing:'up',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'up',powered:'true'}}");
+ register(3498, "{Name:'minecraft:observer',Properties:{facing:'north',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'north',powered:'true'}}");
+ register(3499, "{Name:'minecraft:observer',Properties:{facing:'south',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'south',powered:'true'}}");
+ register(3500, "{Name:'minecraft:observer',Properties:{facing:'west',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'west',powered:'true'}}");
+ register(3501, "{Name:'minecraft:observer',Properties:{facing:'east',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'east',powered:'true'}}");
+ register(3504, "{Name:'minecraft:white_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'down'}}");
+ register(3505, "{Name:'minecraft:white_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'up'}}");
+ register(3506, "{Name:'minecraft:white_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'north'}}");
+ register(3507, "{Name:'minecraft:white_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'south'}}");
+ register(3508, "{Name:'minecraft:white_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'west'}}");
+ register(3509, "{Name:'minecraft:white_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'east'}}");
+ register(3520, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'down'}}");
+ register(3521, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'up'}}");
+ register(3522, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'north'}}");
+ register(3523, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'south'}}");
+ register(3524, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'west'}}");
+ register(3525, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'east'}}");
+ register(3536, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'down'}}");
+ register(3537, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'up'}}");
+ register(3538, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'north'}}");
+ register(3539, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'south'}}");
+ register(3540, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'west'}}");
+ register(3541, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'east'}}");
+ register(3552, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'down'}}");
+ register(3553, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'up'}}");
+ register(3554, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'north'}}");
+ register(3555, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'south'}}");
+ register(3556, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'west'}}");
+ register(3557, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'east'}}");
+ register(3568, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'down'}}");
+ register(3569, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'up'}}");
+ register(3570, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'north'}}");
+ register(3571, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'south'}}");
+ register(3572, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'west'}}");
+ register(3573, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'east'}}");
+ register(3584, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'down'}}");
+ register(3585, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'up'}}");
+ register(3586, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'north'}}");
+ register(3587, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'south'}}");
+ register(3588, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'west'}}");
+ register(3589, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'east'}}");
+ register(3600, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'down'}}");
+ register(3601, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'up'}}");
+ register(3602, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'north'}}");
+ register(3603, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'south'}}");
+ register(3604, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'west'}}");
+ register(3605, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'east'}}");
+ register(3616, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'down'}}");
+ register(3617, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'up'}}");
+ register(3618, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'north'}}");
+ register(3619, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'south'}}");
+ register(3620, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'west'}}");
+ register(3621, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'east'}}");
+ register(3632, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'down'}}");
+ register(3633, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'up'}}");
+ register(3634, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'north'}}");
+ register(3635, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'south'}}");
+ register(3636, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'west'}}");
+ register(3637, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'east'}}");
+ register(3648, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'down'}}");
+ register(3649, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'up'}}");
+ register(3650, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'north'}}");
+ register(3651, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'south'}}");
+ register(3652, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'west'}}");
+ register(3653, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'east'}}");
+ register(3664, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'down'}}");
+ register(3665, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'up'}}");
+ register(3666, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'north'}}");
+ register(3667, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'south'}}");
+ register(3668, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'west'}}");
+ register(3669, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'east'}}");
+ register(3680, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'down'}}");
+ register(3681, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'up'}}");
+ register(3682, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'north'}}");
+ register(3683, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'south'}}");
+ register(3684, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'west'}}");
+ register(3685, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'east'}}");
+ register(3696, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'down'}}");
+ register(3697, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'up'}}");
+ register(3698, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'north'}}");
+ register(3699, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'south'}}");
+ register(3700, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'west'}}");
+ register(3701, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'east'}}");
+ register(3712, "{Name:'minecraft:green_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'down'}}");
+ register(3713, "{Name:'minecraft:green_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'up'}}");
+ register(3714, "{Name:'minecraft:green_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'north'}}");
+ register(3715, "{Name:'minecraft:green_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'south'}}");
+ register(3716, "{Name:'minecraft:green_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'west'}}");
+ register(3717, "{Name:'minecraft:green_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'east'}}");
+ register(3728, "{Name:'minecraft:red_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'down'}}");
+ register(3729, "{Name:'minecraft:red_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'up'}}");
+ register(3730, "{Name:'minecraft:red_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'north'}}");
+ register(3731, "{Name:'minecraft:red_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'south'}}");
+ register(3732, "{Name:'minecraft:red_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'west'}}");
+ register(3733, "{Name:'minecraft:red_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'east'}}");
+ register(3744, "{Name:'minecraft:black_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'down'}}");
+ register(3745, "{Name:'minecraft:black_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'up'}}");
+ register(3746, "{Name:'minecraft:black_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'north'}}");
+ register(3747, "{Name:'minecraft:black_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'south'}}");
+ register(3748, "{Name:'minecraft:black_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'west'}}");
+ register(3749, "{Name:'minecraft:black_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'east'}}");
+ register(3760, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3761, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3762, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3763, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3776, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3777, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3778, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3779, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3792, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3793, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3794, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3795, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3808, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3809, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3810, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3811, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3824, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3825, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3826, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3827, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3840, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3841, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3842, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3843, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3856, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3857, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3858, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3859, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3872, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3873, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3874, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3875, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3888, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3889, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3890, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3891, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3904, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3905, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3906, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3907, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3920, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3921, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3922, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3923, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3936, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3937, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3938, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3939, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3952, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3953, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3954, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3955, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3968, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3969, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3970, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3971, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'east'}}");
+ register(3984, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'south'}}");
+ register(3985, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'west'}}");
+ register(3986, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'north'}}");
+ register(3987, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'east'}}");
+ register(4000, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'south'}}");
+ register(4001, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'west'}}");
+ register(4002, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'north'}}");
+ register(4003, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'east'}}");
+ register(4016, "{Name:'minecraft:white_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'white'}}");
+ register(4017, "{Name:'minecraft:orange_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'orange'}}");
+ register(4018, "{Name:'minecraft:magenta_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'magenta'}}");
+ register(4019, "{Name:'minecraft:light_blue_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'light_blue'}}");
+ register(4020, "{Name:'minecraft:yellow_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'yellow'}}");
+ register(4021, "{Name:'minecraft:lime_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'lime'}}");
+ register(4022, "{Name:'minecraft:pink_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'pink'}}");
+ register(4023, "{Name:'minecraft:gray_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'gray'}}");
+ register(4024, "{Name:'minecraft:light_gray_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'silver'}}");
+ register(4025, "{Name:'minecraft:cyan_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'cyan'}}");
+ register(4026, "{Name:'minecraft:purple_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'purple'}}");
+ register(4027, "{Name:'minecraft:blue_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'blue'}}");
+ register(4028, "{Name:'minecraft:brown_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'brown'}}");
+ register(4029, "{Name:'minecraft:green_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'green'}}");
+ register(4030, "{Name:'minecraft:red_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'red'}}");
+ register(4031, "{Name:'minecraft:black_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'black'}}");
+ register(4032, "{Name:'minecraft:white_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'white'}}");
+ register(4033, "{Name:'minecraft:orange_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'orange'}}");
+ register(4034, "{Name:'minecraft:magenta_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'magenta'}}");
+ register(4035, "{Name:'minecraft:light_blue_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'light_blue'}}");
+ register(4036, "{Name:'minecraft:yellow_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'yellow'}}");
+ register(4037, "{Name:'minecraft:lime_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'lime'}}");
+ register(4038, "{Name:'minecraft:pink_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'pink'}}");
+ register(4039, "{Name:'minecraft:gray_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'gray'}}");
+ register(4040, "{Name:'minecraft:light_gray_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'silver'}}");
+ register(4041, "{Name:'minecraft:cyan_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'cyan'}}");
+ register(4042, "{Name:'minecraft:purple_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'purple'}}");
+ register(4043, "{Name:'minecraft:blue_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'blue'}}");
+ register(4044, "{Name:'minecraft:brown_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'brown'}}");
+ register(4045, "{Name:'minecraft:green_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'green'}}");
+ register(4046, "{Name:'minecraft:red_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'red'}}");
+ register(4047, "{Name:'minecraft:black_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'black'}}");
+ register(4080, "{Name:'minecraft:structure_block',Properties:{mode:'save'}}", "{Name:'minecraft:structure_block',Properties:{mode:'save'}}");
+ register(4081, "{Name:'minecraft:structure_block',Properties:{mode:'load'}}", "{Name:'minecraft:structure_block',Properties:{mode:'load'}}");
+ register(4082, "{Name:'minecraft:structure_block',Properties:{mode:'corner'}}", "{Name:'minecraft:structure_block',Properties:{mode:'corner'}}");
+ register(4083, "{Name:'minecraft:structure_block',Properties:{mode:'data'}}", "{Name:'minecraft:structure_block',Properties:{mode:'data'}}");
+ finalizeMaps();
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperItemNameV102.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperItemNameV102.java
new file mode 100644
index 0000000000000000000000000000000000000000..86f6aa3e3fa886976809f350fc5eb16f6a026ed9
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperItemNameV102.java
@@ -0,0 +1,533 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.helpers;
+
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+
+public final class HelperItemNameV102 {
+
+ // This class is responsible for mapping the id -> string update in itemstacks and potions
+
+ private static final Int2ObjectOpenHashMap<String> ITEM_NAMES = new Int2ObjectOpenHashMap<String>() {
+ @Override
+ public String put(final int k, final String o) {
+ final String ret = super.put(k, o);
+
+ if (ret != null) {
+ throw new IllegalStateException("Mapping already exists for " + k + ": prev: " + ret + ", new: " + o);
+ }
+
+ return ret;
+ }
+ };
+
+ static {
+ ITEM_NAMES.put(0, "minecraft:air");
+ ITEM_NAMES.put(1, "minecraft:stone");
+ ITEM_NAMES.put(2, "minecraft:grass");
+ ITEM_NAMES.put(3, "minecraft:dirt");
+ ITEM_NAMES.put(4, "minecraft:cobblestone");
+ ITEM_NAMES.put(5, "minecraft:planks");
+ ITEM_NAMES.put(6, "minecraft:sapling");
+ ITEM_NAMES.put(7, "minecraft:bedrock");
+ ITEM_NAMES.put(8, "minecraft:flowing_water");
+ ITEM_NAMES.put(9, "minecraft:water");
+ ITEM_NAMES.put(10, "minecraft:flowing_lava");
+ ITEM_NAMES.put(11, "minecraft:lava");
+ ITEM_NAMES.put(12, "minecraft:sand");
+ ITEM_NAMES.put(13, "minecraft:gravel");
+ ITEM_NAMES.put(14, "minecraft:gold_ore");
+ ITEM_NAMES.put(15, "minecraft:iron_ore");
+ ITEM_NAMES.put(16, "minecraft:coal_ore");
+ ITEM_NAMES.put(17, "minecraft:log");
+ ITEM_NAMES.put(18, "minecraft:leaves");
+ ITEM_NAMES.put(19, "minecraft:sponge");
+ ITEM_NAMES.put(20, "minecraft:glass");
+ ITEM_NAMES.put(21, "minecraft:lapis_ore");
+ ITEM_NAMES.put(22, "minecraft:lapis_block");
+ ITEM_NAMES.put(23, "minecraft:dispenser");
+ ITEM_NAMES.put(24, "minecraft:sandstone");
+ ITEM_NAMES.put(25, "minecraft:noteblock");
+ ITEM_NAMES.put(27, "minecraft:golden_rail");
+ ITEM_NAMES.put(28, "minecraft:detector_rail");
+ ITEM_NAMES.put(29, "minecraft:sticky_piston");
+ ITEM_NAMES.put(30, "minecraft:web");
+ ITEM_NAMES.put(31, "minecraft:tallgrass");
+ ITEM_NAMES.put(32, "minecraft:deadbush");
+ ITEM_NAMES.put(33, "minecraft:piston");
+ ITEM_NAMES.put(35, "minecraft:wool");
+ ITEM_NAMES.put(37, "minecraft:yellow_flower");
+ ITEM_NAMES.put(38, "minecraft:red_flower");
+ ITEM_NAMES.put(39, "minecraft:brown_mushroom");
+ ITEM_NAMES.put(40, "minecraft:red_mushroom");
+ ITEM_NAMES.put(41, "minecraft:gold_block");
+ ITEM_NAMES.put(42, "minecraft:iron_block");
+ ITEM_NAMES.put(43, "minecraft:double_stone_slab");
+ ITEM_NAMES.put(44, "minecraft:stone_slab");
+ ITEM_NAMES.put(45, "minecraft:brick_block");
+ ITEM_NAMES.put(46, "minecraft:tnt");
+ ITEM_NAMES.put(47, "minecraft:bookshelf");
+ ITEM_NAMES.put(48, "minecraft:mossy_cobblestone");
+ ITEM_NAMES.put(49, "minecraft:obsidian");
+ ITEM_NAMES.put(50, "minecraft:torch");
+ ITEM_NAMES.put(51, "minecraft:fire");
+ ITEM_NAMES.put(52, "minecraft:mob_spawner");
+ ITEM_NAMES.put(53, "minecraft:oak_stairs");
+ ITEM_NAMES.put(54, "minecraft:chest");
+ ITEM_NAMES.put(56, "minecraft:diamond_ore");
+ ITEM_NAMES.put(57, "minecraft:diamond_block");
+ ITEM_NAMES.put(58, "minecraft:crafting_table");
+ ITEM_NAMES.put(60, "minecraft:farmland");
+ ITEM_NAMES.put(61, "minecraft:furnace");
+ ITEM_NAMES.put(62, "minecraft:lit_furnace");
+ ITEM_NAMES.put(65, "minecraft:ladder");
+ ITEM_NAMES.put(66, "minecraft:rail");
+ ITEM_NAMES.put(67, "minecraft:stone_stairs");
+ ITEM_NAMES.put(69, "minecraft:lever");
+ ITEM_NAMES.put(70, "minecraft:stone_pressure_plate");
+ ITEM_NAMES.put(72, "minecraft:wooden_pressure_plate");
+ ITEM_NAMES.put(73, "minecraft:redstone_ore");
+ ITEM_NAMES.put(76, "minecraft:redstone_torch");
+ ITEM_NAMES.put(77, "minecraft:stone_button");
+ ITEM_NAMES.put(78, "minecraft:snow_layer");
+ ITEM_NAMES.put(79, "minecraft:ice");
+ ITEM_NAMES.put(80, "minecraft:snow");
+ ITEM_NAMES.put(81, "minecraft:cactus");
+ ITEM_NAMES.put(82, "minecraft:clay");
+ ITEM_NAMES.put(84, "minecraft:jukebox");
+ ITEM_NAMES.put(85, "minecraft:fence");
+ ITEM_NAMES.put(86, "minecraft:pumpkin");
+ ITEM_NAMES.put(87, "minecraft:netherrack");
+ ITEM_NAMES.put(88, "minecraft:soul_sand");
+ ITEM_NAMES.put(89, "minecraft:glowstone");
+ ITEM_NAMES.put(90, "minecraft:portal");
+ ITEM_NAMES.put(91, "minecraft:lit_pumpkin");
+ ITEM_NAMES.put(95, "minecraft:stained_glass");
+ ITEM_NAMES.put(96, "minecraft:trapdoor");
+ ITEM_NAMES.put(97, "minecraft:monster_egg");
+ ITEM_NAMES.put(98, "minecraft:stonebrick");
+ ITEM_NAMES.put(99, "minecraft:brown_mushroom_block");
+ ITEM_NAMES.put(100, "minecraft:red_mushroom_block");
+ ITEM_NAMES.put(101, "minecraft:iron_bars");
+ ITEM_NAMES.put(102, "minecraft:glass_pane");
+ ITEM_NAMES.put(103, "minecraft:melon_block");
+ ITEM_NAMES.put(106, "minecraft:vine");
+ ITEM_NAMES.put(107, "minecraft:fence_gate");
+ ITEM_NAMES.put(108, "minecraft:brick_stairs");
+ ITEM_NAMES.put(109, "minecraft:stone_brick_stairs");
+ ITEM_NAMES.put(110, "minecraft:mycelium");
+ ITEM_NAMES.put(111, "minecraft:waterlily");
+ ITEM_NAMES.put(112, "minecraft:nether_brick");
+ ITEM_NAMES.put(113, "minecraft:nether_brick_fence");
+ ITEM_NAMES.put(114, "minecraft:nether_brick_stairs");
+ ITEM_NAMES.put(116, "minecraft:enchanting_table");
+ ITEM_NAMES.put(119, "minecraft:end_portal");
+ ITEM_NAMES.put(120, "minecraft:end_portal_frame");
+ ITEM_NAMES.put(121, "minecraft:end_stone");
+ ITEM_NAMES.put(122, "minecraft:dragon_egg");
+ ITEM_NAMES.put(123, "minecraft:redstone_lamp");
+ ITEM_NAMES.put(125, "minecraft:double_wooden_slab");
+ ITEM_NAMES.put(126, "minecraft:wooden_slab");
+ ITEM_NAMES.put(127, "minecraft:cocoa");
+ ITEM_NAMES.put(128, "minecraft:sandstone_stairs");
+ ITEM_NAMES.put(129, "minecraft:emerald_ore");
+ ITEM_NAMES.put(130, "minecraft:ender_chest");
+ ITEM_NAMES.put(131, "minecraft:tripwire_hook");
+ ITEM_NAMES.put(133, "minecraft:emerald_block");
+ ITEM_NAMES.put(134, "minecraft:spruce_stairs");
+ ITEM_NAMES.put(135, "minecraft:birch_stairs");
+ ITEM_NAMES.put(136, "minecraft:jungle_stairs");
+ ITEM_NAMES.put(137, "minecraft:command_block");
+ ITEM_NAMES.put(138, "minecraft:beacon");
+ ITEM_NAMES.put(139, "minecraft:cobblestone_wall");
+ ITEM_NAMES.put(141, "minecraft:carrots");
+ ITEM_NAMES.put(142, "minecraft:potatoes");
+ ITEM_NAMES.put(143, "minecraft:wooden_button");
+ ITEM_NAMES.put(145, "minecraft:anvil");
+ ITEM_NAMES.put(146, "minecraft:trapped_chest");
+ ITEM_NAMES.put(147, "minecraft:light_weighted_pressure_plate");
+ ITEM_NAMES.put(148, "minecraft:heavy_weighted_pressure_plate");
+ ITEM_NAMES.put(151, "minecraft:daylight_detector");
+ ITEM_NAMES.put(152, "minecraft:redstone_block");
+ ITEM_NAMES.put(153, "minecraft:quartz_ore");
+ ITEM_NAMES.put(154, "minecraft:hopper");
+ ITEM_NAMES.put(155, "minecraft:quartz_block");
+ ITEM_NAMES.put(156, "minecraft:quartz_stairs");
+ ITEM_NAMES.put(157, "minecraft:activator_rail");
+ ITEM_NAMES.put(158, "minecraft:dropper");
+ ITEM_NAMES.put(159, "minecraft:stained_hardened_clay");
+ ITEM_NAMES.put(160, "minecraft:stained_glass_pane");
+ ITEM_NAMES.put(161, "minecraft:leaves2");
+ ITEM_NAMES.put(162, "minecraft:log2");
+ ITEM_NAMES.put(163, "minecraft:acacia_stairs");
+ ITEM_NAMES.put(164, "minecraft:dark_oak_stairs");
+ ITEM_NAMES.put(170, "minecraft:hay_block");
+ ITEM_NAMES.put(171, "minecraft:carpet");
+ ITEM_NAMES.put(172, "minecraft:hardened_clay");
+ ITEM_NAMES.put(173, "minecraft:coal_block");
+ ITEM_NAMES.put(174, "minecraft:packed_ice");
+ ITEM_NAMES.put(175, "minecraft:double_plant");
+ ITEM_NAMES.put(256, "minecraft:iron_shovel");
+ ITEM_NAMES.put(257, "minecraft:iron_pickaxe");
+ ITEM_NAMES.put(258, "minecraft:iron_axe");
+ ITEM_NAMES.put(259, "minecraft:flint_and_steel");
+ ITEM_NAMES.put(260, "minecraft:apple");
+ ITEM_NAMES.put(261, "minecraft:bow");
+ ITEM_NAMES.put(262, "minecraft:arrow");
+ ITEM_NAMES.put(263, "minecraft:coal");
+ ITEM_NAMES.put(264, "minecraft:diamond");
+ ITEM_NAMES.put(265, "minecraft:iron_ingot");
+ ITEM_NAMES.put(266, "minecraft:gold_ingot");
+ ITEM_NAMES.put(267, "minecraft:iron_sword");
+ ITEM_NAMES.put(268, "minecraft:wooden_sword");
+ ITEM_NAMES.put(269, "minecraft:wooden_shovel");
+ ITEM_NAMES.put(270, "minecraft:wooden_pickaxe");
+ ITEM_NAMES.put(271, "minecraft:wooden_axe");
+ ITEM_NAMES.put(272, "minecraft:stone_sword");
+ ITEM_NAMES.put(273, "minecraft:stone_shovel");
+ ITEM_NAMES.put(274, "minecraft:stone_pickaxe");
+ ITEM_NAMES.put(275, "minecraft:stone_axe");
+ ITEM_NAMES.put(276, "minecraft:diamond_sword");
+ ITEM_NAMES.put(277, "minecraft:diamond_shovel");
+ ITEM_NAMES.put(278, "minecraft:diamond_pickaxe");
+ ITEM_NAMES.put(279, "minecraft:diamond_axe");
+ ITEM_NAMES.put(280, "minecraft:stick");
+ ITEM_NAMES.put(281, "minecraft:bowl");
+ ITEM_NAMES.put(282, "minecraft:mushroom_stew");
+ ITEM_NAMES.put(283, "minecraft:golden_sword");
+ ITEM_NAMES.put(284, "minecraft:golden_shovel");
+ ITEM_NAMES.put(285, "minecraft:golden_pickaxe");
+ ITEM_NAMES.put(286, "minecraft:golden_axe");
+ ITEM_NAMES.put(287, "minecraft:string");
+ ITEM_NAMES.put(288, "minecraft:feather");
+ ITEM_NAMES.put(289, "minecraft:gunpowder");
+ ITEM_NAMES.put(290, "minecraft:wooden_hoe");
+ ITEM_NAMES.put(291, "minecraft:stone_hoe");
+ ITEM_NAMES.put(292, "minecraft:iron_hoe");
+ ITEM_NAMES.put(293, "minecraft:diamond_hoe");
+ ITEM_NAMES.put(294, "minecraft:golden_hoe");
+ ITEM_NAMES.put(295, "minecraft:wheat_seeds");
+ ITEM_NAMES.put(296, "minecraft:wheat");
+ ITEM_NAMES.put(297, "minecraft:bread");
+ ITEM_NAMES.put(298, "minecraft:leather_helmet");
+ ITEM_NAMES.put(299, "minecraft:leather_chestplate");
+ ITEM_NAMES.put(300, "minecraft:leather_leggings");
+ ITEM_NAMES.put(301, "minecraft:leather_boots");
+ ITEM_NAMES.put(302, "minecraft:chainmail_helmet");
+ ITEM_NAMES.put(303, "minecraft:chainmail_chestplate");
+ ITEM_NAMES.put(304, "minecraft:chainmail_leggings");
+ ITEM_NAMES.put(305, "minecraft:chainmail_boots");
+ ITEM_NAMES.put(306, "minecraft:iron_helmet");
+ ITEM_NAMES.put(307, "minecraft:iron_chestplate");
+ ITEM_NAMES.put(308, "minecraft:iron_leggings");
+ ITEM_NAMES.put(309, "minecraft:iron_boots");
+ ITEM_NAMES.put(310, "minecraft:diamond_helmet");
+ ITEM_NAMES.put(311, "minecraft:diamond_chestplate");
+ ITEM_NAMES.put(312, "minecraft:diamond_leggings");
+ ITEM_NAMES.put(313, "minecraft:diamond_boots");
+ ITEM_NAMES.put(314, "minecraft:golden_helmet");
+ ITEM_NAMES.put(315, "minecraft:golden_chestplate");
+ ITEM_NAMES.put(316, "minecraft:golden_leggings");
+ ITEM_NAMES.put(317, "minecraft:golden_boots");
+ ITEM_NAMES.put(318, "minecraft:flint");
+ ITEM_NAMES.put(319, "minecraft:porkchop");
+ ITEM_NAMES.put(320, "minecraft:cooked_porkchop");
+ ITEM_NAMES.put(321, "minecraft:painting");
+ ITEM_NAMES.put(322, "minecraft:golden_apple");
+ ITEM_NAMES.put(323, "minecraft:sign");
+ ITEM_NAMES.put(324, "minecraft:wooden_door");
+ ITEM_NAMES.put(325, "minecraft:bucket");
+ ITEM_NAMES.put(326, "minecraft:water_bucket");
+ ITEM_NAMES.put(327, "minecraft:lava_bucket");
+ ITEM_NAMES.put(328, "minecraft:minecart");
+ ITEM_NAMES.put(329, "minecraft:saddle");
+ ITEM_NAMES.put(330, "minecraft:iron_door");
+ ITEM_NAMES.put(331, "minecraft:redstone");
+ ITEM_NAMES.put(332, "minecraft:snowball");
+ ITEM_NAMES.put(333, "minecraft:boat");
+ ITEM_NAMES.put(334, "minecraft:leather");
+ ITEM_NAMES.put(335, "minecraft:milk_bucket");
+ ITEM_NAMES.put(336, "minecraft:brick");
+ ITEM_NAMES.put(337, "minecraft:clay_ball");
+ ITEM_NAMES.put(338, "minecraft:reeds");
+ ITEM_NAMES.put(339, "minecraft:paper");
+ ITEM_NAMES.put(340, "minecraft:book");
+ ITEM_NAMES.put(341, "minecraft:slime_ball");
+ ITEM_NAMES.put(342, "minecraft:chest_minecart");
+ ITEM_NAMES.put(343, "minecraft:furnace_minecart");
+ ITEM_NAMES.put(344, "minecraft:egg");
+ ITEM_NAMES.put(345, "minecraft:compass");
+ ITEM_NAMES.put(346, "minecraft:fishing_rod");
+ ITEM_NAMES.put(347, "minecraft:clock");
+ ITEM_NAMES.put(348, "minecraft:glowstone_dust");
+ ITEM_NAMES.put(349, "minecraft:fish");
+ ITEM_NAMES.put(350, "minecraft:cooked_fish"); // Fix typo, the game never recognized cooked_fished
+ ITEM_NAMES.put(351, "minecraft:dye");
+ ITEM_NAMES.put(352, "minecraft:bone");
+ ITEM_NAMES.put(353, "minecraft:sugar");
+ ITEM_NAMES.put(354, "minecraft:cake");
+ ITEM_NAMES.put(355, "minecraft:bed");
+ ITEM_NAMES.put(356, "minecraft:repeater");
+ ITEM_NAMES.put(357, "minecraft:cookie");
+ ITEM_NAMES.put(358, "minecraft:filled_map");
+ ITEM_NAMES.put(359, "minecraft:shears");
+ ITEM_NAMES.put(360, "minecraft:melon");
+ ITEM_NAMES.put(361, "minecraft:pumpkin_seeds");
+ ITEM_NAMES.put(362, "minecraft:melon_seeds");
+ ITEM_NAMES.put(363, "minecraft:beef");
+ ITEM_NAMES.put(364, "minecraft:cooked_beef");
+ ITEM_NAMES.put(365, "minecraft:chicken");
+ ITEM_NAMES.put(366, "minecraft:cooked_chicken");
+ ITEM_NAMES.put(367, "minecraft:rotten_flesh");
+ ITEM_NAMES.put(368, "minecraft:ender_pearl");
+ ITEM_NAMES.put(369, "minecraft:blaze_rod");
+ ITEM_NAMES.put(370, "minecraft:ghast_tear");
+ ITEM_NAMES.put(371, "minecraft:gold_nugget");
+ ITEM_NAMES.put(372, "minecraft:nether_wart");
+ ITEM_NAMES.put(373, "minecraft:potion");
+ ITEM_NAMES.put(374, "minecraft:glass_bottle");
+ ITEM_NAMES.put(375, "minecraft:spider_eye");
+ ITEM_NAMES.put(376, "minecraft:fermented_spider_eye");
+ ITEM_NAMES.put(377, "minecraft:blaze_powder");
+ ITEM_NAMES.put(378, "minecraft:magma_cream");
+ ITEM_NAMES.put(379, "minecraft:brewing_stand");
+ ITEM_NAMES.put(380, "minecraft:cauldron");
+ ITEM_NAMES.put(381, "minecraft:ender_eye");
+ ITEM_NAMES.put(382, "minecraft:speckled_melon");
+ ITEM_NAMES.put(383, "minecraft:spawn_egg");
+ ITEM_NAMES.put(384, "minecraft:experience_bottle");
+ ITEM_NAMES.put(385, "minecraft:fire_charge");
+ ITEM_NAMES.put(386, "minecraft:writable_book");
+ ITEM_NAMES.put(387, "minecraft:written_book");
+ ITEM_NAMES.put(388, "minecraft:emerald");
+ ITEM_NAMES.put(389, "minecraft:item_frame");
+ ITEM_NAMES.put(390, "minecraft:flower_pot");
+ ITEM_NAMES.put(391, "minecraft:carrot");
+ ITEM_NAMES.put(392, "minecraft:potato");
+ ITEM_NAMES.put(393, "minecraft:baked_potato");
+ ITEM_NAMES.put(394, "minecraft:poisonous_potato");
+ ITEM_NAMES.put(395, "minecraft:map");
+ ITEM_NAMES.put(396, "minecraft:golden_carrot");
+ ITEM_NAMES.put(397, "minecraft:skull");
+ ITEM_NAMES.put(398, "minecraft:carrot_on_a_stick");
+ ITEM_NAMES.put(399, "minecraft:nether_star");
+ ITEM_NAMES.put(400, "minecraft:pumpkin_pie");
+ ITEM_NAMES.put(401, "minecraft:fireworks");
+ ITEM_NAMES.put(402, "minecraft:firework_charge");
+ ITEM_NAMES.put(403, "minecraft:enchanted_book");
+ ITEM_NAMES.put(404, "minecraft:comparator");
+ ITEM_NAMES.put(405, "minecraft:netherbrick");
+ ITEM_NAMES.put(406, "minecraft:quartz");
+ ITEM_NAMES.put(407, "minecraft:tnt_minecart");
+ ITEM_NAMES.put(408, "minecraft:hopper_minecart");
+ ITEM_NAMES.put(417, "minecraft:iron_horse_armor");
+ ITEM_NAMES.put(418, "minecraft:golden_horse_armor");
+ ITEM_NAMES.put(419, "minecraft:diamond_horse_armor");
+ ITEM_NAMES.put(420, "minecraft:lead");
+ ITEM_NAMES.put(421, "minecraft:name_tag");
+ ITEM_NAMES.put(422, "minecraft:command_block_minecart");
+ ITEM_NAMES.put(2256, "minecraft:record_13");
+ ITEM_NAMES.put(2257, "minecraft:record_cat");
+ ITEM_NAMES.put(2258, "minecraft:record_blocks");
+ ITEM_NAMES.put(2259, "minecraft:record_chirp");
+ ITEM_NAMES.put(2260, "minecraft:record_far");
+ ITEM_NAMES.put(2261, "minecraft:record_mall");
+ ITEM_NAMES.put(2262, "minecraft:record_mellohi");
+ ITEM_NAMES.put(2263, "minecraft:record_stal");
+ ITEM_NAMES.put(2264, "minecraft:record_strad");
+ ITEM_NAMES.put(2265, "minecraft:record_ward");
+ ITEM_NAMES.put(2266, "minecraft:record_11");
+ ITEM_NAMES.put(2267, "minecraft:record_wait");
+ // https://github.com/starlis/empirecraft/commit/2da59d1901407fc0c135ef0458c0fe9b016570b3
+ // It's likely that this is a result of old CB/Spigot behavior still writing ids into items as ints.
+ // These ids do not appear to be used by regular MC anyways, so I do not see the harm of porting it here.
+ // Extras can be added if needed
+ String[] extra = new String[4_000];
+ // EMC start
+ extra[409] = "minecraft:prismarine_shard";
+ extra[410] = "minecraft:prismarine_crystals";
+ extra[411] = "minecraft:rabbit";
+ extra[412] = "minecraft:cooked_rabbit";
+ extra[413] = "minecraft:rabbit_stew";
+ extra[414] = "minecraft:rabbit_foot";
+ extra[415] = "minecraft:rabbit_hide";
+ extra[416] = "minecraft:armor_stand";
+ extra[423] = "minecraft:mutton";
+ extra[424] = "minecraft:cooked_mutton";
+ extra[425] = "minecraft:banner";
+ extra[426] = "minecraft:end_crystal";
+ extra[427] = "minecraft:spruce_door";
+ extra[428] = "minecraft:birch_door";
+ extra[429] = "minecraft:jungle_door";
+ extra[430] = "minecraft:acacia_door";
+ extra[431] = "minecraft:dark_oak_door";
+ extra[432] = "minecraft:chorus_fruit";
+ extra[433] = "minecraft:chorus_fruit_popped";
+ extra[434] = "minecraft:beetroot";
+ extra[435] = "minecraft:beetroot_seeds";
+ extra[436] = "minecraft:beetroot_soup";
+ extra[437] = "minecraft:dragon_breath";
+ extra[438] = "minecraft:splash_potion";
+ extra[439] = "minecraft:spectral_arrow";
+ extra[440] = "minecraft:tipped_arrow";
+ extra[441] = "minecraft:lingering_potion";
+ extra[442] = "minecraft:shield";
+ extra[443] = "minecraft:elytra";
+ extra[444] = "minecraft:spruce_boat";
+ extra[445] = "minecraft:birch_boat";
+ extra[446] = "minecraft:jungle_boat";
+ extra[447] = "minecraft:acacia_boat";
+ extra[448] = "minecraft:dark_oak_boat";
+ extra[449] = "minecraft:totem_of_undying";
+ extra[450] = "minecraft:shulker_shell";
+ extra[452] = "minecraft:iron_nugget";
+ extra[453] = "minecraft:knowledge_book";
+ // EMC end
+
+ // dump extra into map
+ for (int i = 0; i < extra.length; ++i) {
+ if (extra[i] != null) {
+ ITEM_NAMES.put(i, extra[i]);
+ }
+ }
+ }
+
+ private static final String[] POTION_NAMES = new String[128];
+ static {
+ POTION_NAMES[0] = "minecraft:water";
+ POTION_NAMES[1] = "minecraft:regeneration";
+ POTION_NAMES[2] = "minecraft:swiftness";
+ POTION_NAMES[3] = "minecraft:fire_resistance";
+ POTION_NAMES[4] = "minecraft:poison";
+ POTION_NAMES[5] = "minecraft:healing";
+ POTION_NAMES[6] = "minecraft:night_vision";
+ POTION_NAMES[7] = null;
+ POTION_NAMES[8] = "minecraft:weakness";
+ POTION_NAMES[9] = "minecraft:strength";
+ POTION_NAMES[10] = "minecraft:slowness";
+ POTION_NAMES[11] = "minecraft:leaping";
+ POTION_NAMES[12] = "minecraft:harming";
+ POTION_NAMES[13] = "minecraft:water_breathing";
+ POTION_NAMES[14] = "minecraft:invisibility";
+ POTION_NAMES[15] = null;
+ POTION_NAMES[16] = "minecraft:awkward";
+ POTION_NAMES[17] = "minecraft:regeneration";
+ POTION_NAMES[18] = "minecraft:swiftness";
+ POTION_NAMES[19] = "minecraft:fire_resistance";
+ POTION_NAMES[20] = "minecraft:poison";
+ POTION_NAMES[21] = "minecraft:healing";
+ POTION_NAMES[22] = "minecraft:night_vision";
+ POTION_NAMES[23] = null;
+ POTION_NAMES[24] = "minecraft:weakness";
+ POTION_NAMES[25] = "minecraft:strength";
+ POTION_NAMES[26] = "minecraft:slowness";
+ POTION_NAMES[27] = "minecraft:leaping";
+ POTION_NAMES[28] = "minecraft:harming";
+ POTION_NAMES[29] = "minecraft:water_breathing";
+ POTION_NAMES[30] = "minecraft:invisibility";
+ POTION_NAMES[31] = null;
+ POTION_NAMES[32] = "minecraft:thick";
+ POTION_NAMES[33] = "minecraft:strong_regeneration";
+ POTION_NAMES[34] = "minecraft:strong_swiftness";
+ POTION_NAMES[35] = "minecraft:fire_resistance";
+ POTION_NAMES[36] = "minecraft:strong_poison";
+ POTION_NAMES[37] = "minecraft:strong_healing";
+ POTION_NAMES[38] = "minecraft:night_vision";
+ POTION_NAMES[39] = null;
+ POTION_NAMES[40] = "minecraft:weakness";
+ POTION_NAMES[41] = "minecraft:strong_strength";
+ POTION_NAMES[42] = "minecraft:slowness";
+ POTION_NAMES[43] = "minecraft:strong_leaping";
+ POTION_NAMES[44] = "minecraft:strong_harming";
+ POTION_NAMES[45] = "minecraft:water_breathing";
+ POTION_NAMES[46] = "minecraft:invisibility";
+ POTION_NAMES[47] = null;
+ POTION_NAMES[48] = null;
+ POTION_NAMES[49] = "minecraft:strong_regeneration";
+ POTION_NAMES[50] = "minecraft:strong_swiftness";
+ POTION_NAMES[51] = "minecraft:fire_resistance";
+ POTION_NAMES[52] = "minecraft:strong_poison";
+ POTION_NAMES[53] = "minecraft:strong_healing";
+ POTION_NAMES[54] = "minecraft:night_vision";
+ POTION_NAMES[55] = null;
+ POTION_NAMES[56] = "minecraft:weakness";
+ POTION_NAMES[57] = "minecraft:strong_strength";
+ POTION_NAMES[58] = "minecraft:slowness";
+ POTION_NAMES[59] = "minecraft:strong_leaping";
+ POTION_NAMES[60] = "minecraft:strong_harming";
+ POTION_NAMES[61] = "minecraft:water_breathing";
+ POTION_NAMES[62] = "minecraft:invisibility";
+ POTION_NAMES[63] = null;
+ POTION_NAMES[64] = "minecraft:mundane";
+ POTION_NAMES[65] = "minecraft:long_regeneration";
+ POTION_NAMES[66] = "minecraft:long_swiftness";
+ POTION_NAMES[67] = "minecraft:long_fire_resistance";
+ POTION_NAMES[68] = "minecraft:long_poison";
+ POTION_NAMES[69] = "minecraft:healing";
+ POTION_NAMES[70] = "minecraft:long_night_vision";
+ POTION_NAMES[71] = null;
+ POTION_NAMES[72] = "minecraft:long_weakness";
+ POTION_NAMES[73] = "minecraft:long_strength";
+ POTION_NAMES[74] = "minecraft:long_slowness";
+ POTION_NAMES[75] = "minecraft:long_leaping";
+ POTION_NAMES[76] = "minecraft:harming";
+ POTION_NAMES[77] = "minecraft:long_water_breathing";
+ POTION_NAMES[78] = "minecraft:long_invisibility";
+ POTION_NAMES[79] = null;
+ POTION_NAMES[80] = "minecraft:awkward";
+ POTION_NAMES[81] = "minecraft:long_regeneration";
+ POTION_NAMES[82] = "minecraft:long_swiftness";
+ POTION_NAMES[83] = "minecraft:long_fire_resistance";
+ POTION_NAMES[84] = "minecraft:long_poison";
+ POTION_NAMES[85] = "minecraft:healing";
+ POTION_NAMES[86] = "minecraft:long_night_vision";
+ POTION_NAMES[87] = null;
+ POTION_NAMES[88] = "minecraft:long_weakness";
+ POTION_NAMES[89] = "minecraft:long_strength";
+ POTION_NAMES[90] = "minecraft:long_slowness";
+ POTION_NAMES[91] = "minecraft:long_leaping";
+ POTION_NAMES[92] = "minecraft:harming";
+ POTION_NAMES[93] = "minecraft:long_water_breathing";
+ POTION_NAMES[94] = "minecraft:long_invisibility";
+ POTION_NAMES[95] = null;
+ POTION_NAMES[96] = "minecraft:thick";
+ POTION_NAMES[97] = "minecraft:regeneration";
+ POTION_NAMES[98] = "minecraft:swiftness";
+ POTION_NAMES[99] = "minecraft:long_fire_resistance";
+ POTION_NAMES[100] = "minecraft:poison";
+ POTION_NAMES[101] = "minecraft:strong_healing";
+ POTION_NAMES[102] = "minecraft:long_night_vision";
+ POTION_NAMES[103] = null;
+ POTION_NAMES[104] = "minecraft:long_weakness";
+ POTION_NAMES[105] = "minecraft:strength";
+ POTION_NAMES[106] = "minecraft:long_slowness";
+ POTION_NAMES[107] = "minecraft:leaping";
+ POTION_NAMES[108] = "minecraft:strong_harming";
+ POTION_NAMES[109] = "minecraft:long_water_breathing";
+ POTION_NAMES[110] = "minecraft:long_invisibility";
+ POTION_NAMES[111] = null;
+ POTION_NAMES[112] = null;
+ POTION_NAMES[113] = "minecraft:regeneration";
+ POTION_NAMES[114] = "minecraft:swiftness";
+ POTION_NAMES[115] = "minecraft:long_fire_resistance";
+ POTION_NAMES[116] = "minecraft:poison";
+ POTION_NAMES[117] = "minecraft:strong_healing";
+ POTION_NAMES[118] = "minecraft:long_night_vision";
+ POTION_NAMES[119] = null;
+ POTION_NAMES[120] = "minecraft:long_weakness";
+ POTION_NAMES[121] = "minecraft:strength";
+ POTION_NAMES[122] = "minecraft:long_slowness";
+ POTION_NAMES[123] = "minecraft:leaping";
+ POTION_NAMES[124] = "minecraft:strong_harming";
+ POTION_NAMES[125] = "minecraft:long_water_breathing";
+ POTION_NAMES[126] = "minecraft:long_invisibility";
+ POTION_NAMES[127] = null;
+ }
+
+ // ret is nullable, you are supposed to log when it does not exist, NOT HIDE IT!
+ public static String getNameFromId(final int id) {
+ return ITEM_NAMES.get(id);
+ }
+
+ public static String getPotionNameFromId(final short id) {
+ return POTION_NAMES[id & 127];
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperSpawnEggNameV105.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperSpawnEggNameV105.java
new file mode 100644
index 0000000000000000000000000000000000000000..bcc586cb68148fd960dd685eecce853169a92ed5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperSpawnEggNameV105.java
@@ -0,0 +1,77 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.helpers;
+
+public final class HelperSpawnEggNameV105 {
+
+ private static final String[] ID_TO_STRING = new String[256];
+ static {
+ ID_TO_STRING[1] = "Item";
+ ID_TO_STRING[2] = "XPOrb";
+ ID_TO_STRING[7] = "ThrownEgg";
+ ID_TO_STRING[8] = "LeashKnot";
+ ID_TO_STRING[9] = "Painting";
+ ID_TO_STRING[10] = "Arrow";
+ ID_TO_STRING[11] = "Snowball";
+ ID_TO_STRING[12] = "Fireball";
+ ID_TO_STRING[13] = "SmallFireball";
+ ID_TO_STRING[14] = "ThrownEnderpearl";
+ ID_TO_STRING[15] = "EyeOfEnderSignal";
+ ID_TO_STRING[16] = "ThrownPotion";
+ ID_TO_STRING[17] = "ThrownExpBottle";
+ ID_TO_STRING[18] = "ItemFrame";
+ ID_TO_STRING[19] = "WitherSkull";
+ ID_TO_STRING[20] = "PrimedTnt";
+ ID_TO_STRING[21] = "FallingSand";
+ ID_TO_STRING[22] = "FireworksRocketEntity";
+ ID_TO_STRING[23] = "TippedArrow";
+ ID_TO_STRING[24] = "SpectralArrow";
+ ID_TO_STRING[25] = "ShulkerBullet";
+ ID_TO_STRING[26] = "DragonFireball";
+ ID_TO_STRING[30] = "ArmorStand";
+ ID_TO_STRING[41] = "Boat";
+ ID_TO_STRING[42] = "MinecartRideable";
+ ID_TO_STRING[43] = "MinecartChest";
+ ID_TO_STRING[44] = "MinecartFurnace";
+ ID_TO_STRING[45] = "MinecartTNT";
+ ID_TO_STRING[46] = "MinecartHopper";
+ ID_TO_STRING[47] = "MinecartSpawner";
+ ID_TO_STRING[40] = "MinecartCommandBlock";
+ ID_TO_STRING[50] = "Creeper";
+ ID_TO_STRING[51] = "Skeleton";
+ ID_TO_STRING[52] = "Spider";
+ ID_TO_STRING[53] = "Giant";
+ ID_TO_STRING[54] = "Zombie";
+ ID_TO_STRING[55] = "Slime";
+ ID_TO_STRING[56] = "Ghast";
+ ID_TO_STRING[57] = "PigZombie";
+ ID_TO_STRING[58] = "Enderman";
+ ID_TO_STRING[59] = "CaveSpider";
+ ID_TO_STRING[60] = "Silverfish";
+ ID_TO_STRING[61] = "Blaze";
+ ID_TO_STRING[62] = "LavaSlime";
+ ID_TO_STRING[63] = "EnderDragon";
+ ID_TO_STRING[64] = "WitherBoss";
+ ID_TO_STRING[65] = "Bat";
+ ID_TO_STRING[66] = "Witch";
+ ID_TO_STRING[67] = "Endermite";
+ ID_TO_STRING[68] = "Guardian";
+ ID_TO_STRING[69] = "Shulker";
+ ID_TO_STRING[90] = "Pig";
+ ID_TO_STRING[91] = "Sheep";
+ ID_TO_STRING[92] = "Cow";
+ ID_TO_STRING[93] = "Chicken";
+ ID_TO_STRING[94] = "Squid";
+ ID_TO_STRING[95] = "Wolf";
+ ID_TO_STRING[96] = "MushroomCow";
+ ID_TO_STRING[97] = "SnowMan";
+ ID_TO_STRING[98] = "Ozelot";
+ ID_TO_STRING[99] = "VillagerGolem";
+ ID_TO_STRING[100] = "EntityHorse";
+ ID_TO_STRING[101] = "Rabbit";
+ ID_TO_STRING[120] = "Villager";
+ ID_TO_STRING[200] = "EnderCrystal";
+ }
+
+ public static String getSpawnNameFromId(final short id) {
+ return ID_TO_STRING[id & 255];
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c0483b72f45f8c98e19237579bfdf5915001768
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java
@@ -0,0 +1,108 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.helpers;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+public final class RenameHelper {
+
+ // assumes no two or more entries are renamed to a single value, otherwise result will be only one of them will win
+ // and there is no defined winner in such a case
+ public static void renameKeys(final MapType data, final Function<String, String> renamer) {
+ if (data == null) {
+ return;
+ }
+
+ List<String> newKeys = null;
+ List<Object> newValues = null;
+ boolean needsRename = false;
+ for (final String key : data.keys()) {
+ final String renamed = renamer.apply(key);
+ if (renamed != null) {
+ newKeys = new ArrayList<>();
+ newValues = new ArrayList<>();
+ newValues.add(data.getGeneric(key));
+ newKeys.add(renamed);
+ data.remove(key);
+ needsRename = true;
+ break;
+ }
+ }
+
+ if (!needsRename) {
+ return;
+ }
+
+ for (final String key : new ArrayList<>(data.keys())) {
+ final String renamed = renamer.apply(key);
+
+ if (renamed != null) {
+ newValues.add(data.getGeneric(key));
+ newKeys.add(renamed);
+ data.remove(key);
+ }
+ }
+
+ // insert new keys
+ for (int i = 0, len = newKeys.size(); i < len; ++i) {
+ final String key = newKeys.get(i);
+ final Object value = newValues.get(i);
+
+ data.setGeneric(key, value);
+ }
+ }
+
+ // Clobbers anything in toKey if fromKey exists
+ public static boolean renameSingle(final MapType data, final String fromKey, final String toKey) {
+ if (data == null) {
+ return false;
+ }
+
+ final Object value = data.getGeneric(fromKey);
+ if (value != null) {
+ data.remove(fromKey);
+ data.setGeneric(toKey, value);
+ return true;
+ }
+ return false;
+ }
+
+ public static void renameString(final MapType data, final String key, final Function<String, String> renamer) {
+ if (data == null) {
+ return;
+ }
+
+ final String value = data.getString(key);
+ if (value == null) {
+ return;
+ }
+
+ final String renamed = renamer.apply(value);
+ if (renamed == null) {
+ return;
+ }
+
+ data.setString(key, renamed);
+ }
+
+ public static void renameListMapItems(final MapType data, final String listPath, final String mapPath,
+ final Function<String, String> renamer) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getListUnchecked(listPath);
+ if (list == null) {
+ return;
+ }
+
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ RenameHelper.renameString(list.getMap(i, null), mapPath, renamer);
+ }
+ }
+
+ private RenameHelper() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/itemname/ConverterAbstractItemRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemname/ConverterAbstractItemRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..94569f0ccff0d3a09eafd4ba73572d9db0a0ac5b
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemname/ConverterAbstractItemRename.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.itemname;
+
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import java.util.function.Function;
+
+public final class ConverterAbstractItemRename {
+
+ private ConverterAbstractItemRename() {}
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ ConverterAbstractStringValueTypeRename.register(version, subVersion, MCTypeRegistry.ITEM_NAME, renamer);
+ }
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..0244aab4905fc2b88abff344c2b2ab753d4b335e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.itemstack;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import java.util.function.Function;
+
+public final class ConverterEnchantmentsRename extends DataConverter<MapType, MapType> {
+
+ private final Function<String, String> renamer;
+
+ public ConverterEnchantmentsRename(final int toVersion, final Function<String, String> renamer) {
+ this(toVersion, 0, renamer);
+ }
+
+ public ConverterEnchantmentsRename(final int toVersion, final int versionStep, final Function<String, String> renamer) {
+ super(toVersion, versionStep);
+
+ this.renamer = (final String input) -> {
+ return renamer.apply(NamespaceUtil.correctNamespace(input));
+ };
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+
+ if (tag == null) {
+ return null;
+ }
+
+ RenameHelper.renameListMapItems(tag, "Enchantments", "id", this.renamer);
+ RenameHelper.renameListMapItems(tag, "StoredEnchantments", "id", this.renamer);
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenItemStack.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenItemStack.java
new file mode 100644
index 0000000000000000000000000000000000000000..eca9a58f43ac80f2fd3c8179d2790dae737951f7
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenItemStack.java
@@ -0,0 +1,460 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.itemstack;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.mojang.logging.LogUtils;
+import org.slf4j.Logger;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public final class ConverterFlattenItemStack extends DataConverter<MapType, MapType> {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ // Map of "id.damage" -> "flattened id"
+ private static final Map<String, String> FLATTEN_MAP = new HashMap<>();
+ static {
+ FLATTEN_MAP.put("minecraft:stone.0", "minecraft:stone");
+ FLATTEN_MAP.put("minecraft:stone.1", "minecraft:granite");
+ FLATTEN_MAP.put("minecraft:stone.2", "minecraft:polished_granite");
+ FLATTEN_MAP.put("minecraft:stone.3", "minecraft:diorite");
+ FLATTEN_MAP.put("minecraft:stone.4", "minecraft:polished_diorite");
+ FLATTEN_MAP.put("minecraft:stone.5", "minecraft:andesite");
+ FLATTEN_MAP.put("minecraft:stone.6", "minecraft:polished_andesite");
+ FLATTEN_MAP.put("minecraft:dirt.0", "minecraft:dirt");
+ FLATTEN_MAP.put("minecraft:dirt.1", "minecraft:coarse_dirt");
+ FLATTEN_MAP.put("minecraft:dirt.2", "minecraft:podzol");
+ FLATTEN_MAP.put("minecraft:leaves.0", "minecraft:oak_leaves");
+ FLATTEN_MAP.put("minecraft:leaves.1", "minecraft:spruce_leaves");
+ FLATTEN_MAP.put("minecraft:leaves.2", "minecraft:birch_leaves");
+ FLATTEN_MAP.put("minecraft:leaves.3", "minecraft:jungle_leaves");
+ FLATTEN_MAP.put("minecraft:leaves2.0", "minecraft:acacia_leaves");
+ FLATTEN_MAP.put("minecraft:leaves2.1", "minecraft:dark_oak_leaves");
+ FLATTEN_MAP.put("minecraft:log.0", "minecraft:oak_log");
+ FLATTEN_MAP.put("minecraft:log.1", "minecraft:spruce_log");
+ FLATTEN_MAP.put("minecraft:log.2", "minecraft:birch_log");
+ FLATTEN_MAP.put("minecraft:log.3", "minecraft:jungle_log");
+ FLATTEN_MAP.put("minecraft:log2.0", "minecraft:acacia_log");
+ FLATTEN_MAP.put("minecraft:log2.1", "minecraft:dark_oak_log");
+ FLATTEN_MAP.put("minecraft:sapling.0", "minecraft:oak_sapling");
+ FLATTEN_MAP.put("minecraft:sapling.1", "minecraft:spruce_sapling");
+ FLATTEN_MAP.put("minecraft:sapling.2", "minecraft:birch_sapling");
+ FLATTEN_MAP.put("minecraft:sapling.3", "minecraft:jungle_sapling");
+ FLATTEN_MAP.put("minecraft:sapling.4", "minecraft:acacia_sapling");
+ FLATTEN_MAP.put("minecraft:sapling.5", "minecraft:dark_oak_sapling");
+ FLATTEN_MAP.put("minecraft:planks.0", "minecraft:oak_planks");
+ FLATTEN_MAP.put("minecraft:planks.1", "minecraft:spruce_planks");
+ FLATTEN_MAP.put("minecraft:planks.2", "minecraft:birch_planks");
+ FLATTEN_MAP.put("minecraft:planks.3", "minecraft:jungle_planks");
+ FLATTEN_MAP.put("minecraft:planks.4", "minecraft:acacia_planks");
+ FLATTEN_MAP.put("minecraft:planks.5", "minecraft:dark_oak_planks");
+ FLATTEN_MAP.put("minecraft:sand.0", "minecraft:sand");
+ FLATTEN_MAP.put("minecraft:sand.1", "minecraft:red_sand");
+ FLATTEN_MAP.put("minecraft:quartz_block.0", "minecraft:quartz_block");
+ FLATTEN_MAP.put("minecraft:quartz_block.1", "minecraft:chiseled_quartz_block");
+ FLATTEN_MAP.put("minecraft:quartz_block.2", "minecraft:quartz_pillar");
+ FLATTEN_MAP.put("minecraft:anvil.0", "minecraft:anvil");
+ FLATTEN_MAP.put("minecraft:anvil.1", "minecraft:chipped_anvil");
+ FLATTEN_MAP.put("minecraft:anvil.2", "minecraft:damaged_anvil");
+ FLATTEN_MAP.put("minecraft:wool.0", "minecraft:white_wool");
+ FLATTEN_MAP.put("minecraft:wool.1", "minecraft:orange_wool");
+ FLATTEN_MAP.put("minecraft:wool.2", "minecraft:magenta_wool");
+ FLATTEN_MAP.put("minecraft:wool.3", "minecraft:light_blue_wool");
+ FLATTEN_MAP.put("minecraft:wool.4", "minecraft:yellow_wool");
+ FLATTEN_MAP.put("minecraft:wool.5", "minecraft:lime_wool");
+ FLATTEN_MAP.put("minecraft:wool.6", "minecraft:pink_wool");
+ FLATTEN_MAP.put("minecraft:wool.7", "minecraft:gray_wool");
+ FLATTEN_MAP.put("minecraft:wool.8", "minecraft:light_gray_wool");
+ FLATTEN_MAP.put("minecraft:wool.9", "minecraft:cyan_wool");
+ FLATTEN_MAP.put("minecraft:wool.10", "minecraft:purple_wool");
+ FLATTEN_MAP.put("minecraft:wool.11", "minecraft:blue_wool");
+ FLATTEN_MAP.put("minecraft:wool.12", "minecraft:brown_wool");
+ FLATTEN_MAP.put("minecraft:wool.13", "minecraft:green_wool");
+ FLATTEN_MAP.put("minecraft:wool.14", "minecraft:red_wool");
+ FLATTEN_MAP.put("minecraft:wool.15", "minecraft:black_wool");
+ FLATTEN_MAP.put("minecraft:carpet.0", "minecraft:white_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.1", "minecraft:orange_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.2", "minecraft:magenta_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.3", "minecraft:light_blue_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.4", "minecraft:yellow_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.5", "minecraft:lime_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.6", "minecraft:pink_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.7", "minecraft:gray_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.8", "minecraft:light_gray_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.9", "minecraft:cyan_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.10", "minecraft:purple_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.11", "minecraft:blue_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.12", "minecraft:brown_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.13", "minecraft:green_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.14", "minecraft:red_carpet");
+ FLATTEN_MAP.put("minecraft:carpet.15", "minecraft:black_carpet");
+ FLATTEN_MAP.put("minecraft:hardened_clay.0", "minecraft:terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.0", "minecraft:white_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.1", "minecraft:orange_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.2", "minecraft:magenta_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.3", "minecraft:light_blue_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.4", "minecraft:yellow_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.5", "minecraft:lime_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.6", "minecraft:pink_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.7", "minecraft:gray_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.8", "minecraft:light_gray_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.9", "minecraft:cyan_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.10", "minecraft:purple_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.11", "minecraft:blue_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.12", "minecraft:brown_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.13", "minecraft:green_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.14", "minecraft:red_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_hardened_clay.15", "minecraft:black_terracotta");
+ FLATTEN_MAP.put("minecraft:silver_glazed_terracotta.0", "minecraft:light_gray_glazed_terracotta");
+ FLATTEN_MAP.put("minecraft:stained_glass.0", "minecraft:white_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.1", "minecraft:orange_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.2", "minecraft:magenta_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.3", "minecraft:light_blue_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.4", "minecraft:yellow_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.5", "minecraft:lime_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.6", "minecraft:pink_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.7", "minecraft:gray_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.8", "minecraft:light_gray_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.9", "minecraft:cyan_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.10", "minecraft:purple_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.11", "minecraft:blue_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.12", "minecraft:brown_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.13", "minecraft:green_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.14", "minecraft:red_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass.15", "minecraft:black_stained_glass");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.0", "minecraft:white_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.1", "minecraft:orange_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.2", "minecraft:magenta_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.3", "minecraft:light_blue_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.4", "minecraft:yellow_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.5", "minecraft:lime_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.6", "minecraft:pink_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.7", "minecraft:gray_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.8", "minecraft:light_gray_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.9", "minecraft:cyan_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.10", "minecraft:purple_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.11", "minecraft:blue_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.12", "minecraft:brown_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.13", "minecraft:green_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.14", "minecraft:red_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:stained_glass_pane.15", "minecraft:black_stained_glass_pane");
+ FLATTEN_MAP.put("minecraft:prismarine.0", "minecraft:prismarine");
+ FLATTEN_MAP.put("minecraft:prismarine.1", "minecraft:prismarine_bricks");
+ FLATTEN_MAP.put("minecraft:prismarine.2", "minecraft:dark_prismarine");
+ FLATTEN_MAP.put("minecraft:concrete.0", "minecraft:white_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.1", "minecraft:orange_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.2", "minecraft:magenta_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.3", "minecraft:light_blue_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.4", "minecraft:yellow_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.5", "minecraft:lime_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.6", "minecraft:pink_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.7", "minecraft:gray_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.8", "minecraft:light_gray_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.9", "minecraft:cyan_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.10", "minecraft:purple_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.11", "minecraft:blue_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.12", "minecraft:brown_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.13", "minecraft:green_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.14", "minecraft:red_concrete");
+ FLATTEN_MAP.put("minecraft:concrete.15", "minecraft:black_concrete");
+ FLATTEN_MAP.put("minecraft:concrete_powder.0", "minecraft:white_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.1", "minecraft:orange_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.2", "minecraft:magenta_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.3", "minecraft:light_blue_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.4", "minecraft:yellow_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.5", "minecraft:lime_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.6", "minecraft:pink_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.7", "minecraft:gray_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.8", "minecraft:light_gray_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.9", "minecraft:cyan_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.10", "minecraft:purple_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.11", "minecraft:blue_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.12", "minecraft:brown_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.13", "minecraft:green_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.14", "minecraft:red_concrete_powder");
+ FLATTEN_MAP.put("minecraft:concrete_powder.15", "minecraft:black_concrete_powder");
+ FLATTEN_MAP.put("minecraft:cobblestone_wall.0", "minecraft:cobblestone_wall");
+ FLATTEN_MAP.put("minecraft:cobblestone_wall.1", "minecraft:mossy_cobblestone_wall");
+ FLATTEN_MAP.put("minecraft:sandstone.0", "minecraft:sandstone");
+ FLATTEN_MAP.put("minecraft:sandstone.1", "minecraft:chiseled_sandstone");
+ FLATTEN_MAP.put("minecraft:sandstone.2", "minecraft:cut_sandstone");
+ FLATTEN_MAP.put("minecraft:red_sandstone.0", "minecraft:red_sandstone");
+ FLATTEN_MAP.put("minecraft:red_sandstone.1", "minecraft:chiseled_red_sandstone");
+ FLATTEN_MAP.put("minecraft:red_sandstone.2", "minecraft:cut_red_sandstone");
+ FLATTEN_MAP.put("minecraft:stonebrick.0", "minecraft:stone_bricks");
+ FLATTEN_MAP.put("minecraft:stonebrick.1", "minecraft:mossy_stone_bricks");
+ FLATTEN_MAP.put("minecraft:stonebrick.2", "minecraft:cracked_stone_bricks");
+ FLATTEN_MAP.put("minecraft:stonebrick.3", "minecraft:chiseled_stone_bricks");
+ FLATTEN_MAP.put("minecraft:monster_egg.0", "minecraft:infested_stone");
+ FLATTEN_MAP.put("minecraft:monster_egg.1", "minecraft:infested_cobblestone");
+ FLATTEN_MAP.put("minecraft:monster_egg.2", "minecraft:infested_stone_bricks");
+ FLATTEN_MAP.put("minecraft:monster_egg.3", "minecraft:infested_mossy_stone_bricks");
+ FLATTEN_MAP.put("minecraft:monster_egg.4", "minecraft:infested_cracked_stone_bricks");
+ FLATTEN_MAP.put("minecraft:monster_egg.5", "minecraft:infested_chiseled_stone_bricks");
+ FLATTEN_MAP.put("minecraft:yellow_flower.0", "minecraft:dandelion");
+ FLATTEN_MAP.put("minecraft:red_flower.0", "minecraft:poppy");
+ FLATTEN_MAP.put("minecraft:red_flower.1", "minecraft:blue_orchid");
+ FLATTEN_MAP.put("minecraft:red_flower.2", "minecraft:allium");
+ FLATTEN_MAP.put("minecraft:red_flower.3", "minecraft:azure_bluet");
+ FLATTEN_MAP.put("minecraft:red_flower.4", "minecraft:red_tulip");
+ FLATTEN_MAP.put("minecraft:red_flower.5", "minecraft:orange_tulip");
+ FLATTEN_MAP.put("minecraft:red_flower.6", "minecraft:white_tulip");
+ FLATTEN_MAP.put("minecraft:red_flower.7", "minecraft:pink_tulip");
+ FLATTEN_MAP.put("minecraft:red_flower.8", "minecraft:oxeye_daisy");
+ FLATTEN_MAP.put("minecraft:double_plant.0", "minecraft:sunflower");
+ FLATTEN_MAP.put("minecraft:double_plant.1", "minecraft:lilac");
+ FLATTEN_MAP.put("minecraft:double_plant.2", "minecraft:tall_grass");
+ FLATTEN_MAP.put("minecraft:double_plant.3", "minecraft:large_fern");
+ FLATTEN_MAP.put("minecraft:double_plant.4", "minecraft:rose_bush");
+ FLATTEN_MAP.put("minecraft:double_plant.5", "minecraft:peony");
+ FLATTEN_MAP.put("minecraft:deadbush.0", "minecraft:dead_bush");
+ FLATTEN_MAP.put("minecraft:tallgrass.0", "minecraft:dead_bush");
+ FLATTEN_MAP.put("minecraft:tallgrass.1", "minecraft:grass");
+ FLATTEN_MAP.put("minecraft:tallgrass.2", "minecraft:fern");
+ FLATTEN_MAP.put("minecraft:sponge.0", "minecraft:sponge");
+ FLATTEN_MAP.put("minecraft:sponge.1", "minecraft:wet_sponge");
+ FLATTEN_MAP.put("minecraft:purpur_slab.0", "minecraft:purpur_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab.0", "minecraft:stone_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab.1", "minecraft:sandstone_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab.2", "minecraft:petrified_oak_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab.3", "minecraft:cobblestone_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab.4", "minecraft:brick_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab.5", "minecraft:stone_brick_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab.6", "minecraft:nether_brick_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab.7", "minecraft:quartz_slab");
+ FLATTEN_MAP.put("minecraft:stone_slab2.0", "minecraft:red_sandstone_slab");
+ FLATTEN_MAP.put("minecraft:wooden_slab.0", "minecraft:oak_slab");
+ FLATTEN_MAP.put("minecraft:wooden_slab.1", "minecraft:spruce_slab");
+ FLATTEN_MAP.put("minecraft:wooden_slab.2", "minecraft:birch_slab");
+ FLATTEN_MAP.put("minecraft:wooden_slab.3", "minecraft:jungle_slab");
+ FLATTEN_MAP.put("minecraft:wooden_slab.4", "minecraft:acacia_slab");
+ FLATTEN_MAP.put("minecraft:wooden_slab.5", "minecraft:dark_oak_slab");
+ FLATTEN_MAP.put("minecraft:coal.0", "minecraft:coal");
+ FLATTEN_MAP.put("minecraft:coal.1", "minecraft:charcoal");
+ FLATTEN_MAP.put("minecraft:fish.0", "minecraft:cod");
+ FLATTEN_MAP.put("minecraft:fish.1", "minecraft:salmon");
+ FLATTEN_MAP.put("minecraft:fish.2", "minecraft:clownfish");
+ FLATTEN_MAP.put("minecraft:fish.3", "minecraft:pufferfish");
+ FLATTEN_MAP.put("minecraft:cooked_fish.0", "minecraft:cooked_cod");
+ FLATTEN_MAP.put("minecraft:cooked_fish.1", "minecraft:cooked_salmon");
+ FLATTEN_MAP.put("minecraft:skull.0", "minecraft:skeleton_skull");
+ FLATTEN_MAP.put("minecraft:skull.1", "minecraft:wither_skeleton_skull");
+ FLATTEN_MAP.put("minecraft:skull.2", "minecraft:zombie_head");
+ FLATTEN_MAP.put("minecraft:skull.3", "minecraft:player_head");
+ FLATTEN_MAP.put("minecraft:skull.4", "minecraft:creeper_head");
+ FLATTEN_MAP.put("minecraft:skull.5", "minecraft:dragon_head");
+ FLATTEN_MAP.put("minecraft:golden_apple.0", "minecraft:golden_apple");
+ FLATTEN_MAP.put("minecraft:golden_apple.1", "minecraft:enchanted_golden_apple");
+ FLATTEN_MAP.put("minecraft:fireworks.0", "minecraft:firework_rocket");
+ FLATTEN_MAP.put("minecraft:firework_charge.0", "minecraft:firework_star");
+ FLATTEN_MAP.put("minecraft:dye.0", "minecraft:ink_sac");
+ FLATTEN_MAP.put("minecraft:dye.1", "minecraft:rose_red");
+ FLATTEN_MAP.put("minecraft:dye.2", "minecraft:cactus_green");
+ FLATTEN_MAP.put("minecraft:dye.3", "minecraft:cocoa_beans");
+ FLATTEN_MAP.put("minecraft:dye.4", "minecraft:lapis_lazuli");
+ FLATTEN_MAP.put("minecraft:dye.5", "minecraft:purple_dye");
+ FLATTEN_MAP.put("minecraft:dye.6", "minecraft:cyan_dye");
+ FLATTEN_MAP.put("minecraft:dye.7", "minecraft:light_gray_dye");
+ FLATTEN_MAP.put("minecraft:dye.8", "minecraft:gray_dye");
+ FLATTEN_MAP.put("minecraft:dye.9", "minecraft:pink_dye");
+ FLATTEN_MAP.put("minecraft:dye.10", "minecraft:lime_dye");
+ FLATTEN_MAP.put("minecraft:dye.11", "minecraft:dandelion_yellow");
+ FLATTEN_MAP.put("minecraft:dye.12", "minecraft:light_blue_dye");
+ FLATTEN_MAP.put("minecraft:dye.13", "minecraft:magenta_dye");
+ FLATTEN_MAP.put("minecraft:dye.14", "minecraft:orange_dye");
+ FLATTEN_MAP.put("minecraft:dye.15", "minecraft:bone_meal");
+ FLATTEN_MAP.put("minecraft:silver_shulker_box.0", "minecraft:light_gray_shulker_box");
+ FLATTEN_MAP.put("minecraft:fence.0", "minecraft:oak_fence");
+ FLATTEN_MAP.put("minecraft:fence_gate.0", "minecraft:oak_fence_gate");
+ FLATTEN_MAP.put("minecraft:wooden_door.0", "minecraft:oak_door");
+ FLATTEN_MAP.put("minecraft:boat.0", "minecraft:oak_boat");
+ FLATTEN_MAP.put("minecraft:lit_pumpkin.0", "minecraft:jack_o_lantern");
+ FLATTEN_MAP.put("minecraft:pumpkin.0", "minecraft:carved_pumpkin");
+ FLATTEN_MAP.put("minecraft:trapdoor.0", "minecraft:oak_trapdoor");
+ FLATTEN_MAP.put("minecraft:nether_brick.0", "minecraft:nether_bricks");
+ FLATTEN_MAP.put("minecraft:red_nether_brick.0", "minecraft:red_nether_bricks");
+ FLATTEN_MAP.put("minecraft:netherbrick.0", "minecraft:nether_brick");
+ FLATTEN_MAP.put("minecraft:wooden_button.0", "minecraft:oak_button");
+ FLATTEN_MAP.put("minecraft:wooden_pressure_plate.0", "minecraft:oak_pressure_plate");
+ FLATTEN_MAP.put("minecraft:noteblock.0", "minecraft:note_block");
+ FLATTEN_MAP.put("minecraft:bed.0", "minecraft:white_bed");
+ FLATTEN_MAP.put("minecraft:bed.1", "minecraft:orange_bed");
+ FLATTEN_MAP.put("minecraft:bed.2", "minecraft:magenta_bed");
+ FLATTEN_MAP.put("minecraft:bed.3", "minecraft:light_blue_bed");
+ FLATTEN_MAP.put("minecraft:bed.4", "minecraft:yellow_bed");
+ FLATTEN_MAP.put("minecraft:bed.5", "minecraft:lime_bed");
+ FLATTEN_MAP.put("minecraft:bed.6", "minecraft:pink_bed");
+ FLATTEN_MAP.put("minecraft:bed.7", "minecraft:gray_bed");
+ FLATTEN_MAP.put("minecraft:bed.8", "minecraft:light_gray_bed");
+ FLATTEN_MAP.put("minecraft:bed.9", "minecraft:cyan_bed");
+ FLATTEN_MAP.put("minecraft:bed.10", "minecraft:purple_bed");
+ FLATTEN_MAP.put("minecraft:bed.11", "minecraft:blue_bed");
+ FLATTEN_MAP.put("minecraft:bed.12", "minecraft:brown_bed");
+ FLATTEN_MAP.put("minecraft:bed.13", "minecraft:green_bed");
+ FLATTEN_MAP.put("minecraft:bed.14", "minecraft:red_bed");
+ FLATTEN_MAP.put("minecraft:bed.15", "minecraft:black_bed");
+ FLATTEN_MAP.put("minecraft:banner.15", "minecraft:white_banner");
+ FLATTEN_MAP.put("minecraft:banner.14", "minecraft:orange_banner");
+ FLATTEN_MAP.put("minecraft:banner.13", "minecraft:magenta_banner");
+ FLATTEN_MAP.put("minecraft:banner.12", "minecraft:light_blue_banner");
+ FLATTEN_MAP.put("minecraft:banner.11", "minecraft:yellow_banner");
+ FLATTEN_MAP.put("minecraft:banner.10", "minecraft:lime_banner");
+ FLATTEN_MAP.put("minecraft:banner.9", "minecraft:pink_banner");
+ FLATTEN_MAP.put("minecraft:banner.8", "minecraft:gray_banner");
+ FLATTEN_MAP.put("minecraft:banner.7", "minecraft:light_gray_banner");
+ FLATTEN_MAP.put("minecraft:banner.6", "minecraft:cyan_banner");
+ FLATTEN_MAP.put("minecraft:banner.5", "minecraft:purple_banner");
+ FLATTEN_MAP.put("minecraft:banner.4", "minecraft:blue_banner");
+ FLATTEN_MAP.put("minecraft:banner.3", "minecraft:brown_banner");
+ FLATTEN_MAP.put("minecraft:banner.2", "minecraft:green_banner");
+ FLATTEN_MAP.put("minecraft:banner.1", "minecraft:red_banner");
+ FLATTEN_MAP.put("minecraft:banner.0", "minecraft:black_banner");
+ FLATTEN_MAP.put("minecraft:grass.0", "minecraft:grass_block");
+ FLATTEN_MAP.put("minecraft:brick_block.0", "minecraft:bricks");
+ FLATTEN_MAP.put("minecraft:end_bricks.0", "minecraft:end_stone_bricks");
+ FLATTEN_MAP.put("minecraft:golden_rail.0", "minecraft:powered_rail");
+ FLATTEN_MAP.put("minecraft:magma.0", "minecraft:magma_block");
+ FLATTEN_MAP.put("minecraft:quartz_ore.0", "minecraft:nether_quartz_ore");
+ FLATTEN_MAP.put("minecraft:reeds.0", "minecraft:sugar_cane");
+ FLATTEN_MAP.put("minecraft:slime.0", "minecraft:slime_block");
+ FLATTEN_MAP.put("minecraft:stone_stairs.0", "minecraft:cobblestone_stairs");
+ FLATTEN_MAP.put("minecraft:waterlily.0", "minecraft:lily_pad");
+ FLATTEN_MAP.put("minecraft:web.0", "minecraft:cobweb");
+ FLATTEN_MAP.put("minecraft:snow.0", "minecraft:snow_block");
+ FLATTEN_MAP.put("minecraft:snow_layer.0", "minecraft:snow");
+ FLATTEN_MAP.put("minecraft:record_11.0", "minecraft:music_disc_11");
+ FLATTEN_MAP.put("minecraft:record_13.0", "minecraft:music_disc_13");
+ FLATTEN_MAP.put("minecraft:record_blocks.0", "minecraft:music_disc_blocks");
+ FLATTEN_MAP.put("minecraft:record_cat.0", "minecraft:music_disc_cat");
+ FLATTEN_MAP.put("minecraft:record_chirp.0", "minecraft:music_disc_chirp");
+ FLATTEN_MAP.put("minecraft:record_far.0", "minecraft:music_disc_far");
+ FLATTEN_MAP.put("minecraft:record_mall.0", "minecraft:music_disc_mall");
+ FLATTEN_MAP.put("minecraft:record_mellohi.0", "minecraft:music_disc_mellohi");
+ FLATTEN_MAP.put("minecraft:record_stal.0", "minecraft:music_disc_stal");
+ FLATTEN_MAP.put("minecraft:record_strad.0", "minecraft:music_disc_strad");
+ FLATTEN_MAP.put("minecraft:record_wait.0", "minecraft:music_disc_wait");
+ FLATTEN_MAP.put("minecraft:record_ward.0", "minecraft:music_disc_ward");
+ }
+
+ // maps out ids requiring flattening
+ private static final Set<String> IDS_REQUIRING_FLATTENING = new HashSet<>();
+ static {
+ for (final String key : FLATTEN_MAP.keySet()) {
+ IDS_REQUIRING_FLATTENING.add(key.substring(0, key.indexOf('.')));
+ }
+ }
+
+ // Damage tag is moved from the ItemStack base tag to the ItemStack tag, and we only want to migrate that
+ // for items that actually require it for damage purposes (Remember, old damage was used to differentiate item types)
+ // It should be noted that this ID set should not be included in the flattening map, because damage for these items
+ // is actual damage and not a subtype specifier
+ private static final Set<String> ITEMS_WITH_DAMAGE = new HashSet<>(Arrays.asList(
+ "minecraft:bow",
+ "minecraft:carrot_on_a_stick",
+ "minecraft:chainmail_boots",
+ "minecraft:chainmail_chestplate",
+ "minecraft:chainmail_helmet",
+ "minecraft:chainmail_leggings",
+ "minecraft:diamond_axe",
+ "minecraft:diamond_boots",
+ "minecraft:diamond_chestplate",
+ "minecraft:diamond_helmet",
+ "minecraft:diamond_hoe",
+ "minecraft:diamond_leggings",
+ "minecraft:diamond_pickaxe",
+ "minecraft:diamond_shovel",
+ "minecraft:diamond_sword",
+ "minecraft:elytra",
+ "minecraft:fishing_rod",
+ "minecraft:flint_and_steel",
+ "minecraft:golden_axe",
+ "minecraft:golden_boots",
+ "minecraft:golden_chestplate",
+ "minecraft:golden_helmet",
+ "minecraft:golden_hoe",
+ "minecraft:golden_leggings",
+ "minecraft:golden_pickaxe",
+ "minecraft:golden_shovel",
+ "minecraft:golden_sword",
+ "minecraft:iron_axe",
+ "minecraft:iron_boots",
+ "minecraft:iron_chestplate",
+ "minecraft:iron_helmet",
+ "minecraft:iron_hoe",
+ "minecraft:iron_leggings",
+ "minecraft:iron_pickaxe",
+ "minecraft:iron_shovel",
+ "minecraft:iron_sword",
+ "minecraft:leather_boots",
+ "minecraft:leather_chestplate",
+ "minecraft:leather_helmet",
+ "minecraft:leather_leggings",
+ "minecraft:shears",
+ "minecraft:shield",
+ "minecraft:stone_axe",
+ "minecraft:stone_hoe",
+ "minecraft:stone_pickaxe",
+ "minecraft:stone_shovel",
+ "minecraft:stone_sword",
+ "minecraft:wooden_axe",
+ "minecraft:wooden_hoe",
+ "minecraft:wooden_pickaxe",
+ "minecraft:wooden_shovel",
+ "minecraft:wooden_sword"
+ ));
+
+ public ConverterFlattenItemStack() {
+ super(MCVersions.V17W47A, 4);
+ }
+
+ public static String flattenItem(final String oldName, final int data) {
+ if (IDS_REQUIRING_FLATTENING.contains(oldName)) {
+ final String flattened = FLATTEN_MAP.get(oldName + '.' + data);
+ return flattened == null ? FLATTEN_MAP.get(oldName.concat(".0")) : flattened;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+
+ if (id == null) {
+ return null;
+ }
+
+ final int damage = data.getInt("Damage");
+ data.remove("Damage");
+
+ if (IDS_REQUIRING_FLATTENING.contains(id)) {
+ String remap = FLATTEN_MAP.get(id + '.' + damage);
+ if (remap == null) {
+ remap = FLATTEN_MAP.get(id.concat(".0"));
+ // this shouldn't be null
+ }
+ if (remap != null) {
+ data.setString("id", remap);
+ } else {
+ LOGGER.warn("Item '" + id + "' requires flattening but found no mapping for it! (ConverterFlattenItemStack)");
+ }
+ }
+
+ if (damage != 0 && ITEMS_WITH_DAMAGE.contains(id)) {
+ // migrate damage
+ MapType tag = data.getMap("tag");
+ if (tag == null) {
+ tag = Types.NBT.createEmptyMap();
+ data.setMap("tag", tag);
+ }
+ tag.setInt("Damage", damage);
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenSpawnEgg.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenSpawnEgg.java
new file mode 100644
index 0000000000000000000000000000000000000000..32d498fac143f40124dc69fa0cf566f1ac33545c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenSpawnEgg.java
@@ -0,0 +1,87 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.itemstack;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class ConverterFlattenSpawnEgg extends DataConverter<MapType, MapType> {
+
+ private static final Map<String, String> ENTITY_ID_TO_NEW_EGG_ID = new HashMap<>();
+ static {
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:bat", "minecraft:bat_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:blaze", "minecraft:blaze_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:cave_spider", "minecraft:cave_spider_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:chicken", "minecraft:chicken_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:cow", "minecraft:cow_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:creeper", "minecraft:creeper_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:donkey", "minecraft:donkey_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:elder_guardian", "minecraft:elder_guardian_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:ender_dragon", "minecraft:ender_dragon_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:enderman", "minecraft:enderman_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:endermite", "minecraft:endermite_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:evocation_illager", "minecraft:evocation_illager_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:ghast", "minecraft:ghast_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:guardian", "minecraft:guardian_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:horse", "minecraft:horse_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:husk", "minecraft:husk_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:iron_golem", "minecraft:iron_golem_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:llama", "minecraft:llama_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:magma_cube", "minecraft:magma_cube_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:mooshroom", "minecraft:mooshroom_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:mule", "minecraft:mule_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:ocelot", "minecraft:ocelot_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:pufferfish", "minecraft:pufferfish_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:parrot", "minecraft:parrot_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:pig", "minecraft:pig_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:polar_bear", "minecraft:polar_bear_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:rabbit", "minecraft:rabbit_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:sheep", "minecraft:sheep_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:shulker", "minecraft:shulker_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:silverfish", "minecraft:silverfish_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:skeleton", "minecraft:skeleton_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:skeleton_horse", "minecraft:skeleton_horse_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:slime", "minecraft:slime_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:snow_golem", "minecraft:snow_golem_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:spider", "minecraft:spider_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:squid", "minecraft:squid_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:stray", "minecraft:stray_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:turtle", "minecraft:turtle_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:vex", "minecraft:vex_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:villager", "minecraft:villager_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:vindication_illager", "minecraft:vindication_illager_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:witch", "minecraft:witch_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:wither", "minecraft:wither_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:wither_skeleton", "minecraft:wither_skeleton_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:wolf", "minecraft:wolf_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:zombie", "minecraft:zombie_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:zombie_horse", "minecraft:zombie_horse_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:zombie_pigman", "minecraft:zombie_pigman_spawn_egg");
+ ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:zombie_villager", "minecraft:zombie_villager_spawn_egg");
+ }
+
+ public ConverterFlattenSpawnEgg(final int version, final int versionStep) {
+ super(version, versionStep);
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType entityTag = tag.getMap("EntityTag");
+ if (entityTag == null) {
+ return null;
+ }
+
+ final String id = entityTag.getString("id");
+ if (id != null) {
+ data.setString("id", ENTITY_ID_TO_NEW_EGG_ID.getOrDefault(id, "minecraft:pig_spawn_egg"));
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java
new file mode 100644
index 0000000000000000000000000000000000000000..d5c5b711406f63a3e35ae7e5bfbf1d306bee4f1c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java
@@ -0,0 +1,1244 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.itemstack;
+
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.minecraft.versions.V3818;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import net.minecraft.util.Mth;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class ConverterItemStackToDataComponents {
+
+ private static final int TOOLTIP_FLAG_HIDE_ENCHANTMENTS = 1 << 0;
+ private static final int TOOLTIP_FLAG_HIDE_MODIFIERS = 1 << 1;
+ private static final int TOOLTIP_FLAG_HIDE_UNBREAKABLE = 1 << 2;
+ private static final int TOOLTIP_FLAG_HIDE_CAN_DESTROY = 1 << 3;
+ private static final int TOOLTIP_FLAG_HIDE_CAN_PLACE = 1 << 4;
+ private static final int TOOLTIP_FLAG_HIDE_ADDITIONAL = 1 << 5;
+ private static final int TOOLTIP_FLAG_HIDE_DYE = 1 << 6;
+ private static final int TOOLTIP_FLAG_HIDE_UPGRADES = 1 << 7;
+
+ private static final int DEFAULT_LEATHER_COLOUR = (160 << 16) | (101 << 8) | (64 << 0); // r, g, b
+
+ private static final String[] BUCKETED_MOB_TAGS = new String[] {
+ "NoAI",
+ "Silent",
+ "NoGravity",
+ "Glowing",
+ "Invulnerable",
+ "Health",
+ "Age",
+ "Variant",
+ "HuntingCooldown",
+ "BucketVariantTag"
+ };
+ private static final Set<String> BOOLEAN_BLOCK_STATE_PROPERTIES = new HashSet<>(
+ Arrays.asList(
+ "attached",
+ "bottom",
+ "conditional",
+ "disarmed",
+ "drag",
+ "enabled",
+ "extended",
+ "eye",
+ "falling",
+ "hanging",
+ "has_bottle_0",
+ "has_bottle_1",
+ "has_bottle_2",
+ "has_record",
+ "has_book",
+ "inverted",
+ "in_wall",
+ "lit",
+ "locked",
+ "occupied",
+ "open",
+ "persistent",
+ "powered",
+ "short",
+ "signal_fire",
+ "snowy",
+ "triggered",
+ "unstable",
+ "waterlogged",
+ "berries",
+ "bloom",
+ "shrieking",
+ "can_summon",
+ "up",
+ "down",
+ "north",
+ "east",
+ "south",
+ "west",
+ "slot_0_occupied",
+ "slot_1_occupied",
+ "slot_2_occupied",
+ "slot_3_occupied",
+ "slot_4_occupied",
+ "slot_5_occupied",
+ "cracked",
+ "crafting"
+ )
+ );
+ private static final String[] MAP_DECORATION_CONVERSION_TABLE = new String[34];
+ static {
+ MAP_DECORATION_CONVERSION_TABLE[0] = "player";
+ MAP_DECORATION_CONVERSION_TABLE[1] = "frame";
+ MAP_DECORATION_CONVERSION_TABLE[2] = "red_marker";
+ MAP_DECORATION_CONVERSION_TABLE[3] = "blue_marker";
+ MAP_DECORATION_CONVERSION_TABLE[4] = "target_x";
+ MAP_DECORATION_CONVERSION_TABLE[5] = "target_point";
+ MAP_DECORATION_CONVERSION_TABLE[6] = "player_off_map";
+ MAP_DECORATION_CONVERSION_TABLE[7] = "player_off_limits";
+ MAP_DECORATION_CONVERSION_TABLE[8] = "mansion";
+ MAP_DECORATION_CONVERSION_TABLE[9] = "monument";
+ MAP_DECORATION_CONVERSION_TABLE[10] = "banner_white";
+ MAP_DECORATION_CONVERSION_TABLE[11] = "banner_orange";
+ MAP_DECORATION_CONVERSION_TABLE[12] = "banner_magenta";
+ MAP_DECORATION_CONVERSION_TABLE[13] = "banner_light_blue";
+ MAP_DECORATION_CONVERSION_TABLE[14] = "banner_yellow";
+ MAP_DECORATION_CONVERSION_TABLE[15] = "banner_lime";
+ MAP_DECORATION_CONVERSION_TABLE[16] = "banner_pink";
+ MAP_DECORATION_CONVERSION_TABLE[17] = "banner_gray";
+ MAP_DECORATION_CONVERSION_TABLE[18] = "banner_light_gray";
+ MAP_DECORATION_CONVERSION_TABLE[19] = "banner_cyan";
+ MAP_DECORATION_CONVERSION_TABLE[20] = "banner_purple";
+ MAP_DECORATION_CONVERSION_TABLE[21] = "banner_blue";
+ MAP_DECORATION_CONVERSION_TABLE[22] = "banner_brown";
+ MAP_DECORATION_CONVERSION_TABLE[23] = "banner_green";
+ MAP_DECORATION_CONVERSION_TABLE[24] = "banner_red";
+ MAP_DECORATION_CONVERSION_TABLE[25] = "banner_black";
+ MAP_DECORATION_CONVERSION_TABLE[26] = "red_x";
+ MAP_DECORATION_CONVERSION_TABLE[27] = "village_desert";
+ MAP_DECORATION_CONVERSION_TABLE[28] = "village_plains";
+ MAP_DECORATION_CONVERSION_TABLE[29] = "village_savanna";
+ MAP_DECORATION_CONVERSION_TABLE[30] = "village_snowy";
+ MAP_DECORATION_CONVERSION_TABLE[31] = "village_taiga";
+ MAP_DECORATION_CONVERSION_TABLE[32] = "jungle_temple";
+ MAP_DECORATION_CONVERSION_TABLE[33] = "swamp_hut";
+ }
+
+ private static String convertMapDecorationId(final int type) {
+ return type >= 0 && type < MAP_DECORATION_CONVERSION_TABLE.length ? MAP_DECORATION_CONVERSION_TABLE[type] : MAP_DECORATION_CONVERSION_TABLE[0];
+ }
+
+ private static void convertBlockStateProperties(final MapType properties) {
+ // convert values stored as boolean/integer to string
+ for (final String key : properties.keys()) {
+ final Object value = properties.getGeneric(key);
+ if (value instanceof Number number) {
+ if (BOOLEAN_BLOCK_STATE_PROPERTIES.contains(key)) {
+ properties.setString(key, Boolean.toString(number.byteValue() != (byte)0));
+ } else {
+ properties.setString(key, number.toString());
+ }
+ }
+ }
+ }
+
+ private static void convertTileEntity(final MapType tileEntity, final TransientItemStack transientItem) {
+ final Object lock = tileEntity.getGeneric("Lock");
+ if (lock != null) {
+ tileEntity.remove("Lock");
+ transientItem.componentSetGeneric("minecraft:lock", lock);
+ }
+
+ final Object lootTable = tileEntity.getGeneric("LootTable");
+ if (lootTable != null) {
+ final MapType containerLoot = tileEntity.getTypeUtil().createEmptyMap();
+ transientItem.componentSetMap("minecraft:container_loot", containerLoot);
+
+ containerLoot.setGeneric("loot_table", lootTable);
+
+ final long seed = tileEntity.getLong("LootTableSeed", 0L);
+ if (seed != 0L) {
+ containerLoot.setLong("seed", seed);
+ }
+
+ tileEntity.remove("LootTable");
+ tileEntity.remove("LootTableSeed");
+ }
+
+ final String id = NamespaceUtil.correctNamespace(tileEntity.getString("id", ""));
+
+ switch (id) {
+ case "minecraft:skull": {
+ final Object noteBlockSound = tileEntity.getGeneric("note_block_sound");
+ if (noteBlockSound != null) {
+ tileEntity.remove("note_block_sound");
+ transientItem.componentSetGeneric("minecraft:note_block_sound", noteBlockSound);
+ }
+
+ break;
+ }
+ case "minecraft:decorated_pot": {
+ final Object sherds = tileEntity.getGeneric("sherds");
+ if (sherds != null) {
+ tileEntity.remove("sherds");
+ transientItem.componentSetGeneric("minecraft:pot_decorations", sherds);
+ }
+
+ final Object item = tileEntity.getGeneric("item");
+ if (item != null) {
+ tileEntity.remove("item");
+
+ final ListType container = tileEntity.getTypeUtil().createEmptyList();
+ transientItem.componentSetList("minecraft:container", container);
+
+ final MapType wrappedItem = tileEntity.getTypeUtil().createEmptyMap();
+ container.addMap(wrappedItem);
+
+ wrappedItem.setInt("slot", 0);
+ wrappedItem.setGeneric("item", item);
+ }
+
+ break;
+ }
+ case "minecraft:banner": {
+ final Object patterns = tileEntity.getGeneric("patterns");
+ if (patterns != null) {
+ tileEntity.remove("patterns");
+
+ transientItem.componentSetGeneric("minecraft:banner_patterns", patterns);
+ }
+
+ final Number base = tileEntity.getNumber("Base");
+ if (base != null) {
+ tileEntity.remove("Base");
+
+ transientItem.componentSetString("minecraft:base_color", V3818.getBannerColour(base.intValue()));
+ }
+
+ break;
+ }
+
+ case "minecraft:shulker_box":
+ case "minecraft:chest":
+ case "minecraft:trapped_chest":
+ case "minecraft:furnace":
+ case "minecraft:ender_chest":
+ case "minecraft:dispenser":
+ case "minecraft:dropper":
+ case "minecraft:brewing_stand":
+ case "minecraft:hopper":
+ case "minecraft:barrel":
+ case "minecraft:smoker":
+ case "minecraft:blast_furnace":
+ case "minecraft:campfire":
+ case "minecraft:chiseled_bookshelf":
+ case "minecraft:crafter": {
+ final ListType items = tileEntity.getList("Items", ObjectType.MAP);
+ tileEntity.remove("Items");
+ if (items != null && items.size() > 0) {
+ transientItem.componentSetList("minecraft:container", items);
+
+ for (int i = 0, len = items.size(); i < len; ++i) {
+ final MapType item = items.getMap(i);
+ final int slot = (int)item.getByte("Slot", (byte)0) & 0xFF;
+ item.remove("Slot");
+
+ final MapType wrappedItem = item.getTypeUtil().createEmptyMap();
+ items.setMap(i, wrappedItem);
+
+ wrappedItem.setInt("slot", slot);
+ wrappedItem.setMap("item", item);
+ }
+ }
+
+ break;
+ }
+
+ case "minecraft:beehive": {
+ final Object bees = tileEntity.getGeneric("bees");
+ if (bees != null) {
+ tileEntity.remove("bees");
+
+ transientItem.componentSetGeneric("minecraft:bees", bees);
+ }
+ break;
+ }
+ }
+ }
+
+ private static void convertEnchantments(final TransientItemStack transientItem, final TypeUtil<?> type,
+ final String tagKey, final String componentKey,
+ final boolean hideToolTip) {
+ final ListType enchantments = transientItem.tagRemoveList(tagKey, ObjectType.MAP);
+ if (enchantments == null || enchantments.size() == 0) {
+ if (hideToolTip) {
+ final MapType newEnchants = type.createEmptyMap();
+ transientItem.componentSetMap(componentKey, newEnchants);
+
+ newEnchants.setMap("levels", type.createEmptyMap());
+ newEnchants.setBoolean("show_in_tooltip", false);
+ }
+ } else {
+ final MapType newEnchantments = type.createEmptyMap();
+
+ for (int i = 0, len = enchantments.size(); i < len; ++i) {
+ final MapType enchantment = enchantments.getMap(i);
+
+ final String id = enchantment.getString("id");
+ final Number level = enchantment.getNumber("lvl");
+
+ if (id == null || level == null) {
+ continue;
+ }
+
+ newEnchantments.setInt(id, Mth.clamp(level.intValue(), 0, 0xFF));
+ }
+
+ if (!newEnchantments.isEmpty() || hideToolTip) {
+ final MapType newEnchants = type.createEmptyMap();
+ transientItem.componentSetMap(componentKey, newEnchants);
+
+ newEnchants.setMap("levels", newEnchantments);
+ if (hideToolTip) {
+ newEnchants.setBoolean("show_in_tooltip", false);
+ }
+ }
+ }
+
+ if (enchantments != null && enchantments.size() == 0) {
+ transientItem.componentSetBoolean("minecraft:enchantment_glint_override", true);
+ }
+ }
+
+ private static void convertDisplay(final TransientItemStack transientItem, final TypeUtil<?> type, final int flags) {
+ final MapType display = transientItem.tag.getMap("display");
+
+ if (display != null) {
+ final Object name = display.getGeneric("Name");
+ if (name != null) {
+ display.remove("Name");
+
+ transientItem.componentSetGeneric("minecraft:custom_name", name);
+ }
+
+ final Object lore = display.getGeneric("Lore");
+ if (lore != null) {
+ display.remove("Lore");
+
+ transientItem.componentSetGeneric("minecraft:lore", lore);
+ }
+ }
+
+ final Number color = display == null ? null : display.getNumber("color");
+ final boolean hideDye = (flags & TOOLTIP_FLAG_HIDE_DYE) != 0;
+
+ if (hideDye || color != null) {
+ if (color != null) {
+ display.remove("color");
+ }
+
+ final MapType dyedColor = type.createEmptyMap();
+ transientItem.componentSetMap("minecraft:dyed_color", dyedColor);
+
+ dyedColor.setInt("rgb", color == null ? DEFAULT_LEATHER_COLOUR : color.intValue());
+ if (hideDye) {
+ dyedColor.setBoolean("show_in_tooltip", false);
+ }
+ }
+
+ final Object locName = display == null ? null : display.getGeneric("LocName");
+ if (locName != null) {
+ display.remove("LocName");
+
+ if (locName instanceof String locNameString) {
+ transientItem.componentSetString("minecraft:item_name", ComponentUtils.createTranslatableComponent(locNameString));
+ }
+ }
+
+ if (display != null && "minecraft:filled_map".equals(transientItem.id)) {
+ final Object mapColor = display.getGeneric("MapColor");
+ if (mapColor != null) {
+ display.remove("MapColor");
+
+ transientItem.componentSetGeneric("minecraft:map_color", mapColor);
+ }
+ }
+
+ // mirror behavior of fixSubTag
+ if (display != null && display.isEmpty()) {
+ transientItem.tagRemoveMap("display");
+ }
+ }
+
+ public static MapType convertBlockStatePredicate(final String value, final TypeUtil<?> type) {
+ final int propertyStart = value.indexOf('[');
+ final int nbtStart = value.indexOf('{');
+ int blockNameEnd = value.length();
+
+ if (propertyStart != -1) {
+ blockNameEnd = propertyStart;
+ }
+ if (nbtStart != -1) {
+ blockNameEnd = Math.min(blockNameEnd, nbtStart);
+ }
+
+ final MapType ret = type.createEmptyMap();
+
+ final String blockName = value.substring(0, blockNameEnd);
+
+ // string is fine here, the underlying type accepts string AND list under the same name...
+ ret.setString("blocks", blockName.trim());
+
+ if (propertyStart != -1) {
+ // unlike DFU, set the fromIndex so that on malformed data we do not IOOBE
+ final int propertyEnd = value.indexOf(']', propertyStart + 1);
+ if (propertyEnd != -1) {
+ final MapType state = type.createEmptyMap();
+ ret.setMap("state", state);
+
+ for (final String property : value.substring(propertyStart + 1, propertyEnd).split(",")) {
+ final int separatorIdx = property.indexOf('=');
+ if (separatorIdx == -1) {
+ continue;
+ }
+
+ final String propertyKey = property.substring(0, separatorIdx).trim();
+ final String propertyValue = property.substring(separatorIdx + 1);
+
+ state.setString(propertyKey, propertyValue);
+ }
+ }
+ }
+
+ if (nbtStart != -1) {
+ // unlike DFU, set the fromIndex so that on malformed data we do not IOOBE
+ final int nbtEnd = value.indexOf('}', nbtStart + 1);
+ if (nbtEnd != -1) {
+ // note: want to include { and }
+ ret.setString("nbt", value.substring(nbtStart, nbtEnd + 1));
+ }
+ }
+
+ return ret;
+ }
+
+ private static void convertBlockStatePredicates(final TransientItemStack item, final TypeUtil<?> type,
+ final String tagKey, final String componentKey,
+ final boolean hideInTooltip) {
+ final ListType blocks = item.tagRemoveListUnchecked(tagKey);
+ if (blocks == null) {
+ return;
+ }
+
+ final MapType blockPredicates = type.createEmptyMap();
+ item.componentSetMap(componentKey, blockPredicates);
+
+ if (hideInTooltip) {
+ blockPredicates.setBoolean("show_in_tooltip", false);
+ }
+
+ final ListType predicates = type.createEmptyList();
+ blockPredicates.setList("predicates", predicates);
+
+ for (int i = 0, len = blocks.size(); i < len; ++i) {
+ final Object block = blocks.getGeneric(i);
+ if (!(block instanceof String blockString)) {
+ // cannot type error here, if block is not a string then nothing in `blocks` is as they have the same type
+ predicates.addGeneric(block);
+ continue;
+ }
+
+ final MapType predicate = convertBlockStatePredicate(blockString, type);
+
+ predicates.addMap(predicate);
+ }
+ }
+
+ private static void convertAdventureMode(final TransientItemStack item, final TypeUtil<?> type, final int flags) {
+ convertBlockStatePredicates(
+ item, type, "CanDestroy", "minecraft:can_break",
+ (flags & TOOLTIP_FLAG_HIDE_CAN_DESTROY) != 0
+ );
+ convertBlockStatePredicates(
+ item, type, "CanPlaceOn", "minecraft:can_place_on",
+ (flags & TOOLTIP_FLAG_HIDE_CAN_PLACE) != 0
+ );
+ }
+
+ private static void copy(final MapType src, final String srcKey, final MapType dst, final String dstKey) {
+ if (src == null || dst == null) {
+ return;
+ }
+
+ final Object srcValue = src.getGeneric(srcKey);
+ if (srcValue != null) {
+ dst.setGeneric(dstKey, srcValue);
+ }
+ }
+
+ private static MapType convertAttribute(final Object inputGeneric, final TypeUtil<?> type) {
+ final MapType input = inputGeneric instanceof MapType casted ? (MapType)casted : null;
+
+ final MapType ret = type.createEmptyMap();
+ ret.setString("name", "");
+ ret.setDouble("amount", 0.0);
+ ret.setString("operation", "add_value");
+
+ copy(input, "AttributeName", ret, "type");
+ copy(input, "Slot", ret, "slot");
+ copy(input, "UUID", ret, "uuid");
+ copy(input, "Name", ret, "name");
+ copy(input, "Amount", ret, "amount");
+
+ // note: no type check on hasKey
+ if (input != null && input.hasKey("Operation")) {
+ final String operation;
+ switch (input.getInt("Operation", 0)) {
+ case 1: {
+ operation = "add_multiplied_base";
+ break;
+ }
+ case 2: {
+ operation = "add_multiplied_total";
+ break;
+ }
+ default: {
+ operation = "add_value";
+ break;
+ }
+ }
+ ret.setString("operation", operation);
+ }
+
+ return ret;
+ }
+
+ private static void convertAttributes(final TransientItemStack item, final TypeUtil<?> type, final int flags) {
+ final ListType attributes = item.tagRemoveListUnchecked("AttributeModifiers");
+ final ListType newAttributes = type.createEmptyList();
+
+ if (attributes != null) {
+ for (int i = 0, len = attributes.size(); i < len; ++i) {
+ newAttributes.addMap(convertAttribute(attributes.getGeneric(i), type));
+ }
+ }
+
+ if (newAttributes.size() > 0) {
+ final MapType newModifiers = type.createEmptyMap();
+ item.componentSetMap("minecraft:attribute_modifiers", newModifiers);
+
+ newModifiers.setList("modifiers", newAttributes);
+
+ final boolean hideModifiers = (flags & TOOLTIP_FLAG_HIDE_MODIFIERS) != 0;
+ if (hideModifiers) {
+ newModifiers.setBoolean("show_in_tooltip", false);
+ }
+ }
+ }
+
+ private static void convertMap(final TransientItemStack item, final TypeUtil<?> type) {
+ item.tagMigrateToComponent("map", "minecraft:map_id");
+
+ final ListType decorations = item.tagRemoveListUnchecked("Decorations");
+ if (decorations != null) {
+ final MapType newDecorations = type.createEmptyMap();
+
+ for (int i = 0, len = decorations.size(); i < len; ++i) {
+ final Object decorationGeneric = decorations.getGeneric(i);
+
+ final MapType decoration = decorationGeneric instanceof MapType casted ? (MapType)casted : null;
+
+ final String id = decoration == null ? "" : decoration.getString("id", "");
+ if (newDecorations.hasKey(id)) {
+ // note: never replace existing decorations by id
+ continue;
+ }
+
+ final int typeId = decoration == null ? 0 : decoration.getInt("type", 0);
+ final double x = decoration == null ? 0.0 : decoration.getDouble("x", 0.0);
+ final double z = decoration == null ? 0.0 : decoration.getDouble("z", 0.0);
+ final float rot = decoration == null ? 0.0f : (float)decoration.getDouble("rot", 0.0);
+
+ final MapType newDecoration = type.createEmptyMap();
+ newDecorations.setMap(id, newDecoration);
+
+ newDecoration.setString("type", convertMapDecorationId(typeId));
+ newDecoration.setDouble("x", x);
+ newDecoration.setDouble("z", z);
+ newDecoration.setFloat("rotation", rot);
+ }
+
+ if (!newDecorations.isEmpty()) {
+ item.componentSetMap("minecraft:map_decorations", newDecorations);
+ }
+ }
+ }
+
+ private static void convertPotion(final TransientItemStack item, final TypeUtil<?> type) {
+ final MapType potionContents = type.createEmptyMap();
+
+ final String potion = item.tagRemoveString("Potion");
+
+ if (potion != null && !"minecraft:empty".equals(potion)) {
+ potionContents.setString("potion", potion);
+ }
+
+ item.migrateTagTo("CustomPotionColor", potionContents, "custom_color");
+ item.migrateTagTo("custom_potion_effects", potionContents, "custom_effects");
+
+ if (!potionContents.isEmpty()) {
+ item.componentSetMap("minecraft:potion_contents", potionContents);
+ }
+ }
+
+ private static MapType makeFilteredText(final String raw, final String filtered, final TypeUtil<?> type) {
+ final MapType ret = type.createEmptyMap();
+
+ ret.setString("raw", raw);
+ if (filtered != null) {
+ ret.setString("filtered", filtered);
+ }
+
+ return ret;
+ }
+
+ private static ListType convertBookPages(final TransientItemStack item, final TypeUtil<?> type) {
+ final ListType oldPages = item.tagRemoveListUnchecked("pages");
+
+ final MapType filteredPages = item.tagRemoveMap("filtered_pages");
+
+ if (oldPages == null || oldPages.size() == 0) {
+ return null;
+ }
+
+ final ListType ret = type.createEmptyList();
+
+ for (int i = 0, len = oldPages.size(); i < len; ++i) {
+ final String page = oldPages.getGeneric(i) instanceof String str ? str : "";
+ final String filtered = filteredPages == null ? null : filteredPages.getString(Integer.toString(i));
+
+ ret.addMap(makeFilteredText(page, filtered, type));
+ }
+
+ return ret;
+ }
+
+ private static void convertWritableBook(final TransientItemStack item, final TypeUtil<?> type) {
+ final ListType pages = convertBookPages(item, type);
+ if (pages != null) {
+ final MapType bookContent = type.createEmptyMap();
+ item.componentSetMap("minecraft:writable_book_content", bookContent);
+
+ bookContent.setList("pages", pages);
+ }
+ }
+
+ private static void convertWrittenBook(final TransientItemStack item, final TypeUtil<?> type) {
+ final ListType pages = convertBookPages(item, type);
+
+ final MapType bookContent = type.createEmptyMap();
+ item.componentSetMap("minecraft:written_book_content", bookContent);
+ if (pages != null) {
+ bookContent.setList("pages", pages);
+ }
+
+ final String title = item.tagRemoveString("title", "");
+ final String filteredTitle = item.tagRemoveString("filtered_title");
+
+ bookContent.setMap("title", makeFilteredText(title, filteredTitle, type));
+
+ bookContent.setString("author", item.tagRemoveString("author", ""));
+ item.migrateTagTo("resolved", bookContent, "resolved");
+ item.migrateTagTo("generation", bookContent, "generation");
+ }
+
+ private static void convertMobBucket(final TransientItemStack item, final TypeUtil<?> type) {
+ final MapType bucketEntityData = type.createEmptyMap();
+
+ for (final String oldKey : BUCKETED_MOB_TAGS) {
+ item.migrateTagTo(oldKey, bucketEntityData, oldKey);
+ }
+
+ if (!bucketEntityData.isEmpty()) {
+ item.componentSetMap("minecraft:bucket_entity_data", bucketEntityData);
+ }
+ }
+
+ private static void convertCompass(final TransientItemStack item, final TypeUtil<?> type) {
+ final Object lodestonePos = item.tagRemoveGeneric("LodestonePos");
+ final Object lodestoneDim = item.tagRemoveGeneric("LodestoneDimension");
+
+ if (lodestonePos == null && lodestoneDim == null) {
+ return;
+ }
+
+ final MapType lodestoneTracker = type.createEmptyMap();
+ item.componentSetMap("minecraft:lodestone_tracker", lodestoneTracker);
+
+ if (lodestonePos != null && lodestoneDim != null) {
+ final MapType target = type.createEmptyMap();
+ lodestoneTracker.setMap("target", target);
+
+ target.setGeneric("pos", lodestonePos);
+ target.setGeneric("dimension", lodestoneDim);
+ }
+
+ final boolean tracked = item.tagRemoveBoolean("LodestoneTracked", true);
+ if (!tracked) {
+ lodestoneTracker.setBoolean("tracked", false);
+ }
+ }
+
+ private static void convertFireworkExplosion(final Object inputGeneric) {
+ if (!(inputGeneric instanceof MapType)) {
+ return;
+ }
+
+ final MapType input = (MapType)inputGeneric;
+
+ RenameHelper.renameSingle(input, "Colors", "colors");
+ RenameHelper.renameSingle(input, "FadeColors", "fade_colors");
+ RenameHelper.renameSingle(input, "Trail", "has_trail");
+ RenameHelper.renameSingle(input, "Flicker", "has_twinkle");
+
+ final int type = input.getInt("Type", 0);
+ input.remove("Type");
+
+ final String newType;
+ switch (type) {
+ case 1: {
+ newType = "large_ball";
+ break;
+ }
+ case 2: {
+ newType = "star";
+ break;
+ }
+ case 3: {
+ newType = "creeper";
+ break;
+ }
+ case 4: {
+ newType = "burst";
+ break;
+ }
+ default: {
+ newType = "small_ball";
+ break;
+ }
+ }
+
+ input.setString("shape", newType);
+ }
+
+ private static void convertFireworkRocket(final TransientItemStack item, final TypeUtil<?> type) {
+ // adhere to fixSubTag(true) behavior
+ final Object fireworksGeneric = item.tag.getGeneric("Fireworks");
+ if (fireworksGeneric == null) {
+ return;
+ }
+
+ if (!(fireworksGeneric instanceof MapType)) {
+ final MapType newFireworks = type.createEmptyMap();
+ item.componentSetMap("minecraft:fireworks", newFireworks);
+
+ newFireworks.setList("explosions", type.createEmptyList());
+ newFireworks.setByte("flight_duration", (byte)0);
+
+ return;
+ }
+
+ final MapType fireworks = (MapType)fireworksGeneric;
+
+ final MapType newFireworks = type.createEmptyMap();
+ item.componentSetMap("minecraft:fireworks", newFireworks);
+
+ final int flight = fireworks.getInt("Flight", 0);
+ newFireworks.setByte("flight_duration", (byte)flight);
+
+ final ListType explosions = fireworks.getListUnchecked("Explosions", type.createEmptyList());
+ newFireworks.setList("explosions", explosions);
+
+ for (int i = 0, len = explosions.size(); i < len; ++i) {
+ convertFireworkExplosion(explosions.getGeneric(i));
+ }
+
+ fireworks.remove("Explosions");
+ fireworks.remove("Flight");
+ if (fireworks.isEmpty()) {
+ item.tag.remove("Fireworks");
+ }
+ }
+
+ private static Object copyGeneric(final Object value, final TypeUtil<?> type) {
+ if (value == null || value instanceof Number || value instanceof String) {
+ return value;
+ }
+ if (value instanceof MapType mapType) {
+ return mapType.copy();
+ }
+ if (value instanceof ListType listType) {
+ return listType.copy();
+ }
+ // rest of the cases can take the slow path
+
+ final ListType dummy = type.createEmptyList();
+ dummy.addGeneric(value);
+
+ return dummy.copy().getGeneric(0);
+ }
+
+ private static void convertFireworkStar(final TransientItemStack item, final TypeUtil<?> type) {
+ // note: adhere to fixSubTag(true) behavior
+ final Object explosionGeneric = item.tag.getGeneric("Explosion");
+ if (explosionGeneric == null) {
+ return;
+ }
+
+ if (!(explosionGeneric instanceof MapType)) {
+ // important that we copy the generic value when not moving it
+ item.componentSetGeneric("minecraft:firework_explosion", copyGeneric(explosionGeneric, type));
+ return;
+ }
+
+ final MapType explosion = (MapType)explosionGeneric;
+
+ final MapType explosionCopy = explosion.copy();
+ item.componentSetGeneric("minecraft:firework_explosion", explosionCopy);
+ convertFireworkExplosion(explosionCopy);
+
+ explosion.remove("Type");
+ explosion.remove("Colors");
+ explosion.remove("FadeColors");
+ explosion.remove("Trail");
+ explosion.remove("Flicker");
+
+ if (explosion.isEmpty()) {
+ item.tag.remove("Explosion");
+ }
+ }
+
+ private static boolean isValidPlayerName(final String name) {
+ if (name.length() > 16) {
+ return false;
+ }
+
+ for (int i = 0, len = name.length(); i < len; ++i) {
+ final char character = name.charAt(i);
+ if (character <= 0x20 || character >= 0x7F) { // printable ascii
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private static ListType convertProperties(final MapType properties, final TypeUtil<?> type) {
+ final ListType ret = type.createEmptyList();
+
+ for (final String propertyKey : properties.keys()) {
+ final ListType propertyValues = properties.getListUnchecked(propertyKey);
+
+ if (propertyValues == null) {
+ continue;
+ }
+
+ for (int i = 0, len = propertyValues.size(); i < len; ++i) {
+ final MapType property = propertyValues.getGeneric(i) instanceof MapType casted ? (MapType)casted : null;
+
+ final String value = property == null ? "" : property.getString("Value", "");
+ final String signature = property == null ? null : property.getString("Signature");
+
+ final MapType newProperty = type.createEmptyMap();
+ ret.addMap(newProperty);
+
+ newProperty.setString("name", propertyKey);
+ newProperty.setString("value", value);
+ if (signature != null) {
+ newProperty.setString("signature", signature);
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ public static MapType convertProfile(final Object inputGeneric, final TypeUtil<?> type) {
+ final MapType ret = type.createEmptyMap();
+
+ if (inputGeneric instanceof String name) {
+ if (!isValidPlayerName(name)) {
+ return ret;
+ }
+
+ ret.setString("name", name);
+
+ return ret;
+ }
+
+ final MapType input = inputGeneric instanceof MapType casted ? (MapType)casted : null;
+
+ final String name = input == null ? "" : input.getString("Name", "");
+
+ if (isValidPlayerName(name)) {
+ ret.setString("name", name);
+ }
+
+ final Object id = input == null ? null : input.getGeneric("Id");
+
+ if (id != null) {
+ ret.setGeneric("id", id);
+ }
+
+ final MapType properties = input == null ? null : input.getMap("Properties");
+ if (properties != null && !properties.isEmpty()) {
+ ret.setList("properties", convertProperties(properties, type));
+ }
+
+ return ret;
+ }
+
+ private static void convertSukll(final TransientItemStack item, final TypeUtil<?> type) {
+ final Object skullOwnerGeneric = item.tagRemoveGeneric("SkullOwner");
+ if (skullOwnerGeneric == null) {
+ return;
+ }
+
+ item.componentSetMap("minecraft:profile", convertProfile(skullOwnerGeneric, type));
+ }
+
+ // input is unmodified
+ public static MapType convertItem(final MapType input) {
+ if (!input.hasKey("id", ObjectType.STRING) || !input.hasKey("Count", ObjectType.NUMBER)) {
+ return input.copy();
+ }
+
+ final TypeUtil<?> type = input.getTypeUtil();
+
+ final TransientItemStack item = new TransientItemStack(input);
+
+ item.tagMigrateToComponent("Damage", "minecraft:damage", 0);
+ item.tagMigrateToComponent("RepairCost", "minecraft:repair_cost", 0);
+ item.tagMigrateToComponent("CustomModelData", "minecraft:custom_model_data");
+
+ final MapType blockStateProperties = item.tagRemoveMap("BlockStateTag");
+ if (blockStateProperties != null) {
+ item.componentSetMap("minecraft:block_state", blockStateProperties);
+ convertBlockStateProperties(blockStateProperties);
+ }
+
+ item.tagMigrateToComponent("EntityTag", "minecraft:entity_data");
+
+ final MapType tileEntityTag = item.tagRemoveMap("BlockEntityTag");
+ if (tileEntityTag != null) {
+ convertTileEntity(tileEntityTag, item);
+
+ if (tileEntityTag.size() > 1 || (tileEntityTag.size() == 1 && !tileEntityTag.hasKey("id"))) {
+ item.componentSetMap("minecraft:block_entity_data", tileEntityTag);
+ }
+ }
+
+ final int flags = item.tagRemoveInt("HideFlags", 0);
+
+ if (item.tagRemoveInt("Unbreakable", 0) != 0) {
+ final MapType unbreakable = type.createEmptyMap();
+ item.componentSetMap("minecraft:unbreakable", unbreakable);
+ if ((flags & TOOLTIP_FLAG_HIDE_UNBREAKABLE) != 0) {
+ unbreakable.setBoolean("show_in_tooltip", false);
+ }
+ }
+
+ convertEnchantments(
+ item, type, "Enchantments", "minecraft:enchantments",
+ (flags & TOOLTIP_FLAG_HIDE_ENCHANTMENTS) != 0
+ );
+
+ convertDisplay(item, type, flags);
+ convertAdventureMode(item, type, flags);
+ convertAttributes(item, type, flags);
+
+ final Object trim = item.tagRemoveGeneric("Trim");
+ if (trim != null) {
+ // note: DFU set does nothing if not map
+ if ((flags & TOOLTIP_FLAG_HIDE_UPGRADES) != 0 && trim instanceof MapType) {
+ ((MapType)trim).setBoolean("show_in_tooltip", false);
+ }
+
+ item.componentSetGeneric("minecraft:trim", trim);
+ }
+
+ if ((flags & TOOLTIP_FLAG_HIDE_ADDITIONAL) != 0) {
+ item.componentSetMap("minecraft:hide_additional_tooltip", type.createEmptyMap());
+ }
+
+ switch (item.id) {
+ case "minecraft:enchanted_book": {
+ convertEnchantments(
+ item, type, "StoredEnchantments", "minecraft:stored_enchantments",
+ (flags & TOOLTIP_FLAG_HIDE_ADDITIONAL) != 0
+ );
+ break;
+ }
+ case "minecraft:crossbow": {
+ item.tagRemoveGeneric("Charged");
+ item.tagMigrateNonEmptyListToComponent("ChargedProjectiles", "minecraft:charged_projectiles");
+ break;
+ }
+ case "minecraft:bundle": {
+ item.tagMigrateNonEmptyListToComponent("Items", "minecraft:bundle_contents");
+ break;
+ }
+ case "minecraft:filled_map": {
+ convertMap(item, type);
+ break;
+ }
+ case "minecraft:potion":
+ case "minecraft:splash_potion":
+ case "minecraft:lingering_potion":
+ case "minecraft:tipped_arrow": {
+ convertPotion(item, type);
+ break;
+ }
+ case "minecraft:writable_book": {
+ convertWritableBook(item, type);
+ break;
+ }
+ case "minecraft:written_book": {
+ convertWrittenBook(item, type);
+ break;
+ }
+ case "minecraft:suspicious_stew": {
+ item.tagMigrateToComponent("effects", "minecraft:suspicious_stew_effects");
+ break;
+ }
+ case "minecraft:debug_stick": {
+ item.tagMigrateToComponent("DebugProperty", "minecraft:debug_stick_state");
+ break;
+ }
+ case "minecraft:pufferfish_bucket":
+ case "minecraft:salmon_bucket":
+ case "minecraft:cod_bucket":
+ case "minecraft:tropical_fish_bucket":
+ case "minecraft:axolotl_bucket":
+ case "minecraft:tadpole_bucket": {
+ convertMobBucket(item, type);
+ break;
+ }
+ case "minecraft:goat_horn": {
+ item.tagMigrateToComponent("instrument", "minecraft:instrument");
+ break;
+ }
+ case "minecraft:knowledge_book": {
+ item.tagMigrateToComponent("Recipes", "minecraft:recipes");
+ break;
+ }
+ case "minecraft:compass": {
+ convertCompass(item, type);
+ break;
+ }
+ case "minecraft:firework_rocket": {
+ convertFireworkRocket(item, type);
+ break;
+ }
+ case "minecraft:firework_star": {
+ convertFireworkStar(item, type);
+ break;
+ }
+ case "minecraft:player_head": {
+ convertSukll(item, type);
+ break;
+ }
+ }
+
+ return item.serialize();
+ }
+
+ private ConverterItemStackToDataComponents() {}
+
+ private static final class TransientItemStack {
+
+ private final String id;
+ private final int count;
+
+ private final MapType components;
+ private final MapType tag;
+ private final MapType root;
+
+ public TransientItemStack(final MapType root) {
+ this.id = root.getString("id");
+ this.count = root.getInt("Count");
+
+ final TypeUtil<?> type = root.getTypeUtil();
+
+ this.components = type.createEmptyMap();
+
+ final MapType rootCopy = root.copy();
+
+ final MapType tag = rootCopy.getMap("tag");
+
+ rootCopy.remove("id");
+ rootCopy.remove("Count");
+ rootCopy.remove("tag");
+
+ this.tag = tag == null ? type.createEmptyMap() : tag;
+
+ this.root = rootCopy;
+ }
+
+ public void migrateTagTo(final String tagKey, final MapType dst, final String dstKey) {
+ final Object value = this.tag.getGeneric(tagKey);
+
+ if (value != null) {
+ this.tag.remove(tagKey);
+
+ dst.setGeneric(dstKey, value);
+ }
+ }
+
+ public String tagRemoveString(final String key) {
+ final String ret = this.tag.getString(key);
+
+ this.tag.remove(key);
+
+ return ret;
+ }
+
+ public String tagRemoveString(final String key, final String dfl) {
+ final String ret = this.tag.getString(key, dfl);
+
+ this.tag.remove(key);
+
+ return ret;
+ }
+
+ public ListType tagRemoveListUnchecked(final String key) {
+ final ListType ret = this.tag.getListUnchecked(key);
+
+ this.tag.remove(key);
+
+ return ret;
+ }
+
+ public ListType tagRemoveList(final String key, final ObjectType listType) {
+ final ListType ret = this.tag.getList(key, listType);
+
+ this.tag.remove(key);
+
+ return ret;
+ }
+
+ public MapType tagRemoveMap(final String key) {
+ final MapType ret = this.tag.getMap(key);
+
+ this.tag.remove(key);
+
+ return ret;
+ }
+
+ public boolean tagRemoveBoolean(final String key, final boolean dfl) {
+ final boolean ret = this.tag.getBoolean(key, dfl);
+
+ this.tag.remove(key);
+
+ return ret;
+ }
+
+ public int tagRemoveInt(final String key, final int dfl) {
+ final int ret = this.tag.getInt(key, dfl);
+
+ this.tag.remove(key);
+
+ return ret;
+ }
+
+ public Object tagRemoveGeneric(final String key) {
+ final Object ret = this.tag.getGeneric(key);
+
+ if (ret != null) {
+ this.tag.remove(key);
+ return ret;
+ }
+
+ return ret;
+ }
+
+ public void tagMigrateToComponent(final String tagKey, final String componentKey) {
+ final Object value = this.tag.getGeneric(tagKey);
+ if (value != null) {
+ this.tag.remove(tagKey);
+
+ this.components.setGeneric(componentKey, value);
+ }
+ }
+
+ public void tagMigrateNonEmptyListToComponent(final String tagKey, final String componentKey) {
+ final Object value = this.tag.getGeneric(tagKey);
+ if (value != null) {
+ this.tag.remove(tagKey);
+
+ if (!(value instanceof ListType list) || list.size() > 0) {
+ this.components.setGeneric(componentKey, value);
+ }
+ }
+ }
+
+ public void tagMigrateToComponent(final String tagKey, final String componentKey, final int defaultComponent) {
+ final int value = this.tag.getInt(tagKey, defaultComponent);
+ this.tag.remove(tagKey);
+
+ if (value != defaultComponent) {
+ this.components.setGeneric(componentKey, value);
+ }
+ }
+
+ public void componentSetBoolean(final String key, final boolean value) {
+ this.components.setBoolean(key, value);
+ }
+
+ public void componentSetString(final String key, final String value) {
+ this.components.setString(key, value);
+ }
+
+ public void componentSetList(final String key, final ListType value) {
+ this.components.setList(key, value);
+ }
+
+ public void componentSetMap(final String key, final MapType value) {
+ this.components.setMap(key, value);
+ }
+
+ public void componentSetGeneric(final String key, final Object value) {
+ this.components.setGeneric(key, value);
+ }
+
+ public MapType serialize() {
+ final MapType ret = this.components.getTypeUtil().createEmptyMap();
+
+ ret.setString("id", this.id);
+ ret.setInt("count", this.count);
+ if (!this.tag.isEmpty()) {
+ this.components.setMap("minecraft:custom_data", this.tag);
+ }
+
+ if (!this.components.isEmpty()) {
+ ret.setMap("components", this.components);
+ }
+
+ // merge root to ret, with entries in ret taking priority
+ if (!this.root.isEmpty()) {
+ for (final String key : this.root.keys()) {
+ if (ret.hasKey(key)) {
+ continue;
+ }
+
+ ret.setGeneric(key, this.root.getGeneric(key));
+ }
+ }
+
+ return ret;
+ }
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/leveldat/ConverterRemoveFeatureFlag.java b/ca/spottedleaf/dataconverter/minecraft/converters/leveldat/ConverterRemoveFeatureFlag.java
new file mode 100644
index 0000000000000000000000000000000000000000..d47f922b2dd1a92be1d128df16a81983eddc2ac2
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/leveldat/ConverterRemoveFeatureFlag.java
@@ -0,0 +1,46 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.leveldat;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import java.util.Set;
+
+public final class ConverterRemoveFeatureFlag extends DataConverter<MapType, MapType> {
+
+ private final Set<String> flags;
+
+ public ConverterRemoveFeatureFlag(final int toVersion, final Set<String> flags) {
+ this(toVersion, 0, flags);
+ }
+
+ public ConverterRemoveFeatureFlag(final int toVersion, final int versionStep, final Set<String> flags) {
+ super(toVersion, versionStep);
+ this.flags = flags;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType enabledFeatures = data.getList("enabled_features", ObjectType.STRING);
+ if (enabledFeatures == null) {
+ return null;
+ }
+
+ ListType removedFeatures = null;
+
+ for (int i = 0; i < enabledFeatures.size(); ++i) {
+ final String flag = enabledFeatures.getString(i);
+ if (!this.flags.contains(flag)) {
+ continue;
+ }
+ enabledFeatures.remove(i--);
+
+ if (removedFeatures == null) {
+ removedFeatures = data.getOrCreateList("removed_features", ObjectType.STRING);
+ }
+ removedFeatures.addString(flag);
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/options/ConverterAbstractOptionsRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/options/ConverterAbstractOptionsRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b6341eb7cd843749f377684c14cbb81043660bc
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/options/ConverterAbstractOptionsRename.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.options;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.ArrayList;
+import java.util.function.Function;
+
+public final class ConverterAbstractOptionsRename {
+
+ private ConverterAbstractOptionsRename() {}
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameKeys(data, renamer);
+ return null;
+ }
+ });
+ }
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/particle/ConverterParticleToNBT.java b/ca/spottedleaf/dataconverter/minecraft/converters/particle/ConverterParticleToNBT.java
new file mode 100644
index 0000000000000000000000000000000000000000..e02fac460178e5aef15f330de88253c019e492b6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/particle/ConverterParticleToNBT.java
@@ -0,0 +1,270 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.particle;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import ca.spottedleaf.dataconverter.types.nbt.NBTMapType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import com.mojang.brigadier.StringReader;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.logging.LogUtils;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.TagParser;
+import net.minecraft.util.Mth;
+import org.slf4j.Logger;
+
+public final class ConverterParticleToNBT {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static CompoundTag parseNBT(final String flat) {
+ try {
+ return TagParser.parseCompoundFully(flat);
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse nbt: " + flat, ex);
+ return null;
+ }
+ }
+
+ private static void convertItem(final MapType nbt, final String data) {
+ final MapType itemNBT = nbt.getTypeUtil().createEmptyMap();
+ nbt.setMap("item", itemNBT);
+ itemNBT.setInt("Count", 1);
+
+ final int nbtStart = data.indexOf('{');
+ if (nbtStart == -1) {
+ // assume data is item name
+ itemNBT.setString("id", NamespaceUtil.correctNamespace(data));
+ return;
+ }
+ // itemname{tagNBT}
+ itemNBT.setString("id", NamespaceUtil.correctNamespace(data.substring(0, nbtStart)));
+
+ final CompoundTag tag = parseNBT(data.substring(nbtStart));
+ if (tag != null) {
+ // do we need to worry about type conversion?
+ itemNBT.setMap("tag", new NBTMapType(tag));
+ }
+ }
+
+ private static MapType parseProperties(final String input, final TypeUtil<?> type) {
+ final MapType ret = type.createEmptyMap();
+ try {
+ // format: [p1=v1, p2=v2, p3=v3, ...]
+ final StringReader reader = new StringReader(input);
+
+ reader.expect('[');
+ reader.skipWhitespace();
+
+ if (reader.canRead() && reader.peek() != ']') {
+ while (reader.canRead()) {
+ final String property = reader.readString();
+
+ reader.skipWhitespace();
+ reader.expect('=');
+ reader.skipWhitespace();
+
+ final String value = reader.readString();
+ ret.setString(property, value);
+
+ reader.skipWhitespace();
+ if (reader.canRead()) {
+ if (reader.peek() != ',') {
+ // invalid character or ']'
+ break;
+ }
+
+ // skip ',' and move onto next entry
+ reader.skip();
+ }
+
+ reader.skipWhitespace();
+ }
+ }
+
+ reader.expect(']');
+ return ret;
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse block properties: " + input, ex);
+ return null;
+ }
+ }
+
+ private static void convertBlock(final MapType nbt, final String data) {
+ final MapType blockNBT = nbt.getTypeUtil().createEmptyMap();
+ nbt.setMap("block_state", blockNBT);
+
+ final int propertiesStart = data.indexOf('[');
+ if (propertiesStart == -1) {
+ // assume data is id
+ blockNBT.setString("Name", NamespaceUtil.correctNamespace(data));
+ return;
+ }
+ blockNBT.setString("Name", NamespaceUtil.correctNamespace(data.substring(0, propertiesStart)));
+
+ // blockname{properties}
+ final MapType properties = parseProperties(data.substring(propertiesStart), nbt.getTypeUtil());
+ if (properties != null && !properties.isEmpty()) {
+ blockNBT.setMap("Properties", properties);
+ }
+ }
+
+ private static ListType parseFloatVector(final StringReader reader, final TypeUtil<?> type) throws CommandSyntaxException {
+ final float x = reader.readFloat();
+
+ reader.expect(' ');
+ final float y = reader.readFloat();
+
+ reader.expect(' ');
+ final float z = reader.readFloat();
+
+ final ListType ret = type.createEmptyList();
+ ret.addFloat(x);
+ ret.addFloat(y);
+ ret.addFloat(z);
+
+ return ret;
+ }
+
+ private static void convertDust(final MapType nbt, final String data) {
+ try {
+ final StringReader reader = new StringReader(data);
+
+ final ListType color = parseFloatVector(reader, nbt.getTypeUtil());
+
+ reader.expect(' ');
+ final float scale = reader.readFloat();
+
+ nbt.setList("color", color);
+ nbt.setFloat("scale", scale);
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse dust particle: " + data, ex);
+ }
+ }
+
+ private static void convertColorDust(final MapType nbt, final String data) {
+ try {
+ final StringReader reader = new StringReader(data);
+
+ final ListType fromColor = parseFloatVector(reader, nbt.getTypeUtil());
+
+ reader.expect(' ');
+ final float scale = reader.readFloat();
+
+ reader.expect(' ');
+ final ListType toColor = parseFloatVector(reader, nbt.getTypeUtil());
+
+ nbt.setList("from_color", fromColor);
+ nbt.setFloat("scale", scale);
+ nbt.setList("to_color", toColor);
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse color transition dust particle: " + data, ex);
+ }
+ }
+
+ private static void convertSculk(final MapType nbt, final String data) {
+ try {
+ final StringReader reader = new StringReader(data);
+
+ final float roll = reader.readFloat();
+
+ nbt.setFloat("roll", roll);
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse sculk particle: " + data, ex);
+ }
+ }
+
+ private static void convertVibration(final MapType nbt, final String data) {
+ try {
+ final StringReader reader = new StringReader(data);
+
+ final double posX = reader.readDouble();
+
+ reader.expect(' ');
+ final double posY = reader.readDouble();
+
+ reader.expect(' ');
+ final double posZ = reader.readDouble();
+
+ reader.expect(' ');
+ final int arrival = reader.readInt();
+
+ nbt.setInt("arrival_in_ticks", arrival);
+
+ final MapType destination = nbt.getTypeUtil().createEmptyMap();
+ nbt.setMap("destination", destination);
+
+ destination.setString("type", "minecraft:block");
+
+ final ListType pos = nbt.getTypeUtil().createEmptyList();
+ destination.setList("pos", pos);
+
+ pos.addInt(Mth.floor(posX));
+ pos.addInt(Mth.floor(posY));
+ pos.addInt(Mth.floor(posZ));
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse vibration particle: " + data, ex);
+ }
+ }
+
+ private static void convertShriek(final MapType nbt, final String data) {
+ try {
+ final StringReader reader = new StringReader(data);
+
+ final int delay = reader.readInt();
+
+ nbt.setInt("delay", delay);
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse shriek particle: " + data, ex);
+ }
+ }
+
+ public static MapType convert(final String flat, final TypeUtil<?> type) {
+ final String[] split = flat.split(" ", 2);
+ final String name = NamespaceUtil.correctNamespace(split[0]);
+
+ final MapType ret = type.createEmptyMap();
+ ret.setString("type", name);
+
+ if (split.length > 1) {
+ final String data = split[1];
+ switch (name) {
+ case "minecraft:item": {
+ convertItem(ret, data);
+ break;
+ }
+ case "minecraft:block":
+ case "minecraft:block_marker":
+ case "minecraft:falling_dust":
+ case "minecraft:dust_pillar": {
+ convertBlock(ret, data);
+ break;
+ }
+ case "minecraft:dust": {
+ convertDust(ret, data);
+ break;
+ }
+ case "minecraft:dust_color_transition": {
+ convertColorDust(ret, data);
+ break;
+ }
+ case "minecraft:sculk_charge": {
+ convertSculk(ret, data);
+ break;
+ }
+ case "minecraft:vibration": {
+ convertVibration(ret, data);
+ break;
+ }
+ case "minecraft:shriek": {
+ convertShriek(ret, data);
+ break;
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ private ConverterParticleToNBT() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterAbstractPOIRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterAbstractPOIRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..cdd60c91796691b79e4848a5565616351474f453
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterAbstractPOIRename.java
@@ -0,0 +1,53 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.poi;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import java.util.function.Function;
+
+public final class ConverterAbstractPOIRename {
+
+ private ConverterAbstractPOIRename() {}
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ MCTypeRegistry.POI_CHUNK.addStructureConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType sections = data.getMap("Sections");
+ if (sections == null) {
+ return null;
+ }
+
+ for (final String key : sections.keys()) {
+ final MapType section = sections.getMap(key);
+
+ final ListType records = section.getList("Records", ObjectType.MAP);
+
+ if (records == null) {
+ continue;
+ }
+
+ for (int i = 0, len = records.size(); i < len; ++i) {
+ final MapType record = records.getMap(i);
+
+ final String type = record.getString("type");
+ if (type != null) {
+ final String converted = renamer.apply(type);
+ if (converted != null) {
+ record.setString("type", converted);
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterPoiDelete.java b/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterPoiDelete.java
new file mode 100644
index 0000000000000000000000000000000000000000..c61537e7ebef1c48d65a302ab174ef41847560a8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterPoiDelete.java
@@ -0,0 +1,53 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.poi;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import java.util.function.Predicate;
+
+public final class ConverterPoiDelete extends DataConverter<MapType, MapType> {
+
+ private final Predicate<String> delete;
+
+ public ConverterPoiDelete(final int toVersion, final Predicate<String> delete) {
+ super(toVersion);
+ this.delete = delete;
+ }
+
+ public ConverterPoiDelete(final int toVersion, final int versionStep, final Predicate<String> delete) {
+ super(toVersion, versionStep);
+ this.delete = delete;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType sections = data.getMap("Sections");
+ if (sections == null) {
+ return null;
+ }
+
+ for (final String key : sections.keys()) {
+ final MapType section = sections.getMap(key);
+
+ final ListType records = section.getList("Records", ObjectType.MAP);
+
+ if (records == null) {
+ continue;
+ }
+
+ for (int i = 0; i < records.size();) {
+ final MapType record = records.getMap(i);
+
+ final String type = record.getString("type");
+ if (type != null && this.delete.test(type)) {
+ records.remove(i);
+ continue;
+ }
+ ++i;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/recipe/ConverterAbstractRecipeRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/recipe/ConverterAbstractRecipeRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f35cbbd78a629712f9ae3cd5d180269f015a11d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/recipe/ConverterAbstractRecipeRename.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.recipe;
+
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import java.util.function.Function;
+
+public final class ConverterAbstractRecipeRename {
+
+ private ConverterAbstractRecipeRename() {}
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ ConverterAbstractStringValueTypeRename.register(version, subVersion, MCTypeRegistry.RECIPE, renamer);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterAbstractStatsRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterAbstractStatsRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..2468ebedfabfb93f9b8d398d77e70d019b9a3dfa
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterAbstractStatsRename.java
@@ -0,0 +1,66 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.stats;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.ArrayList;
+import java.util.function.Function;
+
+public final class ConverterAbstractStatsRename {
+
+ private ConverterAbstractStatsRename() {}
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ MCTypeRegistry.OBJECTIVE.addStructureConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType criteriaType = data.getMap("CriteriaType");
+ if (criteriaType == null) {
+ return null;
+ }
+
+ final String type = criteriaType.getString("type");
+ if (!"minecraft:custom".equals(type)) {
+ return null;
+ }
+
+ final String id = criteriaType.getString("id");
+ if (id == null) {
+ return null;
+ }
+
+ final String rename = renamer.apply(id);
+ if (rename != null) {
+ criteriaType.setString("id", rename);
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.STATS.addStructureConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType stats = data.getMap("stats");
+
+ if (stats == null) {
+ return null;
+ }
+
+ final MapType custom = stats.getMap("minecraft:custom");
+ if (custom == null) {
+ return null;
+ }
+
+ RenameHelper.renameKeys(custom, renamer);
+
+ return null;
+ }
+ });
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterFlattenStats.java b/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterFlattenStats.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8a5d9e4d8fb0f1b3c2fed900fa1d52e2d25f5ec
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterFlattenStats.java
@@ -0,0 +1,321 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.stats;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterFlattenItemStack;
+import ca.spottedleaf.dataconverter.minecraft.versions.V1451;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import org.apache.commons.lang3.StringUtils;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public final class ConverterFlattenStats {
+
+ private static final int VERSION = MCVersions.V17W47A;
+ private static final int VERSION_STEP = 6;
+
+ private static final Set<String> SPECIAL_OBJECTIVE_CRITERIA = new HashSet<>(
+ Set.of(
+ "dummy",
+ "trigger",
+ "deathCount",
+ "playerKillCount",
+ "totalKillCount",
+ "health",
+ "food",
+ "air",
+ "armor",
+ "xp",
+ "level",
+ "killedByTeam.aqua",
+ "killedByTeam.black",
+ "killedByTeam.blue",
+ "killedByTeam.dark_aqua",
+ "killedByTeam.dark_blue",
+ "killedByTeam.dark_gray",
+ "killedByTeam.dark_green",
+ "killedByTeam.dark_purple",
+ "killedByTeam.dark_red",
+ "killedByTeam.gold",
+ "killedByTeam.gray",
+ "killedByTeam.green",
+ "killedByTeam.light_purple",
+ "killedByTeam.red",
+ "killedByTeam.white",
+ "killedByTeam.yellow",
+ "teamkill.aqua",
+ "teamkill.black",
+ "teamkill.blue",
+ "teamkill.dark_aqua",
+ "teamkill.dark_blue",
+ "teamkill.dark_gray",
+ "teamkill.dark_green",
+ "teamkill.dark_purple",
+ "teamkill.dark_red",
+ "teamkill.gold",
+ "teamkill.gray",
+ "teamkill.green",
+ "teamkill.light_purple",
+ "teamkill.red",
+ "teamkill.white",
+ "teamkill.yellow"
+ )
+ );
+
+ private static final Set<String> SKIP = new HashSet<>(
+ ImmutableSet.<String>builder()
+ .add("stat.craftItem.minecraft.spawn_egg")
+ .add("stat.useItem.minecraft.spawn_egg")
+ .add("stat.breakItem.minecraft.spawn_egg")
+ .add("stat.pickup.minecraft.spawn_egg")
+ .add("stat.drop.minecraft.spawn_egg")
+ .build()
+ );
+
+ private static final Map<String, String> CUSTOM_MAP = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("stat.leaveGame", "minecraft:leave_game")
+ .put("stat.playOneMinute", "minecraft:play_one_minute")
+ .put("stat.timeSinceDeath", "minecraft:time_since_death")
+ .put("stat.sneakTime", "minecraft:sneak_time")
+ .put("stat.walkOneCm", "minecraft:walk_one_cm")
+ .put("stat.crouchOneCm", "minecraft:crouch_one_cm")
+ .put("stat.sprintOneCm", "minecraft:sprint_one_cm")
+ .put("stat.swimOneCm", "minecraft:swim_one_cm")
+ .put("stat.fallOneCm", "minecraft:fall_one_cm")
+ .put("stat.climbOneCm", "minecraft:climb_one_cm")
+ .put("stat.flyOneCm", "minecraft:fly_one_cm")
+ .put("stat.diveOneCm", "minecraft:dive_one_cm")
+ .put("stat.minecartOneCm", "minecraft:minecart_one_cm")
+ .put("stat.boatOneCm", "minecraft:boat_one_cm")
+ .put("stat.pigOneCm", "minecraft:pig_one_cm")
+ .put("stat.horseOneCm", "minecraft:horse_one_cm")
+ .put("stat.aviateOneCm", "minecraft:aviate_one_cm")
+ .put("stat.jump", "minecraft:jump")
+ .put("stat.drop", "minecraft:drop")
+ .put("stat.damageDealt", "minecraft:damage_dealt")
+ .put("stat.damageTaken", "minecraft:damage_taken")
+ .put("stat.deaths", "minecraft:deaths")
+ .put("stat.mobKills", "minecraft:mob_kills")
+ .put("stat.animalsBred", "minecraft:animals_bred")
+ .put("stat.playerKills", "minecraft:player_kills")
+ .put("stat.fishCaught", "minecraft:fish_caught")
+ .put("stat.talkedToVillager", "minecraft:talked_to_villager")
+ .put("stat.tradedWithVillager", "minecraft:traded_with_villager")
+ .put("stat.cakeSlicesEaten", "minecraft:eat_cake_slice")
+ .put("stat.cauldronFilled", "minecraft:fill_cauldron")
+ .put("stat.cauldronUsed", "minecraft:use_cauldron")
+ .put("stat.armorCleaned", "minecraft:clean_armor")
+ .put("stat.bannerCleaned", "minecraft:clean_banner")
+ .put("stat.brewingstandInteraction", "minecraft:interact_with_brewingstand")
+ .put("stat.beaconInteraction", "minecraft:interact_with_beacon")
+ .put("stat.dropperInspected", "minecraft:inspect_dropper")
+ .put("stat.hopperInspected", "minecraft:inspect_hopper")
+ .put("stat.dispenserInspected", "minecraft:inspect_dispenser")
+ .put("stat.noteblockPlayed", "minecraft:play_noteblock")
+ .put("stat.noteblockTuned", "minecraft:tune_noteblock")
+ .put("stat.flowerPotted", "minecraft:pot_flower")
+ .put("stat.trappedChestTriggered", "minecraft:trigger_trapped_chest")
+ .put("stat.enderchestOpened", "minecraft:open_enderchest")
+ .put("stat.itemEnchanted", "minecraft:enchant_item")
+ .put("stat.recordPlayed", "minecraft:play_record")
+ .put("stat.furnaceInteraction", "minecraft:interact_with_furnace")
+ .put("stat.craftingTableInteraction", "minecraft:interact_with_crafting_table")
+ .put("stat.chestOpened", "minecraft:open_chest")
+ .put("stat.sleepInBed", "minecraft:sleep_in_bed")
+ .put("stat.shulkerBoxOpened", "minecraft:open_shulker_box")
+ .build()
+ );
+
+ private static final String BLOCK_KEY = "stat.mineBlock";
+ private static final String NEW_BLOCK_KEY = "minecraft:mined";
+
+ private static final Map<String, String> ITEM_KEYS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("stat.craftItem", "minecraft:crafted")
+ .put("stat.useItem", "minecraft:used")
+ .put("stat.breakItem", "minecraft:broken")
+ .put("stat.pickup", "minecraft:picked_up")
+ .put("stat.drop", "minecraft:dropped")
+ .build()
+ );
+
+ private static final Map<String, String> ENTITY_KEYS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("stat.entityKilledBy", "minecraft:killed_by")
+ .put("stat.killEntity", "minecraft:killed")
+ .build()
+ );
+
+ private static final Map<String, String> ENTITIES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("Bat", "minecraft:bat")
+ .put("Blaze", "minecraft:blaze")
+ .put("CaveSpider", "minecraft:cave_spider")
+ .put("Chicken", "minecraft:chicken")
+ .put("Cow", "minecraft:cow")
+ .put("Creeper", "minecraft:creeper")
+ .put("Donkey", "minecraft:donkey")
+ .put("ElderGuardian", "minecraft:elder_guardian")
+ .put("Enderman", "minecraft:enderman")
+ .put("Endermite", "minecraft:endermite")
+ .put("EvocationIllager", "minecraft:evocation_illager")
+ .put("Ghast", "minecraft:ghast")
+ .put("Guardian", "minecraft:guardian")
+ .put("Horse", "minecraft:horse")
+ .put("Husk", "minecraft:husk")
+ .put("Llama", "minecraft:llama")
+ .put("LavaSlime", "minecraft:magma_cube")
+ .put("MushroomCow", "minecraft:mooshroom")
+ .put("Mule", "minecraft:mule")
+ .put("Ozelot", "minecraft:ocelot")
+ .put("Parrot", "minecraft:parrot")
+ .put("Pig", "minecraft:pig")
+ .put("PolarBear", "minecraft:polar_bear")
+ .put("Rabbit", "minecraft:rabbit")
+ .put("Sheep", "minecraft:sheep")
+ .put("Shulker", "minecraft:shulker")
+ .put("Silverfish", "minecraft:silverfish")
+ .put("SkeletonHorse", "minecraft:skeleton_horse")
+ .put("Skeleton", "minecraft:skeleton")
+ .put("Slime", "minecraft:slime")
+ .put("Spider", "minecraft:spider")
+ .put("Squid", "minecraft:squid")
+ .put("Stray", "minecraft:stray")
+ .put("Vex", "minecraft:vex")
+ .put("Villager", "minecraft:villager")
+ .put("VindicationIllager", "minecraft:vindication_illager")
+ .put("Witch", "minecraft:witch")
+ .put("WitherSkeleton", "minecraft:wither_skeleton")
+ .put("Wolf", "minecraft:wolf")
+ .put("ZombieHorse", "minecraft:zombie_horse")
+ .put("PigZombie", "minecraft:zombie_pigman")
+ .put("ZombieVillager", "minecraft:zombie_villager")
+ .put("Zombie", "minecraft:zombie")
+ .build()
+ );
+
+ private static final String NEW_CUSTOM_KEY = "minecraft:custom";
+
+ private ConverterFlattenStats() {}
+
+ private static String upgradeItem(final String itemName) {
+ return ConverterFlattenItemStack.flattenItem(itemName, 0);
+ }
+
+ private static String upgradeBlock(final String block) {
+ return HelperBlockFlatteningV1450.getNewBlockName(block);
+ }
+
+ private static record StatType(String category, String key) {}
+
+ private static StatType convertLegacyKey(final String key) {
+ if (SKIP.contains(key)) {
+ return null;
+ }
+
+ final String custom = CUSTOM_MAP.get(key);
+ if (custom != null) {
+ return new StatType(NEW_CUSTOM_KEY, custom);
+ }
+
+ final int i = StringUtils.ordinalIndexOf(key, ".", 2);
+ if (i < 0) {
+ return null;
+ }
+
+ final String stat = key.substring(0, i);
+
+ if (BLOCK_KEY.equals(stat)) {
+ return new StatType(NEW_BLOCK_KEY, upgradeBlock(key.substring(i + 1).replace('.', ':')));
+ }
+
+ final String itemStat = ITEM_KEYS.get(stat);
+
+ if (itemStat != null) {
+ final String itemId = key.substring(i + 1).replace('.', ':');
+ final String flattenedItem = upgradeItem(itemId);
+
+ return new StatType(itemStat, flattenedItem == null ? itemId : flattenedItem);
+ }
+
+ final String entityStat = ENTITY_KEYS.get(stat);
+ if (entityStat != null) {
+ final String entityId = key.substring(i + 1).replace('.', ':');
+
+ return new StatType(entityStat, ENTITIES.getOrDefault(entityId, entityId));
+ }
+
+ return null;
+ }
+
+ public static DataConverter<MapType, MapType> makeStatsConverter() {
+ return new DataConverter<>(VERSION, VERSION_STEP) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType stats = Types.NBT.createEmptyMap();
+
+ for (final String statKey : data.keys()) {
+ final Number value = data.getNumber(statKey);
+ if (value == null) {
+ continue;
+ }
+
+ final StatType converted = convertLegacyKey(statKey);
+
+ if (converted == null) {
+ continue;
+ }
+
+ stats.getOrCreateMap(converted.category()).setGeneric(converted.key(), value);
+ }
+
+ data.clear();
+ data.setMap("stats", stats);
+
+ return null;
+ }
+ };
+ }
+
+ public static DataConverter<MapType, MapType> makeObjectiveConverter() {
+ return new DataConverter<>(VERSION, VERSION_STEP) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertCriteriaName(data, "CriteriaName");
+
+ // We also need to update CriteriaType that is created by the data hook in V1451,
+ // otherwise that data hook will overwrite our CriteriaName
+ final MapType criteriaType = data.getMap("CriteriaType");
+ if (criteriaType != null) {
+ if ("_special".equals(criteriaType.getString("type"))) {
+ convertCriteriaName(criteriaType, "id");
+ }
+ }
+
+ return null;
+ }
+
+ private void convertCriteriaName(final MapType data, final String key) {
+ final String criteriaName = data.getString(key);
+
+ if (criteriaName == null) {
+ return;
+ }
+
+ if (SPECIAL_OBJECTIVE_CRITERIA.contains(criteriaName)) {
+ return;
+ }
+
+ final StatType converted = convertLegacyKey(criteriaName);
+ data.setString(key, converted == null ? "dummy" : V1451.packWithDot(converted.category()) + ":" + V1451.packWithDot(converted.key()));
+ }
+ };
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/tileentity/ConverterAbstractTileEntityRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/tileentity/ConverterAbstractTileEntityRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b82500851430bbe55669d83602931edbc2fa973
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/converters/tileentity/ConverterAbstractTileEntityRename.java
@@ -0,0 +1,34 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.tileentity;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.function.Function;
+
+public final class ConverterAbstractTileEntityRename {
+
+ public static void register(final int version, final Function<String, String> renamer) {
+ register(version, 0, renamer);
+ }
+
+ public static void register(final int version, final int subVersion, final Function<String, String> renamer) {
+ MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(version, subVersion) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+ if (id == null) {
+ return null;
+ }
+
+ final String converted = renamer.apply(id);
+
+ if (converted != null) {
+ data.setString("id", converted);
+ }
+
+ return null;
+ }
+ });
+ }
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java
new file mode 100644
index 0000000000000000000000000000000000000000..48f5e7950a27995f16787d4eaaa7dc10182a10c8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java
@@ -0,0 +1,132 @@
+package ca.spottedleaf.dataconverter.minecraft.datatypes;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataHook;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataType;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCVersionRegistry;
+import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DynamicDataType extends DataType<Object, Object> {
+
+ public final String name;
+
+ protected final ArrayList<DataConverter<Object, Object>> structureConverters = new ArrayList<>();
+ protected final Long2ObjectArraySortedMap<List<DataWalker<Object>>> structureWalkers = new Long2ObjectArraySortedMap<>();
+ protected final Long2ObjectArraySortedMap<List<DataHook<Object, Object>>> structureHooks = new Long2ObjectArraySortedMap<>();
+
+ public DynamicDataType(final String name) {
+ this.name = name;
+ }
+
+ public void addStructureConverter(final DataConverter<Object, Object> converter) {
+ MCVersionRegistry.checkVersion(converter.getEncodedVersion());
+ final boolean sort = !this.structureConverters.isEmpty()
+ && DataConverter.LOWEST_VERSION_COMPARATOR.compare(this.structureConverters.getLast(), converter) > 0;
+ this.structureConverters.add(converter);
+ if (sort) {
+ this.structureConverters.sort(DataConverter.LOWEST_VERSION_COMPARATOR);
+ }
+ }
+
+ public void addStructureWalker(final int minVersion, final DataWalker<Object> walker) {
+ this.addStructureWalker(minVersion, 0, walker);
+ }
+
+ public void addStructureWalker(final int minVersion, final int versionStep, final DataWalker<Object> walker) {
+ this.structureWalkers.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> {
+ return new ArrayList<>();
+ }).add(walker);
+ }
+
+ public void addStructureHook(final int minVersion, final DataHook<Object, Object> hook) {
+ this.addStructureHook(minVersion, 0, hook);
+ }
+
+ public void addStructureHook(final int minVersion, final int versionStep, final DataHook<Object, Object> hook) {
+ this.structureHooks.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> {
+ return new ArrayList<>();
+ }).add(hook);
+ }
+
+ @Override
+ public Object convert(Object data, final long fromVersion, final long toVersion) {
+ Object ret = null;
+
+ final List<DataConverter<Object, Object>> converters = this.structureConverters;
+ for (int i = 0, len = converters.size(); i < len; ++i) {
+ final DataConverter<Object, Object> converter = converters.get(i);
+ final long converterVersion = converter.getEncodedVersion();
+
+ if (converterVersion <= fromVersion) {
+ continue;
+ }
+
+ if (converterVersion > toVersion) {
+ break;
+ }
+
+ List<DataHook<Object, Object>> hooks = this.structureHooks.getFloor(converterVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final Object replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final Object replace = converter.convert(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+
+ // possibly new data format, update hooks
+ hooks = this.structureHooks.getFloor(toVersion);
+
+ if (hooks != null) {
+ for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) {
+ final Object postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+ }
+
+ final List<DataHook<Object, Object>> hooks = this.structureHooks.getFloor(toVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final Object replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final List<DataWalker<Object>> walkers = this.structureWalkers.getFloor(toVersion);
+ if (walkers != null) {
+ for (int i = 0, len = walkers.size(); i < len; ++i) {
+ final Object replace = walkers.get(i).walk(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ if (hooks != null) {
+ for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) {
+ final Object postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+
+ return ret;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java
new file mode 100644
index 0000000000000000000000000000000000000000..35ae849cb57e2e6b54f5607e8bacdc43448ae6a1
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java
@@ -0,0 +1,170 @@
+package ca.spottedleaf.dataconverter.minecraft.datatypes;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataHook;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCVersionRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class IDDataType extends MCDataType {
+
+ protected final Map<String, Long2ObjectArraySortedMap<List<DataWalker<MapType>>>> walkersById = new HashMap<>();
+
+ public IDDataType(final String name) {
+ super(name);
+ }
+
+ public void addConverterForId(final String id, final DataConverter<MapType, MapType> converter) {
+ this.addStructureConverter(new DataConverter<>(converter.getToVersion(), converter.getVersionStep()) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!id.equals(data.getString("id"))) {
+ return null;
+ }
+ return converter.convert(data, sourceVersion, toVersion);
+ }
+ });
+ }
+
+ public boolean hasWalkers(final String id) {
+ return this.walkersById.containsKey(id);
+ }
+
+ public void addWalker(final int minVersion, final String id, final DataWalker<MapType> walker) {
+ this.addWalker(minVersion, 0, id, walker);
+ }
+
+ public void addWalker(final int minVersion, final int versionStep, final String id, final DataWalker<MapType> walker) {
+ this.walkersById.computeIfAbsent(id, (final String keyInMap) -> {
+ return new Long2ObjectArraySortedMap<>();
+ }).computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> {
+ return new ArrayList<>();
+ }).add(walker);
+ }
+
+ public void copyWalkers(final int minVersion, final String fromId, final String toId) {
+ this.copyWalkers(minVersion, 0, fromId, toId);
+ }
+
+ public void copyWalkers(final int minVersion, final int versionStep, final String fromId, final String toId) {
+ final long version = DataConverter.encodeVersions(minVersion, versionStep);
+ final Long2ObjectArraySortedMap<List<DataWalker<MapType>>> walkersForId = this.walkersById.get(fromId);
+ if (walkersForId == null) {
+ return;
+ }
+
+ final List<DataWalker<MapType>> nearest = walkersForId.getFloor(version);
+
+ if (nearest == null) {
+ return;
+ }
+
+ for (final DataWalker<MapType> walker : nearest) {
+ this.addWalker(minVersion, versionStep, toId, walker);
+ }
+ }
+
+ @Override
+ public MapType convert(MapType data, final long fromVersion, final long toVersion) {
+ MapType ret = null;
+
+ final List<DataConverter<MapType, MapType>> converters = this.structureConverters;
+ for (int i = 0, len = converters.size(); i < len; ++i) {
+ final DataConverter<MapType, MapType> converter = converters.get(i);
+ final long converterVersion = converter.getEncodedVersion();
+
+ if (converterVersion <= fromVersion) {
+ continue;
+ }
+
+ if (converterVersion > toVersion) {
+ break;
+ }
+
+ List<DataHook<MapType, MapType>> hooks = this.structureHooks.getFloor(converterVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final MapType replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final MapType replace = converter.convert(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+
+ // possibly new data format, update hooks
+ hooks = this.structureHooks.getFloor(toVersion);
+
+ if (hooks != null) {
+ for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) {
+ final MapType postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+ }
+
+ final List<DataHook<MapType, MapType>> hooks = this.structureHooks.getFloor(toVersion);
+
+ // run pre hooks
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final MapType replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ // run all walkers
+
+ final List<DataWalker<MapType>> walkers = this.structureWalkers.getFloor(toVersion);
+ if (walkers != null) {
+ for (int i = 0, len = walkers.size(); i < len; ++i) {
+ final MapType replace = walkers.get(i).walk(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final Long2ObjectArraySortedMap<List<DataWalker<MapType>>> walkersByVersion = this.walkersById.get(data.getString("id"));
+ if (walkersByVersion != null) {
+ final List<DataWalker<MapType>> walkersForId = walkersByVersion.getFloor(toVersion);
+ if (walkersForId != null) {
+ for (int i = 0, len = walkersForId.size(); i < len; ++i) {
+ final MapType replace = walkersForId.get(i).walk(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+ }
+
+ // run post hooks
+
+ if (hooks != null) {
+ for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) {
+ final MapType postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+
+ return ret;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1f7c0d7fd80556941bbba8018aa85e7c896b630
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java
@@ -0,0 +1,133 @@
+package ca.spottedleaf.dataconverter.minecraft.datatypes;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataHook;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataType;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCVersionRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MCDataType extends DataType<MapType, MapType> {
+
+ public final String name;
+
+ protected final ArrayList<DataConverter<MapType, MapType>> structureConverters = new ArrayList<>();
+ protected final Long2ObjectArraySortedMap<List<DataWalker<MapType>>> structureWalkers = new Long2ObjectArraySortedMap<>();
+ protected final Long2ObjectArraySortedMap<List<DataHook<MapType, MapType>>> structureHooks = new Long2ObjectArraySortedMap<>();
+
+ public MCDataType(final String name) {
+ this.name = name;
+ }
+
+ public void addStructureConverter(final DataConverter<MapType, MapType> converter) {
+ MCVersionRegistry.checkVersion(converter.getEncodedVersion());
+ final boolean sort = !this.structureConverters.isEmpty()
+ && DataConverter.LOWEST_VERSION_COMPARATOR.compare(this.structureConverters.getLast(), converter) > 0;
+ this.structureConverters.add(converter);
+ if (sort) {
+ this.structureConverters.sort(DataConverter.LOWEST_VERSION_COMPARATOR);
+ }
+ }
+
+ public void addStructureWalker(final int minVersion, final DataWalker<MapType> walker) {
+ this.addStructureWalker(minVersion, 0, walker);
+ }
+
+ public void addStructureWalker(final int minVersion, final int versionStep, final DataWalker<MapType> walker) {
+ this.structureWalkers.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> {
+ return new ArrayList<>();
+ }).add(walker);
+ }
+
+ public void addStructureHook(final int minVersion, final DataHook<MapType, MapType> hook) {
+ this.addStructureHook(minVersion, 0, hook);
+ }
+
+ public void addStructureHook(final int minVersion, final int versionStep, final DataHook<MapType, MapType> hook) {
+ this.structureHooks.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> {
+ return new ArrayList<>();
+ }).add(hook);
+ }
+
+ @Override
+ public MapType convert(MapType data, final long fromVersion, final long toVersion) {
+ MapType ret = null;
+
+ final List<DataConverter<MapType, MapType>> converters = this.structureConverters;
+ for (int i = 0, len = converters.size(); i < len; ++i) {
+ final DataConverter<MapType, MapType> converter = converters.get(i);
+ final long converterVersion = converter.getEncodedVersion();
+
+ if (converterVersion <= fromVersion) {
+ continue;
+ }
+
+ if (converterVersion > toVersion) {
+ break;
+ }
+
+ List<DataHook<MapType, MapType>> hooks = this.structureHooks.getFloor(converterVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final MapType replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final MapType replace = converter.convert(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+
+ // possibly new data format, update hooks
+ hooks = this.structureHooks.getFloor(toVersion);
+
+ if (hooks != null) {
+ for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) {
+ final MapType postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+ }
+
+ final List<DataHook<MapType, MapType>> hooks = this.structureHooks.getFloor(toVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final MapType replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final List<DataWalker<MapType>> walkers = this.structureWalkers.getFloor(toVersion);
+ if (walkers != null) {
+ for (int i = 0, len = walkers.size(); i < len; ++i) {
+ final MapType replace = walkers.get(i).walk(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ if (hooks != null) {
+ for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) {
+ final MapType postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+
+ return ret;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java
new file mode 100644
index 0000000000000000000000000000000000000000..4888b386d0e7f0237c2fe416e9034658cba0f1b0
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java
@@ -0,0 +1,367 @@
+package ca.spottedleaf.dataconverter.minecraft.datatypes;
+
+import ca.spottedleaf.dataconverter.minecraft.versions.*;
+import com.mojang.logging.LogUtils;
+import org.slf4j.Logger;
+import java.text.DecimalFormat;
+
+public final class MCTypeRegistry {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ public static final MCDataType LEVEL = new MCDataType("Level");
+ public static final MCDataType LIGHTWEIGHT_LEVEL = new MCDataType("LightweightLevel");
+ public static final MCDataType PLAYER = new MCDataType("Player");
+ public static final MCDataType CHUNK = new MCDataType("Chunk");
+ public static final MCDataType HOTBAR = new MCDataType("CreativeHotbar");
+ public static final MCDataType OPTIONS = new MCDataType("Options");
+ public static final MCDataType STRUCTURE = new MCDataType("Structure");
+ public static final MCDataType STATS = new MCDataType("Stats");
+ public static final MCDataType ADVANCEMENTS = new MCDataType("Advancements");
+ public static final MCDataType POI_CHUNK = new MCDataType("PoiChunk");
+ public static final MCDataType ENTITY_CHUNK = new MCDataType("EntityChunk");
+ public static final IDDataType TILE_ENTITY = new IDDataType("TileEntity");
+ public static final IDDataType ITEM_STACK = new IDDataType("ItemStack");
+ public static final MCDataType BLOCK_STATE = new MCDataType("BlockState");
+ public static final MCValueType FLAT_BLOCK_STATE = new MCValueType("FlatBlockState");
+ public static final MCDataType DATA_COMPONENTS = new MCDataType("DataComponents");
+ public static final MCDataType VILLAGER_TRADE = new MCDataType("VillagerTrade");
+ public static final DynamicDataType PARTICLE = new DynamicDataType("Particle");
+ public static final MCValueType ENTITY_NAME = new MCValueType("EntityName");
+ public static final IDDataType ENTITY = new IDDataType("Entity");
+ public static final MCValueType BLOCK_NAME = new MCValueType("BlockName");
+ public static final MCValueType ITEM_NAME = new MCValueType("ItemName");
+ public static final MCDataType UNTAGGED_SPAWNER = new MCDataType("Spawner");
+ public static final MCDataType STRUCTURE_FEATURE = new MCDataType("StructureFeature");
+ public static final MCDataType OBJECTIVE = new MCDataType("Objective");
+ public static final MCDataType TEAM = new MCDataType("Team");
+ public static final MCValueType RECIPE = new MCValueType("RecipeName");
+ public static final MCValueType BIOME = new MCValueType("Biome");
+ public static final MCDataType WORLD_GEN_SETTINGS = new MCDataType("WorldGenSettings");
+ public static final MCValueType GAME_EVENT_NAME = new MCValueType("GameEventName");
+ // NOTE: Prior to V165, TEXT_COMPONENT _also_ mark plain strings (not components!) to be converted to json format.
+ // So, great care should be taken to ensure that when dealing with versions up to and including V165 that BOTH formats
+ // of JSON and plain text are parsed properly.
+ // As a result, we differ from Vanilla's schemas to ensure that legacy data converts correctly.
+ public static final DynamicDataType TEXT_COMPONENT = new DynamicDataType("TextComponent");
+ public static final MCDataType ENTITY_EQUIPMENT = new MCDataType("EntityEquipment");
+
+ public static final MCValueType MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST = new MCValueType("MultiNoiseBiomeSourceParameterList");
+
+ public static final MCDataType SAVED_DATA_RANDOM_SEQUENCES = new MCDataType("SavedData/RandomSequences");
+ public static final MCDataType SAVED_DATA_SCOREBOARD = new MCDataType("SavedData/Scoreboard");
+ public static final MCDataType SAVED_DATA_STRUCTURE_FEATURE_INDICES = new MCDataType("SavedData/StructureFeatureIndices");
+ public static final MCDataType SAVED_DATA_MAP_DATA = new MCDataType("SavedData/MapData");
+ public static final MCDataType SAVED_DATA_RAIDS = new MCDataType("SavedData/Raids");
+ public static final MCDataType SAVED_DATA_COMMAND_STORAGE = new MCDataType("SavedData/CommandStorage");
+ public static final MCDataType SAVED_DATA_MAP_INDEX = new MCDataType("SavedData/IdCounts");
+ public static final MCDataType SAVED_DATA_TICKETS = new MCDataType("SavedData/Tickets");
+
+ public static final DynamicDataType DATACONVERTER_CUSTOM_TYPE_COMMAND = new DynamicDataType("DC_Custom/Command");
+
+ static {
+ LOGGER.info("Initialising converters for DataConverter...");
+
+ final long start = System.nanoTime();
+ try {
+ registerAll();
+ } catch (final Throwable thr) {
+ LOGGER.error(LogUtils.FATAL_MARKER, "Failed to register data converters", thr);
+ throw new RuntimeException(thr);
+ }
+ final long end = System.nanoTime();
+
+ final DecimalFormat oneDecimalFormat = new DecimalFormat("#,##0.0");
+
+ LOGGER.info("Finished initialising converters for DataConverter in " + oneDecimalFormat.format((double)(end - start) / 1.0E6) + "ms");
+ }
+
+ public static void init() {}
+
+ private static void registerAll() {
+ // General notes:
+ // - Structure converters run before everything.
+ // - ID specific converters run after structure converters.
+ // - Structure walkers run after id specific converters.
+ // - ID specific walkers run after structure walkers.
+
+ V99.register(); // all legacy data before converters existed
+ V100.register(); // first version with version id
+ V101.register();
+ V102.register();
+ V105.register();
+ V106.register();
+ V107.register();
+ V108.register();
+ V109.register();
+ V110.register();
+ V111.register();
+ V113.register();
+ V135.register();
+ V143.register();
+ V147.register();
+ V165.register();
+ V501.register();
+ V502.register();
+ V505.register();
+ V700.register();
+ V701.register();
+ V702.register();
+ V703.register();
+ V704.register();
+ V705.register();
+ V804.register();
+ V806.register();
+ V808.register();
+ V813.register();
+ V816.register();
+ V820.register();
+ V1022.register();
+ V1125.register();
+ // END OF LEGACY DATA CONVERTERS
+
+ // V1.13
+ V1344.register();
+ V1446.register();
+ // START THE FLATTENING
+ V1450.register();
+ V1451.register();
+ // END THE FLATTENING
+
+ V1456.register();
+ V1458.register();
+ V1460.register();
+ V1466.register();
+ V1470.register();
+ V1474.register();
+ V1475.register();
+ V1480.register();
+ // V1481 is adding simple block entity
+ V1483.register();
+ V1484.register();
+ V1486.register();
+ V1487.register();
+ V1488.register();
+ V1490.register();
+ V1492.register();
+ V1494.register();
+ V1496.register();
+ V1500.register();
+ V1501.register();
+ V1502.register();
+ V1506.register();
+ V1510.register();
+ V1514.register();
+ V1515.register();
+ V1624.register();
+ // V1.14
+ V1800.register();
+ V1801.register();
+ V1802.register();
+ V1803.register();
+ V1904.register();
+ V1905.register();
+ V1906.register();
+ V1909.register();
+ V1911.register();
+ V1914.register();
+ V1917.register();
+ V1918.register();
+ V1920.register();
+ V1925.register();
+ V1928.register();
+ V1929.register();
+ V1931.register();
+ V1936.register();
+ V1946.register();
+ V1948.register();
+ V1953.register();
+ V1955.register();
+ V1961.register();
+ V1963.register();
+ // V1.15
+ V2100.register();
+ V2202.register();
+ V2209.register();
+ V2211.register();
+ V2218.register();
+ // V1.16
+ V2501.register();
+ V2502.register();
+ V2503.register();
+ V2505.register();
+ V2508.register();
+ V2509.register();
+ V2511.register();
+ V2514.register();
+ V2516.register();
+ V2518.register();
+ V2519.register();
+ V2522.register();
+ V2523.register();
+ V2527.register();
+ V2528.register();
+ V2529.register();
+ V2531.register();
+ V2533.register();
+ V2535.register();
+ V2537.register();
+ V2538.register();
+ V2550.register();
+ V2551.register();
+ V2552.register();
+ V2553.register();
+ V2558.register();
+ V2568.register();
+ // V1.17
+ // WARN: Mojang registers V2671 under 2571, but that version predates 1.16.5? So it looks like a typo...
+ // I changed it to 2671, just so that it's after 1.16.5, but even then this looks misplaced... Thankfully this is
+ // the first datafixer, and all it does is add a walker, so I think even if the version here is just wrong it will
+ // work.
+ V2671.register();
+ V2679.register();
+ V2680.register();
+ V2684.register();
+ V2686.register();
+ V2688.register();
+ V2690.register();
+ V2691.register();
+ V2693.register();
+ V2696.register();
+ V2700.register();
+ V2701.register();
+ V2702.register();
+ // In reference to V2671, why the fuck is goat being registered again? For this obvious reason, V2704 is absent.
+ V2707.register();
+ V2710.register();
+ V2717.register();
+ // V1.18
+ V2825.register();
+ V2831.register();
+ V2832.register();
+ V2833.register();
+ V2838.register();
+ V2841.register();
+ V2842.register();
+ V2843.register();
+ V2846.register();
+ V2852.register();
+ V2967.register();
+ V2970.register();
+ // V1.19
+ // V3076 is registering a simple tile entity (sculk_catalyst)
+ V3077.register();
+ V3078.register();
+ V3081.register();
+ V3082.register();
+ V3083.register();
+ V3084.register();
+ V3086.register();
+ V3087.register();
+ V3088.register();
+ V3090.register();
+ V3093.register();
+ V3094.register();
+ V3097.register();
+ V3108.register();
+ V3201.register();
+ V3202.register();
+ V3203.register();
+ V3204.register();
+ V3209.register();
+ V3214.register();
+ V3319.register();
+ V3322.register();
+ V3325.register();
+ V3326.register();
+ V3327.register();
+ V3328.register();
+ // V1.20
+ V3438.register();
+ V3439.register();
+ V3440.register();
+ V3441.register();
+ V3447.register();
+ V3448.register();
+ V3450.register();
+ V3451.register();
+ V3459.register();
+ V3564.register();
+ V3565.register();
+ V3566.register();
+ V3568.register();
+ V3682.register();
+ V3683.register();
+ V3685.register();
+ V3689.register();
+ V3692.register();
+ // V1.20.5
+ V3799.register();
+ V3800.register();
+ V3803.register();
+ V3807.register();
+ V3808.register();
+ V3809.register();
+ V3812.register();
+ V3813.register();
+ V3814.register();
+ V3816.register();
+ V3818.register();
+ V3820.register();
+ V3825.register();
+ V3828.register();
+ V3833.register();
+ // V1.21
+ V3938.register();
+ V3939.register();
+ V3943.register();
+ V3945.register();
+ // V1.21.2
+ V4054.register();
+ V4055.register();
+ V4057.register();
+ V4059.register();
+ V4061.register();
+ V4064.register();
+ V4067.register();
+ V4068.register();
+ V4070.register();
+ V4071.register();
+ // V1.21.3
+ V4081.register();
+ // V1.21.4
+ V4173.register();
+ V4175.register();
+ V4176.register();
+ V4180.register();
+ V4181.register();
+ V4185.register();
+ V4187.register();
+ // V1.21.5
+ V4290.register();
+ V4291.register();
+ V4292.register();
+ V4293.register();
+ V4294.register();
+ V4295.register();
+ V4296.register();
+ V4297.register();
+ V4299.register();
+ V4300.register();
+ V4301.register();
+ V4302.register();
+ V4303.register();
+ V4305.register();
+ V4306.register();
+ V4307.register();
+ V4309.register();
+ V4311.register();
+ V4312.register();
+ V4314.register();
+ V4420.register();
+ V4421.register();
+ V4424.register();
+ }
+
+ private MCTypeRegistry() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2598db6f73019e2730622e8156b71196bfe0ee5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java
@@ -0,0 +1,90 @@
+package ca.spottedleaf.dataconverter.minecraft.datatypes;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataHook;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataType;
+import ca.spottedleaf.dataconverter.minecraft.MCVersionRegistry;
+import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MCValueType extends DataType<Object, Object> {
+
+ public final String name;
+
+ protected final ArrayList<DataConverter<Object, Object>> converters = new ArrayList<>();
+ protected final Long2ObjectArraySortedMap<List<DataHook<Object, Object>>> structureHooks = new Long2ObjectArraySortedMap<>();
+
+ public MCValueType(final String name) {
+ this.name = name;
+ }
+
+ public void addStructureHook(final int minVersion, final DataHook<Object, Object> hook) {
+ this.addStructureHook(minVersion, 0, hook);
+ }
+
+ public void addStructureHook(final int minVersion, final int versionStep, final DataHook<Object, Object> hook) {
+ this.structureHooks.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> {
+ return new ArrayList<>();
+ }).add(hook);
+ }
+
+ public void addConverter(final DataConverter<Object, Object> converter) {
+ MCVersionRegistry.checkVersion(converter.getEncodedVersion());
+ final boolean sort = !this.converters.isEmpty()
+ && DataConverter.LOWEST_VERSION_COMPARATOR.compare(this.converters.getLast(), converter) > 0;
+ this.converters.add(converter);
+ if (sort) {
+ this.converters.sort(DataConverter.LOWEST_VERSION_COMPARATOR);
+ }
+ }
+
+ @Override
+ public Object convert(final Object data, final long fromVersion, final long toVersion) {
+ Object ret = null;
+ final List<DataConverter<Object, Object>> converters = this.converters;
+
+ for (int i = 0, len = converters.size(); i < len; ++i) {
+ final DataConverter<Object, Object> converter = converters.get(i);
+ final long converterVersion = converter.getEncodedVersion();
+
+ if (converterVersion <= fromVersion) {
+ continue;
+ }
+
+ if (converterVersion > toVersion) {
+ break;
+ }
+
+ List<DataHook<Object, Object>> hooks = this.structureHooks.getFloor(converterVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final Object replace = hooks.get(k).preHook(ret == null ? data : ret, fromVersion, toVersion);
+ if (replace != null) {
+ ret = replace;
+ }
+ }
+ }
+
+ final Object converted = converter.convert(ret == null ? data : ret, fromVersion, toVersion);
+ if (converted != null) {
+ ret = converted;
+ }
+
+ // possibly new data format, update hooks
+ hooks = this.structureHooks.getFloor(toVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final Object replace = hooks.get(k).postHook(ret == null ? data : ret, fromVersion, toVersion);
+ if (replace != null) {
+ ret = replace;
+ }
+ }
+ }
+ }
+
+ return ret;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookEnforceNamespacedID.java b/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookEnforceNamespacedID.java
new file mode 100644
index 0000000000000000000000000000000000000000..a0d5bdfce1e7f433ee3bb984814315a157fa3c15
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookEnforceNamespacedID.java
@@ -0,0 +1,29 @@
+package ca.spottedleaf.dataconverter.minecraft.hooks;
+
+import ca.spottedleaf.dataconverter.converters.datatypes.DataHook;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+
+public class DataHookEnforceNamespacedID implements DataHook<MapType, MapType> {
+
+ private final String path;
+
+ public DataHookEnforceNamespacedID() {
+ this("id");
+ }
+
+ public DataHookEnforceNamespacedID(final String path) {
+ this.path = path;
+ }
+
+ @Override
+ public MapType preHook(final MapType data, final long fromVersion, final long toVersion) {
+ NamespaceUtil.enforceForPath(data, this.path);
+ return null;
+ }
+
+ @Override
+ public MapType postHook(final MapType data, final long fromVersion, final long toVersion) {
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookValueTypeEnforceNamespaced.java b/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookValueTypeEnforceNamespaced.java
new file mode 100644
index 0000000000000000000000000000000000000000..8467d4849f9988da3d79620337be8e12815fa4ff
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookValueTypeEnforceNamespaced.java
@@ -0,0 +1,20 @@
+package ca.spottedleaf.dataconverter.minecraft.hooks;
+
+import ca.spottedleaf.dataconverter.converters.datatypes.DataHook;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+
+public class DataHookValueTypeEnforceNamespaced implements DataHook<Object, Object> {
+
+ @Override
+ public Object preHook(final Object data, final long fromVersion, final long toVersion) {
+ if (data instanceof String string) {
+ return NamespaceUtil.correctNamespaceOrNull(string);
+ }
+ return null;
+ }
+
+ @Override
+ public Object postHook(final Object data, final long fromVersion, final long toVersion) {
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java b/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..17ded002b5546de8be4a5238c20ccfda460a98bb
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java
@@ -0,0 +1,82 @@
+package ca.spottedleaf.dataconverter.minecraft.util;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
+import net.minecraft.util.GsonHelper;
+
+public final class ComponentUtils {
+
+ public static final String EMPTY = createPlainTextComponent("");
+
+ public static String createPlainTextComponent(final String text) {
+ final JsonObject ret = new JsonObject();
+
+ ret.addProperty("text", text);
+
+ return GsonHelper.toStableString(ret);
+ }
+
+ public static String createTranslatableComponent(final String key) {
+ final JsonObject ret = new JsonObject();
+
+ ret.addProperty("translate", key);
+
+ return GsonHelper.toStableString(ret);
+ }
+
+ public static String retrieveTranslationString(final String possibleJson) {
+ if (possibleJson == null) {
+ return null;
+ }
+
+ try {
+ final JsonElement element = JsonParser.parseString(possibleJson);
+
+ if (element instanceof JsonObject object) {
+ final JsonElement translation = object.get("translate");
+ if (translation instanceof JsonPrimitive primitive) {
+ return primitive.getAsString();
+ }
+ }
+
+ return null;
+ } catch (final Exception ex) {
+ return null;
+ }
+ }
+
+ public static String convertFromLenient(final String input) {
+ if (input == null) {
+ return input;
+ }
+
+ if (input.isEmpty() || input.equals("null")) {
+ return EMPTY;
+ }
+
+ final char firstCharacter = input.charAt(0);
+ final char lastCharacter = input.charAt(input.length() - 1);
+ if ((firstCharacter == '"' && lastCharacter == '"')
+ || (firstCharacter == '{' && lastCharacter == '}')
+ || (firstCharacter == '[' && lastCharacter == ']')) {
+ try {
+ final JsonElement json = JsonParser.parseString(input);
+
+ if (json.isJsonPrimitive()) {
+ return createPlainTextComponent(json.getAsString());
+ }
+
+ return GsonHelper.toStableString(json);
+ } catch (final JsonParseException ignored) {
+ // fall through to plain text
+ }
+ }
+
+ return createPlainTextComponent(input);
+ }
+
+ private ComponentUtils() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/util/StringWalker.java b/ca/spottedleaf/dataconverter/minecraft/util/StringWalker.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e1add641c092b241b48e93732dab4ef646eafc3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/util/StringWalker.java
@@ -0,0 +1,78 @@
+package ca.spottedleaf.dataconverter.minecraft.util;
+
+public final class StringWalker {
+
+ public final String string;
+ private int index; // index of next value to return
+ private final int maxIndex; // exclusive
+
+ public StringWalker(final String string) {
+ this(string, 0);
+ }
+
+ public StringWalker(final String string, final int index) {
+ this(string, index, string.length());
+ }
+
+ public StringWalker(final String string, final int index, final int maxIndex) {
+ this.string = string;
+ this.index = index;
+ this.maxIndex = maxIndex;
+
+ if (maxIndex < 0 || maxIndex > string.length()) {
+ throw new IllegalArgumentException("Max index out of string range");
+ }
+
+ if (index < 0 || index > maxIndex) {
+ throw new IllegalArgumentException("Index out of string range");
+ }
+ }
+
+ public int getIndex() {
+ return this.index;
+ }
+
+ public void setIndex(final int to) {
+ this.index = to;
+ }
+
+ private void checkNext() {
+ if (!this.hasNext()) {
+ throw this.parseFail(this.getIndex(), "Expecting more input");
+ }
+ }
+
+ public boolean hasNext() {
+ return this.index < this.maxIndex;
+ }
+
+ public char next() {
+ return this.string.charAt(this.index++);
+ }
+
+ public char peek() {
+ return this.string.charAt(this.index);
+ }
+
+ public void advance() {
+ ++this.index;
+ }
+
+ public void skipWhitespace() {
+ while (this.hasNext() || Character.isWhitespace(this.peek())) {
+ this.advance();
+ }
+ }
+
+ public boolean skipIf(final char c) {
+ if (this.hasNext() && this.peek() == c) {
+ this.advance();
+ return true;
+ }
+ return false;
+ }
+
+ public IllegalStateException parseFail(final int index, final String reason) {
+ return new IllegalStateException("At column " + index + ": " + reason);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/util/Version.java b/ca/spottedleaf/dataconverter/minecraft/util/Version.java
new file mode 100644
index 0000000000000000000000000000000000000000..c289ec6b7f6d199182ffdfb1cd95a1746bfd6e76
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/util/Version.java
@@ -0,0 +1,12 @@
+package ca.spottedleaf.dataconverter.minecraft.util;
+
+import net.minecraft.SharedConstants;
+
+public final class Version {
+
+ public static int getCurrentVersion() {
+ return SharedConstants.getCurrentVersion().dataVersion().version();
+ }
+
+ private Version() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V100.java b/ca/spottedleaf/dataconverter/minecraft/versions/V100.java
new file mode 100644
index 0000000000000000000000000000000000000000..166953878ce7df4317a40ad274f56ecd3f7214cc
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V100.java
@@ -0,0 +1,124 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.block_name.DataWalkerBlockNames;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V100 {
+
+ private static final int VERSION = MCVersions.V15W32A;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType equipment = data.getList("Equipment", ObjectType.MAP);
+ data.remove("Equipment");
+
+ if (equipment != null) {
+ if (equipment.size() > 0 && data.getListUnchecked("HandItems") == null) {
+ final ListType handItems = Types.NBT.createEmptyList();
+ data.setList("HandItems", handItems);
+ handItems.addMap(equipment.getMap(0));
+ handItems.addMap(Types.NBT.createEmptyMap());
+ }
+
+ if (equipment.size() > 1 && data.getListUnchecked("ArmorItems") == null) {
+ final ListType armorItems = Types.NBT.createEmptyList();
+ data.setList("ArmorItems", armorItems);
+ for (int i = 1; i < Math.min(equipment.size(), 5); ++i) {
+ armorItems.addMap(equipment.getMap(i));
+ }
+ }
+ }
+
+ final ListType dropChances = data.getList("DropChances", ObjectType.FLOAT);
+ data.remove("DropChances");
+
+ if (dropChances != null) {
+ if (data.getListUnchecked("HandDropChances") == null) {
+ final ListType handDropChances = Types.NBT.createEmptyList();
+ data.setList("HandDropChances", handDropChances);
+ if (0 < dropChances.size()) {
+ handDropChances.addFloat(dropChances.getFloat(0));
+ } else {
+ handDropChances.addFloat(0.0F);
+ }
+ handDropChances.addFloat(0.0F);
+ }
+
+ if (data.getListUnchecked("ArmorDropChances") == null) {
+ final ListType armorDropChances = Types.NBT.createEmptyList();
+ data.setList("ArmorDropChances", armorDropChances);
+ for (int i = 1; i < 5; ++i) {
+ if (i < dropChances.size()) {
+ armorDropChances.addFloat(dropChances.getFloat(i));
+ } else {
+ armorDropChances.addFloat(0.0F);
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY_EQUIPMENT.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "ArmorItems", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "HandItems", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, data, "body_armor_item", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, data, "saddle", fromVersion, toVersion);
+
+ return null;
+ });
+
+ //registerMob("ArmorStand"); // changed to simple in 1.21.5
+ //registerMob("Creeper"); // changed to simple in 1.21.5
+ //registerMob("Skeleton"); // changed to simple in 1.21.5
+ //registerMob("Spider"); // changed to simple in 1.21.5
+ //registerMob("Giant"); // changed to simple in 1.21.5
+ //registerMob("Zombie"); // changed to simple in 1.21.5
+ //registerMob("Slime"); // changed to simple in 1.21.5
+ //registerMob("Ghast"); // changed to simple in 1.21.5
+ //registerMob("PigZombie"); // changed to simple in 1.21.5
+ // Enderman is now identical to V99 due to moving equipment to base in 1.21.5
+ //registerMob("CaveSpider"); // changed to simple in 1.21.5
+ //registerMob("Silverfish"); // changed to simple in 1.21.5
+ //registerMob("Blaze"); // changed to simple in 1.21.5
+ //registerMob("LavaSlime"); // changed to simple in 1.21.5
+ //registerMob("EnderDragon"); // changed to simple in 1.21.5
+ //registerMob("WitherBoss"); // changed to simple in 1.21.5
+ //registerMob("Bat"); // changed to simple in 1.21.5
+ //registerMob("Witch"); // changed to simple in 1.21.5
+ //registerMob("Endermite"); // changed to simple in 1.21.5
+ //registerMob("Guardian"); // changed to simple in 1.21.5
+ //registerMob("Pig"); // changed to simple in 1.21.5
+ //registerMob("Sheep"); // changed to simple in 1.21.5
+ //registerMob("Cow"); // changed to simple in 1.21.5
+ //registerMob("Chicken"); // changed to simple in 1.21.5
+ //registerMob("Squid"); // changed to simple in 1.21.5
+ //registerMob("Wolf"); // changed to simple in 1.21.5
+ //registerMob("MushroomCow"); // changed to simple in 1.21.5
+ //registerMob("SnowMan"); // changed to simple in 1.21.5
+ //registerMob("Ozelot"); // changed to simple in 1.21.5
+ //registerMob("VillagerGolem"); // changed to simple in 1.21.5
+ // EntityHorse is now identical to V99 due to moving equipment to base in 1.21.5
+ //registerMob("Rabbit"); // changed to simple in 1.21.5
+ // Villager is now identical to V99 due to moving equipment to base in 1.21.5
+ //registerMob("Shulker"); // changed to simple in 1.21.5
+ // AreaEffectCloud is now identical to V99 due to moving equipment to base in 1.21.5
+
+ // Moved to V99 in 1.21.5
+ }
+
+ private V100() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V101.java b/ca/spottedleaf/dataconverter/minecraft/versions/V101.java
new file mode 100644
index 0000000000000000000000000000000000000000..787f09af1338483fdb820806f94680c7e5db7d7c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V101.java
@@ -0,0 +1,46 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V101 {
+
+ private static final int VERSION = MCVersions.V15W32A + 1;
+
+ private static void updateLine(final MapType data, final String path) {
+ final String textString = data.getString(path);
+
+ if (textString == null) {
+ return;
+ }
+
+ data.setString(path, ComponentUtils.convertFromLenient(textString));
+ }
+
+ public static void register() {
+ // Mojang Removed in 1.21.5, replaced in V165 - although we should not be modifying old converters unless
+ // we need to (the conversion is the same)
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("Sign", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateLine(data, "Text1");
+ updateLine(data, "Text2");
+ updateLine(data, "Text3");
+ updateLine(data, "Text4");
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("Villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setBoolean("CanPickUpLoot", true);
+ return null;
+ }
+ });
+ }
+
+ private V101() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V102.java b/ca/spottedleaf/dataconverter/minecraft/versions/V102.java
new file mode 100644
index 0000000000000000000000000000000000000000..b9f23288d9cc912eccd07418e38cd6ffcdf65360
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V102.java
@@ -0,0 +1,86 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperItemNameV102;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.mojang.logging.LogUtils;
+import org.slf4j.Logger;
+
+public final class V102 {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static final int VERSION = MCVersions.V15W32A + 2;
+
+ public static void register() {
+ // V102 -> V15W32A + 2
+ // V102 schema only modifies ITEM_STACK to have only a string ID, but our ITEM_NAME is generic (int or String) so we don't
+ // actually need to update the walker
+
+ MCTypeRegistry.ITEM_NAME.addConverter(new DataConverter<>(VERSION) {
+ @Override
+ public Object convert(final Object data, final long sourceVersion, final long toVersion) {
+ if (!(data instanceof Number)) {
+ return null;
+ }
+ final int id = ((Number)data).intValue();
+ final String remap = HelperItemNameV102.getNameFromId(id);
+ if (remap == null) {
+ LOGGER.warn("Unknown legacy integer id (V102) " + id);
+ }
+ return remap == null ? HelperItemNameV102.getNameFromId(0) : remap;
+ }
+ });
+
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!data.hasKey("id", ObjectType.NUMBER)) {
+ return null;
+ }
+
+ final int id = data.getInt("id");
+
+ String remap = HelperItemNameV102.getNameFromId(id);
+ if (remap == null) {
+ LOGGER.warn("Unknown legacy integer id (V102) " + id);
+ remap = HelperItemNameV102.getNameFromId(0);
+ }
+
+ data.setString("id", remap);
+
+ return null;
+ }
+ });
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:potion", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final short damage = data.getShort("Damage");
+ if (damage != 0) {
+ data.setShort("Damage", (short)0);
+ }
+ MapType tag = data.getMap("tag");
+ if (tag == null) {
+ tag = Types.NBT.createEmptyMap();
+ data.setMap("tag", tag);
+ }
+
+ if (!tag.hasKey("Potion", ObjectType.STRING)) {
+ final String converted = HelperItemNameV102.getPotionNameFromId(damage);
+ tag.setString("Potion", converted == null ? "minecraft:water" : converted);
+ if ((damage & 16384) == 16384) {
+ data.setString("id", "minecraft:splash_potion");
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V102() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java
new file mode 100644
index 0000000000000000000000000000000000000000..dab97581780d0d3156335fe0fbb84ea0823c5585
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java
@@ -0,0 +1,43 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1022 {
+
+ private static final int VERSION = MCVersions.V17W06A;
+
+ public static void register() {
+ MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("RootVehicle"), "Entity", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "ender_pearls", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "EnderItems", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityLeft", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityRight", fromVersion, toVersion);
+
+ final MapType recipeBook = data.getMap("recipeBook");
+ if (recipeBook != null) {
+ WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "recipes", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "toBeDisplayed", fromVersion, toVersion);
+ }
+
+ return null;
+ });
+
+ MCTypeRegistry.HOTBAR.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ for (final String key : data.keys()) {
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, key, fromVersion, toVersion);
+ }
+
+ return null;
+ });
+ }
+
+ private V1022() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V105.java b/ca/spottedleaf/dataconverter/minecraft/versions/V105.java
new file mode 100644
index 0000000000000000000000000000000000000000..072c64eda648496ceee300abaff62c8b64a84219
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V105.java
@@ -0,0 +1,49 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperSpawnEggNameV105;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V105 {
+
+ private static final int VERSION = MCVersions.V15W32C + 1;
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:spawn_egg", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ MapType tag = data.getMap("tag");
+ if (tag == null) {
+ tag = Types.NBT.createEmptyMap();
+ }
+
+ final short damage = data.getShort("Damage");
+ if (damage != 0) {
+ data.setShort("Damage", (short)0);
+ }
+
+ MapType entityTag = tag.getMap("EntityTag");
+ if (entityTag == null) {
+ entityTag = Types.NBT.createEmptyMap();
+ }
+
+ if (!entityTag.hasKey("id", ObjectType.STRING)) {
+ final String converted = HelperSpawnEggNameV105.getSpawnNameFromId(damage);
+ if (converted != null) {
+ entityTag.setString("id", converted);
+ tag.setMap("EntityTag", entityTag);
+ data.setMap("tag", tag);
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V105() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V106.java b/ca/spottedleaf/dataconverter/minecraft/versions/V106.java
new file mode 100644
index 0000000000000000000000000000000000000000..025488260309ea2816b6513338a0aba21fd6f9e3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V106.java
@@ -0,0 +1,83 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V106 {
+
+ private static final int VERSION = MCVersions.V15W32C + 2;
+
+ public static void register() {
+ // V106 -> V15W32C + 2
+
+ MCTypeRegistry.UNTAGGED_SPAWNER.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ // While all converters for spawners check the id for this version, we don't because spawners exist in minecarts. ooops! Loading a chunk
+ // with a minecart spawner from 1.7.10 in 1.16.5 vanilla will fail to convert! Clearly there was a mistake in how they
+ // used and applied spawner converters. In anycase, do not check the id - we are not guaranteed to be a tile
+ // entity. We can be a regular old minecart spawner. And we know we are a spawner because this is only called from data walkers.
+
+ final String entityId = data.getString("EntityId");
+ if (entityId != null) {
+ data.remove("EntityId");
+ MapType spawnData = data.getMap("SpawnData");
+ if (spawnData == null) {
+ spawnData = Types.NBT.createEmptyMap();
+ data.setMap("SpawnData", spawnData);
+ }
+ spawnData.setString("id", entityId.isEmpty() ? "Pig" : entityId);
+ }
+
+ final ListType spawnPotentials = data.getList("SpawnPotentials", ObjectType.MAP);
+ if (spawnPotentials != null) {
+ for (int i = 0, len = spawnPotentials.size(); i < len; ++i) {
+ // convert to standard entity format (it's not a coincidence a walker for spawners is only added
+ // in this version)
+ final MapType spawn = spawnPotentials.getMap(i);
+ final String spawnType = spawn.getString("Type");
+ if (spawnType == null) {
+ continue;
+ }
+ spawn.remove("Type");
+
+ MapType properties = spawn.getMap("Properties");
+ if (properties == null) {
+ properties = Types.NBT.createEmptyMap();
+ } else {
+ spawn.remove("Properties");
+ }
+
+ properties.setString("id", spawnType);
+
+ spawn.setMap("Entity", properties);
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.UNTAGGED_SPAWNER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final ListType spawnPotentials = data.getList("SpawnPotentials", ObjectType.MAP);
+ if (spawnPotentials != null) {
+ for (int i = 0, len = spawnPotentials.size(); i < len; ++i) {
+ final MapType spawnPotential = spawnPotentials.getMap(i);
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, spawnPotential, "Entity", fromVersion, toVersion);
+ }
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "SpawnData", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ private V106() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V107.java b/ca/spottedleaf/dataconverter/minecraft/versions/V107.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b845e6df83694de203181382094c6c30684c0cc
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V107.java
@@ -0,0 +1,43 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V107 {
+
+ private static final int VERSION = MCVersions.V15W32C + 3;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("Minecart", new DataConverter<>(VERSION) {
+ protected final String[] MINECART_IDS = new String[] {
+ "MinecartRideable", // 0
+ "MinecartChest", // 1
+ "MinecartFurnace", // 2
+ "MinecartTNT", // 3
+ "MinecartSpawner", // 4
+ "MinecartHopper", // 5
+ "MinecartCommandBlock" // 6
+ };
+ // Vanilla does not use all of the IDs here. The legacy (pre DFU) code does, so I'm going to use them.
+ // No harm in catching more cases here.
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ String newId = "MinecartRideable"; // dfl
+ final int type = data.getInt("Type");
+ data.remove("Type");
+
+ if (type >= 0 && type < MINECART_IDS.length) {
+ newId = MINECART_IDS[type];
+ }
+ data.setString("id", newId);
+
+ return null;
+ }
+ });
+ }
+
+ private V107() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V108.java b/ca/spottedleaf/dataconverter/minecraft/versions/V108.java
new file mode 100644
index 0000000000000000000000000000000000000000..19246f5219896f018b2e6a6adfcadce95a795f59
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V108.java
@@ -0,0 +1,46 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import com.mojang.logging.LogUtils;
+import org.slf4j.Logger;
+import java.util.UUID;
+
+public final class V108 {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static final int VERSION = MCVersions.V15W32C + 4;
+
+ public static void register() {
+ // Convert String UUID into UUIDMost and UUIDLeast
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String uuidString = data.getString("UUID");
+
+ if (uuidString == null) {
+ return null;
+ }
+ data.remove("UUID");
+
+ final UUID uuid;
+ try {
+ uuid = UUID.fromString(uuidString);
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse UUID for legacy entity (V108): " + uuidString, ex);
+ return null;
+ }
+
+ data.setLong("UUIDMost", uuid.getMostSignificantBits());
+ data.setLong("UUIDLeast", uuid.getLeastSignificantBits());
+
+ return null;
+ }
+ });
+ }
+
+ private V108() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V109.java b/ca/spottedleaf/dataconverter/minecraft/versions/V109.java
new file mode 100644
index 0000000000000000000000000000000000000000..05e54a7f716899060aae56be20e8b3764bc97081
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V109.java
@@ -0,0 +1,41 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V109 {
+
+ private static final int VERSION = MCVersions.V15W32C + 5;
+
+ public static void register() {
+ // Converts health to be in float, and cleans up whatever the hell was going on with HealF and Health...
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final Number healF = data.getNumber("HealF");
+ final Number heal = data.getNumber("Health");
+
+ final float newHealth;
+
+ if (healF != null) {
+ data.remove("HealF");
+ newHealth = healF.floatValue();
+ } else {
+ if (heal == null) {
+ return null;
+ }
+
+ newHealth = heal.floatValue();
+ }
+
+ data.setFloat("Health", newHealth);
+
+ return null;
+ }
+ });
+ }
+
+ private V109() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V110.java b/ca/spottedleaf/dataconverter/minecraft/versions/V110.java
new file mode 100644
index 0000000000000000000000000000000000000000..11db20648cf877eacaa2a39e62fa66daad3a79bb
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V110.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V110 {
+
+ private static final int VERSION = MCVersions.V15W32C + 6;
+
+ public static void register() {
+ // Moves the Saddle boolean to be an actual saddle item. Note: The data walker for the SaddleItem exists
+ // in V99, it doesn't need to be added here.
+ MCTypeRegistry.ENTITY.addConverterForId("EntityHorse", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!data.getBoolean("Saddle") || data.hasKey("SaddleItem", ObjectType.MAP)) {
+ return null;
+ }
+
+ final MapType saddleItem = Types.NBT.createEmptyMap();
+ data.remove("Saddle");
+ data.setMap("SaddleItem", saddleItem);
+
+ saddleItem.setString("id", "minecraft:saddle");
+ saddleItem.setByte("Count", (byte)1);
+ saddleItem.setShort("Damage", (short)0);
+
+ return null;
+ }
+ });
+ }
+
+ private V110() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V111.java b/ca/spottedleaf/dataconverter/minecraft/versions/V111.java
new file mode 100644
index 0000000000000000000000000000000000000000..9eaf34660e1b42ab99d06d43d86cda13a69448ae
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V111.java
@@ -0,0 +1,64 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V111 {
+
+ private static final int VERSION = MCVersions.V15W33B;
+
+ public static void register() {
+ final EntityRotationFix rotationFix = new EntityRotationFix(VERSION);
+ MCTypeRegistry.ENTITY.addConverterForId("Painting", rotationFix);
+ MCTypeRegistry.ENTITY.addConverterForId("ItemFrame", rotationFix);
+ }
+
+ private V111() {}
+
+ protected static final class EntityRotationFix extends DataConverter<MapType, MapType> {
+
+ private static final int[][] DIRECTIONS = new int[][] {
+ {0, 0, 1},
+ {-1, 0, 0},
+ {0, 0, -1},
+ {1, 0, 0}
+ };
+
+ public EntityRotationFix(final int version) {
+ super(version);
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.getNumber("Facing") != null) {
+ return null;
+ }
+
+ final Number direction = data.getNumber("Direction");
+ final int facing;
+ if (direction != null) {
+ data.remove("Direction");
+ facing = direction.intValue() % DIRECTIONS.length;
+ final int[] offsets = DIRECTIONS[facing];
+ data.setInt("TileX", data.getInt("TileX") + offsets[0]);
+ data.setInt("TileY", data.getInt("TileY") + offsets[1]);
+ data.setInt("TileZ", data.getInt("TileZ") + offsets[2]);
+ if ("ItemFrame".equals(data.getString("id"))) {
+ final Number rotation = data.getNumber("ItemRotation");
+ if (rotation != null) {
+ data.setByte("ItemRotation", (byte)(rotation.byteValue() * 2));
+ }
+ }
+ } else {
+ facing = data.getByte("Dir") % DIRECTIONS.length;
+ data.remove("Dir");
+ }
+
+ data.setByte("Facing", (byte)facing);
+
+ return null;
+ }
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1125.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1125.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff99e8e263d6fd234bce01c0c02fdb3eb0ff7eaa
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1125.java
@@ -0,0 +1,101 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookValueTypeEnforceNamespaced;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V1125 {
+
+ private static final int VERSION = MCVersions.V17W15A;
+ private static final int BED_BLOCK_ID = 416;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ final int chunkX = level.getInt("xPos");
+ final int chunkZ = level.getInt("zPos");
+
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections == null) {
+ return null;
+ }
+
+ ListType tileEntities = level.getList("TileEntities", ObjectType.MAP);
+ if (tileEntities == null) {
+ tileEntities = Types.NBT.createEmptyList();
+ level.setList("TileEntities", tileEntities);
+ }
+
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ final byte sectionY = section.getByte("Y");
+ final byte[] blocks = section.getBytes("Blocks");
+
+ if (blocks == null) {
+ continue;
+ }
+
+ for (int blockIndex = 0; blockIndex < blocks.length; ++blockIndex) {
+ if (BED_BLOCK_ID != ((blocks[blockIndex] & 255) << 4)) {
+ continue;
+ }
+
+ final int localX = blockIndex & 15;
+ final int localZ = (blockIndex >> 4) & 15;
+ final int localY = (blockIndex >> 8) & 15;
+
+ final MapType newTile = Types.NBT.createEmptyMap();
+ newTile.setString("id", "minecraft:bed");
+ newTile.setInt("x", localX + (chunkX << 4));
+ newTile.setInt("y", localY + (sectionY << 4));
+ newTile.setInt("z", localZ + (chunkZ << 4));
+ newTile.setShort("color", (short)14); // Red
+
+ tileEntities.addMap(newTile);
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:bed", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.getShort("Damage") == 0) {
+ data.setShort("Damage", (short)14); // Red
+ }
+
+ return null;
+ }
+ });
+
+
+ MCTypeRegistry.ADVANCEMENTS.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertKeys(MCTypeRegistry.BIOME, data.getMap("minecraft:adventure/adventuring_time"), "criteria", fromVersion, toVersion);
+ WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/kill_a_mob"), "criteria", fromVersion, toVersion);
+ WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/kill_all_mobs"), "criteria", fromVersion, toVersion);
+ WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/bred_all_animals"), "criteria", fromVersion, toVersion);
+
+ return null;
+ });
+
+ // Enforce namespacing for ids
+ MCTypeRegistry.BIOME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced());
+ }
+
+ private V1125() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V113.java b/ca/spottedleaf/dataconverter/minecraft/versions/V113.java
new file mode 100644
index 0000000000000000000000000000000000000000..3470afede273da32d98571524817dc1979b3044d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V113.java
@@ -0,0 +1,40 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V113 {
+
+ private static final int VERSION = MCVersions.V15W33C + 1;
+
+ private static void checkList(final MapType data, final String id, final int requiredLength) {
+ final ListType list = data.getList(id, ObjectType.FLOAT);
+ if (list != null && list.size() == requiredLength) {
+ for (int i = 0; i < requiredLength; ++i) {
+ if (list.getFloat(i) != 0.0F) {
+ return;
+ }
+ }
+ }
+
+ data.remove(id);
+ }
+
+ public static void register() {
+ // Removes "HandDropChances" and "ArmorDropChances" if they're empty.
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ checkList(data, "HandDropChances", 2);
+ checkList(data, "ArmorDropChances", 4);
+ return null;
+ }
+ });
+ }
+
+ private V113() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1344.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1344.java
new file mode 100644
index 0000000000000000000000000000000000000000..18d5a0f47066b8c92dc13e5b7c441f8c8258c85d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1344.java
@@ -0,0 +1,176 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+
+public final class V1344 {
+
+ private static final int VERSION = MCVersions.V1_12_2 + 1;
+
+ private static final Int2ObjectOpenHashMap<String> BUTTON_ID_TO_NAME = new Int2ObjectOpenHashMap<>();
+ static {
+ BUTTON_ID_TO_NAME.put(0, "key.unknown");
+ BUTTON_ID_TO_NAME.put(11, "key.0");
+ BUTTON_ID_TO_NAME.put(2, "key.1");
+ BUTTON_ID_TO_NAME.put(3, "key.2");
+ BUTTON_ID_TO_NAME.put(4, "key.3");
+ BUTTON_ID_TO_NAME.put(5, "key.4");
+ BUTTON_ID_TO_NAME.put(6, "key.5");
+ BUTTON_ID_TO_NAME.put(7, "key.6");
+ BUTTON_ID_TO_NAME.put(8, "key.7");
+ BUTTON_ID_TO_NAME.put(9, "key.8");
+ BUTTON_ID_TO_NAME.put(10, "key.9");
+ BUTTON_ID_TO_NAME.put(30, "key.a");
+ BUTTON_ID_TO_NAME.put(40, "key.apostrophe");
+ BUTTON_ID_TO_NAME.put(48, "key.b");
+ BUTTON_ID_TO_NAME.put(43, "key.backslash");
+ BUTTON_ID_TO_NAME.put(14, "key.backspace");
+ BUTTON_ID_TO_NAME.put(46, "key.c");
+ BUTTON_ID_TO_NAME.put(58, "key.caps.lock");
+ BUTTON_ID_TO_NAME.put(51, "key.comma");
+ BUTTON_ID_TO_NAME.put(32, "key.d");
+ BUTTON_ID_TO_NAME.put(211, "key.delete");
+ BUTTON_ID_TO_NAME.put(208, "key.down");
+ BUTTON_ID_TO_NAME.put(18, "key.e");
+ BUTTON_ID_TO_NAME.put(207, "key.end");
+ BUTTON_ID_TO_NAME.put(28, "key.enter");
+ BUTTON_ID_TO_NAME.put(13, "key.equal");
+ BUTTON_ID_TO_NAME.put(1, "key.escape");
+ BUTTON_ID_TO_NAME.put(33, "key.f");
+ BUTTON_ID_TO_NAME.put(59, "key.f1");
+ BUTTON_ID_TO_NAME.put(68, "key.f10");
+ BUTTON_ID_TO_NAME.put(87, "key.f11");
+ BUTTON_ID_TO_NAME.put(88, "key.f12");
+ BUTTON_ID_TO_NAME.put(100, "key.f13");
+ BUTTON_ID_TO_NAME.put(101, "key.f14");
+ BUTTON_ID_TO_NAME.put(102, "key.f15");
+ BUTTON_ID_TO_NAME.put(103, "key.f16");
+ BUTTON_ID_TO_NAME.put(104, "key.f17");
+ BUTTON_ID_TO_NAME.put(105, "key.f18");
+ BUTTON_ID_TO_NAME.put(113, "key.f19");
+ BUTTON_ID_TO_NAME.put(60, "key.f2");
+ BUTTON_ID_TO_NAME.put(61, "key.f3");
+ BUTTON_ID_TO_NAME.put(62, "key.f4");
+ BUTTON_ID_TO_NAME.put(63, "key.f5");
+ BUTTON_ID_TO_NAME.put(64, "key.f6");
+ BUTTON_ID_TO_NAME.put(65, "key.f7");
+ BUTTON_ID_TO_NAME.put(66, "key.f8");
+ BUTTON_ID_TO_NAME.put(67, "key.f9");
+ BUTTON_ID_TO_NAME.put(34, "key.g");
+ BUTTON_ID_TO_NAME.put(41, "key.grave.accent");
+ BUTTON_ID_TO_NAME.put(35, "key.h");
+ BUTTON_ID_TO_NAME.put(199, "key.home");
+ BUTTON_ID_TO_NAME.put(23, "key.i");
+ BUTTON_ID_TO_NAME.put(210, "key.insert");
+ BUTTON_ID_TO_NAME.put(36, "key.j");
+ BUTTON_ID_TO_NAME.put(37, "key.k");
+ BUTTON_ID_TO_NAME.put(82, "key.keypad.0");
+ BUTTON_ID_TO_NAME.put(79, "key.keypad.1");
+ BUTTON_ID_TO_NAME.put(80, "key.keypad.2");
+ BUTTON_ID_TO_NAME.put(81, "key.keypad.3");
+ BUTTON_ID_TO_NAME.put(75, "key.keypad.4");
+ BUTTON_ID_TO_NAME.put(76, "key.keypad.5");
+ BUTTON_ID_TO_NAME.put(77, "key.keypad.6");
+ BUTTON_ID_TO_NAME.put(71, "key.keypad.7");
+ BUTTON_ID_TO_NAME.put(72, "key.keypad.8");
+ BUTTON_ID_TO_NAME.put(73, "key.keypad.9");
+ BUTTON_ID_TO_NAME.put(78, "key.keypad.add");
+ BUTTON_ID_TO_NAME.put(83, "key.keypad.decimal");
+ BUTTON_ID_TO_NAME.put(181, "key.keypad.divide");
+ BUTTON_ID_TO_NAME.put(156, "key.keypad.enter");
+ BUTTON_ID_TO_NAME.put(141, "key.keypad.equal");
+ BUTTON_ID_TO_NAME.put(55, "key.keypad.multiply");
+ BUTTON_ID_TO_NAME.put(74, "key.keypad.subtract");
+ BUTTON_ID_TO_NAME.put(38, "key.l");
+ BUTTON_ID_TO_NAME.put(203, "key.left");
+ BUTTON_ID_TO_NAME.put(56, "key.left.alt");
+ BUTTON_ID_TO_NAME.put(26, "key.left.bracket");
+ BUTTON_ID_TO_NAME.put(29, "key.left.control");
+ BUTTON_ID_TO_NAME.put(42, "key.left.shift");
+ BUTTON_ID_TO_NAME.put(219, "key.left.win");
+ BUTTON_ID_TO_NAME.put(50, "key.m");
+ BUTTON_ID_TO_NAME.put(12, "key.minus");
+ BUTTON_ID_TO_NAME.put(49, "key.n");
+ BUTTON_ID_TO_NAME.put(69, "key.num.lock");
+ BUTTON_ID_TO_NAME.put(24, "key.o");
+ BUTTON_ID_TO_NAME.put(25, "key.p");
+ BUTTON_ID_TO_NAME.put(209, "key.page.down");
+ BUTTON_ID_TO_NAME.put(201, "key.page.up");
+ BUTTON_ID_TO_NAME.put(197, "key.pause");
+ BUTTON_ID_TO_NAME.put(52, "key.period");
+ BUTTON_ID_TO_NAME.put(183, "key.print.screen");
+ BUTTON_ID_TO_NAME.put(16, "key.q");
+ BUTTON_ID_TO_NAME.put(19, "key.r");
+ BUTTON_ID_TO_NAME.put(205, "key.right");
+ BUTTON_ID_TO_NAME.put(184, "key.right.alt");
+ BUTTON_ID_TO_NAME.put(27, "key.right.bracket");
+ BUTTON_ID_TO_NAME.put(157, "key.right.control");
+ BUTTON_ID_TO_NAME.put(54, "key.right.shift");
+ BUTTON_ID_TO_NAME.put(220, "key.right.win");
+ BUTTON_ID_TO_NAME.put(31, "key.s");
+ BUTTON_ID_TO_NAME.put(70, "key.scroll.lock");
+ BUTTON_ID_TO_NAME.put(39, "key.semicolon");
+ BUTTON_ID_TO_NAME.put(53, "key.slash");
+ BUTTON_ID_TO_NAME.put(57, "key.space");
+ BUTTON_ID_TO_NAME.put(20, "key.t");
+ BUTTON_ID_TO_NAME.put(15, "key.tab");
+ BUTTON_ID_TO_NAME.put(22, "key.u");
+ BUTTON_ID_TO_NAME.put(200, "key.up");
+ BUTTON_ID_TO_NAME.put(47, "key.v");
+ BUTTON_ID_TO_NAME.put(17, "key.w");
+ BUTTON_ID_TO_NAME.put(45, "key.x");
+ BUTTON_ID_TO_NAME.put(21, "key.y");
+ BUTTON_ID_TO_NAME.put(44, "key.z");
+ }
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ for (final String key : data.keys()) {
+ if (!key.startsWith("key_")) {
+ continue;
+ }
+ final String value = data.getString(key);
+ final int code;
+ try {
+ code = Integer.parseInt(value);
+ } catch (final NumberFormatException ex) {
+ continue;
+ }
+
+ final String newEntry;
+
+ if (code < 0) {
+ final int mouseCode = code + 100;
+ switch (mouseCode) {
+ case 0:
+ newEntry = "key.mouse.left";
+ break;
+ case 1:
+ newEntry = "key.mouse.right";
+ break;
+ case 2:
+ newEntry = "key.mouse.middle";
+ break;
+ default:
+ newEntry = "key.mouse." + (mouseCode + 1);
+ break;
+ }
+ } else {
+ newEntry = BUTTON_ID_TO_NAME.getOrDefault(code, "key.unknown");
+ }
+
+ // No CMEs occur for existing entries in maps.
+ data.setString(key, newEntry);
+ }
+ return null;
+ }
+ });
+ }
+
+ private V1344() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V135.java b/ca/spottedleaf/dataconverter/minecraft/versions/V135.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b6d09980bd1479ca9a4dc275f2abb4cfbecd545
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V135.java
@@ -0,0 +1,62 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V135 {
+
+ private static final int VERSION = MCVersions.V15W40B + 1;
+
+ public static void register() {
+ // In this update they changed the "Riding" value to be "Passengers", which is now a list. So it added
+ // support for multiple entities riding. Of course, Riding and Passenger are opposites - so it also will
+ // switch the data layout to be from highest rider to lowest rider, in terms of depth.
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(MapType data, final long sourceVersion, final long toVersion) {
+ MapType ret = null;
+ while (data.hasKey("Riding", ObjectType.MAP)) {
+ final MapType riding = data.getMap("Riding");
+ data.remove("Riding");
+
+ final ListType passengers = Types.NBT.createEmptyList();
+ riding.setList("Passengers", passengers);
+ passengers.addMap(data);
+
+ ret = data = riding;
+ }
+
+ return ret;
+ }
+ });
+
+
+ MCTypeRegistry.PLAYER.addStructureWalker(VERSION, new DataWalkerItemLists("Inventory", "EnderItems"));
+ MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType rootVehicle = data.getMap("RootVehicle");
+ if (rootVehicle != null) {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, rootVehicle, "Entity", fromVersion, toVersion);
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "ender_pearls", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Passengers", fromVersion, toVersion);
+
+ return MCTypeRegistry.ENTITY_EQUIPMENT.convert(data, fromVersion, toVersion);
+ });
+
+ }
+
+ private V135() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V143.java b/ca/spottedleaf/dataconverter/minecraft/versions/V143.java
new file mode 100644
index 0000000000000000000000000000000000000000..90889dddd8a510fe69c47413f5fe3ed4a756fedb
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V143.java
@@ -0,0 +1,17 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename;
+
+public final class V143 {
+
+ private static final int VERSION = MCVersions.V15W44B;
+
+ public static void register() {
+ ConverterAbstractEntityRename.register(VERSION, (final String input) -> {
+ return "TippedArrow".equals(input) ? "Arrow" : null;
+ });
+ }
+
+ private V143() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1446.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1446.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d1d3a5898e87754510e63ce7444286418a077ef
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1446.java
@@ -0,0 +1,35 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1446 {
+
+ private static final int VERSION = MCVersions.V17W43B + 1;
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ for (final String key : data.keys()) {
+ if (!key.startsWith("key_")) {
+ continue;
+ }
+
+ final String value = data.getString(key);
+
+ if (value.startsWith("key.mouse") || value.startsWith("scancode.")) {
+ continue;
+ }
+
+ data.setString(key, "key.keyboard." + value.substring("key.".length()));
+ }
+ return null;
+ }
+ });
+ }
+
+ private V1446() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1450.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1450.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f2e0b6c1f75c61230d138a2fa4328dd9cc99eab
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1450.java
@@ -0,0 +1,24 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1450 {
+
+ private static final int VERSION = MCVersions.V17W46A + 1;
+
+ public static void register() {
+ MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType ret = HelperBlockFlatteningV1450.flattenNBT(data);
+ return ret == data ? null : ret.copy(); // copy to avoid problems with later state datafixers
+ }
+ });
+ }
+
+ private V1450() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java
new file mode 100644
index 0000000000000000000000000000000000000000..1856060ba8124c36fd64c816921a4b908fec2bfd
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java
@@ -0,0 +1,518 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataHook;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterFlattenChunk;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperItemNameV102;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterFlattenItemStack;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterFlattenSpawnEgg;
+import ca.spottedleaf.dataconverter.minecraft.converters.stats.ConverterFlattenStats;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterFlattenEntity;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.minecraft.walkers.tile_entity.DataWalkerTileEntities;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.google.common.base.Splitter;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.util.datafix.fixes.BlockStateData;
+import net.minecraft.util.datafix.fixes.EntityBlockStateFix;
+import org.apache.commons.lang3.math.NumberUtils;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+public final class V1451 {
+
+ private static final int VERSION = MCVersions.V17W47A;
+
+ public static String packWithDot(final String string) {
+ final ResourceLocation resourceLocation = ResourceLocation.tryParse(string);
+ return resourceLocation != null ? resourceLocation.getNamespace() + "." + resourceLocation.getPath() : string;
+ }
+
+ public static void register() {
+ // V0
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, 0, "minecraft:trapped_chest", new DataWalkerItemLists("Items"));
+
+ // V1
+ MCTypeRegistry.CHUNK.addStructureConverter(new ConverterFlattenChunk());
+
+ MCTypeRegistry.CHUNK.addStructureWalker(VERSION, 1, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion);
+
+ final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP);
+ if (tileTicks != null) {
+ for (int i = 0, len = tileTicks.size(); i < len; ++i) {
+ final MapType tileTick = tileTicks.getMap(i);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion);
+ }
+ }
+
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections != null) {
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section, "Palette", fromVersion, toVersion);
+ }
+ }
+
+ return null;
+ });
+
+ // V2
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:piston", new DataConverter<>(VERSION, 2) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int blockId = data.getInt("blockId");
+ final int blockData = data.getInt("blockData") & 15;
+
+ data.remove("blockId");
+ data.remove("blockData");
+
+ data.setMap("blockState", HelperBlockFlatteningV1450.getNBTForId((blockId << 4) | blockData).copy()); // copy to avoid problems with later state datafixers
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, 2, "minecraft:piston", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "blockState"));
+
+ // V3
+ ConverterFlattenEntity.register();
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:filled_map", new DataConverter<>(VERSION, 3) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ MapType tag = data.getMap("tag");
+ if (tag == null) {
+ tag = Types.NBT.createEmptyMap();
+ data.setMap("tag", tag);
+ }
+
+ if (!tag.hasKey("map", ObjectType.NUMBER)) { // This if is from CB. as usual, no documentation from CB. I'm guessing it just wants to avoid possibly overwriting it. seems fine.
+ tag.setInt("map", data.getInt("Damage"));
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:potion", new DataWalkerItems("Potion"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:arrow", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:enderman", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "carriedBlockState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:falling_block", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "BlockState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:falling_block", new DataWalkerTileEntities("TileEntityData"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:spectral_arrow", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:chest_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:chest_minecart", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:commandblock_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:commandblock_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "LastOutput"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:furnace_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:hopper_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:hopper_minecart", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:spawner_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:spawner_minecart", (final MapType data, final long fromVersion, final long toVersion) -> {
+ return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ });
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:tnt_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState"));
+
+ // V4
+ MCTypeRegistry.BLOCK_NAME.addConverter(new DataConverter<>(VERSION, 4) {
+ @Override
+ public Object convert(final Object data, final long sourceVersion, final long toVersion) {
+ if (data instanceof Number) {
+ return HelperBlockFlatteningV1450.getNameForId(((Number)data).intValue());
+ } else if (data instanceof String) {
+ return HelperBlockFlatteningV1450.getNewBlockName((String)data); // structure hook ensured data is namespaced
+ }
+ return null;
+ }
+ });
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new ConverterFlattenItemStack());
+
+ // V5
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:spawn_egg", new ConverterFlattenSpawnEgg(VERSION, 5));
+ /* This datafixer has been disabled because the collar colour handler did not change from 1.12 -> 1.13 at all.
+ // So clearly somebody fucked up. This fixes wolf colours incorrectly converting between versions
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:wolf", new DataConverter<>(VERSION, 5) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final Number colour = data.getNumber("CollarColor");
+
+ if (colour != null) {
+ data.setByte("CollarColor", (byte)(15 - colour.intValue()));
+ }
+
+ return null;
+ }
+ });
+ */
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION, 5) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final Number base = data.getNumber("Base");
+ if (base != null) {
+ data.setInt("Base", 15 - base.intValue());
+ }
+
+ final ListType patterns = data.getList("Patterns", ObjectType.MAP);
+ if (patterns != null) {
+ for (int i = 0, len = patterns.size(); i < len; ++i) {
+ final MapType pattern = patterns.getMap(i);
+ final Number colour = pattern.getNumber("Color");
+ if (colour != null) {
+ pattern.setInt("Color", 15 - colour.intValue());
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+ MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION, 5) {
+ private final Splitter SPLITTER = Splitter.on(';').limit(5);
+ private final Splitter LAYER_SPLITTER = Splitter.on(',');
+ private final Splitter OLD_AMOUNT_SPLITTER = Splitter.on('x').limit(2);
+ private final Splitter AMOUNT_SPLITTER = Splitter.on('*').limit(2);
+ private final Splitter BLOCK_SPLITTER = Splitter.on(':').limit(3);
+
+ // idk man i just copy and pasted this one
+ private String fixGeneratorSettings(final String generatorSettings) {
+ if (generatorSettings.isEmpty()) {
+ return "minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;1;village";
+ } else {
+ Iterator<String> iterator = SPLITTER.split(generatorSettings).iterator();
+ String string2 = (String)iterator.next();
+ int j;
+ String string4;
+ if (iterator.hasNext()) {
+ j = NumberUtils.toInt(string2, 0);
+ string4 = (String)iterator.next();
+ } else {
+ j = 0;
+ string4 = string2;
+ }
+
+ if (j >= 0 && j <= 3) {
+ StringBuilder stringBuilder = new StringBuilder();
+ Splitter splitter = j < 3 ? OLD_AMOUNT_SPLITTER : AMOUNT_SPLITTER;
+ stringBuilder.append((String) StreamSupport.stream(LAYER_SPLITTER.split(string4).spliterator(), false).map((stringx) -> {
+ List<String> list = splitter.splitToList(stringx);
+ int k;
+ String string3;
+ if (list.size() == 2) {
+ k = NumberUtils.toInt((String)list.get(0));
+ string3 = (String)list.get(1);
+ } else {
+ k = 1;
+ string3 = (String)list.get(0);
+ }
+
+ List<String> list2 = BLOCK_SPLITTER.splitToList(string3);
+ int l = ((String)list2.get(0)).equals("minecraft") ? 1 : 0;
+ String string5 = (String)list2.get(l);
+ int m = j == 3 ? EntityBlockStateFix.getBlockId("minecraft:" + string5) : NumberUtils.toInt(string5, 0);
+ int n = l + 1;
+ int o = list2.size() > n ? NumberUtils.toInt((String)list2.get(n), 0) : 0;
+ return (k == 1 ? "" : k + "*") + BlockStateData.getTag(m << 4 | o).get("Name").asString("");
+ }).collect(Collectors.joining(",")));
+
+ while(iterator.hasNext()) {
+ stringBuilder.append(';').append((String)iterator.next());
+ }
+
+ return stringBuilder.toString();
+ } else {
+ return "minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;1;village";
+ }
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!"flat".equalsIgnoreCase(data.getString("generatorName"))) {
+ return null;
+ }
+
+ final String generatorOptions = data.getString("generatorOptions");
+ if (generatorOptions == null) {
+ return null;
+ }
+
+ data.setString("generatorOptions", this.fixGeneratorSettings(generatorOptions));
+
+ return null;
+ }
+ });
+
+ // V6
+ MCTypeRegistry.STATS.addStructureConverter(ConverterFlattenStats.makeStatsConverter());
+ MCTypeRegistry.OBJECTIVE.addStructureConverter(ConverterFlattenStats.makeObjectiveConverter());
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:jukebox", new DataConverter<>(VERSION, 6) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int record = data.getInt("Record");
+ if (record <= 0) {
+ return null;
+ }
+
+ data.remove("Record");
+
+ final String newItemId = ConverterFlattenItemStack.flattenItem(HelperItemNameV102.getNameFromId(record), 0);
+ if (newItemId == null) {
+ return null;
+ }
+
+ final MapType recordItem = Types.NBT.createEmptyMap();
+ data.setMap("RecordItem", recordItem);
+
+ recordItem.setString("id", newItemId);
+ recordItem.setByte("Count", (byte)1);
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.STATS.addStructureWalker(VERSION, 6, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType stats = data.getMap("stats");
+ if (stats == null) {
+ return null;
+ }
+
+ WalkerUtils.convertKeys(MCTypeRegistry.BLOCK_NAME, stats, "minecraft:mined", fromVersion, toVersion);
+
+ WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:crafted", fromVersion, toVersion);
+ WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:used", fromVersion, toVersion);
+ WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:broken", fromVersion, toVersion);
+ WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:picked_up", fromVersion, toVersion);
+ WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:dropped", fromVersion, toVersion);
+
+ WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, stats, "minecraft:killed", fromVersion, toVersion);
+ WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, stats, "minecraft:killed_by", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.OBJECTIVE.addStructureHook(VERSION, 6, new DataHook<>() {
+ @Override
+ public MapType preHook(final MapType data, final long fromVersion, final long toVersion) {
+ // unpack
+ final String criteriaName = data.getString("CriteriaName");
+ String type;
+ String id;
+
+ if (criteriaName != null) {
+ final int index = criteriaName.indexOf(':');
+ if (index < 0) {
+ type = "_special";
+ id = criteriaName;
+ } else {
+ try {
+ type = ResourceLocation.bySeparator(criteriaName.substring(0, index), '.').toString();
+ id = ResourceLocation.bySeparator(criteriaName.substring(index + 1), '.').toString();
+ } catch (final Exception ex) {
+ type = "_special";
+ id = criteriaName;
+ }
+ }
+ } else {
+ type = null;
+ id = null;
+ }
+
+ if (type != null && id != null) {
+ final MapType criteriaType = Types.NBT.createEmptyMap();
+ data.setMap("CriteriaType", criteriaType);
+
+ criteriaType.setString("type", type);
+ criteriaType.setString("id", id);
+ }
+
+ return null;
+ }
+
+ @Override
+ public MapType postHook(final MapType data, final long fromVersion, final long toVersion) {
+ // repack
+ final MapType criteriaType = data.getMap("CriteriaType");
+
+ final String newName;
+ if (criteriaType == null) {
+ newName = null;
+ } else {
+ final String type = criteriaType.getString("type");
+ final String id = criteriaType.getString("id");
+ if (type != null && id != null) {
+ if ("_special".equals(type)) {
+ newName = id;
+ } else {
+ newName = packWithDot(type) + ":" + packWithDot(id);
+ }
+ } else {
+ newName = null;
+ }
+ }
+
+ if (newName != null) {
+ data.remove("CriteriaType");
+ data.setString("CriteriaName", newName);
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.OBJECTIVE.addStructureWalker(VERSION, 6, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "DisplayName", fromVersion, toVersion);
+
+ final MapType criteriaType = data.getMap("CriteriaType");
+ if (criteriaType == null) {
+ return null;
+ }
+
+ final String type = criteriaType.getString("type");
+
+ if (type == null) {
+ return null;
+ }
+
+ switch (type) {
+ case "minecraft:mined": {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, criteriaType, "id", fromVersion, toVersion);
+ break;
+ }
+
+ case "minecraft:crafted":
+ case "minecraft:used":
+ case "minecraft:broken":
+ case "minecraft:picked_up":
+ case "minecraft:dropped": {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, criteriaType, "id", fromVersion, toVersion);
+ break;
+ }
+
+ case "minecraft:killed":
+ case "minecraft:killed_by": {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, criteriaType, "id", fromVersion, toVersion);
+ break;
+ }
+ }
+
+ return null;
+ });
+
+
+ // V7
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION, 7) {
+ private static void convertToBlockState(final MapType data, final String path) {
+ final Number number = data.getNumber(path);
+ if (number == null) {
+ return;
+ }
+
+ data.setMap(path, HelperBlockFlatteningV1450.getNBTForId(number.intValue() << 4).copy()); // copy to avoid problems with later state datafixers
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType children = data.getList("Children", ObjectType.MAP);
+ if (children == null) {
+ return null;
+ }
+
+ for (int i = 0, len = children.size(); i < len; ++i) {
+ final MapType child = children.getMap(i);
+
+ final String id = child.getString("id");
+
+ switch (id) {
+ case "ViF":
+ convertToBlockState(child, "CA");
+ convertToBlockState(child, "CB");
+ break;
+ case "ViDF":
+ convertToBlockState(child, "CA");
+ convertToBlockState(child, "CB");
+ convertToBlockState(child, "CC");
+ convertToBlockState(child, "CD");
+ break;
+ }
+ }
+
+ return null;
+ }
+ });
+
+ // convert villagers to trade with pumpkins and not the carved pumpkin
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION, 7) {
+ private static void convertPumpkin(final MapType data, final String path) {
+ final MapType item = data.getMap(path);
+ if (item == null) {
+ return;
+ }
+
+ final String id = item.getString("id");
+
+ if (id.equals("minecraft:carved_pumpkin")) {
+ item.setString("id", "minecraft:pumpkin");
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType offers = data.getMap("Offers");
+ if (offers != null) {
+ final ListType recipes = offers.getList("Recipes", ObjectType.MAP);
+ if (recipes != null) {
+ for (int i = 0, len = recipes.size(); i < len; ++i) {
+ final MapType recipe = recipes.getMap(i);
+
+ convertPumpkin(recipe, "buy");
+ convertPumpkin(recipe, "buyB");
+ convertPumpkin(recipe, "sell");
+ }
+ }
+ }
+ return null;
+ }
+ });
+
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureWalker(VERSION, 7, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final ListType list = data.getListUnchecked("Children");
+ if (list == null) {
+ return null;
+ }
+
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType child = list.getMap(i, null);
+ if (child == null) {
+ continue;
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CA", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CB", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CC", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CD", fromVersion, toVersion);
+ }
+
+ return null;
+ });
+ }
+
+ private V1451() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1456.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1456.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ea9da33a49891da1e12fd1e870118c6e74c7464
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1456.java
@@ -0,0 +1,37 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1456 {
+
+ private static final int VERSION = MCVersions.V17W49B + 1;
+
+ private static byte direction2dTo3d(final byte old) {
+ switch (old) {
+ case 0:
+ return 3;
+ case 1:
+ return 4;
+ case 2:
+ default:
+ return 2;
+ case 3:
+ return 5;
+ }
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:item_frame", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setByte("Facing", direction2dTo3d(data.getByte("Facing")));
+ return null;
+ }
+ });
+ }
+
+ private V1456() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java
new file mode 100644
index 0000000000000000000000000000000000000000..84104a80ee0c0b408dda258a84cdca8c03997093
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java
@@ -0,0 +1,142 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1458 {
+
+ public static final int VERSION = MCVersions.V17W50A + 1;
+
+ public static MapType updateCustomName(final MapType data) {
+ final String customName = data.getString("CustomName", "");
+
+ if (customName.isEmpty()) {
+ data.remove("CustomName");
+ } else {
+ data.setString("CustomName", ComponentUtils.createPlainTextComponent(customName));
+ }
+
+ return null;
+ }
+
+ static void named(final int version, final String id) {
+ MCTypeRegistry.TILE_ENTITY.addWalker(version, id, new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "CustomName"));
+ }
+
+ static void namedInventory(final int version, final String id) {
+ named(version, id);
+ MCTypeRegistry.TILE_ENTITY.addWalker(version, id, new DataWalkerItemLists("Items"));
+ }
+
+ public static void register() {
+ // From CB
+ MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ return updateCustomName(data);
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if ("minecraft:commandblock_minecart".equals(data.getString("id"))) {
+ return null;
+ }
+
+ return updateCustomName(data);
+ }
+ });
+
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType display = tag.getMap("display");
+ if (display == null) {
+ return null;
+ }
+
+ final String name = display.getString("Name");
+ if (name != null) {
+ display.setString("Name", ComponentUtils.createPlainTextComponent(name));
+ } /* In 1.20.5, Mojang removed this branch (ItemCustomNameToComponentFix) */ /*else {
+ final String localisedName = display.getString("LocName");
+ if (localisedName != null) {
+ display.setString("Name", ComponentUtils.createTranslatableComponent(localisedName));
+ display.remove("LocName");
+ }
+ }*/
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if ("minecraft:command_block".equals(data.getString("id"))) {
+ return null;
+ }
+
+ return updateCustomName(data);
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Passengers", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "CustomName", fromVersion, toVersion);
+
+ return MCTypeRegistry.ENTITY_EQUIPMENT.convert(data, fromVersion, toVersion);
+ });
+
+ // Note: This is not present in Vanilla, but since we have the converter from CB it makes sense that we
+ // would walk the CustomName field for Player if we are converting it
+ MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("RootVehicle"), "Entity", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "ender_pearls", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "EnderItems", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityLeft", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityRight", fromVersion, toVersion);
+
+ final MapType recipeBook = data.getMap("recipeBook");
+ if (recipeBook != null) {
+ WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "recipes", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "toBeDisplayed", fromVersion, toVersion);
+ }
+
+ // "From CB"
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "CustomName", fromVersion, toVersion);
+
+ return null;
+ });
+
+ named(VERSION, "minecraft:beacon");
+ named(VERSION, "minecraft:banner");
+ namedInventory(VERSION, "minecraft:brewing_stand");
+ namedInventory(VERSION, "minecraft:chest");
+ namedInventory(VERSION, "minecraft:trapped_chest");
+ namedInventory(VERSION, "minecraft:dispenser");
+ namedInventory(VERSION, "minecraft:dropper");
+ named(VERSION, "minecraft:enchanting_table");
+ namedInventory(VERSION, "minecraft:furnace");
+ namedInventory(VERSION, "minecraft:hopper");
+ namedInventory(VERSION, "minecraft:shulker_box");
+ }
+
+ private V1458() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1460.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1460.java
new file mode 100644
index 0000000000000000000000000000000000000000..dca03108730af672445463326aabc156e6ae16ca
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1460.java
@@ -0,0 +1,45 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.block_name.DataWalkerBlockNames;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import net.minecraft.resources.ResourceLocation;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+public final class V1460 {
+
+ private static final Map<String, String> MOTIVE_REMAP = new HashMap<>();
+
+ static {
+ MOTIVE_REMAP.put("donkeykong", "donkey_kong");
+ MOTIVE_REMAP.put("burningskull", "burning_skull");
+ MOTIVE_REMAP.put("skullandroses", "skull_and_roses");
+ }
+
+ private static final int VERSION = MCVersions.V18W01A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:painting", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ String motive = data.getString("Motive");
+ if (motive != null) {
+ motive = motive.toLowerCase(Locale.ROOT);
+ data.setString("Motive", NamespaceUtil.correctNamespace(MOTIVE_REMAP.getOrDefault(motive, motive)));
+ }
+ return null;
+ }
+ });
+
+ // No idea why so many type redefines exist here in Vanilla. nothing about the data structure changed, it's literally a copy of
+ // the existing types.
+ }
+
+ private V1460() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1466.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1466.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4d308812e8b86cca7a0fde5db133b5357895959
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1466.java
@@ -0,0 +1,142 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V1466 {
+
+ private static final int VERSION = MCVersions.V18W06A;
+
+ private static short packOffsetCoordinates(final int x, final int y, final int z) {
+ return (short)((x & 15) | ((y & 15) << 4) | ((z & 15) << 8));
+ }
+
+ public static void register() {
+ // There is a rather critical change I've made to this converter: changing the chunk status determination.
+ // In Vanilla, this is determined by whether the terrain has been populated and whether the chunk is lit.
+ // For reference, here is the full status progression (at the time of 18w06a):
+ // empty -> base -> carved -> decorated -> lighted -> mobs_spawned -> finalized -> fullchunk -> postprocessed
+ // So one of those must be picked.
+ // If the chunk is lit and terrain is populated, the Vanilla converter will set the status to "mobs_spawned."
+ // If it is anything else, it will be "empty"
+ // I've changed it to the following: if terrain is populated, it is set to at least decorated. If it is populated
+ // and lit, it is set to "mobs_spawned"
+ // But what if it is not populated? If it is not populated, ignore the lit field - obviously that's just broken.
+ // It can't be lit and not populated.
+ // Let's take a look at chunk generation logic for a chunk that is not populated, or even near a populated chunk.
+ // It actually will generate a chunk up to the "carved" stage. It generates the base terrain, (i.e using noise
+ // to figure out where stone is, dirt, grass) and it will generate caves. Nothing else though. No populators.
+ // So "carved" is the correct stage to use, not empty. Setting it to empty would clobber chunk data, when we don't
+ // need to. If it is populated, at least set it to decorated. If it is lit and populated, set it to mobs_spawned. Else,
+ // it is carved.
+ // This change also fixes the random light check "bug" (really this is Mojang's fault for fucking up the status conversion here)
+ // caused by spigot, which would not set the lit value for some chunks. Now those chunks will not be regenerated.
+
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ final boolean terrainPopulated = level.getBoolean("TerrainPopulated");
+ final boolean lightPopulated = level.getBoolean("LightPopulated") || level.getNumber("LightPopulated") == null;
+ final String newStatus = !terrainPopulated ? "carved" : (lightPopulated ? "mobs_spawned" : "decorated");
+
+ level.setString("Status", newStatus);
+ level.setBoolean("hasLegacyStructureData", true);
+
+ // convert biome byte[] into int[]
+ final byte[] biomes = level.getBytes("Biomes");
+ if (biomes != null) {
+ final int[] newBiomes = new int[256];
+ for (int i = 0, len = Math.min(newBiomes.length, biomes.length); i < len; ++i) {
+ newBiomes[i] = biomes[i] & 255;
+ }
+ level.setInts("Biomes", newBiomes);
+ }
+
+ // ProtoChunks have their own dedicated tick list, so we must convert the TileTicks to that.
+ final ListType ticks = level.getList("TileTicks", ObjectType.MAP);
+ if (ticks != null) {
+ final ListType sections = Types.NBT.createEmptyList();
+ final ListType[] sectionAccess = new ListType[16];
+ for (int i = 0; i < sectionAccess.length; ++i) {
+ sections.addList(sectionAccess[i] = Types.NBT.createEmptyList());
+ }
+ level.setList("ToBeTicked", sections);
+
+ for (int i = 0, len = ticks.size(); i < len; ++i) {
+ final MapType tick = ticks.getMap(i);
+
+ final int x = tick.getInt("x");
+ final int y = tick.getInt("y");
+ final int z = tick.getInt("z");
+ final short coordinate = packOffsetCoordinates(x, y, z);
+
+ sectionAccess[y >> 4].addShort(coordinate);
+ }
+ }
+
+ return null;
+ }
+ });
+
+
+ MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion);
+
+ final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP);
+ if (tileTicks != null) {
+ for (int i = 0, len = tileTicks.size(); i < len; ++i) {
+ final MapType tileTick = tileTicks.getMap(i);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion);
+ }
+ }
+
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections != null) {
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section, "Palette", fromVersion, toVersion);
+ }
+ }
+
+ WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, level.getMap("Structures"), "Starts", fromVersion, toVersion);
+
+ return null;
+ });
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final ListType list = data.getList("Children", ObjectType.MAP);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType child = list.getMap(i);
+
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CA", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CB", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CC", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CD", fromVersion, toVersion);
+ }
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.BIOME, data, "biome", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ private V1466() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V147.java b/ca/spottedleaf/dataconverter/minecraft/versions/V147.java
new file mode 100644
index 0000000000000000000000000000000000000000..02df67a0bb6d7dc3f7e6b7de5c0978295661c72f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V147.java
@@ -0,0 +1,26 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V147 {
+
+ private static final int VERSION = MCVersions.V15W46A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("ArmorStand", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.getBoolean("Silent") && !data.getBoolean("Marker")) {
+ data.remove("Silent");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V147() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java
new file mode 100644
index 0000000000000000000000000000000000000000..42cf72340be7e1ef84f794a569f2f00e5e56429e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java
@@ -0,0 +1,27 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+
+public final class V1470 {
+
+ private static final int VERSION = MCVersions.V18W08A;
+
+ public static void register() {
+ //registerMob("minecraft:turtle"); // is now simple in 1.21.5
+ //registerMob("minecraft:cod_mob"); // is now simple in 1.21.5
+ //registerMob("minecraft:tropical_fish"); // is now simple in 1.21.5
+ //registerMob("minecraft:salmon_mob"); // is now simple in 1.21.5
+ //registerMob("minecraft:puffer_fish"); // is now simple in 1.21.5
+ //registerMob("minecraft:phantom"); // is now simple in 1.21.5
+ //registerMob("minecraft:dolphin"); // is now simple in 1.21.5
+ //registerMob("minecraft:drowned"); // is now simple in 1.21.5
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trident", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trident", new DataWalkerItems("Trident"));
+ }
+
+ private V1470() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1474.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1474.java
new file mode 100644
index 0000000000000000000000000000000000000000..244baa4f38102ecbfdb7fe0b14bf0be1816a59a2
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1474.java
@@ -0,0 +1,34 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1474 {
+
+ private static final int VERSION = MCVersions.V18W10B;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.getInt("Color") == 10) {
+ data.setByte("Color", (byte)16);
+ }
+ return null;
+ }
+ });
+ // data hooks ensure the inputs are namespaced
+ ConverterAbstractBlockRename.register(VERSION, (final String old) -> {
+ return "minecraft:purple_shulker_box".equals(old) ? "minecraft:shulker_box" : null;
+ });
+ ConverterAbstractItemRename.register(VERSION, (final String old) -> {
+ return "minecraft:purple_shulker_box".equals(old) ? "minecraft:shulker_box" : null;
+ });
+ }
+
+ private V1474() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1475.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1475.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ae50eea847671f3995688901c79caf520440d7a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1475.java
@@ -0,0 +1,22 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V1475 {
+
+ private static final int VERSION = MCVersions.V18W10B + 1;
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:flowing_water", "minecraft:water",
+ "minecraft:flowing_lava", "minecraft:lava"
+ )
+ )::get);
+ }
+
+ private V1475() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1480.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1480.java
new file mode 100644
index 0000000000000000000000000000000000000000..7180c1168bffb9fe70d18fe7414a5372518413a8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1480.java
@@ -0,0 +1,45 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1480 {
+
+ private static final int VERSION = MCVersions.V18W14A + 1;
+
+ public static final Map<String, String> RENAMED_IDS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:blue_coral", "minecraft:tube_coral_block")
+ .put("minecraft:pink_coral", "minecraft:brain_coral_block")
+ .put("minecraft:purple_coral", "minecraft:bubble_coral_block")
+ .put("minecraft:red_coral", "minecraft:fire_coral_block")
+ .put("minecraft:yellow_coral", "minecraft:horn_coral_block")
+ .put("minecraft:blue_coral_plant", "minecraft:tube_coral")
+ .put("minecraft:pink_coral_plant", "minecraft:brain_coral")
+ .put("minecraft:purple_coral_plant", "minecraft:bubble_coral")
+ .put("minecraft:red_coral_plant", "minecraft:fire_coral")
+ .put("minecraft:yellow_coral_plant", "minecraft:horn_coral")
+ .put("minecraft:blue_coral_fan", "minecraft:tube_coral_fan")
+ .put("minecraft:pink_coral_fan", "minecraft:brain_coral_fan")
+ .put("minecraft:purple_coral_fan", "minecraft:bubble_coral_fan")
+ .put("minecraft:red_coral_fan", "minecraft:fire_coral_fan")
+ .put("minecraft:yellow_coral_fan", "minecraft:horn_coral_fan")
+ .put("minecraft:blue_dead_coral", "minecraft:dead_tube_coral")
+ .put("minecraft:pink_dead_coral", "minecraft:dead_brain_coral")
+ .put("minecraft:purple_dead_coral", "minecraft:dead_bubble_coral")
+ .put("minecraft:red_dead_coral", "minecraft:dead_fire_coral")
+ .put("minecraft:yellow_dead_coral", "minecraft:dead_horn_coral")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, RENAMED_IDS::get);
+ ConverterAbstractItemRename.register(VERSION, RENAMED_IDS::get);
+ }
+
+ private V1480() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1483.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1483.java
new file mode 100644
index 0000000000000000000000000000000000000000..56d9babebba8b8ba6be07ea413e9c04ffea84023
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1483.java
@@ -0,0 +1,30 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V1483 {
+
+ private static final int VERSION = MCVersions.V18W16A;
+
+ public static void register() {
+ ConverterAbstractEntityRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:puffer_fish", "minecraft:pufferfish"
+ )
+ )::get);
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:puffer_fish_spawn_egg", "minecraft:pufferfish_spawn_egg"
+ )
+ )::get);
+
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:puffer_fish", "minecraft:pufferfish");
+ }
+
+ private V1483() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1484.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1484.java
new file mode 100644
index 0000000000000000000000000000000000000000..cdc8ab8b0e1fc88cba8fd1d3000180288fe8d5fd
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1484.java
@@ -0,0 +1,75 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1484 {
+
+ private static final int VERSION = MCVersions.V18W19A;
+
+ public static void register() {
+ final Map<String, String> renamed = new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:sea_grass", "minecraft:seagrass",
+ "minecraft:tall_sea_grass", "minecraft:tall_seagrass"
+ )
+ );
+
+ ConverterAbstractItemRename.register(VERSION, renamed::get);
+ ConverterAbstractBlockRename.register(VERSION, renamed::get);
+
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+
+ if (level == null) {
+ return null;
+ }
+
+ final MapType heightmaps = level.getMap("Heightmaps");
+
+ if (heightmaps == null) {
+ return null;
+ }
+
+ final Object liquid = heightmaps.getGeneric("LIQUID");
+ if (liquid != null) {
+ heightmaps.remove("LIQUID");
+ heightmaps.setGeneric("WORLD_SURFACE_WG", liquid);
+ }
+
+ final Object solid = heightmaps.getGeneric("SOLID");
+ if (solid != null) {
+ heightmaps.remove("SOLID");
+ heightmaps.setGeneric("OCEAN_FLOOR_WG", solid);
+ heightmaps.setGeneric("OCEAN_FLOOR", solid);
+ }
+
+ final Object light = heightmaps.getGeneric("LIGHT");
+ if (light != null) {
+ heightmaps.remove("LIGHT");
+ heightmaps.setGeneric("LIGHT_BLOCKING", light);
+ }
+
+ final Object rain = heightmaps.getGeneric("RAIN");
+ if (rain != null) {
+ heightmaps.remove("RAIN");
+ heightmaps.setGeneric("MOTION_BLOCKING", rain);
+ heightmaps.setGeneric("MOTION_BLOCKING_NO_LEAVES", rain);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1484() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1486.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1486.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9e42da41064ea293a71dbf2d681a857b2e1812e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1486.java
@@ -0,0 +1,39 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1486 {
+
+ private static final int VERSION = MCVersions.V18W19B + 1;
+
+ public static final Map<String, String> RENAMED_ENTITY_IDS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:salmon_mob", "minecraft:salmon")
+ .put("minecraft:cod_mob", "minecraft:cod")
+ .build()
+ );
+ public static final Map<String, String> RENAMED_ITEM_IDS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:salmon_mob_spawn_egg", "minecraft:salmon_spawn_egg")
+ .put("minecraft:cod_mob_spawn_egg", "minecraft:cod_spawn_egg")
+ .build()
+ );
+
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:cod_mob", "minecraft:cod");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:salmon_mob", "minecraft:salmon");
+
+ ConverterAbstractEntityRename.register(VERSION, RENAMED_ENTITY_IDS::get);
+ ConverterAbstractItemRename.register(VERSION, RENAMED_ITEM_IDS::get);
+ }
+
+ private V1486() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1487.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1487.java
new file mode 100644
index 0000000000000000000000000000000000000000..884049818efdf273443fb3d1c2d7250564fbdbf7
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1487.java
@@ -0,0 +1,27 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1487 {
+
+ private static final int VERSION = MCVersions.V18W19B + 2;
+
+ public static void register() {
+ final Map<String, String> remap = new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:prismarine_bricks_slab", "minecraft:prismarine_brick_slab",
+ "minecraft:prismarine_bricks_stairs", "minecraft:prismarine_brick_stairs"
+ )
+ );
+
+ ConverterAbstractItemRename.register(VERSION, remap::get);
+ ConverterAbstractBlockRename.register(VERSION, remap::get);
+ }
+
+ private V1487() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1488.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1488.java
new file mode 100644
index 0000000000000000000000000000000000000000..a291dc5b9dbc4362038fcfb6fbb0de405b693c11
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1488.java
@@ -0,0 +1,99 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import com.google.common.collect.ImmutableMap;
+
+import java.util.HashMap;
+
+public final class V1488 {
+
+ private static final int VERSION = MCVersions.V18W19B + 3;
+
+ private static boolean isIglooPiece(final MapType piece) {
+ return "Iglu".equals(piece.getString("id"));
+ }
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:kelp_top", "minecraft:kelp",
+ "minecraft:kelp", "minecraft:kelp_plant"
+ )
+ )::get);
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:kelp_top", "minecraft:kelp"
+ )
+ )::get);
+
+ // Don't ask me why in V1458 they wrote the converter to NOT do command blocks and THEN in THIS version
+ // to ONLY do command blocks. I don't know.
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:command_block", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ return V1458.updateCustomName(data);
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:commandblock_minecart", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ return V1458.updateCustomName(data);
+ }
+ });
+
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType children = data.getList("Children", ObjectType.MAP);
+ boolean isIgloo;
+ if (children != null) {
+ isIgloo = true;
+ for (int i = 0, len = children.size(); i < len; ++i) {
+ if (!isIglooPiece(children.getMap(i))) {
+ isIgloo = false;
+ break;
+ }
+ }
+ } else {
+ isIgloo = false;
+ }
+
+ if (isIgloo) {
+ data.remove("Children");
+ data.setString("id", "Igloo");
+ return null;
+ }
+
+ if (children != null) {
+ for (int i = 0; i < children.size();) {
+ final MapType child = children.getMap(i);
+ if (isIglooPiece(child)) {
+ children.remove(i);
+ continue;
+ }
+ ++i;
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:command_block",
+ new DataWalkerTypePaths<>(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, "Command")
+ );
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:command_block", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "CustomName", "LastOutput"));
+ }
+
+ private V1488() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1490.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1490.java
new file mode 100644
index 0000000000000000000000000000000000000000..1e99de15732bdd283835a9531f76e29ddab91f46
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1490.java
@@ -0,0 +1,30 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+
+import java.util.HashMap;
+
+public final class V1490 {
+
+ private static final int VERSION = MCVersions.V18W20A + 1;
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:melon_block", "minecraft:melon"
+ )
+ )::get);
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:melon_block", "minecraft:melon",
+ "minecraft:melon", "minecraft:melon_slice",
+ "minecraft:speckled_melon", "minecraft:glistering_melon_slice"
+ )
+ )::get);
+ }
+
+ private V1490() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1492.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1492.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa18e481f2d54d20784fe6af27846ec0d297f9c1
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1492.java
@@ -0,0 +1,151 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import com.google.common.collect.ImmutableMap;
+import com.mojang.datafixers.util.Pair;
+
+public final class V1492 {
+
+ private static final ImmutableMap<String, Pair<String, ImmutableMap<String, String>>> RENAMES = ImmutableMap.<String, Pair<String, ImmutableMap<String, String>>>builder()
+ .put("EndCity", Pair.of(
+ "ECP",
+ ImmutableMap.<String, String>builder()
+ .put("second_floor", "second_floor_1")
+ .put("third_floor", "third_floor_1")
+ .put("third_floor_c", "third_floor_2")
+ .build()
+ )
+ )
+
+ .put("Mansion", Pair.of(
+ "WMP",
+ ImmutableMap.<String, String>builder()
+ .put("carpet_south", "carpet_south_1")
+ .put("carpet_west", "carpet_west_1")
+ .put("indoors_door", "indoors_door_1")
+ .put("indoors_wall", "indoors_wall_1")
+ .build()
+ )
+ )
+
+ .put("Igloo", Pair.of(
+ "Iglu",
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:igloo/igloo_bottom", "minecraft:igloo/bottom")
+ .put("minecraft:igloo/igloo_middle", "minecraft:igloo/middle")
+ .put("minecraft:igloo/igloo_top", "minecraft:igloo/top")
+ .build()
+ )
+ )
+ .put("Ocean_Ruin", Pair.of(
+ "ORP",
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:ruin/big_ruin1_brick", "minecraft:underwater_ruin/big_brick_1")
+ .put("minecraft:ruin/big_ruin2_brick", "minecraft:underwater_ruin/big_brick_2")
+ .put("minecraft:ruin/big_ruin3_brick", "minecraft:underwater_ruin/big_brick_3")
+ .put("minecraft:ruin/big_ruin8_brick", "minecraft:underwater_ruin/big_brick_8")
+ .put("minecraft:ruin/big_ruin1_cracked", "minecraft:underwater_ruin/big_cracked_1")
+ .put("minecraft:ruin/big_ruin2_cracked", "minecraft:underwater_ruin/big_cracked_2")
+ .put("minecraft:ruin/big_ruin3_cracked", "minecraft:underwater_ruin/big_cracked_3")
+ .put("minecraft:ruin/big_ruin8_cracked", "minecraft:underwater_ruin/big_cracked_8")
+ .put("minecraft:ruin/big_ruin1_mossy", "minecraft:underwater_ruin/big_mossy_1")
+ .put("minecraft:ruin/big_ruin2_mossy", "minecraft:underwater_ruin/big_mossy_2")
+ .put("minecraft:ruin/big_ruin3_mossy", "minecraft:underwater_ruin/big_mossy_3")
+ .put("minecraft:ruin/big_ruin8_mossy", "minecraft:underwater_ruin/big_mossy_8")
+ .put("minecraft:ruin/big_ruin_warm4", "minecraft:underwater_ruin/big_warm_4")
+ .put("minecraft:ruin/big_ruin_warm5", "minecraft:underwater_ruin/big_warm_5")
+ .put("minecraft:ruin/big_ruin_warm6", "minecraft:underwater_ruin/big_warm_6")
+ .put("minecraft:ruin/big_ruin_warm7", "minecraft:underwater_ruin/big_warm_7")
+ .put("minecraft:ruin/ruin1_brick", "minecraft:underwater_ruin/brick_1")
+ .put("minecraft:ruin/ruin2_brick", "minecraft:underwater_ruin/brick_2")
+ .put("minecraft:ruin/ruin3_brick", "minecraft:underwater_ruin/brick_3")
+ .put("minecraft:ruin/ruin4_brick", "minecraft:underwater_ruin/brick_4")
+ .put("minecraft:ruin/ruin5_brick", "minecraft:underwater_ruin/brick_5")
+ .put("minecraft:ruin/ruin6_brick", "minecraft:underwater_ruin/brick_6")
+ .put("minecraft:ruin/ruin7_brick", "minecraft:underwater_ruin/brick_7")
+ .put("minecraft:ruin/ruin8_brick", "minecraft:underwater_ruin/brick_8")
+ .put("minecraft:ruin/ruin1_cracked", "minecraft:underwater_ruin/cracked_1")
+ .put("minecraft:ruin/ruin2_cracked", "minecraft:underwater_ruin/cracked_2")
+ .put("minecraft:ruin/ruin3_cracked", "minecraft:underwater_ruin/cracked_3")
+ .put("minecraft:ruin/ruin4_cracked", "minecraft:underwater_ruin/cracked_4")
+ .put("minecraft:ruin/ruin5_cracked", "minecraft:underwater_ruin/cracked_5")
+ .put("minecraft:ruin/ruin6_cracked", "minecraft:underwater_ruin/cracked_6")
+ .put("minecraft:ruin/ruin7_cracked", "minecraft:underwater_ruin/cracked_7")
+ .put("minecraft:ruin/ruin8_cracked", "minecraft:underwater_ruin/cracked_8")
+ .put("minecraft:ruin/ruin1_mossy", "minecraft:underwater_ruin/mossy_1")
+ .put("minecraft:ruin/ruin2_mossy", "minecraft:underwater_ruin/mossy_2")
+ .put("minecraft:ruin/ruin3_mossy", "minecraft:underwater_ruin/mossy_3")
+ .put("minecraft:ruin/ruin4_mossy", "minecraft:underwater_ruin/mossy_4")
+ .put("minecraft:ruin/ruin5_mossy", "minecraft:underwater_ruin/mossy_5")
+ .put("minecraft:ruin/ruin6_mossy", "minecraft:underwater_ruin/mossy_6")
+ .put("minecraft:ruin/ruin7_mossy", "minecraft:underwater_ruin/mossy_7")
+ .put("minecraft:ruin/ruin8_mossy", "minecraft:underwater_ruin/mossy_8")
+ .put("minecraft:ruin/ruin_warm1", "minecraft:underwater_ruin/warm_1")
+ .put("minecraft:ruin/ruin_warm2", "minecraft:underwater_ruin/warm_2")
+ .put("minecraft:ruin/ruin_warm3", "minecraft:underwater_ruin/warm_3")
+ .put("minecraft:ruin/ruin_warm4", "minecraft:underwater_ruin/warm_4")
+ .put("minecraft:ruin/ruin_warm5", "minecraft:underwater_ruin/warm_5")
+ .put("minecraft:ruin/ruin_warm6", "minecraft:underwater_ruin/warm_6")
+ .put("minecraft:ruin/ruin_warm7", "minecraft:underwater_ruin/warm_7")
+ .put("minecraft:ruin/ruin_warm8", "minecraft:underwater_ruin/warm_8")
+ .put("minecraft:ruin/big_brick_1", "minecraft:underwater_ruin/big_brick_1")
+ .put("minecraft:ruin/big_brick_2", "minecraft:underwater_ruin/big_brick_2")
+ .put("minecraft:ruin/big_brick_3", "minecraft:underwater_ruin/big_brick_3")
+ .put("minecraft:ruin/big_brick_8", "minecraft:underwater_ruin/big_brick_8")
+ .put("minecraft:ruin/big_mossy_1", "minecraft:underwater_ruin/big_mossy_1")
+ .put("minecraft:ruin/big_mossy_2", "minecraft:underwater_ruin/big_mossy_2")
+ .put("minecraft:ruin/big_mossy_3", "minecraft:underwater_ruin/big_mossy_3")
+ .put("minecraft:ruin/big_mossy_8", "minecraft:underwater_ruin/big_mossy_8")
+ .put("minecraft:ruin/big_cracked_1", "minecraft:underwater_ruin/big_cracked_1")
+ .put("minecraft:ruin/big_cracked_2", "minecraft:underwater_ruin/big_cracked_2")
+ .put("minecraft:ruin/big_cracked_3", "minecraft:underwater_ruin/big_cracked_3")
+ .put("minecraft:ruin/big_cracked_8", "minecraft:underwater_ruin/big_cracked_8")
+ .put("minecraft:ruin/big_warm_4", "minecraft:underwater_ruin/big_warm_4")
+ .put("minecraft:ruin/big_warm_5", "minecraft:underwater_ruin/big_warm_5")
+ .put("minecraft:ruin/big_warm_6", "minecraft:underwater_ruin/big_warm_6")
+ .put("minecraft:ruin/big_warm_7", "minecraft:underwater_ruin/big_warm_7")
+ .build()
+ )
+ )
+
+ .build();
+
+ private static final int VERSION = MCVersions.V18W20B + 1;
+
+ public static void register() {
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType children = data.getList("Children", ObjectType.MAP);
+ if (children == null) {
+ return null;
+ }
+
+ final String id = data.getString("id");
+
+ final Pair<String, ImmutableMap<String, String>> renames = RENAMES.get(id);
+ if (renames == null) {
+ return null;
+ }
+
+ for (int i = 0, len = children.size(); i < len; ++i) {
+ final MapType child = children.getMap(i);
+
+ if (renames.getFirst().equals(child.getString("id"))) {
+ final String template = child.getString("Template", "");
+ child.setString("Template", renames.getSecond().getOrDefault(template, template));
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1492() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1494.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1494.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef35ea5c1e471794721bd26834db14ea63ddd17f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1494.java
@@ -0,0 +1,88 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+
+public final class V1494 {
+
+ private static final int VERSION = MCVersions.V18W20C + 1;
+
+ private static final Int2ObjectOpenHashMap<String> ENCH_ID_TO_NAME = new Int2ObjectOpenHashMap<>();
+ static {
+ ENCH_ID_TO_NAME.put(0, "minecraft:protection");
+ ENCH_ID_TO_NAME.put(1, "minecraft:fire_protection");
+ ENCH_ID_TO_NAME.put(2, "minecraft:feather_falling");
+ ENCH_ID_TO_NAME.put(3, "minecraft:blast_protection");
+ ENCH_ID_TO_NAME.put(4, "minecraft:projectile_protection");
+ ENCH_ID_TO_NAME.put(5, "minecraft:respiration");
+ ENCH_ID_TO_NAME.put(6, "minecraft:aqua_affinity");
+ ENCH_ID_TO_NAME.put(7, "minecraft:thorns");
+ ENCH_ID_TO_NAME.put(8, "minecraft:depth_strider");
+ ENCH_ID_TO_NAME.put(9, "minecraft:frost_walker");
+ ENCH_ID_TO_NAME.put(10, "minecraft:binding_curse");
+ ENCH_ID_TO_NAME.put(16, "minecraft:sharpness");
+ ENCH_ID_TO_NAME.put(17, "minecraft:smite");
+ ENCH_ID_TO_NAME.put(18, "minecraft:bane_of_arthropods");
+ ENCH_ID_TO_NAME.put(19, "minecraft:knockback");
+ ENCH_ID_TO_NAME.put(20, "minecraft:fire_aspect");
+ ENCH_ID_TO_NAME.put(21, "minecraft:looting");
+ ENCH_ID_TO_NAME.put(22, "minecraft:sweeping");
+ ENCH_ID_TO_NAME.put(32, "minecraft:efficiency");
+ ENCH_ID_TO_NAME.put(33, "minecraft:silk_touch");
+ ENCH_ID_TO_NAME.put(34, "minecraft:unbreaking");
+ ENCH_ID_TO_NAME.put(35, "minecraft:fortune");
+ ENCH_ID_TO_NAME.put(48, "minecraft:power");
+ ENCH_ID_TO_NAME.put(49, "minecraft:punch");
+ ENCH_ID_TO_NAME.put(50, "minecraft:flame");
+ ENCH_ID_TO_NAME.put(51, "minecraft:infinity");
+ ENCH_ID_TO_NAME.put(61, "minecraft:luck_of_the_sea");
+ ENCH_ID_TO_NAME.put(62, "minecraft:lure");
+ ENCH_ID_TO_NAME.put(65, "minecraft:loyalty");
+ ENCH_ID_TO_NAME.put(66, "minecraft:impaling");
+ ENCH_ID_TO_NAME.put(67, "minecraft:riptide");
+ ENCH_ID_TO_NAME.put(68, "minecraft:channeling");
+ ENCH_ID_TO_NAME.put(70, "minecraft:mending");
+ ENCH_ID_TO_NAME.put(71, "minecraft:vanishing_curse");
+ }
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final ListType enchants = tag.getList("ench", ObjectType.MAP);
+ if (enchants != null) {
+ tag.remove("ench");
+ tag.setList("Enchantments", enchants);
+
+ for (int i = 0, len = enchants.size(); i < len; ++i) {
+ final MapType enchant = enchants.getMap(i);
+ enchant.setString("id", ENCH_ID_TO_NAME.getOrDefault(enchant.getInt("id"), "null"));
+ }
+ }
+
+ final ListType storedEnchants = tag.getList("StoredEnchantments", ObjectType.MAP);
+ if (storedEnchants != null) {
+ for (int i = 0, len = storedEnchants.size(); i < len; ++i) {
+ final MapType enchant = storedEnchants.getMap(i);
+ enchant.setString("id", ENCH_ID_TO_NAME.getOrDefault(enchant.getInt("id"), "null"));
+ }
+ }
+
+
+ return null;
+ }
+ });
+ }
+
+ private V1494() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1496.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1496.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b34a890a96b67cd14fc576a051f6f69f1697e93
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1496.java
@@ -0,0 +1,370 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.mojang.datafixers.DataFixUtils;
+import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntIterator;
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
+import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import net.minecraft.util.datafix.PackedBitStorage;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class V1496 {
+
+ private static final int VERSION = MCVersions.V18W21B;
+
+ private static final int[][] DIRECTIONS = new int[][] {
+ new int[] {-1, 0, 0},
+ new int[] {1, 0, 0},
+ new int[] {0, -1, 0},
+ new int[] {0, 1, 0},
+ new int[] {0, 0, -1},
+ new int[] {0, 0, 1}
+ };
+
+ private static final Object2IntOpenHashMap<String> LEAVES_TO_ID = new Object2IntOpenHashMap<>();
+ static {
+ LEAVES_TO_ID.put("minecraft:acacia_leaves", 0);
+ LEAVES_TO_ID.put("minecraft:birch_leaves", 1);
+ LEAVES_TO_ID.put("minecraft:dark_oak_leaves", 2);
+ LEAVES_TO_ID.put("minecraft:jungle_leaves", 3);
+ LEAVES_TO_ID.put("minecraft:oak_leaves", 4);
+ LEAVES_TO_ID.put("minecraft:spruce_leaves", 5);
+ }
+
+ private static final Set<String> LOGS = new HashSet<>(
+ Arrays.asList(
+ "minecraft:acacia_bark",
+ "minecraft:birch_bark",
+ "minecraft:dark_oak_bark",
+ "minecraft:jungle_bark",
+ "minecraft:oak_bark",
+ "minecraft:spruce_bark",
+ "minecraft:acacia_log",
+ "minecraft:birch_log",
+ "minecraft:dark_oak_log",
+ "minecraft:jungle_log",
+ "minecraft:oak_log",
+ "minecraft:spruce_log",
+ "minecraft:stripped_acacia_log",
+ "minecraft:stripped_birch_log",
+ "minecraft:stripped_dark_oak_log",
+ "minecraft:stripped_jungle_log",
+ "minecraft:stripped_oak_log",
+ "minecraft:stripped_spruce_log"
+ )
+ );
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ final ListType sectionsNBT = level.getList("Sections", ObjectType.MAP);
+ if (sectionsNBT == null) {
+ return null;
+ }
+
+ int newSides = 0;
+
+ final LeavesSection[] sections = new LeavesSection[16];
+ boolean skippable = true;
+ for (int i = 0, len = sectionsNBT.size(); i < len; ++i) {
+ final LeavesSection section = new LeavesSection(sectionsNBT.getMap(i));
+ sections[section.sectionY] = section;
+
+ skippable &= section.isSkippable();
+ }
+
+ if (skippable) {
+ return null;
+ }
+
+ final IntOpenHashSet[] positionsByDistance = new IntOpenHashSet[7];
+ for (int i = 0; i < positionsByDistance.length; ++i) {
+ positionsByDistance[i] = new IntOpenHashSet();
+ }
+
+ for (final LeavesSection section : sections) {
+ if (section == null || section.isSkippable()) {
+ continue;
+ }
+
+ for (int index = 0; index < 4096; ++index) {
+ final int block = section.getBlock(index);
+ if (section.isLog(block)) {
+ positionsByDistance[0].add(section.getSectionY() << 12 | index);
+ } else if (section.isLeaf(block)) {
+ int x = getX(index);
+ int z = getZ(index);
+ newSides |= getSideMask(x == 0, x == 15, z == 0, z == 15);
+ }
+ }
+ }
+
+ // this is basically supposed to recalculate the distances, because a higher cap was added
+ for (int distance = 1; distance < 7; ++distance) {
+ final IntOpenHashSet positionsLess = positionsByDistance[distance - 1];
+ final IntOpenHashSet positionsEqual = positionsByDistance[distance];
+
+ for (final IntIterator iterator = positionsLess.iterator(); iterator.hasNext();) {
+ final int position = iterator.nextInt();
+ final int fromX = getX(position);
+ final int fromY = getY(position);
+ final int fromZ = getZ(position);
+
+ for (final int[] direction : DIRECTIONS) {
+ final int toX = fromX + direction[0];
+ final int toY = fromY + direction[1];
+ final int toZ = fromZ + direction[2];
+
+ if (!(toX >= 0 && toX <= 15 && toZ >= 0 && toZ <= 15 && toY >= 0 && toY <= 255)) {
+ continue;
+ }
+
+ final LeavesSection toSection = sections[toY >> 4];
+ if (toSection == null || toSection.isSkippable()) {
+ continue;
+ }
+
+ final int sectionLocalIndex = getIndex(toX, toY & 15, toZ);
+ final int toBlock = toSection.getBlock(sectionLocalIndex);
+
+ if (toSection.isLeaf(toBlock)) {
+ final int newDistance = toSection.getDistance(toBlock);
+ if (newDistance > distance) {
+ toSection.setDistance(sectionLocalIndex, toBlock, distance);
+ positionsEqual.add(getIndex(toX, toY, toZ));
+ }
+ }
+ }
+ }
+ }
+
+ // done updating blocks, now just update the blockstates and palette
+ for (int i = 0, len = sectionsNBT.size(); i < len; ++i) {
+ final MapType sectionNBT = sectionsNBT.getMap(i);
+ final int y = sectionNBT.getInt("Y");
+ final LeavesSection section = sections[y];
+
+ section.writeInto(sectionNBT);
+ }
+
+ // if sides changed during process, update it now
+ if (newSides != 0) {
+ MapType upgradeData = level.getMap("UpgradeData");
+ if (upgradeData == null) {
+ level.setMap("UpgradeData", upgradeData = Types.NBT.createEmptyMap());
+ }
+
+ upgradeData.setByte("Sides", (byte)(upgradeData.getByte("Sides") | newSides));
+ }
+
+ return null;
+ }
+ });
+ }
+
+ public static int getIndex(final int x, final int y, final int z) {
+ return y << 8 | z << 4 | x;
+ }
+
+ public static int getX(final int index) {
+ return index & 15;
+ }
+
+ public static int getY(final int index) {
+ return index >> 8 & 255;
+ }
+
+ public static int getZ(final int index) {
+ return index >> 4 & 15;
+ }
+
+ public static int getSideMask(final boolean noLeft, final boolean noRight, final boolean noBack, final boolean noForward) {
+ final int ret;
+
+ if (noBack) {
+ if (noRight) {
+ ret = 2;
+ } else if (noLeft) {
+ ret = 128;
+ } else {
+ ret = 1;
+ }
+ } else if (noForward) {
+ if (noLeft) {
+ ret = 32;
+ } else if (noRight) {
+ ret = 8;
+ } else {
+ ret = 16;
+ }
+ } else if (noRight) {
+ ret = 4;
+ } else if (noLeft) {
+ ret = 64;
+ } else {
+ ret = 0;
+ }
+
+ return ret;
+ }
+
+ private V1496() {}
+
+ public abstract static class Section {
+ protected final ListType palette;
+ protected final int sectionY;
+ protected PackedBitStorage storage;
+
+ public Section(final MapType section) {
+ this.palette = section.getList("Palette", ObjectType.MAP);
+ this.sectionY = section.getInt("Y");
+ this.readStorage(section);
+ }
+
+ protected void readStorage(final MapType section) {
+ if (this.initSkippable()) {
+ this.storage = null;
+ } else {
+ final long[] states = section.getLongs("BlockStates");
+ final int bits = Math.max(4, DataFixUtils.ceillog2(this.palette.size()));
+ this.storage = new PackedBitStorage(bits, 4096, states);
+ }
+ }
+
+ public void writeInto(final MapType section) {
+ if (this.isSkippable()) {
+ return;
+ }
+
+ section.setList("Palette", this.palette);
+ section.setLongs("BlockStates", this.storage.getRaw());
+ }
+
+ public boolean isSkippable() {
+ return this.storage == null;
+ }
+
+ public int getBlock(final int index) {
+ return this.storage.get(index);
+ }
+
+ protected int getStateId(final String name, final boolean persistent, final int distance) {
+ return LEAVES_TO_ID.getInt(name) << 5 | (persistent ? 16 : 0) | distance;
+ }
+
+ protected int getSectionY() {
+ return this.sectionY;
+ }
+
+ protected abstract boolean initSkippable();
+ }
+
+ public static final class LeavesSection extends Section {
+ private IntOpenHashSet leaveIds;
+ private IntOpenHashSet logIds;
+ private Int2IntOpenHashMap stateToIdMap;
+
+ public LeavesSection(final MapType section) {
+ super(section);
+ }
+
+ @Override
+ protected boolean initSkippable() {
+ this.leaveIds = new IntOpenHashSet();
+ this.logIds = new IntOpenHashSet();
+ this.stateToIdMap = new Int2IntOpenHashMap();
+ this.stateToIdMap.defaultReturnValue(-1);
+
+ for(int i = 0; i < this.palette.size(); ++i) {
+ final MapType blockState = this.palette.getMap(i);
+ final String name = blockState.getString("Name", "");
+ if (LEAVES_TO_ID.containsKey(name)) {
+ final MapType properties = blockState.getMap("Properties");
+ final boolean notDecayable = properties != null && "false".equals(properties.getString("decayable"));
+
+ this.leaveIds.add(i);
+ this.stateToIdMap.put(this.getStateId(name, notDecayable, 7), i);
+ this.palette.setMap(i, this.makeNewLeafTag(name, notDecayable, 7));
+ }
+
+ if (LOGS.contains(name)) {
+ this.logIds.add(i);
+ }
+ }
+
+ return this.leaveIds.isEmpty() && this.logIds.isEmpty();
+ }
+
+ private MapType makeNewLeafTag(final String name, final boolean notDecayable, final int distance) {
+ final MapType properties = Types.NBT.createEmptyMap();
+ final MapType ret = Types.NBT.createEmptyMap();
+
+ ret.setString("Name", name);
+ ret.setMap("Properties", properties);
+
+ properties.setString("persistent", Boolean.toString(notDecayable));
+ properties.setString("distance", Integer.toString(distance));
+
+ return ret;
+ }
+
+ public boolean isLog(final int id) {
+ return this.logIds.contains(id);
+ }
+
+ public boolean isLeaf(final int id) {
+ return this.leaveIds.contains(id);
+ }
+
+ // only call for logs or leaves, will throw otherwise!
+ private int getDistance(final int id) {
+ if (this.isLog(id)) {
+ return 0;
+ }
+
+ return Integer.parseInt(this.palette.getMap(id).getMap("Properties").getString("distance"));
+ }
+
+ private void setDistance(final int index, final int id, final int distance) {
+ final MapType state = this.palette.getMap(id);
+ final String name = state.getString("Name");
+ final boolean persistent = "true".equals(state.getMap("Properties").getString("persistent"));
+ final int newState = this.getStateId(name, persistent, distance);
+ int newStateId;
+ if ((newStateId = this.stateToIdMap.get(newState)) == -1) {
+ newStateId = this.palette.size();
+ this.leaveIds.add(newStateId);
+ this.stateToIdMap.put(newState, newStateId);
+ this.palette.addMap(this.makeNewLeafTag(name, persistent, distance));
+ }
+
+ if (1 << this.storage.getBits() <= newStateId) {
+ // need to widen storage
+ final PackedBitStorage newStorage = new PackedBitStorage(this.storage.getBits() + 1, 4096);
+
+ for(int i = 0; i < 4096; ++i) {
+ newStorage.set(i, this.storage.get(i));
+ }
+
+ this.storage = newStorage;
+ }
+
+ this.storage.set(index, newStateId);
+ }
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1500.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1500.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ee4c5cab7e8020b3432ef9f614f92c1dda5606e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1500.java
@@ -0,0 +1,23 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1500 {
+
+ private static final int VERSION = MCVersions.V18W22C + 1;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("DUMMY", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setBoolean("keepPacked", true);
+ return null;
+ }
+ });
+ }
+
+ private V1500() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1501.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1501.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbfb51b74c54a9a479de49ecb295854fc69aef64
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1501.java
@@ -0,0 +1,78 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1501 {
+
+ private static final int VERSION = MCVersions.V1_13_PRE1;
+
+ private static final Map<String, String> RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:recipes/brewing/speckled_melon", "minecraft:recipes/brewing/glistering_melon_slice")
+ .put("minecraft:recipes/building_blocks/black_stained_hardened_clay", "minecraft:recipes/building_blocks/black_terracotta")
+ .put("minecraft:recipes/building_blocks/blue_stained_hardened_clay", "minecraft:recipes/building_blocks/blue_terracotta")
+ .put("minecraft:recipes/building_blocks/brown_stained_hardened_clay", "minecraft:recipes/building_blocks/brown_terracotta")
+ .put("minecraft:recipes/building_blocks/cyan_stained_hardened_clay", "minecraft:recipes/building_blocks/cyan_terracotta")
+ .put("minecraft:recipes/building_blocks/gray_stained_hardened_clay", "minecraft:recipes/building_blocks/gray_terracotta")
+ .put("minecraft:recipes/building_blocks/green_stained_hardened_clay", "minecraft:recipes/building_blocks/green_terracotta")
+ .put("minecraft:recipes/building_blocks/light_blue_stained_hardened_clay", "minecraft:recipes/building_blocks/light_blue_terracotta")
+ .put("minecraft:recipes/building_blocks/light_gray_stained_hardened_clay", "minecraft:recipes/building_blocks/light_gray_terracotta")
+ .put("minecraft:recipes/building_blocks/lime_stained_hardened_clay", "minecraft:recipes/building_blocks/lime_terracotta")
+ .put("minecraft:recipes/building_blocks/magenta_stained_hardened_clay", "minecraft:recipes/building_blocks/magenta_terracotta")
+ .put("minecraft:recipes/building_blocks/orange_stained_hardened_clay", "minecraft:recipes/building_blocks/orange_terracotta")
+ .put("minecraft:recipes/building_blocks/pink_stained_hardened_clay", "minecraft:recipes/building_blocks/pink_terracotta")
+ .put("minecraft:recipes/building_blocks/purple_stained_hardened_clay", "minecraft:recipes/building_blocks/purple_terracotta")
+ .put("minecraft:recipes/building_blocks/red_stained_hardened_clay", "minecraft:recipes/building_blocks/red_terracotta")
+ .put("minecraft:recipes/building_blocks/white_stained_hardened_clay", "minecraft:recipes/building_blocks/white_terracotta")
+ .put("minecraft:recipes/building_blocks/yellow_stained_hardened_clay", "minecraft:recipes/building_blocks/yellow_terracotta")
+ .put("minecraft:recipes/building_blocks/acacia_wooden_slab", "minecraft:recipes/building_blocks/acacia_slab")
+ .put("minecraft:recipes/building_blocks/birch_wooden_slab", "minecraft:recipes/building_blocks/birch_slab")
+ .put("minecraft:recipes/building_blocks/dark_oak_wooden_slab", "minecraft:recipes/building_blocks/dark_oak_slab")
+ .put("minecraft:recipes/building_blocks/jungle_wooden_slab", "minecraft:recipes/building_blocks/jungle_slab")
+ .put("minecraft:recipes/building_blocks/oak_wooden_slab", "minecraft:recipes/building_blocks/oak_slab")
+ .put("minecraft:recipes/building_blocks/spruce_wooden_slab", "minecraft:recipes/building_blocks/spruce_slab")
+ .put("minecraft:recipes/building_blocks/brick_block", "minecraft:recipes/building_blocks/bricks")
+ .put("minecraft:recipes/building_blocks/chiseled_stonebrick", "minecraft:recipes/building_blocks/chiseled_stone_bricks")
+ .put("minecraft:recipes/building_blocks/end_bricks", "minecraft:recipes/building_blocks/end_stone_bricks")
+ .put("minecraft:recipes/building_blocks/lit_pumpkin", "minecraft:recipes/building_blocks/jack_o_lantern")
+ .put("minecraft:recipes/building_blocks/magma", "minecraft:recipes/building_blocks/magma_block")
+ .put("minecraft:recipes/building_blocks/melon_block", "minecraft:recipes/building_blocks/melon")
+ .put("minecraft:recipes/building_blocks/mossy_stonebrick", "minecraft:recipes/building_blocks/mossy_stone_bricks")
+ .put("minecraft:recipes/building_blocks/nether_brick", "minecraft:recipes/building_blocks/nether_bricks")
+ .put("minecraft:recipes/building_blocks/pillar_quartz_block", "minecraft:recipes/building_blocks/quartz_pillar")
+ .put("minecraft:recipes/building_blocks/red_nether_brick", "minecraft:recipes/building_blocks/red_nether_bricks")
+ .put("minecraft:recipes/building_blocks/snow", "minecraft:recipes/building_blocks/snow_block")
+ .put("minecraft:recipes/building_blocks/smooth_red_sandstone", "minecraft:recipes/building_blocks/cut_red_sandstone")
+ .put("minecraft:recipes/building_blocks/smooth_sandstone", "minecraft:recipes/building_blocks/cut_sandstone")
+ .put("minecraft:recipes/building_blocks/stonebrick", "minecraft:recipes/building_blocks/stone_bricks")
+ .put("minecraft:recipes/building_blocks/stone_stairs", "minecraft:recipes/building_blocks/cobblestone_stairs")
+ .put("minecraft:recipes/building_blocks/string_to_wool", "minecraft:recipes/building_blocks/white_wool_from_string")
+ .put("minecraft:recipes/decorations/fence", "minecraft:recipes/decorations/oak_fence")
+ .put("minecraft:recipes/decorations/purple_shulker_box", "minecraft:recipes/decorations/shulker_box")
+ .put("minecraft:recipes/decorations/slime", "minecraft:recipes/decorations/slime_block")
+ .put("minecraft:recipes/decorations/snow_layer", "minecraft:recipes/decorations/snow")
+ .put("minecraft:recipes/misc/bone_meal_from_block", "minecraft:recipes/misc/bone_meal_from_bone_block")
+ .put("minecraft:recipes/misc/bone_meal_from_bone", "minecraft:recipes/misc/bone_meal")
+ .put("minecraft:recipes/misc/gold_ingot_from_block", "minecraft:recipes/misc/gold_ingot_from_gold_block")
+ .put("minecraft:recipes/misc/iron_ingot_from_block", "minecraft:recipes/misc/iron_ingot_from_iron_block")
+ .put("minecraft:recipes/redstone/fence_gate", "minecraft:recipes/redstone/oak_fence_gate")
+ .put("minecraft:recipes/redstone/noteblock", "minecraft:recipes/redstone/note_block")
+ .put("minecraft:recipes/redstone/trapdoor", "minecraft:recipes/redstone/oak_trapdoor")
+ .put("minecraft:recipes/redstone/wooden_button", "minecraft:recipes/redstone/oak_button")
+ .put("minecraft:recipes/redstone/wooden_door", "minecraft:recipes/redstone/oak_door")
+ .put("minecraft:recipes/redstone/wooden_pressure_plate", "minecraft:recipes/redstone/oak_pressure_plate")
+ .put("minecraft:recipes/transportation/boat", "minecraft:recipes/transportation/oak_boat")
+ .put("minecraft:recipes/transportation/golden_rail", "minecraft:recipes/transportation/powered_rail")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractAdvancementsRename.register(VERSION, RENAMES::get);
+ }
+
+ private V1501() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1502.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1502.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd07718649f0e2ca66f1ec3b0aba81611333ba09
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1502.java
@@ -0,0 +1,77 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.recipe.ConverterAbstractRecipeRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1502 {
+
+ private static final int VERSION = MCVersions.V1_13_PRE2;
+
+ private static final Map<String, String> RECIPES_UPDATES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:acacia_wooden_slab", "minecraft:acacia_slab")
+ .put("minecraft:birch_wooden_slab", "minecraft:birch_slab")
+ .put("minecraft:black_stained_hardened_clay", "minecraft:black_terracotta")
+ .put("minecraft:blue_stained_hardened_clay", "minecraft:blue_terracotta")
+ .put("minecraft:boat", "minecraft:oak_boat")
+ .put("minecraft:bone_meal_from_block", "minecraft:bone_meal_from_bone_block")
+ .put("minecraft:bone_meal_from_bone", "minecraft:bone_meal")
+ .put("minecraft:brick_block", "minecraft:bricks")
+ .put("minecraft:brown_stained_hardened_clay", "minecraft:brown_terracotta")
+ .put("minecraft:chiseled_stonebrick", "minecraft:chiseled_stone_bricks")
+ .put("minecraft:cyan_stained_hardened_clay", "minecraft:cyan_terracotta")
+ .put("minecraft:dark_oak_wooden_slab", "minecraft:dark_oak_slab")
+ .put("minecraft:end_bricks", "minecraft:end_stone_bricks")
+ .put("minecraft:fence_gate", "minecraft:oak_fence_gate")
+ .put("minecraft:fence", "minecraft:oak_fence")
+ .put("minecraft:golden_rail", "minecraft:powered_rail")
+ .put("minecraft:gold_ingot_from_block", "minecraft:gold_ingot_from_gold_block")
+ .put("minecraft:gray_stained_hardened_clay", "minecraft:gray_terracotta")
+ .put("minecraft:green_stained_hardened_clay", "minecraft:green_terracotta")
+ .put("minecraft:iron_ingot_from_block", "minecraft:iron_ingot_from_iron_block")
+ .put("minecraft:jungle_wooden_slab", "minecraft:jungle_slab")
+ .put("minecraft:light_blue_stained_hardened_clay", "minecraft:light_blue_terracotta")
+ .put("minecraft:light_gray_stained_hardened_clay", "minecraft:light_gray_terracotta")
+ .put("minecraft:lime_stained_hardened_clay", "minecraft:lime_terracotta")
+ .put("minecraft:lit_pumpkin", "minecraft:jack_o_lantern")
+ .put("minecraft:magenta_stained_hardened_clay", "minecraft:magenta_terracotta")
+ .put("minecraft:magma", "minecraft:magma_block")
+ .put("minecraft:melon_block", "minecraft:melon")
+ .put("minecraft:mossy_stonebrick", "minecraft:mossy_stone_bricks")
+ .put("minecraft:noteblock", "minecraft:note_block")
+ .put("minecraft:oak_wooden_slab", "minecraft:oak_slab")
+ .put("minecraft:orange_stained_hardened_clay", "minecraft:orange_terracotta")
+ .put("minecraft:pillar_quartz_block", "minecraft:quartz_pillar")
+ .put("minecraft:pink_stained_hardened_clay", "minecraft:pink_terracotta")
+ .put("minecraft:purple_shulker_box", "minecraft:shulker_box")
+ .put("minecraft:purple_stained_hardened_clay", "minecraft:purple_terracotta")
+ .put("minecraft:red_nether_brick", "minecraft:red_nether_bricks")
+ .put("minecraft:red_stained_hardened_clay", "minecraft:red_terracotta")
+ .put("minecraft:slime", "minecraft:slime_block")
+ .put("minecraft:smooth_red_sandstone", "minecraft:cut_red_sandstone")
+ .put("minecraft:smooth_sandstone", "minecraft:cut_sandstone")
+ .put("minecraft:snow_layer", "minecraft:snow")
+ .put("minecraft:snow", "minecraft:snow_block")
+ .put("minecraft:speckled_melon", "minecraft:glistering_melon_slice")
+ .put("minecraft:spruce_wooden_slab", "minecraft:spruce_slab")
+ .put("minecraft:stonebrick", "minecraft:stone_bricks")
+ .put("minecraft:stone_stairs", "minecraft:cobblestone_stairs")
+ .put("minecraft:string_to_wool", "minecraft:white_wool_from_string")
+ .put("minecraft:trapdoor", "minecraft:oak_trapdoor")
+ .put("minecraft:white_stained_hardened_clay", "minecraft:white_terracotta")
+ .put("minecraft:wooden_button", "minecraft:oak_button")
+ .put("minecraft:wooden_door", "minecraft:oak_door")
+ .put("minecraft:wooden_pressure_plate", "minecraft:oak_pressure_plate")
+ .put("minecraft:yellow_stained_hardened_clay", "minecraft:yellow_terracotta")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractRecipeRename.register(VERSION, RECIPES_UPDATES::get);
+ }
+
+ private V1502() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java
new file mode 100644
index 0000000000000000000000000000000000000000..36e32a8ff987e4006784c5cba369c736903fa222
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java
@@ -0,0 +1,221 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+import ca.spottedleaf.dataconverter.types.json.JsonMapType;
+import ca.spottedleaf.dataconverter.types.json.JsonTypeUtil;
+import ca.spottedleaf.dataconverter.types.nbt.NBTMapType;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.gson.JsonParser;
+import com.mojang.datafixers.util.Pair;
+import com.mojang.serialization.Dynamic;
+import com.mojang.serialization.DynamicOps;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.NbtOps;
+import net.minecraft.nbt.Tag;
+import net.minecraft.util.GsonHelper;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public final class V1506 {
+
+ private static final int VERSION = MCVersions.V1_13_PRE4 + 2;
+
+ static final Map<String, String> MAP = new HashMap<>();
+ static {
+ MAP.put("0", "minecraft:ocean");
+ MAP.put("1", "minecraft:plains");
+ MAP.put("2", "minecraft:desert");
+ MAP.put("3", "minecraft:mountains");
+ MAP.put("4", "minecraft:forest");
+ MAP.put("5", "minecraft:taiga");
+ MAP.put("6", "minecraft:swamp");
+ MAP.put("7", "minecraft:river");
+ MAP.put("8", "minecraft:nether");
+ MAP.put("9", "minecraft:the_end");
+ MAP.put("10", "minecraft:frozen_ocean");
+ MAP.put("11", "minecraft:frozen_river");
+ MAP.put("12", "minecraft:snowy_tundra");
+ MAP.put("13", "minecraft:snowy_mountains");
+ MAP.put("14", "minecraft:mushroom_fields");
+ MAP.put("15", "minecraft:mushroom_field_shore");
+ MAP.put("16", "minecraft:beach");
+ MAP.put("17", "minecraft:desert_hills");
+ MAP.put("18", "minecraft:wooded_hills");
+ MAP.put("19", "minecraft:taiga_hills");
+ MAP.put("20", "minecraft:mountain_edge");
+ MAP.put("21", "minecraft:jungle");
+ MAP.put("22", "minecraft:jungle_hills");
+ MAP.put("23", "minecraft:jungle_edge");
+ MAP.put("24", "minecraft:deep_ocean");
+ MAP.put("25", "minecraft:stone_shore");
+ MAP.put("26", "minecraft:snowy_beach");
+ MAP.put("27", "minecraft:birch_forest");
+ MAP.put("28", "minecraft:birch_forest_hills");
+ MAP.put("29", "minecraft:dark_forest");
+ MAP.put("30", "minecraft:snowy_taiga");
+ MAP.put("31", "minecraft:snowy_taiga_hills");
+ MAP.put("32", "minecraft:giant_tree_taiga");
+ MAP.put("33", "minecraft:giant_tree_taiga_hills");
+ MAP.put("34", "minecraft:wooded_mountains");
+ MAP.put("35", "minecraft:savanna");
+ MAP.put("36", "minecraft:savanna_plateau");
+ MAP.put("37", "minecraft:badlands");
+ MAP.put("38", "minecraft:wooded_badlands_plateau");
+ MAP.put("39", "minecraft:badlands_plateau");
+ MAP.put("40", "minecraft:small_end_islands");
+ MAP.put("41", "minecraft:end_midlands");
+ MAP.put("42", "minecraft:end_highlands");
+ MAP.put("43", "minecraft:end_barrens");
+ MAP.put("44", "minecraft:warm_ocean");
+ MAP.put("45", "minecraft:lukewarm_ocean");
+ MAP.put("46", "minecraft:cold_ocean");
+ MAP.put("47", "minecraft:deep_warm_ocean");
+ MAP.put("48", "minecraft:deep_lukewarm_ocean");
+ MAP.put("49", "minecraft:deep_cold_ocean");
+ MAP.put("50", "minecraft:deep_frozen_ocean");
+ MAP.put("127", "minecraft:the_void");
+ MAP.put("129", "minecraft:sunflower_plains");
+ MAP.put("130", "minecraft:desert_lakes");
+ MAP.put("131", "minecraft:gravelly_mountains");
+ MAP.put("132", "minecraft:flower_forest");
+ MAP.put("133", "minecraft:taiga_mountains");
+ MAP.put("134", "minecraft:swamp_hills");
+ MAP.put("140", "minecraft:ice_spikes");
+ MAP.put("149", "minecraft:modified_jungle");
+ MAP.put("151", "minecraft:modified_jungle_edge");
+ MAP.put("155", "minecraft:tall_birch_forest");
+ MAP.put("156", "minecraft:tall_birch_hills");
+ MAP.put("157", "minecraft:dark_forest_hills");
+ MAP.put("158", "minecraft:snowy_taiga_mountains");
+ MAP.put("160", "minecraft:giant_spruce_taiga");
+ MAP.put("161", "minecraft:giant_spruce_taiga_hills");
+ MAP.put("162", "minecraft:modified_gravelly_mountains");
+ MAP.put("163", "minecraft:shattered_savanna");
+ MAP.put("164", "minecraft:shattered_savanna_plateau");
+ MAP.put("165", "minecraft:eroded_badlands");
+ MAP.put("166", "minecraft:modified_wooded_badlands_plateau");
+ MAP.put("167", "minecraft:modified_badlands_plateau");
+ }
+
+ public static void register() {
+ MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String generatorOptions = data.getString("generatorOptions");
+ final String generatorName = data.getString("generatorName");
+ if ("flat".equalsIgnoreCase(generatorName)) {
+ data.setMap("generatorOptions", V1506.convert(generatorOptions == null ? "" : generatorOptions));
+ } else if ("buffet".equalsIgnoreCase(generatorName) && generatorOptions != null) {
+ data.setGeneric("generatorOptions", Types.JSON.convertFromBaseToGeneric(JsonParser.parseString(generatorOptions), data.getTypeUtil()));
+ }
+ return null;
+ }
+ });
+ }
+
+ private static MapType convert(final String param0) {
+ final Dynamic<Tag> dynamic = convert(param0, NbtOps.INSTANCE);
+
+ return new NBTMapType((CompoundTag)dynamic.getValue());
+ }
+
+ // Yeah I ain't touching that. This is basically magic value hell.
+ private static <T> Dynamic<T> convert(final String generatorSettings, final DynamicOps<T> ops) {
+ final Iterator<String> splitSettings = Splitter.on(';').split(generatorSettings).iterator();
+ String biome = "minecraft:plains";
+ final Map<String, Map<String, String>> structures = Maps.newHashMap();
+ final List<Pair<Integer, String>> layers;
+ if (!generatorSettings.isEmpty() && splitSettings.hasNext()) {
+ layers = getLayersInfoFromString(splitSettings.next());
+ if (!layers.isEmpty()) {
+ // biome is next
+ if (splitSettings.hasNext()) {
+ biome = MAP.getOrDefault(splitSettings.next(), "minecraft:plains");
+ }
+
+ // structures is next
+ if (splitSettings.hasNext()) {
+ final String[] structuresSplit = splitSettings.next().toLowerCase(Locale.ROOT).split(",");
+
+ for (final String structureString : structuresSplit) {
+ final String[] structureInfo = structureString.split("\\(", 2);
+ if (!structureInfo[0].isEmpty()) {
+ structures.put(structureInfo[0], Maps.newHashMap());
+ if (structureInfo.length > 1 && structureInfo[1].endsWith(")") && structureInfo[1].length() > 1) {
+ // I can't even guess the mappings for these. Not worth my time, it will work regardless of the mappings
+ final String[] var7 = structureInfo[1].substring(0, structureInfo[1].length() - 1).split(" ");
+
+ for (final String var8 : var7) {
+ String[] var9 = var8.split("=", 2);
+ if (var9.length == 2) {
+ structures.get(structureInfo[0]).put(var9[0], var9[1]);
+ }
+ }
+ }
+ }
+ }
+ } else {
+ structures.put("village", Maps.newHashMap());
+ }
+ }
+ } else {
+ layers = Lists.newArrayList();
+ layers.add(Pair.of(1, "minecraft:bedrock"));
+ layers.add(Pair.of(2, "minecraft:dirt"));
+ layers.add(Pair.of(1, "minecraft:grass_block"));
+ structures.put("village", Maps.newHashMap());
+ }
+
+ final T layerTag = ops.createList(layers.stream().map((param1x) -> ops.createMap(ImmutableMap.of(ops.createString("height"), ops.createInt(param1x.getFirst()), ops.createString("block"), ops.createString(param1x.getSecond())))));
+ final T structuresTag = ops.createMap(structures.entrySet().stream().map((param1x) -> Pair.of(ops.createString(param1x.getKey().toLowerCase(Locale.ROOT)), ops.createMap(param1x.getValue().entrySet().stream().map((param1xx) -> Pair.of(ops.createString(param1xx.getKey()), ops.createString(param1xx.getValue()))).collect(Collectors.toMap(Pair::getFirst, Pair::getSecond))))).collect(Collectors.toMap(Pair::getFirst, Pair::getSecond)));
+ return new Dynamic<>(ops, ops.createMap(ImmutableMap.of(ops.createString("layers"), layerTag, ops.createString("biome"), ops.createString(biome), ops.createString("structures"), structuresTag)));
+ }
+
+ private static Pair<Integer, String> getLayerInfoFromString(final String layerString) {
+ final String[] split = layerString.split("\\*", 2);
+ int layerCount;
+ if (split.length == 2) {
+ try {
+ layerCount = Integer.parseInt(split[0]);
+ } catch (final NumberFormatException ex) {
+ return null;
+ }
+ } else {
+ layerCount = 1;
+ }
+
+ final String blockName = split[split.length - 1];
+ return Pair.of(layerCount, blockName);
+ }
+
+ private static List<Pair<Integer, String>> getLayersInfoFromString(final String layersString) {
+ final List<Pair<Integer, String>> ret = new ArrayList<>();
+ final String[] layers = layersString.split(",");
+
+ for (final String layerString : layers) {
+ final Pair<Integer, String> layer = getLayerInfoFromString(layerString);
+ if (layer == null) {
+ return Collections.emptyList();
+ }
+
+ ret.add(layer);
+ }
+
+ return ret;
+ }
+
+ private V1506() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1510.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1510.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfc9d1e89983c73e06ce3c8a22c29f49af4a935c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1510.java
@@ -0,0 +1,111 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.recipe.ConverterAbstractRecipeRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.stats.ConverterAbstractStatsRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1510 {
+
+ public static final Map<String, String> RENAMED_ENTITY_IDS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:commandblock_minecart", "minecraft:command_block_minecart")
+ .put("minecraft:ender_crystal", "minecraft:end_crystal")
+ .put("minecraft:snowman", "minecraft:snow_golem")
+ .put("minecraft:evocation_illager", "minecraft:evoker")
+ .put("minecraft:evocation_fangs", "minecraft:evoker_fangs")
+ .put("minecraft:illusion_illager", "minecraft:illusioner")
+ .put("minecraft:vindication_illager", "minecraft:vindicator")
+ .put("minecraft:villager_golem", "minecraft:iron_golem")
+ .put("minecraft:xp_orb", "minecraft:experience_orb")
+ .put("minecraft:xp_bottle", "minecraft:experience_bottle")
+ .put("minecraft:eye_of_ender_signal", "minecraft:eye_of_ender")
+ .put("minecraft:fireworks_rocket", "minecraft:firework_rocket")
+ .build()
+ );
+
+ public static final Map<String, String> RENAMED_BLOCKS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:portal", "minecraft:nether_portal")
+ .put("minecraft:oak_bark", "minecraft:oak_wood")
+ .put("minecraft:spruce_bark", "minecraft:spruce_wood")
+ .put("minecraft:birch_bark", "minecraft:birch_wood")
+ .put("minecraft:jungle_bark", "minecraft:jungle_wood")
+ .put("minecraft:acacia_bark", "minecraft:acacia_wood")
+ .put("minecraft:dark_oak_bark", "minecraft:dark_oak_wood")
+ .put("minecraft:stripped_oak_bark", "minecraft:stripped_oak_wood")
+ .put("minecraft:stripped_spruce_bark", "minecraft:stripped_spruce_wood")
+ .put("minecraft:stripped_birch_bark", "minecraft:stripped_birch_wood")
+ .put("minecraft:stripped_jungle_bark", "minecraft:stripped_jungle_wood")
+ .put("minecraft:stripped_acacia_bark", "minecraft:stripped_acacia_wood")
+ .put("minecraft:stripped_dark_oak_bark", "minecraft:stripped_dark_oak_wood")
+ .put("minecraft:mob_spawner", "minecraft:spawner")
+ .build()
+ );
+
+ public static final Map<String, String> RENAMED_ITEMS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .putAll(RENAMED_BLOCKS)
+ .put("minecraft:clownfish", "minecraft:tropical_fish")
+ .put("minecraft:chorus_fruit_popped", "minecraft:popped_chorus_fruit")
+ .put("minecraft:evocation_illager_spawn_egg", "minecraft:evoker_spawn_egg")
+ .put("minecraft:vindication_illager_spawn_egg", "minecraft:vindicator_spawn_egg")
+ .build()
+ );
+
+ private static final Map<String, String> RECIPES_UPDATES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:acacia_bark", "minecraft:acacia_wood")
+ .put("minecraft:birch_bark", "minecraft:birch_wood")
+ .put("minecraft:dark_oak_bark", "minecraft:dark_oak_wood")
+ .put("minecraft:jungle_bark", "minecraft:jungle_wood")
+ .put("minecraft:oak_bark", "minecraft:oak_wood")
+ .put("minecraft:spruce_bark", "minecraft:spruce_wood")
+ .build()
+ );
+
+ private static final int VERSION = MCVersions.V1_13_PRE4 + 6;
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, RENAMED_BLOCKS::get);
+ ConverterAbstractItemRename.register(VERSION, RENAMED_ITEMS::get);
+ ConverterAbstractRecipeRename.register(VERSION, RECIPES_UPDATES::get);
+
+ ConverterAbstractEntityRename.register(VERSION, (String input) -> {
+ if (input.startsWith("minecraft:bred_")) {
+ input = "minecraft:".concat(input.substring("minecraft:bred_".length()));
+ }
+
+ return RENAMED_ENTITY_IDS.get(input);
+ });
+
+ ConverterAbstractStatsRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:swim_one_cm", "minecraft:walk_on_water_one_cm",
+ "minecraft:dive_one_cm", "minecraft:walk_under_water_one_cm"
+ )
+ )::get);
+
+
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:commandblock_minecart", "minecraft:command_block_minecart");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:ender_crystal", "minecraft:end_crystal");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:snowman", "minecraft:snow_golem");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:evocation_illager", "minecraft:evoker");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:evocation_fangs", "minecraft:evoker_fangs");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:illusion_illager", "minecraft:illusioner");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:vindication_illager", "minecraft:vindicator");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:villager_golem", "minecraft:iron_golem");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:xp_orb", "minecraft:experience_orb");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:xp_bottle", "minecraft:experience_bottle");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:eye_of_ender_signal", "minecraft:eye_of_ender");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:fireworks_rocket", "minecraft:firework_rocket");
+ }
+
+ private V1510() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1514.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1514.java
new file mode 100644
index 0000000000000000000000000000000000000000..308c29fece597117694b759b72b5161a43d160cf
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1514.java
@@ -0,0 +1,68 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1514 {
+
+ private static final int VERSION = MCVersions.V1_13_PRE7 + 1;
+
+ public static void register() {
+ MCTypeRegistry.OBJECTIVE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String displayName = data.getString("DisplayName");
+ if (displayName == null) {
+ return null;
+ }
+
+ final String update = ComponentUtils.createPlainTextComponent(displayName);
+
+ data.setString("DisplayName", update);
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TEAM.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String displayName = data.getString("DisplayName");
+ if (displayName == null) {
+ return null;
+ }
+
+ final String update = ComponentUtils.createPlainTextComponent(displayName);
+
+ data.setString("DisplayName", update);
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.OBJECTIVE.addStructureConverter(new DataConverter<>(VERSION) {
+ private static String getRenderType(String string) {
+ return string.equals("health") ? "hearts" : "integer";
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String renderType = data.getString("RenderType");
+ if (renderType != null) {
+ return null;
+ }
+
+ final String criteriaName = data.getString("CriteriaName", "");
+
+ data.setString("RenderType", getRenderType(criteriaName));
+
+ return null;
+ }
+ });
+ }
+
+ private V1514() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1515.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1515.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2093732e06ddccdd8a34bbfcaee6ede3aae96d0
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1515.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1515 {
+
+ private static final int VERSION = MCVersions.V1_13_PRE7 + 2;
+
+ public static final Map<String, String> RENAMED_BLOCK_IDS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:tube_coral_fan", "minecraft:tube_coral_wall_fan")
+ .put("minecraft:brain_coral_fan", "minecraft:brain_coral_wall_fan")
+ .put("minecraft:bubble_coral_fan", "minecraft:bubble_coral_wall_fan")
+ .put("minecraft:fire_coral_fan", "minecraft:fire_coral_wall_fan")
+ .put("minecraft:horn_coral_fan", "minecraft:horn_coral_wall_fan")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, RENAMED_BLOCK_IDS::get);
+ }
+
+ private V1515() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1624.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1624.java
new file mode 100644
index 0000000000000000000000000000000000000000..d1df382e095032950a1dc4c256b62b39b9fe96a4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1624.java
@@ -0,0 +1,110 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import com.mojang.logging.LogUtils;
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
+import org.slf4j.Logger;
+
+public final class V1624 {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static final int VERSION = MCVersions.V18W32A + 1;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+
+ if (level == null) {
+ return null;
+ }
+
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections == null) {
+ return null;
+ }
+
+ final IntOpenHashSet positionsToLook = new IntOpenHashSet();
+
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final TrappedChestSection section = new TrappedChestSection(sections.getMap(i));
+ if (section.isSkippable()) {
+ continue;
+ }
+
+ for (int index = 0; index < 4096; ++index) {
+ if (section.isTrappedChest(section.getBlock(index))) {
+ positionsToLook.add(section.getSectionY() << 12 | index);
+ }
+ }
+ }
+
+ final int chunkX = level.getInt("xPos");
+ final int chunkZ = level.getInt("zPos");
+
+ final ListType tileEntities = level.getList("TileEntities", ObjectType.MAP);
+
+ if (tileEntities != null) {
+ for (int i = 0, len = tileEntities.size(); i < len; ++i) {
+ final MapType tile = tileEntities.getMap(i);
+
+ final int x = tile.getInt("x");
+ final int y = tile.getInt("y");
+ final int z = tile.getInt("z");
+
+ final int index = V1496.getIndex(x - (chunkX << 4), y, z - (chunkZ << 4));
+ if (!positionsToLook.contains(index)) {
+ continue;
+ }
+
+ final String id = tile.getString("id");
+ if (!"minecraft:chest".equals(id)) {
+ LOGGER.warn("Block Entity ({},{},{}) was expected to be a chest (V1624)", x, y, z);
+ }
+
+ tile.setString("id", "minecraft:trapped_chest");
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1624() {}
+
+ public static final class TrappedChestSection extends V1496.Section {
+
+ private IntOpenHashSet chestIds;
+
+ public TrappedChestSection(final MapType section) {
+ super(section);
+ }
+
+ @Override
+ protected boolean initSkippable() {
+ this.chestIds = new IntOpenHashSet();
+
+ for (int i = 0; i < this.palette.size(); ++i) {
+ final MapType blockState = this.palette.getMap(i);
+ final String name = blockState.getString("Name");
+ if ("minecraft:trapped_chest".equals(name)) {
+ this.chestIds.add(i);
+ }
+ }
+
+ return this.chestIds.isEmpty();
+ }
+
+ public boolean isTrappedChest(final int id) {
+ return this.chestIds.contains(id);
+ }
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V165.java b/ca/spottedleaf/dataconverter/minecraft/versions/V165.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4476d08e1c0103a1f0beeb5144061aab01f5077
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V165.java
@@ -0,0 +1,45 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V165 {
+
+ private static final int VERSION = MCVersions.V1_9_PRE2;
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:written_book".equals(data.getString("id"))) {
+ return null;
+ }
+
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final ListType pages = tag.getList("pages", ObjectType.STRING);
+ if (pages == null) {
+ return null;
+ }
+
+ for (int i = 0, len = pages.size(); i < len; ++i) {
+ final String page = pages.getString(i);
+
+ pages.setString(i, ComponentUtils.convertFromLenient(page));
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V165() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java
new file mode 100644
index 0000000000000000000000000000000000000000..90967b33222ba7052d036c19cf08ca84a7dc7ef4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java
@@ -0,0 +1,31 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1800 {
+
+ private static final int VERSION = MCVersions.V1_13_2 + 169;
+
+ public static final Map<String, String> RENAMED_ITEM_IDS = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:cactus_green", "minecraft:green_dye")
+ .put("minecraft:rose_red", "minecraft:red_dye")
+ .put("minecraft:dandelion_yellow", "minecraft:yellow_dye")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, RENAMED_ITEM_IDS::get);
+
+ //registerMob("minecraft:panda"); // simple as of 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:pillager", new DataWalkerItemLists("Inventory"));
+ }
+
+ private V1800() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java
new file mode 100644
index 0000000000000000000000000000000000000000..e47ebb269f6e579274e2f1172c9180172e1064f7
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V1801 {
+
+ private static final int VERSION = MCVersions.V1_13_2 + 170;
+
+ public static void register() {
+ //registerMob("minecraft:illager_beast"); // changed to simple in 1.21.5
+ }
+
+ private V1801() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1802.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1802.java
new file mode 100644
index 0000000000000000000000000000000000000000..aeae0c62efa1e189fe4b0da585c8a2a101bb5ede
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1802.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V1802 {
+
+ private static final int VERSION = MCVersions.V1_13_2 + 171;
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:stone_slab", "minecraft:smooth_stone_slab",
+ "minecraft:sign", "minecraft:oak_sign", "minecraft:wall_sign", "minecraft:oak_wall_sign"
+ )
+ )::get);
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(ImmutableMap.of(
+ "minecraft:stone_slab", "minecraft:smooth_stone_slab",
+ "minecraft:sign", "minecraft:oak_sign"
+ )
+ )::get);
+ }
+
+ private V1802() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1803.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1803.java
new file mode 100644
index 0000000000000000000000000000000000000000..e12ae00288dcfc955d205b225dd8c5cf53d7afcb
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1803.java
@@ -0,0 +1,46 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V1803 {
+
+ public static final int VERSION = MCVersions.V1_13_2 + 172;
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType display = tag.getMap("display");
+
+ if (display == null) {
+ return null;
+ }
+
+ final ListType lore = display.getList("Lore", ObjectType.STRING);
+ if (lore == null) {
+ return null;
+ }
+
+ for (int i = 0, len = lore.size(); i < len; ++i) {
+ lore.setString(i, ComponentUtils.createPlainTextComponent(lore.getString(i)));
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1803() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1904.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1904.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4b1bdaddb5a9ee6fc6e1bb6a1df09cbcd6fdf86
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1904.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1904 {
+
+ private static final int VERSION = MCVersions.V18W43C + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:ocelot", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int catType = data.getInt("CatType");
+
+ if (catType == 0) {
+ final String owner = data.getString("Owner");
+ final String ownerUUID = data.getString("OwnerUUID");
+ if ((owner != null && owner.length() > 0) || (ownerUUID != null && ownerUUID.length() > 0)) {
+ data.setBoolean("Trusting", true);
+ }
+ } else if (catType > 0 && catType < 4) {
+ data.setString("id", "minecraft:cat");
+ data.setString("OwnerUUID", data.getString("OwnerUUID", ""));
+ }
+
+ return null;
+ }
+ });
+
+ //registerMob("minecraft:cat"); // changed to simple in 1.21.5
+ }
+
+ private V1904() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1905.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1905.java
new file mode 100644
index 0000000000000000000000000000000000000000..feba11bb1c4c3aeee4dcfbe51f4ca15d35c2d542
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1905.java
@@ -0,0 +1,34 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1905 {
+
+ private static final int VERSION = MCVersions.V18W43C + 2;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+
+ if (level == null) {
+ return null;
+ }
+
+ final String status = level.getString("Status");
+
+ if ("postprocessed".equals(status)) {
+ level.setString("Status", "fullchunk");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1905() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd60eb21ae8ced56a28b2515bd33a59f1eea44fd
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java
@@ -0,0 +1,21 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+
+public final class V1906 {
+
+ private static final int VERSION = MCVersions.V18W43C + 3;
+
+ public static void register() {
+ V1458.namedInventory(VERSION, "minecraft:barrel");
+ V1458.namedInventory(VERSION, "minecraft:smoker");
+ V1458.namedInventory(VERSION, "minecraft:blast_furnace");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:lectern", new DataWalkerItems("Book"));
+ }
+
+ private V1906() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1909.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1909.java
new file mode 100644
index 0000000000000000000000000000000000000000..ede4d0bfc0fe0e4a3a6fb906037a4c964baac6e6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1909.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+
+public final class V1909 {
+
+ private static final int VERSION = MCVersions.V18W45A + 1;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:jigsaw", new DataWalkerTypePaths<>(MCTypeRegistry.FLAT_BLOCK_STATE, "final_state"));
+ }
+
+ private V1909() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1911.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1911.java
new file mode 100644
index 0000000000000000000000000000000000000000..db9981030c0d4d826ba595d8465825023acfce20
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1911.java
@@ -0,0 +1,49 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V1911 {
+
+ private static final int VERSION = MCVersions.V18W46A + 1;
+
+ private static final Map<String, String> CHUNK_STATUS_REMAP = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("structure_references", "empty")
+ .put("biomes", "empty")
+ .put("base", "surface")
+ .put("carved", "carvers")
+ .put("liquid_carved", "liquid_carvers")
+ .put("decorated", "features")
+ .put("lighted", "light")
+ .put("mobs_spawned", "spawn")
+ .put("finalized", "heightmaps")
+ .put("fullchunk", "full")
+ .build()
+ );
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+
+ if (level == null) {
+ return null;
+ }
+
+ final String status = level.getString("Status", "empty");
+ level.setString("Status", CHUNK_STATUS_REMAP.getOrDefault(status, "empty"));
+
+ return null;
+ }
+ });
+ }
+
+ private V1911() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1914.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1914.java
new file mode 100644
index 0000000000000000000000000000000000000000..fad451b5dd46774fe086f2459ff88077a900a15a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1914.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1914 {
+
+ private static final int VERSION = MCVersions.V18W48A;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:chest", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String lootTable = data.getString("LootTable");
+
+ if ("minecraft:chests/village_blacksmith".equals(lootTable)) {
+ data.setString("LootTable", "minecraft:chests/village/village_weaponsmith");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1914() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1917.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1917.java
new file mode 100644
index 0000000000000000000000000000000000000000..51c0dee566eb1220c1544591655f30d0f4fd49b8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1917.java
@@ -0,0 +1,25 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1917 {
+
+ private static final int VERSION = MCVersions.V18W49A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:cat", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.getInt("CatType") == 9) {
+ data.setInt("CatType", 10);
+ }
+ return null;
+ }
+ });
+ }
+
+ private V1917() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1918.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1918.java
new file mode 100644
index 0000000000000000000000000000000000000000..74fab9ff2379fae494f48a19804b154c3162519c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1918.java
@@ -0,0 +1,65 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V1918 {
+
+ private static final int VERSION = MCVersions.V18W49A + 2;
+
+ private static String getProfessionString(final int professionId, final int careerId) {
+ if (professionId == 0) {
+ if (careerId == 2) {
+ return "minecraft:fisherman";
+ } else if (careerId == 3) {
+ return "minecraft:shepherd";
+ } else {
+ return careerId == 4 ? "minecraft:fletcher" : "minecraft:farmer";
+ }
+ } else if (professionId == 1) {
+ return careerId == 2 ? "minecraft:cartographer" : "minecraft:librarian";
+ } else if (professionId == 2) {
+ return "minecraft:cleric";
+ } else if (professionId == 3) {
+ if (careerId == 2) {
+ return "minecraft:weaponsmith";
+ } else {
+ return careerId == 3 ? "minecraft:toolsmith" : "minecraft:armorer";
+ }
+ } else if (professionId == 4) {
+ return careerId == 2 ? "minecraft:leatherworker" : "minecraft:butcher";
+ } else {
+ return professionId == 5 ? "minecraft:nitwit" : "minecraft:none";
+ }
+ }
+
+ public static void register() {
+ final DataConverter<MapType, MapType> converter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int profession = data.getInt("Profession");
+ final int career = data.getInt("Career");
+ final int careerLevel = data.getInt("CareerLevel", 1);
+ data.remove("Profession");
+ data.remove("Career");
+ data.remove("CareerLevel");
+
+ final MapType villagerData = Types.NBT.createEmptyMap();
+ data.setMap("VillagerData", villagerData);
+ villagerData.setString("type", "minecraft:plains");
+ villagerData.setString("profession", getProfessionString(profession, career));
+ villagerData.setInt("level", careerLevel);
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", converter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", converter);
+ }
+
+ private V1918() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1920.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1920.java
new file mode 100644
index 0000000000000000000000000000000000000000..74f06a170cad432383a314b06833f9334a9cbd6c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1920.java
@@ -0,0 +1,75 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+
+public final class V1920 {
+
+ private static final int VERSION = MCVersions.V18W50A + 1;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ final MapType structures = level.getMap("Structures");
+ if (structures == null) {
+ return null;
+ }
+
+ final MapType starts = structures.getMap("Starts");
+ if (starts != null) {
+ final MapType village = starts.getMap("New_Village");
+ if (village != null) {
+ starts.remove("New_Village");
+ starts.setMap("Village", village);
+ } else {
+ starts.remove("Village");
+ }
+ }
+
+ final MapType references = structures.getMap("References");
+ if (references != null) {
+ final MapType newVillage = references.getMap("New_Village");
+ // I believe Mojang had a typo here, removing Village from references only made sense
+ // if the new village didn't exist. DFU removes it whether or not it exists, but still relocates
+ // New_Village to Village first. It doesn't make sense to me to relocate it just to remove it, so it
+ // must be a typo.
+ if (newVillage == null) {
+ references.remove("Village");
+ } else {
+ references.remove("New_Village");
+ references.setMap("Village", newVillage);
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+
+ if ("minecraft:new_village".equals(NamespaceUtil.correctNamespace(id))) {
+ data.setString("id", "minecraft:village");
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:campfire", new DataWalkerItemLists("Items"));
+ }
+
+ private V1920() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1925.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1925.java
new file mode 100644
index 0000000000000000000000000000000000000000..8bc7155c186fdf52cc6c3ff45f04f9374bb9c87e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1925.java
@@ -0,0 +1,35 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V1925 {
+
+ private static final int VERSION = MCVersions.V19W03C + 1;
+
+ public static void register() {
+ MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType data = root.getMap("data");
+ if (data == null) {
+ final MapType ret = Types.NBT.createEmptyMap();
+ ret.setMap("data", root);
+
+ return ret;
+ }
+ return null;
+ }
+ });
+ MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, root.getMap("data"), "banners", "Name", fromVersion, toVersion);
+ return null;
+ });
+ }
+
+ private V1925() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java
new file mode 100644
index 0000000000000000000000000000000000000000..e43f828bb527e449e5c46c6da8ac980106e4940c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java
@@ -0,0 +1,29 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V1928 {
+
+ private static final int VERSION = MCVersions.V19W04B + 1;
+
+ public static void register() {
+ ConverterAbstractEntityRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:illager_beast", "minecraft:ravager"
+ )
+ )::get);
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:illager_beast_spawn_egg", "minecraft:ravager_spawn_egg"
+ )
+ )::get);
+
+ //registerMob("minecraft:ravager"); // changed to simple in 1.21.5
+ }
+
+ private V1928() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf63fd07bdb1736f5367d4fd217159d3aa383e6e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java
@@ -0,0 +1,32 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1929 {
+
+ private static final int VERSION = MCVersions.V19W04B + 2;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:wandering_trader", (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trader_llama", (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, data, "SaddleItem", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, data, "DecorItem", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Items", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ private V1929() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java
new file mode 100644
index 0000000000000000000000000000000000000000..06f467533d4139886510b61fd8aa6a190d4eb59c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java
@@ -0,0 +1,15 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V1931 {
+
+ private static final int VERSION = MCVersions.V19W06A;
+
+ public static void register() {
+ //registerMob("minecraft:fox"); // changed to simple in 1.21.5
+ }
+
+ private V1931() {}
+
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1936.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1936.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6f99547735f0056609de2fd7c9e69c439c8a271
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1936.java
@@ -0,0 +1,37 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1936 {
+
+ private static final int VERSION = MCVersions.V19W09A + 1;
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String chatOpacity = data.getString("chatOpacity");
+ if (chatOpacity != null) {
+ // Vanilla uses createDouble here, but options is always string -> string. I presume they made
+ // a mistake with this converter.
+ data.setString("textBackgroundOpacity", Double.toString(calculateBackground(chatOpacity)));
+ }
+ return null;
+ }
+ });
+ }
+
+ private static double calculateBackground(final String opacity) {
+ try {
+ final double d = 0.9D * Double.parseDouble(opacity) + 0.1D;
+ return d / 2.0D;
+ } catch (final NumberFormatException ex) {
+ return 0.5D;
+ }
+ }
+
+ private V1936() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1946.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1946.java
new file mode 100644
index 0000000000000000000000000000000000000000..2039be46ea37229b07bbfacb16506db7307cc576
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1946.java
@@ -0,0 +1,41 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V1946 {
+
+ private static final int VERSION = MCVersions.V19W14B + 1;
+
+ public static void register() {
+ MCTypeRegistry.POI_CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType sections = Types.NBT.createEmptyMap();
+ data.setMap("Sections", sections);
+
+ for (int y = 0; y < 16; ++y) {
+ final String key = Integer.toString(y);
+ final Object records = data.getGeneric(key);
+
+ if (records == null) {
+ continue;
+ }
+
+ data.remove(key);
+
+ final MapType section = Types.NBT.createEmptyMap();
+ section.setGeneric("Records", records);
+ sections.setMap(key, section);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1946() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1948.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1948.java
new file mode 100644
index 0000000000000000000000000000000000000000..b879d83bf8fa3b99ecdda552a71b4936ca93e7ce
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1948.java
@@ -0,0 +1,39 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1948 {
+
+ private static final int VERSION = MCVersions.V1_14_PRE2;
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:white_banner", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType display = tag.getMap("display");
+ if (display == null) {
+ return null;
+ }
+
+ final String name = display.getString("Name");
+ if (name == null) {
+ return null;
+ }
+
+ display.setString("Name", name.replace("\"translate\":\"block.minecraft.illager_banner\"", "\"translate\":\"block.minecraft.ominous_banner\""));
+
+ return null;
+ }
+ });
+ }
+
+ private V1948() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1953.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1953.java
new file mode 100644
index 0000000000000000000000000000000000000000..3178487686defc7d30afe4f5bc3043da569bafae
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1953.java
@@ -0,0 +1,26 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1953 {
+
+ private static final int VERSION = MCVersions.V1_14 + 1;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String name = data.getString("CustomName");
+ if (name != null) {
+ data.setString("CustomName", name.replace("\"translate\":\"block.minecraft.illager_banner\"", "\"translate\":\"block.minecraft.ominous_banner\""));
+ }
+ return null;
+ }
+ });
+ }
+
+ private V1953() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1955.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1955.java
new file mode 100644
index 0000000000000000000000000000000000000000..701c426b4aa3b35a490ebab734c3d4bd50ea10af
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1955.java
@@ -0,0 +1,93 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import net.minecraft.util.Mth;
+
+public final class V1955 {
+
+ private static final int VERSION = MCVersions.V1_14_1_PRE1;
+
+ private static final int[] LEVEL_XP_THRESHOLDS = new int[] {
+ 0,
+ 10,
+ 50,
+ 100,
+ 150
+ };
+
+ private static int getMinXpPerLevel(final int level) {
+ return LEVEL_XP_THRESHOLDS[Mth.clamp(level - 1, 0, LEVEL_XP_THRESHOLDS.length - 1)];
+ }
+
+ private static void addLevel(final MapType data, final int level) {
+ MapType villagerData = data.getMap("VillagerData");
+ if (villagerData == null) {
+ villagerData = Types.NBT.createEmptyMap();
+ data.setMap("VillagerData", villagerData);
+ }
+ villagerData.setInt("level", level);
+ }
+
+ private static void addXpFromLevel(final MapType data, final int level) {
+ data.setInt("Xp", getMinXpPerLevel(level));
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType villagerData = data.getMap("VillagerData");
+ int level = villagerData == null ? 0 : villagerData.getInt("level");
+ if (level == 0 || level == 1) {
+ // count recipes
+ final MapType offers = data.getMap("Offers");
+ final ListType recipes = offers == null ? null : offers.getList("Recipes", ObjectType.MAP);
+ final int recipeCount;
+ if (recipes != null) {
+ recipeCount = recipes.size();
+ } else {
+ recipeCount = 0;
+ }
+
+ level = Mth.clamp(recipeCount / 2, 1, 5);
+ if (level > 1) {
+ addLevel(data, level);
+ }
+ }
+
+ if (!data.hasKey("Xp", ObjectType.NUMBER)) {
+ addXpFromLevel(data, level);
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final Number xp = data.getNumber("Xp");
+ if (xp == null) {
+ final int level;
+ final MapType villagerData = data.getMap("VillagerData");
+ if (villagerData == null) {
+ level = 1;
+ } else {
+ level = villagerData.getInt("level", 1);
+ }
+
+ data.setInt("Xp", getMinXpPerLevel(level));
+ }
+ return null;
+ }
+ });
+ }
+
+ private V1955() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1961.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1961.java
new file mode 100644
index 0000000000000000000000000000000000000000..e49e4c902c6fa6d5794ac0c22508c96d82c6ff7a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1961.java
@@ -0,0 +1,29 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1961 {
+
+ private static final int VERSION = MCVersions.V1_14_2_PRE3 + 1;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ level.remove("isLightOn");
+
+ return null;
+ }
+ });
+ }
+
+ private V1961() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1963.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1963.java
new file mode 100644
index 0000000000000000000000000000000000000000..e13c694cd9a992c0129fdec3a3c90ef3dad1ff17
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1963.java
@@ -0,0 +1,39 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V1963 {
+
+ private static final int VERSION = MCVersions.V1_14_2;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType gossips = data.getList("Gossips", ObjectType.MAP);
+ if (gossips == null) {
+ return null;
+ }
+
+ for (int i = 0; i < gossips.size();) {
+ final MapType gossip = gossips.getMap(i);
+ if ("golem".equals(gossip.getString("Type"))) {
+ gossips.remove(i);
+ continue;
+ }
+
+ ++i;
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1963() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java
new file mode 100644
index 0000000000000000000000000000000000000000..90d2fcf77e746081043a32503049df7b127e00a7
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java
@@ -0,0 +1,47 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.recipe.ConverterAbstractRecipeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2100 {
+
+ private static final int VERSION = MCVersions.V1_14_4 + 124;
+ private static final Map<String, String> RECIPE_RENAMES = new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:sugar", "minecraft:sugar_from_sugar_cane"
+ )
+ );
+ private static final Map<String, String> ADVANCEMENT_RENAMES = new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:recipes/misc/sugar", "minecraft:recipes/misc/sugar_from_sugar_cane"
+ )
+ );
+
+ public static void register() {
+ ConverterAbstractRecipeRename.register(VERSION, RECIPE_RENAMES::get);
+ ConverterAbstractAdvancementsRename.register(VERSION, ADVANCEMENT_RENAMES::get);
+
+ //registerMob("minecraft:bee"); // changed in 1.21.5 to simple
+ //registerMob("minecraft:bee_stinger"); // changed in 1.21.5 to simple
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:beehive", (data, fromVersion, toVersion) -> {
+ final ListType bees = data.getList("Bees", ObjectType.MAP);
+ if (bees != null) {
+ for (int i = 0, len = bees.size(); i < len; ++i) {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, bees.getMap(i), "EntityData", fromVersion, toVersion);
+ }
+ }
+
+ return null;
+ });
+ }
+
+ private V2100() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2202.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2202.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce20aaa8ef06c69ec85ddf0e5bdf17f57fa5ce70
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2202.java
@@ -0,0 +1,49 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2202 {
+
+ private static final int VERSION = MCVersions.V19W35A + 1;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ final int[] oldBiomes = level.getInts("Biomes");
+
+ if (oldBiomes == null || oldBiomes.length != 256) {
+ return null;
+ }
+
+ final int[] newBiomes = new int[1024];
+ level.setInts("Biomes", newBiomes);
+
+ for (int i = 0; i < 4; ++i) {
+ for (int j = 0; j < 4; ++j) {
+ int k = (j << 2) + 2;
+ int l = (i << 2) + 2;
+ int m = l << 4 | k;
+ newBiomes[i << 2 | j] = oldBiomes[m];
+ }
+ }
+
+ for (int i = 1; i < 64; ++i) {
+ System.arraycopy(newBiomes, 0, newBiomes, i * 16, 16);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2202() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2209.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2209.java
new file mode 100644
index 0000000000000000000000000000000000000000..7439d0e948f144d93a1fa7b57c2b478a54835d6d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2209.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.poi.ConverterAbstractPOIRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2209 {
+
+ private static final int VERSION = MCVersions.V19W40A + 1;
+
+ public static void register() {
+ final Map<String, String> renamedIds = new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:bee_hive", "minecraft:beehive"
+ )
+ );
+
+ ConverterAbstractBlockRename.register(VERSION, renamedIds::get);
+ ConverterAbstractItemRename.register(VERSION, renamedIds::get);
+ ConverterAbstractPOIRename.register(VERSION, renamedIds::get);
+ }
+
+ private V2209() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2211.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2211.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b888aadf7f4abfd9feff25aa785d84782d14ba0
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2211.java
@@ -0,0 +1,31 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V2211 {
+
+ private static final int VERSION = MCVersions.V19W41A + 1;
+
+ public static void register() {
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!data.hasKey("references", ObjectType.NUMBER)) {
+ return null;
+ }
+
+ final int references = data.getInt("references");
+ if (references <= 0) {
+ data.setInt("references", 1);
+ }
+ return null;
+ }
+ });
+ }
+
+ private V2211() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2218.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2218.java
new file mode 100644
index 0000000000000000000000000000000000000000..3fc4c20e117edd06056145d58d822eb5c2c16e61
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2218.java
@@ -0,0 +1,33 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2218 {
+
+ private static final int VERSION = MCVersions.V1_15_PRE1;
+
+ public static void register() {
+ MCTypeRegistry.POI_CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType sections = data.getMap("Sections");
+ if (sections == null) {
+ return null;
+ }
+
+ for (final String key : sections.keys()) {
+ final MapType section = sections.getMap(key);
+
+ section.remove("Valid");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2218() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2501.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2501.java
new file mode 100644
index 0000000000000000000000000000000000000000..02dec41330c7e463f8b9869752ddae1601ac3763
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2501.java
@@ -0,0 +1,67 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V2501 {
+
+ private static final int VERSION = MCVersions.V1_15_2 + 271;
+
+ private static void registerFurnace(final String id) {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, id, (data, fromVersion, toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Items", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "CustomName", fromVersion, toVersion);
+
+ WalkerUtils.convertKeys(MCTypeRegistry.RECIPE, data, "RecipesUsed", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ public static void register() {
+ final DataConverter<MapType, MapType> converter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int recipesUsedSize = data.getInt("RecipesUsedSize");
+ data.remove("RecipesUsedSize");
+
+ if (recipesUsedSize <= 0) {
+ return null;
+ }
+
+ final MapType newRecipes = Types.NBT.createEmptyMap();
+ data.setMap("RecipesUsed", newRecipes);
+
+ for (int i = 0; i < recipesUsedSize; ++i) {
+ final String recipeKey = data.getString("RecipeLocation" + i);
+ data.remove("RecipeLocation" + i);
+ final int recipeAmount = data.getInt("RecipeAmount" + i);
+ data.remove("RecipeAmount" + i);
+
+ if (i <= 0 || recipeKey == null) {
+ continue;
+ }
+
+ newRecipes.setInt(recipeKey, recipeAmount);
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:furnace", converter);
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:blast_furnace", converter);
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:smoker", converter);
+
+ registerFurnace("minecraft:furnace");
+ registerFurnace("minecraft:smoker");
+ registerFurnace("minecraft:blast_furnace");
+ }
+
+ private V2501() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2f0495c05e670d100cb90d526c1785ab172b5a2
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2502 {
+
+ private static final int VERSION = MCVersions.V1_15_2 + 272;
+
+ public static void register() {
+ //registerMob("minecraft:hoglin"); changed to simple in 1.21.5
+ }
+
+ private V2502() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2503.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2503.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1fca94f01bc9c18de17e4b40a98c57a4f965f7c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2503.java
@@ -0,0 +1,73 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class V2503 {
+
+ private static final int VERSION = MCVersions.V1_15_2 + 273;
+
+ private static final Set<String> WALL_BLOCKS = new HashSet<>(
+ ImmutableSet.of(
+ "minecraft:andesite_wall",
+ "minecraft:brick_wall",
+ "minecraft:cobblestone_wall",
+ "minecraft:diorite_wall",
+ "minecraft:end_stone_brick_wall",
+ "minecraft:granite_wall",
+ "minecraft:mossy_cobblestone_wall",
+ "minecraft:mossy_stone_brick_wall",
+ "minecraft:nether_brick_wall",
+ "minecraft:prismarine_wall",
+ "minecraft:red_nether_brick_wall",
+ "minecraft:red_sandstone_wall",
+ "minecraft:sandstone_wall",
+ "minecraft:stone_brick_wall"
+ )
+ );
+
+ private static void changeWallProperty(final MapType properties, final String path) {
+ final String property = properties.getString(path);
+ if (property != null) {
+ properties.setString(path, "true".equals(property) ? "low" : "none");
+ }
+ }
+
+ public static void register() {
+ MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!WALL_BLOCKS.contains(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType properties = data.getMap("Properties");
+ if (properties == null) {
+ return null;
+ }
+
+ changeWallProperty(properties, "east");
+ changeWallProperty(properties, "west");
+ changeWallProperty(properties, "north");
+ changeWallProperty(properties, "south");
+
+ return null;
+ }
+ });
+ ConverterAbstractAdvancementsRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:recipes/misc/composter", "minecraft:recipes/decorations/composter"
+ )
+ )::get);
+ }
+
+ private V2503() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2505.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2505.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7c4ddf11e841b23c17fc95fdcb878dffecb07d8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2505.java
@@ -0,0 +1,45 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V2505 {
+
+ private static final int VERSION = MCVersions.V20W06A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType brain = data.getMap("Brain");
+ if (brain == null) {
+ return null;
+ }
+
+ final MapType memories = brain.getMap("memories");
+ if (memories == null) {
+ return null;
+ }
+
+ for (final String key : memories.keys()) {
+ final Object value = memories.getGeneric(key);
+
+ final MapType wrapped = Types.NBT.createEmptyMap();
+ wrapped.setGeneric("value", value);
+
+ memories.setMap(key, wrapped);
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:piglin", new DataWalkerItemLists("Inventory"));
+ }
+
+ private V2505() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2508.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2508.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9e9d88e4cca15d2d4fdcbc0dbcae4c35c02284a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2508.java
@@ -0,0 +1,27 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2508 {
+
+ private static final int VERSION = MCVersions.V20W08A + 1;
+
+ public static void register() {
+ final Map<String, String> remap = new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:warped_fungi", "minecraft:warped_fungus",
+ "minecraft:crimson_fungi", "minecraft:crimson_fungus"
+ )
+ );
+
+ ConverterAbstractBlockRename.register(VERSION, remap::get);
+ ConverterAbstractItemRename.register(VERSION, remap::get);
+ }
+
+ private V2508() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c8780f626b10918851a222afd8406d82e3754c0
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java
@@ -0,0 +1,29 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V2509 {
+
+ private static final int VERSION = MCVersions.V20W08A + 2;
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:zombie_pigman_spawn_egg", "minecraft:zombified_piglin_spawn_egg"
+ )
+ )::get);
+ ConverterAbstractEntityRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:zombie_pigman", "minecraft:zombified_piglin"
+ )
+ )::get);
+
+ //registerMob("minecraft:zombified_piglin"); // changed to simple in 1.21.5
+ }
+
+ private V2509() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java
new file mode 100644
index 0000000000000000000000000000000000000000..0fe1e7b2c8c6e197c89643da0f2cda9fcf779dff
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java
@@ -0,0 +1,99 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V2511 {
+
+ private static final int VERSION = MCVersions.V20W09A + 1;
+
+ private static int[] createUUIDArray(final long most, final long least) {
+ return new int[] {
+ (int)(most >>> 32),
+ (int)most,
+ (int)(least >>> 32),
+ (int)least
+ };
+ }
+
+ private static void setUUID(final MapType data, final long most, final long least) {
+ if (most != 0L && least != 0L) {
+ data.setInts("OwnerUUID", createUUIDArray(most, least));
+ }
+ }
+
+ public static void register() {
+ final DataConverter<MapType, MapType> throwableConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType owner = data.getMap("owner");
+ data.remove("owner");
+ if (owner == null) {
+ return null;
+ }
+
+ setUUID(data, owner.getLong("M"), owner.getLong("L"));
+
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> potionConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType potion = data.getMap("Potion");
+ data.remove("Potion");
+
+ data.setMap("Item", potion == null ? Types.NBT.createEmptyMap() : potion);
+
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> llamaSpitConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType owner = data.getMap("Owner");
+ data.remove("Owner");
+ if (owner == null) {
+ return null;
+ }
+
+ setUUID(data, owner.getLong("OwnerUUIDMost"), owner.getLong("OwnerUUIDLeast"));
+
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> arrowConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ setUUID(data, data.getLong("OwnerUUIDMost"), data.getLong("OwnerUUIDLeast"));
+
+ data.remove("OwnerUUIDMost");
+ data.remove("OwnerUUIDLeast");
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:egg", throwableConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:ender_pearl", throwableConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:experience_bottle", throwableConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:snowball", throwableConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:potion", throwableConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:potion", potionConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:llama_spit", llamaSpitConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", arrowConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", arrowConverter);
+
+ // Vanilla uses version step 1, but there's no need to add a step here.
+ // Note: Originally we have had this walker on step 0, as Vanilla accidentally left this walker out
+ // until 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerItems("Item"));
+ }
+
+ private V2511() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2514.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2514.java
new file mode 100644
index 0000000000000000000000000000000000000000..167109fb53b45901e944ae3eb4a690956fe18e8f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2514.java
@@ -0,0 +1,590 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.google.common.collect.Sets;
+import java.util.Set;
+import java.util.UUID;
+
+public final class V2514 {
+
+ private static final int VERSION = MCVersions.V20W11A + 1;
+
+ private static final Set<String> ABSTRACT_HORSES = Sets.newHashSet();
+ private static final Set<String> TAMEABLE_ANIMALS = Sets.newHashSet();
+ private static final Set<String> ANIMALS = Sets.newHashSet();
+ private static final Set<String> MOBS = Sets.newHashSet();
+ private static final Set<String> LIVING_ENTITIES = Sets.newHashSet();
+ private static final Set<String> PROJECTILES = Sets.newHashSet();
+ static {
+ ABSTRACT_HORSES.add("minecraft:donkey");
+ ABSTRACT_HORSES.add("minecraft:horse");
+ ABSTRACT_HORSES.add("minecraft:llama");
+ ABSTRACT_HORSES.add("minecraft:mule");
+ ABSTRACT_HORSES.add("minecraft:skeleton_horse");
+ ABSTRACT_HORSES.add("minecraft:trader_llama");
+ ABSTRACT_HORSES.add("minecraft:zombie_horse");
+
+ TAMEABLE_ANIMALS.add("minecraft:cat");
+ TAMEABLE_ANIMALS.add("minecraft:parrot");
+ TAMEABLE_ANIMALS.add("minecraft:wolf");
+
+ ANIMALS.add("minecraft:bee");
+ ANIMALS.add("minecraft:chicken");
+ ANIMALS.add("minecraft:cow");
+ ANIMALS.add("minecraft:fox");
+ ANIMALS.add("minecraft:mooshroom");
+ ANIMALS.add("minecraft:ocelot");
+ ANIMALS.add("minecraft:panda");
+ ANIMALS.add("minecraft:pig");
+ ANIMALS.add("minecraft:polar_bear");
+ ANIMALS.add("minecraft:rabbit");
+ ANIMALS.add("minecraft:sheep");
+ ANIMALS.add("minecraft:turtle");
+ ANIMALS.add("minecraft:hoglin");
+
+ MOBS.add("minecraft:bat");
+ MOBS.add("minecraft:blaze");
+ MOBS.add("minecraft:cave_spider");
+ MOBS.add("minecraft:cod");
+ MOBS.add("minecraft:creeper");
+ MOBS.add("minecraft:dolphin");
+ MOBS.add("minecraft:drowned");
+ MOBS.add("minecraft:elder_guardian");
+ MOBS.add("minecraft:ender_dragon");
+ MOBS.add("minecraft:enderman");
+ MOBS.add("minecraft:endermite");
+ MOBS.add("minecraft:evoker");
+ MOBS.add("minecraft:ghast");
+ MOBS.add("minecraft:giant");
+ MOBS.add("minecraft:guardian");
+ MOBS.add("minecraft:husk");
+ MOBS.add("minecraft:illusioner");
+ MOBS.add("minecraft:magma_cube");
+ MOBS.add("minecraft:pufferfish");
+ MOBS.add("minecraft:zombified_piglin");
+ MOBS.add("minecraft:salmon");
+ MOBS.add("minecraft:shulker");
+ MOBS.add("minecraft:silverfish");
+ MOBS.add("minecraft:skeleton");
+ MOBS.add("minecraft:slime");
+ MOBS.add("minecraft:snow_golem");
+ MOBS.add("minecraft:spider");
+ MOBS.add("minecraft:squid");
+ MOBS.add("minecraft:stray");
+ MOBS.add("minecraft:tropical_fish");
+ MOBS.add("minecraft:vex");
+ MOBS.add("minecraft:villager");
+ MOBS.add("minecraft:iron_golem");
+ MOBS.add("minecraft:vindicator");
+ MOBS.add("minecraft:pillager");
+ MOBS.add("minecraft:wandering_trader");
+ MOBS.add("minecraft:witch");
+ MOBS.add("minecraft:wither");
+ MOBS.add("minecraft:wither_skeleton");
+ MOBS.add("minecraft:zombie");
+ MOBS.add("minecraft:zombie_villager");
+ MOBS.add("minecraft:phantom");
+ MOBS.add("minecraft:ravager");
+ MOBS.add("minecraft:piglin");
+
+ LIVING_ENTITIES.add("minecraft:armor_stand");
+
+ PROJECTILES.add("minecraft:arrow");
+ PROJECTILES.add("minecraft:dragon_fireball");
+ PROJECTILES.add("minecraft:firework_rocket");
+ PROJECTILES.add("minecraft:fireball");
+ PROJECTILES.add("minecraft:llama_spit");
+ PROJECTILES.add("minecraft:small_fireball");
+ PROJECTILES.add("minecraft:snowball");
+ PROJECTILES.add("minecraft:spectral_arrow");
+ PROJECTILES.add("minecraft:egg");
+ PROJECTILES.add("minecraft:ender_pearl");
+ PROJECTILES.add("minecraft:experience_bottle");
+ PROJECTILES.add("minecraft:potion");
+ PROJECTILES.add("minecraft:trident");
+ PROJECTILES.add("minecraft:wither_skull");
+ }
+
+ static int[] createUUIDArray(final long most, final long least) {
+ return new int[] {
+ (int)(most >>> 32),
+ (int)most,
+ (int)(least >>> 32),
+ (int)least
+ };
+ }
+
+ static int[] createUUIDFromString(final MapType data, final String path) {
+ if (data == null) {
+ return null;
+ }
+
+ final String uuidString = data.getString(path);
+ if (uuidString == null) {
+ return null;
+ }
+
+ try {
+ final UUID uuid = UUID.fromString(uuidString);
+ return createUUIDArray(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits());
+ } catch (final IllegalArgumentException ignore) {
+ return null;
+ }
+ }
+
+ static int[] createUUIDFromLongs(final MapType data, final String most, final String least) {
+ if (data == null) {
+ return null;
+ }
+
+ final long mostBits = data.getLong(most);
+ final long leastBits = data.getLong(least);
+
+ return (mostBits != 0 || leastBits != 0) ? createUUIDArray(mostBits, leastBits) : null;
+ }
+
+ static void replaceUUIDString(final MapType data, final String oldPath, final String newPath) {
+ final int[] newUUID = createUUIDFromString(data, oldPath);
+ if (newUUID != null) {
+ data.remove(oldPath);
+ data.setInts(newPath, newUUID);
+ }
+ }
+
+ static void replaceUUIDMLTag(final MapType data, final String oldPath, final String newPath) {
+ final int[] uuid = createUUIDFromLongs(data.getMap(oldPath), "M", "L");
+ if (uuid != null) {
+ data.remove(oldPath);
+ data.setInts(newPath, uuid);
+ }
+ }
+
+ static void replaceUUIDLeastMost(final MapType data, final String prefix, final String newPath) {
+ final String mostPath = prefix.concat("Most");
+ final String leastPath = prefix.concat("Least");
+
+ final int[] uuid = createUUIDFromLongs(data, mostPath, leastPath);
+ if (uuid != null) {
+ data.remove(mostPath);
+ data.remove(leastPath);
+ data.setInts(newPath, uuid);
+ }
+ }
+
+ private static void updatePiglin(final MapType data) {
+ final MapType brain = data.getMap("Brain");
+ if (brain == null) {
+ return;
+ }
+
+ final MapType memories = brain.getMap("memories");
+ if (memories == null) {
+ return;
+ }
+
+ final MapType angryAt = memories.getMap("minecraft:angry_at");
+
+ replaceUUIDString(angryAt, "value", "value");
+ }
+
+ private static void updateEvokerFangs(final MapType data) {
+ replaceUUIDLeastMost(data, "OwnerUUID", "Owner");
+ }
+
+ private static void updateZombieVillager(final MapType data) {
+ replaceUUIDLeastMost(data, "ConversionPlayer", "ConversionPlayer");
+ }
+
+ private static void updateAreaEffectCloud(final MapType data) {
+ replaceUUIDLeastMost(data, "OwnerUUID", "Owner");
+ }
+
+ private static void updateShulkerBullet(final MapType data) {
+ replaceUUIDMLTag(data, "Owner", "Owner");
+ replaceUUIDMLTag(data, "Target", "Target");
+ }
+
+ private static void updateItem(final MapType data) {
+ replaceUUIDMLTag(data, "Owner", "Owner");
+ replaceUUIDMLTag(data, "Thrower", "Thrower");
+ }
+
+ private static void updateFox(final MapType data) {
+ final ListType trustedUUIDS = data.getList("TrustedUUIDs", ObjectType.MAP);
+ if (trustedUUIDS == null) {
+ return;
+ }
+
+ final ListType newUUIDs = Types.NBT.createEmptyList();
+ data.remove("TrustedUUIDs");
+ data.setList("Trusted", newUUIDs);
+
+ for (int i = 0, len = trustedUUIDS.size(); i < len; ++i) {
+ final MapType uuid = trustedUUIDS.getMap(i);
+ final int[] newUUID = createUUIDFromLongs(uuid, "M", "L");
+ if (newUUID != null) {
+ newUUIDs.addIntArray(newUUID);
+ }
+ }
+ }
+
+ private static void updateHurtBy(final MapType data) {
+ replaceUUIDString(data, "HurtBy", "HurtBy");
+ }
+
+ private static void updateAnimalOwner(final MapType data) {
+ updateAnimal(data);
+
+ replaceUUIDString(data, "OwnerUUID", "Owner");
+ }
+
+ private static void updateAnimal(final MapType data) {
+ updateMob(data);
+
+ replaceUUIDLeastMost(data, "LoveCause", "LoveCause");
+ }
+
+ private static void updateMob(final MapType data) {
+ updateLivingEntity(data);
+
+ final MapType leash = data.getMap("Leash");
+ if (leash == null) {
+ return;
+ }
+
+ replaceUUIDLeastMost(leash, "UUID", "UUID");
+ }
+
+ private static void updateLivingEntity(final MapType data) {
+ final ListType attributes = data.getList("Attributes", ObjectType.MAP);
+ if (attributes == null) {
+ return;
+ }
+
+ for (int i = 0, len = attributes.size(); i < len; ++i) {
+ final MapType attribute = attributes.getMap(i);
+
+ final ListType modifiers = attribute.getList("Modifiers", ObjectType.MAP);
+ if (modifiers == null) {
+ continue;
+ }
+
+ for (int k = 0; k < modifiers.size(); ++k) {
+ replaceUUIDLeastMost(modifiers.getMap(k), "UUID", "UUID");
+ }
+ }
+ }
+
+ private static void updateProjectile(final MapType data) {
+ final Object ownerUUID = data.getGeneric("OwnerUUID");
+ if (ownerUUID != null) {
+ data.remove("OwnerUUID");
+ data.setGeneric("Owner", ownerUUID);
+ }
+ }
+
+ private static void updateEntityUUID(final MapType data) {
+ replaceUUIDLeastMost(data, "UUID", "UUID");
+ }
+
+ public static void register() {
+ // Entity UUID fixes
+
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateEntityUUID(data);
+ return null;
+ }
+ });
+
+ final DataConverter<MapType, MapType> animalOwnerConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateAnimalOwner(data);
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> animalConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateAnimal(data);
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> mobConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateMob(data);
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> livingEntityConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateLivingEntity(data);
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> projectileConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateProjectile(data);
+ return null;
+ }
+ };
+ for (final String id : ABSTRACT_HORSES) {
+ MCTypeRegistry.ENTITY.addConverterForId(id, animalOwnerConverter);
+ }
+ for (final String id : TAMEABLE_ANIMALS) {
+ MCTypeRegistry.ENTITY.addConverterForId(id, animalOwnerConverter);
+ }
+ for (final String id : ANIMALS) {
+ MCTypeRegistry.ENTITY.addConverterForId(id, animalConverter);
+ }
+ for (final String id : MOBS) {
+ MCTypeRegistry.ENTITY.addConverterForId(id, mobConverter);
+ }
+ for (final String id : LIVING_ENTITIES) {
+ MCTypeRegistry.ENTITY.addConverterForId(id, livingEntityConverter);
+ }
+ for (final String id : PROJECTILES) {
+ MCTypeRegistry.ENTITY.addConverterForId(id, projectileConverter);
+ }
+
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:bee", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateHurtBy(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombified_piglin", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateHurtBy(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:fox", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateFox(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:item", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateItem(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker_bullet", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateShulkerBullet(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateAreaEffectCloud(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateZombieVillager(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:evoker_fangs", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateEvokerFangs(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:piglin", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updatePiglin(data);
+ return null;
+ }
+ });
+
+
+ // Update TE
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:conduit", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ replaceUUIDMLTag(data, "target_uuid", "Target");
+ return null;
+ }
+ });
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:skull", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType owner = data.getMap("Owner");
+ if (owner == null) {
+ return null;
+ }
+
+ data.remove("Owner");
+
+ replaceUUIDString(owner, "Id", "Id");
+
+ data.setMap("SkullOwner", owner);
+
+ return null;
+ }
+ });
+
+ // Player UUID
+ MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateLivingEntity(data);
+ updateEntityUUID(data);
+
+ final MapType rootVehicle = data.getMap("RootVehicle");
+ if (rootVehicle == null) {
+ return null;
+ }
+
+ replaceUUIDLeastMost(rootVehicle, "Attach", "Attach");
+
+ return null;
+ }
+ });
+
+ // Level.dat
+ MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ replaceUUIDString(data, "WanderingTraderId", "WanderingTraderId");
+
+ final MapType dimensionData = data.getMap("DimensionData");
+ if (dimensionData != null) {
+ for (final String key : dimensionData.keys()) {
+ final MapType dimension = dimensionData.getMap(key);
+
+ final MapType dragonFight = dimension.getMap("DragonFight");
+ if (dragonFight == null) {
+ continue;
+ }
+
+ replaceUUIDLeastMost(dragonFight, "DragonUUID", "Dragon");
+ }
+ }
+
+ final MapType customBossEvents = data.getMap("CustomBossEvents");
+ if (customBossEvents != null) {
+ for (final String key : customBossEvents.keys()) {
+ final MapType customBossEvent = customBossEvents.getMap(key);
+
+ final ListType players = customBossEvent.getList("Players", ObjectType.MAP);
+ if (players == null) {
+ continue;
+ }
+
+ final ListType newPlayers = Types.NBT.createEmptyList();
+ customBossEvent.setList("Players", newPlayers);
+
+ for (int i = 0, len = players.size(); i < len; ++i) {
+ final int[] newUUID = createUUIDFromLongs(players.getMap(i), "M", "L");
+ if (newUUID != null) {
+ newPlayers.addIntArray(newUUID);
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.SAVED_DATA_RAIDS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+ final ListType raids = data.getList("Raids", ObjectType.MAP);
+ if (raids == null) {
+ return null;
+ }
+
+ for (int i = 0, len = raids.size(); i < len; ++i) {
+ final MapType raid = raids.getMap(i);
+
+ final ListType heros = raid.getList("HeroesOfTheVillage", ObjectType.MAP);
+
+ if (heros == null) {
+ continue;
+ }
+
+ final ListType newHeros = Types.NBT.createEmptyList();
+ raid.setList("HeroesOfTheVillage", newHeros);
+
+ for (int k = 0, klen = heros.size(); k < klen; ++k) {
+ final MapType uuidOld = heros.getMap(i);
+ final int[] uuidNew = createUUIDFromLongs(uuidOld, "UUIDMost", "UUIDLeast");
+ if (uuidNew != null) {
+ newHeros.addIntArray(uuidNew);
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ updateAttributeModifiers(tag);
+
+ if ("minecraft:player_head".equals(data.getString("id"))) {
+ updateSkullOwner(tag);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private static void updateAttributeModifiers(final MapType tag) {
+ final ListType attributes = tag.getList("AttributeModifiers", ObjectType.MAP);
+ if (attributes == null) {
+ return;
+ }
+
+ for (int i = 0, len = attributes.size(); i < len; ++i) {
+ replaceUUIDLeastMost(attributes.getMap(i), "UUID", "UUID");
+ }
+ }
+
+ private static void updateSkullOwner(final MapType tag) {
+ replaceUUIDString(tag.getMap("SkullOwner"), "Id", "Id");
+ }
+
+ private V2514() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2516.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2516.java
new file mode 100644
index 0000000000000000000000000000000000000000..50f8e258ecc71e2c7e88ae8ccd83494da9ca9dfd
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2516.java
@@ -0,0 +1,37 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V2516 {
+
+ private static final int VERSION = MCVersions.V20W12A + 1;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> gossipUUIDConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType gossips = data.getList("Gossips", ObjectType.MAP);
+
+ if (gossips == null) {
+ return null;
+ }
+
+ for (int i = 0, len = gossips.size(); i < len; ++i) {
+ V2514.replaceUUIDLeastMost(gossips.getMap(i), "Target", "Target");
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", gossipUUIDConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", gossipUUIDConverter);
+ }
+
+ private V2516() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2518.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2518.java
new file mode 100644
index 0000000000000000000000000000000000000000..df2c6cd50b2b0bfc062210a48d7e4b25a6cf0cb0
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2518.java
@@ -0,0 +1,65 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2518 {
+
+ private static final int VERSION = MCVersions.V20W12A + 3;
+
+ private static final Map<String, String> FACING_RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("down", "down_south")
+ .put("up", "up_north")
+ .put("north", "north_up")
+ .put("south", "south_up")
+ .put("west", "west_up")
+ .put("east", "east_up")
+ .build()
+ );
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:jigsaw", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String type = data.getString("attachement_type", "minecraft:empty");
+ final String pool = data.getString("target_pool", "minecraft:empty");
+ data.remove("attachement_type");
+ data.remove("target_pool");
+
+ data.setString("name", type);
+ data.setString("target", type);
+ data.setString("pool", pool);
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:jigsaw".equals(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType properties = data.getMap("Properties");
+ if (properties == null) {
+ return null;
+ }
+
+ final String facing = properties.getString("facing", "north");
+ properties.remove("facing");
+ properties.setString("orientation", FACING_RENAMES.getOrDefault(facing, facing));
+
+ return null;
+ }
+ });
+ }
+
+ private V2518() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java
new file mode 100644
index 0000000000000000000000000000000000000000..e270ccada1c13a4c71b227cf0096dc3094ceff6f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2519 {
+
+ private static final int VERSION = MCVersions.V20W12A + 4;
+
+ public static void register() {
+ //registerMob("minecraft:strider"); // changed to simple in 1.21.5
+ }
+
+ private V2519() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java
new file mode 100644
index 0000000000000000000000000000000000000000..89258da61bccb3668730adad70c0383de001a5a3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2522 {
+
+ private static final int VERSION = MCVersions.V20W13B + 1;
+
+ public static void register() {
+ //registerMob("minecraft:zoglin"); // changed to simple in 1.21.5
+ }
+
+ private V2522() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2523.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2523.java
new file mode 100644
index 0000000000000000000000000000000000000000..7777d83d63dc177f0bac72290ed2e5c3cbd028be
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2523.java
@@ -0,0 +1,41 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.attributes.ConverterAbstractOldAttributesRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2523 {
+
+ private static final int VERSION = MCVersions.V20W13B + 2;
+
+ private static final Map<String, String> RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("generic.maxHealth", "minecraft:generic.max_health")
+ .put("Max Health", "minecraft:generic.max_health")
+ .put("zombie.spawnReinforcements", "minecraft:zombie.spawn_reinforcements")
+ .put("Spawn Reinforcements Chance", "minecraft:zombie.spawn_reinforcements")
+ .put("horse.jumpStrength", "minecraft:horse.jump_strength")
+ .put("Jump Strength", "minecraft:horse.jump_strength")
+ .put("generic.followRange", "minecraft:generic.follow_range")
+ .put("Follow Range", "minecraft:generic.follow_range")
+ .put("generic.knockbackResistance", "minecraft:generic.knockback_resistance")
+ .put("Knockback Resistance", "minecraft:generic.knockback_resistance")
+ .put("generic.movementSpeed", "minecraft:generic.movement_speed")
+ .put("Movement Speed", "minecraft:generic.movement_speed")
+ .put("generic.flyingSpeed", "minecraft:generic.flying_speed")
+ .put("Flying Speed", "minecraft:generic.flying_speed")
+ .put("generic.attackDamage", "minecraft:generic.attack_damage")
+ .put("generic.attackKnockback", "minecraft:generic.attack_knockback")
+ .put("generic.attackSpeed", "minecraft:generic.attack_speed")
+ .put("generic.armorToughness", "minecraft:generic.armor_toughness")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractOldAttributesRename.register(VERSION, RENAMES::get);
+ }
+
+ private V2523() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2527.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2527.java
new file mode 100644
index 0000000000000000000000000000000000000000..00268930307bc539e81ba364d66824f4b0a858b1
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2527.java
@@ -0,0 +1,123 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import com.mojang.datafixers.DataFixUtils;
+import net.minecraft.util.Mth;
+
+public final class V2527 {
+
+ private static final int VERSION = MCVersions.V20W16A + 1;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType level = data.getMap("Level");
+
+ if (level == null) {
+ return null;
+ }
+
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections != null) {
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ final ListType palette = section.getList("Palette", ObjectType.MAP);
+
+ if (palette == null) {
+ continue;
+ }
+
+ final int bits = Math.max(4, DataFixUtils.ceillog2(palette.size()));
+
+ if (Mth.isPowerOfTwo(bits)) {
+ // fits perfectly
+ continue;
+ }
+
+ final long[] states = section.getLongs("BlockStates");
+ if (states == null) {
+ // wat
+ continue;
+ }
+
+ section.setLongs("BlockStates", addPadding(4096, bits, states));
+ }
+ }
+
+ final MapType heightMaps = level.getMap("Heightmaps");
+ if (heightMaps != null) {
+ for (final String key : heightMaps.keys()) {
+ final long[] old = heightMaps.getLongs(key);
+ heightMaps.setLongs(key, addPadding(256, 9, old));
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ public static long[] addPadding(final int indices, final int bits, final long[] old) {
+ int k = old.length;
+ if (k == 0) {
+ return old;
+ } else {
+ long l = (1L << bits) - 1L;
+ int m = 64 / bits;
+ int n = (indices + m - 1) / m;
+ long[] padded = new long[n];
+ int o = 0;
+ int p = 0;
+ long q = 0L;
+ int r = 0;
+ long s = old[0];
+ long t = k > 1 ? old[1] : 0L;
+
+ for(int u = 0; u < indices; ++u) {
+ int v = u * bits;
+ int w = v >> 6;
+ int x = (u + 1) * bits - 1 >> 6;
+ int y = v ^ w << 6;
+ if (w != r) {
+ s = t;
+ t = w + 1 < k ? old[w + 1] : 0L;
+ r = w;
+ }
+
+ long ab;
+ int ac;
+ if (w == x) {
+ ab = s >>> y & l;
+ } else {
+ ac = 64 - y;
+ ab = (s >>> y | t << ac) & l;
+ }
+
+ ac = p + bits;
+ if (ac >= 64) {
+ padded[o++] = q;
+ q = ab;
+ p = bits;
+ } else {
+ q |= ab << p;
+ p = ac;
+ }
+ }
+
+ if (q != 0L) {
+ padded[o] = q;
+ }
+
+ return padded;
+ }
+ }
+
+ private V2527() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2528.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2528.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7197d098b3d6269d3a4fd9be0432d85f0504dfd
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2528.java
@@ -0,0 +1,30 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V2528 {
+
+ private static final int VERSION = MCVersions.V20W16A + 2;
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:soul_fire_torch", "minecraft:soul_torch",
+ "minecraft:soul_fire_lantern", "minecraft:soul_lantern"
+ )
+ )::get);
+ ConverterAbstractBlockRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:soul_fire_torch", "minecraft:soul_torch",
+ "minecraft:soul_fire_wall_torch", "minecraft:soul_wall_torch",
+ "minecraft:soul_fire_lantern", "minecraft:soul_lantern"
+ )
+ )::get);
+ }
+
+ private V2528() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2529.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2529.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ea1926080fe5cbf976c3c5886b0e2a2451b252d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2529.java
@@ -0,0 +1,25 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2529 {
+
+ private static final int VERSION = MCVersions.V20W17A;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:strider", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.getBoolean("NoGravity")) {
+ data.setBoolean("NoGravity", false);
+ }
+ return null;
+ }
+ });
+ }
+
+ private V2529() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2531.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2531.java
new file mode 100644
index 0000000000000000000000000000000000000000..57ceb6e6a67f7fbc94e90c0327da9e353c612877
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2531.java
@@ -0,0 +1,63 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2531 {
+
+ private static final int VERSION = MCVersions.V20W17A + 2;
+
+ private static boolean isConnected(final String facing) {
+ return !"none".equals(facing);
+ }
+
+ public static void register() {
+ MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:redstone_wire".equals(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType properties = data.getMap("Properties");
+
+ if (properties == null) {
+ return null;
+ }
+
+
+ final String east = properties.getString("east", "none");
+ final String west = properties.getString("west", "none");
+ final String north = properties.getString("north", "none");
+ final String south = properties.getString("south", "none");
+
+ final boolean connectedX = isConnected(east) || isConnected(west);
+ final boolean connectedZ = isConnected(north) || isConnected(south);
+
+ final String newEast = !isConnected(east) && !connectedZ ? "side" : east;
+ final String newWest = !isConnected(west) && !connectedZ ? "side" : west;
+ final String newNorth = !isConnected(north) && !connectedX ? "side" : north;
+ final String newSouth = !isConnected(south) && !connectedX ? "side" : south;
+
+ if (properties.hasKey("east")) {
+ properties.setString("east", newEast);
+ }
+ if (properties.hasKey("west")) {
+ properties.setString("west", newWest);
+ }
+ if (properties.hasKey("north")) {
+ properties.setString("north", newNorth);
+ }
+ if (properties.hasKey("south")) {
+ properties.setString("south", newSouth);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2531() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2533.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2533.java
new file mode 100644
index 0000000000000000000000000000000000000000..c89985ccfb271f84888dbe7975a0918d7ef7f38a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2533.java
@@ -0,0 +1,42 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V2533 {
+
+ private static final int VERSION = MCVersions.V20W18A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType attributes = data.getList("Attributes", ObjectType.MAP);
+
+ if (attributes == null) {
+ return null;
+ }
+
+ for (int i = 0, len = attributes.size(); i < len; ++i) {
+ final MapType attribute = attributes.getMap(i);
+
+ if (!"generic.follow_range".equals(attribute.getString("Name"))) {
+ continue;
+ }
+
+ if (attribute.getDouble("Base") == 16.0) {
+ attribute.setDouble("Base", 48.0);
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2533() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2535.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2535.java
new file mode 100644
index 0000000000000000000000000000000000000000..21d79dfdfc0062bf66a904c66fd1445e953127d6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2535.java
@@ -0,0 +1,34 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V2535 {
+
+ private static final int VERSION = MCVersions.V20W19A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ // Mojang uses doubles for whatever reason... rotation is in FLOAT. by using double here
+ // the entity load will just ignore rotation and set it to 0...
+ final ListType rotation = data.getList("Rotation", ObjectType.FLOAT);
+
+ if (rotation == null || rotation.size() == 0) {
+ return null;
+ }
+
+ rotation.setFloat(0, rotation.getFloat(0) - 180.0F);
+
+ return null;
+ }
+ });
+ }
+
+ private V2535() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2537.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2537.java
new file mode 100644
index 0000000000000000000000000000000000000000..28709ea1eb0e8966321a4a959350778bb2ea5fed
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2537.java
@@ -0,0 +1,61 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2537 {
+
+ private static final int VERSION = MCVersions.V20W20B;
+
+ private static void convertDimension(final MapType data, final String path) {
+ if (data == null) {
+ return;
+ }
+
+ final Number dimension = data.getNumber(path);
+ if (dimension == null) {
+ return;
+ }
+
+ final String newDimension;
+ switch (dimension.intValue()) {
+ case -1: {
+ newDimension = "minecraft:the_nether";
+ break;
+ }
+ case 1: {
+ newDimension = "minecraft:the_end";
+ break;
+ }
+ default: {
+ newDimension = "minecraft:overworld";
+ break;
+ }
+ }
+
+ data.setString(path, newDimension);
+ return;
+ }
+
+ public static void register() {
+ MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertDimension(data, "Dimension");
+ return null;
+ }
+ });
+
+ MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ convertDimension(root.getMap("data"), "dimension");
+ return null;
+ }
+ });
+ }
+
+ private V2537() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2538.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2538.java
new file mode 100644
index 0000000000000000000000000000000000000000..69097398c3d2b8c04d9adefa2268803bcbaffa32
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2538.java
@@ -0,0 +1,43 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2538 {
+
+ private static final int VERSION = MCVersions.V20W20B + 1;
+ private static final String[] MERGE_KEYS = new String[] {
+ "RandomSeed",
+ "generatorName",
+ "generatorOptions",
+ "generatorVersion",
+ "legacy_custom_options",
+ "MapFeatures",
+ "BonusChest"
+ };
+
+ public static void register() {
+ MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType worldGenSettings = data.getOrCreateMap("WorldGenSettings");
+
+ for (final String key : MERGE_KEYS) {
+ final Object value = data.getGeneric(key);
+ if (value == null) {
+ continue;
+ }
+
+ data.remove(key);
+ worldGenSettings.setGeneric(key, value);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2538() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2550.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2550.java
new file mode 100644
index 0000000000000000000000000000000000000000..704ffd7fb6fa965d573040cb4fa2b32d31921aa3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2550.java
@@ -0,0 +1,346 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.google.common.collect.ImmutableMap;
+import org.apache.commons.lang3.math.NumberUtils;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+public final class V2550 {
+
+ private static final int VERSION = MCVersions.V20W20B + 13;
+
+ private static final Map<String, StructureFeatureConfiguration> DEFAULTS = new HashMap<>(
+ ImmutableMap.<String, StructureFeatureConfiguration>builder()
+ .put("minecraft:village", new StructureFeatureConfiguration(32, 8, 10387312))
+ .put("minecraft:desert_pyramid", new StructureFeatureConfiguration(32, 8, 14357617))
+ .put("minecraft:igloo", new StructureFeatureConfiguration(32, 8, 14357618))
+ .put("minecraft:jungle_pyramid", new StructureFeatureConfiguration(32, 8, 14357619))
+ .put("minecraft:swamp_hut", new StructureFeatureConfiguration(32, 8, 14357620))
+ .put("minecraft:pillager_outpost", new StructureFeatureConfiguration(32, 8, 165745296))
+ .put("minecraft:monument", new StructureFeatureConfiguration(32, 5, 10387313))
+ .put("minecraft:endcity", new StructureFeatureConfiguration(20, 11, 10387313))
+ .put("minecraft:mansion", new StructureFeatureConfiguration(80, 20, 10387319))
+ .build()
+ );
+
+ private static record StructureFeatureConfiguration(int spacing, int separation, int salt) {
+
+ public MapType serialize() {
+ final MapType ret = Types.NBT.createEmptyMap();
+
+ ret.setInt("spacing", this.spacing);
+ ret.setInt("separation", this.separation);
+ ret.setInt("salt", this.salt);
+
+ return ret;
+ }
+ }
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final long seed = data.getLong("RandomSeed");
+ String generatorName = data.getString("generatorName");
+ if (generatorName != null) {
+ generatorName = generatorName.toLowerCase(Locale.ROOT);
+ }
+ String legacyCustomOptions = data.getString("legacy_custom_options");
+ if (legacyCustomOptions == null) {
+ legacyCustomOptions = "customized".equals(generatorName) ? data.getString("generatorOptions") : null;
+ }
+
+ final MapType generator;
+ boolean caves = false;
+
+ if ("customized".equals(generatorName) || generatorName == null) {
+ generator = defaultOverworld(seed);
+ } else {
+ switch (generatorName) {
+ case "flat": {
+ final MapType generatorOptions = data.getMap("generatorOptions");
+
+ final MapType structures = fixFlatStructures(generatorOptions);
+ final MapType settings = Types.NBT.createEmptyMap();
+ generator = Types.NBT.createEmptyMap();
+ generator.setString("type", "minecraft:flat");
+ generator.setMap("settings", settings);
+
+ settings.setMap("structures", structures);
+
+ ListType layers = generatorOptions.getList("layers", ObjectType.MAP);
+ if (layers == null) {
+ layers = Types.NBT.createEmptyList();
+
+ final int[] heights = new int[] { 1, 2, 1 };
+ final String[] blocks = new String[] { "minecraft:bedrock", "minecraft:dirt", "minecraft:grass_block" };
+ for (int i = 0; i < 3; ++i) {
+ final MapType layer = Types.NBT.createEmptyMap();
+ layer.setInt("height", heights[i]);
+ layer.setString("block", blocks[i]);
+ layers.addMap(layer);
+ }
+ }
+
+ settings.setList("layers", layers);
+ settings.setString("biome", generatorOptions.getString("biome", "minecraft:plains"));
+
+ break;
+ }
+
+ case "debug_all_block_states": {
+ generator = Types.NBT.createEmptyMap();
+ generator.setString("type", "minecraft:debug");
+ break;
+ }
+
+ case "buffet": {
+ final MapType generatorOptions = data.getMap("generatorOptions");
+ final MapType chunkGenerator = generatorOptions == null ? null : generatorOptions.getMap("chunk_generator");
+ final String chunkGeneratorType = chunkGenerator == null ? null : chunkGenerator.getString("type");
+
+ final String newType;
+ if ("minecraft:caves".equals(chunkGeneratorType)) {
+ newType = "minecraft:caves";
+ caves = true;
+ } else if ("minecraft:floating_islands".equals(chunkGeneratorType)) {
+ newType = "minecraft:floating_islands";
+ } else {
+ newType = "minecraft:overworld";
+ }
+
+ MapType biomeSource = generatorOptions == null ? null : generatorOptions.getMap("biome_source");
+ if (biomeSource == null) {
+ biomeSource = Types.NBT.createEmptyMap();
+ biomeSource.setString("type", "minecraft:fixed");
+ }
+
+ if ("minecraft:fixed".equals(biomeSource.getString("type"))) {
+ final MapType options = biomeSource.getMap("options");
+ final ListType biomes = options == null ? null : options.getList("biomes", ObjectType.STRING);
+ final String biome = biomes == null || biomes.size() == 0 ? "minecraft:ocean" : biomes.getString(0);
+ biomeSource.remove("options");
+ biomeSource.setString("biome", biome);
+ }
+
+ generator = noise(seed, newType, biomeSource);
+ break;
+ }
+
+ default: {
+ boolean defaultGen = generatorName.equals("default");
+ boolean default11Gen = generatorName.equals("default_1_1") || defaultGen && data.getInt("generatorVersion") == 0;
+ boolean amplified = generatorName.equals("amplified");
+ boolean largeBiomes = generatorName.equals("largebiomes");
+
+ generator = noise(seed, amplified ? "minecraft:amplified" : "minecraft:overworld",
+ vanillaBiomeSource(seed, default11Gen, largeBiomes));
+ break;
+ }
+ }
+ }
+
+ final boolean mapFeatures = data.getBoolean("MapFeatures", true);
+ final boolean bonusChest = data.getBoolean("BonusChest", false);
+
+ final MapType ret = Types.NBT.createEmptyMap();
+
+ ret.setLong("seed", seed);
+ ret.setBoolean("generate_features", mapFeatures);
+ ret.setBoolean("bonus_chest", bonusChest);
+ ret.setMap("dimensions", vanillaLevels(seed, generator, caves));
+ if (legacyCustomOptions != null) {
+ ret.setString("legacy_custom_options", legacyCustomOptions);
+ }
+
+ return ret;
+ }
+ });
+ }
+
+ public static MapType noise(final long seed, final String worldType, final MapType biomeSource) {
+ final MapType ret = Types.NBT.createEmptyMap();
+
+ ret.setString("type", "minecraft:noise");
+ ret.setMap("biome_source", biomeSource);
+ ret.setLong("seed", seed);
+ ret.setString("settings", worldType);
+
+ return ret;
+ }
+
+ public static MapType vanillaBiomeSource(final long seed, final boolean default11Gen, final boolean largeBiomes) {
+ final MapType ret = Types.NBT.createEmptyMap();
+
+ ret.setString("type", "minecraft:vanilla_layered");
+ ret.setLong("seed", seed);
+ ret.setBoolean("large_biomes", largeBiomes);
+ if (default11Gen) {
+ ret.setBoolean("legacy_biome_init_layer", default11Gen);
+ }
+
+ return ret;
+ }
+
+ public static MapType fixFlatStructures(final MapType generatorOptions) {
+ int distance = 32;
+ int spread = 3;
+ int count = 128;
+ boolean stronghold = false;
+ final Map<String, StructureFeatureConfiguration> newStructures = new HashMap<>();
+
+ if (generatorOptions == null) {
+ stronghold = true;
+ newStructures.put("minecraft:village", DEFAULTS.get("minecraft:village"));
+ }
+
+ final MapType oldStructures = generatorOptions == null ? null : generatorOptions.getMap("structures");
+ if (oldStructures != null) {
+ for (final String structureName : oldStructures.keys()) {
+ final MapType structureValues = oldStructures.getMap(structureName);
+ if (structureValues == null) {
+ continue;
+ }
+
+ for (final String structureValueKey : structureValues.keys()) {
+ final String structureValue = structureValues.getString(structureValueKey);
+
+ if ("stronghold".equals(structureName)) {
+ stronghold = true;
+ switch (structureValueKey) {
+ case "distance":
+ distance = getInt(structureValue, distance, 1);
+ break;
+ case "spread":
+ spread = getInt(structureValue, spread, 1);
+ break;
+ case "count":
+ count = getInt(structureValue, count, 1);
+ break;
+ }
+ } else {
+ switch (structureValueKey) {
+ case "distance":
+ switch (structureName) {
+ case "village":
+ setSpacing(newStructures, "minecraft:village", structureValue, 9);
+ break;
+ case "biome_1":
+ setSpacing(newStructures, "minecraft:desert_pyramid", structureValue, 9);
+ setSpacing(newStructures, "minecraft:igloo", structureValue, 9);
+ setSpacing(newStructures, "minecraft:jungle_pyramid", structureValue, 9);
+ setSpacing(newStructures, "minecraft:swamp_hut", structureValue, 9);
+ setSpacing(newStructures, "minecraft:pillager_outpost", structureValue, 9);
+ break;
+ case "endcity":
+ setSpacing(newStructures, "minecraft:endcity", structureValue, 1);
+ break;
+ case "mansion":
+ setSpacing(newStructures, "minecraft:mansion", structureValue, 1);
+ break;
+ default:
+ break;
+ }
+ case "separation":
+ if ("oceanmonument".equals(structureName)) {
+ final StructureFeatureConfiguration structure = newStructures.getOrDefault("minecraft:monument", DEFAULTS.get("minecraft:monument"));
+ final int newSpacing = getInt(structureValue, structure.separation, 1);
+ newStructures.put("minecraft:monument", new StructureFeatureConfiguration(newSpacing, structure.separation, structure.salt));
+ }
+
+ break;
+ case "spacing":
+ if ("oceanmonument".equals(structureName)) {
+ setSpacing(newStructures, "minecraft:monument", structureValue, 1);
+ }
+
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ final MapType ret = Types.NBT.createEmptyMap();
+ final MapType structuresSerialized = Types.NBT.createEmptyMap();
+ ret.setMap("structures", structuresSerialized);
+ for (final String key : newStructures.keySet()) {
+ structuresSerialized.setMap(key, newStructures.get(key).serialize());
+ }
+
+ if (stronghold) {
+ final MapType strongholdData = Types.NBT.createEmptyMap();
+ ret.setMap("stronghold", strongholdData);
+
+ strongholdData.setInt("distance", distance);
+ strongholdData.setInt("spread", spread);
+ strongholdData.setInt("count", count);
+ }
+
+ return ret;
+ }
+
+ public static MapType vanillaLevels(final long seed, final MapType generator, final boolean caves) {
+ final MapType ret = Types.NBT.createEmptyMap();
+
+ final MapType overworld = Types.NBT.createEmptyMap();
+ final MapType nether = Types.NBT.createEmptyMap();
+ final MapType end = Types.NBT.createEmptyMap();
+
+ ret.setMap("minecraft:overworld", overworld);
+ ret.setMap("minecraft:the_nether", nether);
+ ret.setMap("minecraft:the_end", end);
+
+ // overworld
+ overworld.setString("type", caves ? "minecraft:overworld_caves" : "minecraft:overworld");
+ overworld.setMap("generator", generator);
+
+ // nether
+ nether.setString("type", "minecraft:the_nether");
+ final MapType netherBiomeSource = Types.NBT.createEmptyMap();
+ netherBiomeSource.setString("type", "minecraft:multi_noise");
+ netherBiomeSource.setLong("seed", seed);
+ netherBiomeSource.setString("preset", "minecraft:nether");
+
+ nether.setMap("generator", noise(seed, "minecraft:nether", netherBiomeSource));
+
+ // end
+ end.setString("type", "minecraft:the_end");
+ final MapType endBiomeSource = Types.NBT.createEmptyMap();
+ endBiomeSource.setString("type", "minecraft:the_end");
+ endBiomeSource.setLong("seed", seed);
+ end.setMap("generator", noise(seed,"minecraft:end", endBiomeSource));
+
+ return ret;
+ }
+
+ public static MapType defaultOverworld(final long seed) {
+ return noise(seed, "minecraft:overworld", vanillaBiomeSource(seed, false, false));
+ }
+
+ private static int getInt(final String value, final int dfl) {
+ return NumberUtils.toInt(value, dfl);
+ }
+
+ private static int getInt(final String value, final int dfl, final int minVal) {
+ return Math.max(minVal, getInt(value, dfl));
+ }
+
+ private static void setSpacing(final Map<String, StructureFeatureConfiguration> structures, final String structureName,
+ final String value, final int minVal) {
+ final StructureFeatureConfiguration structure = structures.getOrDefault(structureName, DEFAULTS.get(structureName));
+ final int newSpacing = getInt(value, structure.spacing, minVal);
+
+ structures.put(structureName, new StructureFeatureConfiguration(newSpacing, structure.separation, structure.salt));
+ }
+
+ private V2550() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2551.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2551.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d31193df65ec1abc6aa26c0fd2dd454316c4f60
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2551.java
@@ -0,0 +1,103 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V2551 {
+
+ private static final int VERSION = MCVersions.V20W20B + 14;
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType dimensions = data.getMap("dimensions");
+
+ if (dimensions == null) {
+ return null;
+ }
+
+ for (final String dimension : dimensions.keys()) {
+ final MapType dimensionData = dimensions.getMap(dimension);
+ if (dimensionData == null) {
+ continue;
+ }
+
+ final MapType generator = dimensionData.getMap("generator");
+ if (generator == null) {
+ continue;
+ }
+
+ final String type = generator.getString("type");
+ if (type == null) {
+ continue;
+ }
+
+ switch (type) {
+ case "minecraft:flat": {
+ final MapType settings = generator.getMap("settings");
+ if (settings == null) {
+ continue;
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.BIOME, settings, "biome", fromVersion, toVersion);
+
+ final ListType layers = settings.getList("layers", ObjectType.MAP);
+ if (layers != null) {
+ for (int i = 0, len = layers.size(); i < len; ++i) {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, layers.getMap(i), "block", fromVersion, toVersion);
+ }
+ }
+
+ break;
+ }
+ case "minecraft:noise": {
+ final MapType settings = generator.getMap("settings");
+ if (settings != null) {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_block", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_fluid", fromVersion, toVersion);
+ }
+
+ final MapType biomeSource = generator.getMap("biome_source");
+ if (biomeSource != null) {
+ final String biomeSourceType = biomeSource.getString("type", "");
+ switch (biomeSourceType) {
+ case "minecraft:fixed": {
+ WalkerUtils.convert(MCTypeRegistry.BIOME, biomeSource, "biome", fromVersion, toVersion);
+ break;
+ }
+
+ case "minecraft:multi_noise": {
+ // Vanilla's schema is wrong. It should be DSL.fields("biomes", DSL.list(DSL.fields("biome")))
+ // But it just contains the list part. That obviously can never be the case, because
+ // the root object is a compound, not a list.
+
+ final ListType biomes = biomeSource.getList("biomes", ObjectType.MAP);
+ if (biomes != null) {
+ for (int i = 0, len = biomes.size(); i < len; ++i) {
+ WalkerUtils.convert(MCTypeRegistry.BIOME, biomes.getMap(i), "biome", fromVersion, toVersion);
+ }
+ }
+ break;
+ }
+
+ case "minecraft:checkerboard": {
+ WalkerUtils.convertList(MCTypeRegistry.BIOME, biomeSource, "biomes", fromVersion, toVersion);
+ break;
+ }
+ }
+ }
+
+ break;
+ }
+ }
+ }
+
+ return null;
+ });
+ }
+
+ private V2551() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2552.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2552.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e6c7dc40d509cf424976831382425ab7eceb024
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2552.java
@@ -0,0 +1,22 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V2552 {
+
+ private static final int VERSION = MCVersions.V20W20B + 15;
+
+ public static void register() {
+ ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.BIOME, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:nether", "minecraft:nether_wastes"
+ )
+ )::get);
+ }
+
+ private V2552() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2553.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2553.java
new file mode 100644
index 0000000000000000000000000000000000000000..f019774923bf08fc0f7dc7cafd5fb66fdd7427f8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2553.java
@@ -0,0 +1,77 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2553 {
+
+ private static final int VERSION = MCVersions.V20W20B + 16;
+
+ public static final Map<String, String> BIOME_RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:extreme_hills", "minecraft:mountains")
+ .put("minecraft:swampland", "minecraft:swamp")
+ .put("minecraft:hell", "minecraft:nether_wastes")
+ .put("minecraft:sky", "minecraft:the_end")
+ .put("minecraft:ice_flats", "minecraft:snowy_tundra")
+ .put("minecraft:ice_mountains", "minecraft:snowy_mountains")
+ .put("minecraft:mushroom_island", "minecraft:mushroom_fields")
+ .put("minecraft:mushroom_island_shore", "minecraft:mushroom_field_shore")
+ .put("minecraft:beaches", "minecraft:beach")
+ .put("minecraft:forest_hills", "minecraft:wooded_hills")
+ .put("minecraft:smaller_extreme_hills", "minecraft:mountain_edge")
+ .put("minecraft:stone_beach", "minecraft:stone_shore")
+ .put("minecraft:cold_beach", "minecraft:snowy_beach")
+ .put("minecraft:roofed_forest", "minecraft:dark_forest")
+ .put("minecraft:taiga_cold", "minecraft:snowy_taiga")
+ .put("minecraft:taiga_cold_hills", "minecraft:snowy_taiga_hills")
+ .put("minecraft:redwood_taiga", "minecraft:giant_tree_taiga")
+ .put("minecraft:redwood_taiga_hills", "minecraft:giant_tree_taiga_hills")
+ .put("minecraft:extreme_hills_with_trees", "minecraft:wooded_mountains")
+ .put("minecraft:savanna_rock", "minecraft:savanna_plateau")
+ .put("minecraft:mesa", "minecraft:badlands")
+ .put("minecraft:mesa_rock", "minecraft:wooded_badlands_plateau")
+ .put("minecraft:mesa_clear_rock", "minecraft:badlands_plateau")
+ .put("minecraft:sky_island_low", "minecraft:small_end_islands")
+ .put("minecraft:sky_island_medium", "minecraft:end_midlands")
+ .put("minecraft:sky_island_high", "minecraft:end_highlands")
+ .put("minecraft:sky_island_barren", "minecraft:end_barrens")
+ .put("minecraft:void", "minecraft:the_void")
+ .put("minecraft:mutated_plains", "minecraft:sunflower_plains")
+ .put("minecraft:mutated_desert", "minecraft:desert_lakes")
+ .put("minecraft:mutated_extreme_hills", "minecraft:gravelly_mountains")
+ .put("minecraft:mutated_forest", "minecraft:flower_forest")
+ .put("minecraft:mutated_taiga", "minecraft:taiga_mountains")
+ .put("minecraft:mutated_swampland", "minecraft:swamp_hills")
+ .put("minecraft:mutated_ice_flats", "minecraft:ice_spikes")
+ .put("minecraft:mutated_jungle", "minecraft:modified_jungle")
+ .put("minecraft:mutated_jungle_edge", "minecraft:modified_jungle_edge")
+ .put("minecraft:mutated_birch_forest", "minecraft:tall_birch_forest")
+ .put("minecraft:mutated_birch_forest_hills", "minecraft:tall_birch_hills")
+ .put("minecraft:mutated_roofed_forest", "minecraft:dark_forest_hills")
+ .put("minecraft:mutated_taiga_cold", "minecraft:snowy_taiga_mountains")
+ .put("minecraft:mutated_redwood_taiga", "minecraft:giant_spruce_taiga")
+ .put("minecraft:mutated_redwood_taiga_hills", "minecraft:giant_spruce_taiga_hills")
+ .put("minecraft:mutated_extreme_hills_with_trees", "minecraft:modified_gravelly_mountains")
+ .put("minecraft:mutated_savanna", "minecraft:shattered_savanna")
+ .put("minecraft:mutated_savanna_rock", "minecraft:shattered_savanna_plateau")
+ .put("minecraft:mutated_mesa", "minecraft:eroded_badlands")
+ .put("minecraft:mutated_mesa_rock", "minecraft:modified_wooded_badlands_plateau")
+ .put("minecraft:mutated_mesa_clear_rock", "minecraft:modified_badlands_plateau")
+ .put("minecraft:warm_deep_ocean", "minecraft:deep_warm_ocean")
+ .put("minecraft:lukewarm_deep_ocean", "minecraft:deep_lukewarm_ocean")
+ .put("minecraft:cold_deep_ocean", "minecraft:deep_cold_ocean")
+ .put("minecraft:frozen_deep_ocean", "minecraft:deep_frozen_ocean")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.BIOME, BIOME_RENAMES::get);
+ }
+
+ private V2553() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2558.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2558.java
new file mode 100644
index 0000000000000000000000000000000000000000..cfb17deec6d53fc99a6562dce1fcc2f6dea8e26b
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2558.java
@@ -0,0 +1,48 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.options.ConverterAbstractOptionsRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V2558 {
+
+ private static final int VERSION = MCVersions.V1_16_PRE2 + 1;
+
+ public static void register() {
+ ConverterAbstractOptionsRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "key_key.swapHands", "key_key.swapOffhand"
+ )
+ )::get);
+
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ MapType dimensions = data.getMap("dimensions");
+ if (dimensions == null) {
+ dimensions = Types.NBT.createEmptyMap();
+ data.setMap("dimensions", dimensions);
+ }
+
+ if (dimensions.isEmpty()) {
+ data.setMap("dimensions", recreateSettings(data));
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private static MapType recreateSettings(final MapType data) {
+ final long seed = data.getLong("seed");
+
+ return V2550.vanillaLevels(seed, V2550.defaultOverworld(seed), false);
+ }
+
+ private V2558() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java
new file mode 100644
index 0000000000000000000000000000000000000000..a50146d1dba4d62da3bb54a5869ae879f573f0e5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2568 {
+
+ private static final int VERSION = MCVersions.V1_16_1 + 1;
+
+ public static void register() {
+ //registerMob("minecraft:piglin_brute"); // changed to simple in 1.21.5
+ }
+
+ private V2568() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad6c4c4427fc17d7ad743115773cb48dad1b415d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2671 {
+
+ private static final int VERSION = MCVersions.V1_16_5 + 85;
+
+ public static void register() {
+ //registerMob("minecraft:goat"); // changed to simple in 1.21.5
+ }
+
+ private V2671() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2679.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2679.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f8b0cdc05116ebf07eee98e6288b2d7d9eb0e8b
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2679.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2679 {
+
+ private static final int VERSION = MCVersions.V1_16_5 + 93;
+
+ public static void register() {
+ MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:cauldron".equals(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType properties = data.getMap("Properties");
+
+ if (properties == null) {
+ return null;
+ }
+
+ if (properties.getString("level", "0").equals("0")) {
+ data.remove("Properties");
+ return null;
+ } else {
+ data.setString("Name", "minecraft:water_cauldron");
+ return null;
+ }
+ }
+ });
+ }
+
+ private V2679() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2680.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2680.java
new file mode 100644
index 0000000000000000000000000000000000000000..87cbe1c717635908a30c57028346a1abeb21e6a6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2680.java
@@ -0,0 +1,27 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V2680 {
+
+ private static final int VERSION = MCVersions.V1_16_5 + 94;
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:grass_path", "minecraft:dirt_path"
+ )
+ )::get);
+ ConverterAbstractBlockRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:grass_path", "minecraft:dirt_path"
+ )
+ )::get);
+ }
+
+ private V2680() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2684.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2684.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c996642f561d2471a506a34f5efe6dae5cd1fb3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2684.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.game_event.GameEventListenerWalker;
+
+public final class V2684 {
+
+ private static final int VERSION = MCVersions.V20W48A + 1;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:sculk_sensor", new GameEventListenerWalker());
+ }
+
+ private V2684() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java
new file mode 100644
index 0000000000000000000000000000000000000000..4cfb211c6e557a7f2a3535c8430049e4c720eae9
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2686 {
+
+ private static final int VERSION = MCVersions.V20W49A + 1;
+
+ public static void register() {
+ //registerMob("minecraft:axolotl"); // changed to simple in 1.21.5
+ }
+
+ private V2686() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2688.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2688.java
new file mode 100644
index 0000000000000000000000000000000000000000..f971b5284950db483fb9b80599572b27a59755b5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2688.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+
+public final class V2688 {
+
+ private static final int VERSION = MCVersions.V20W51A + 1;
+
+ public static void register() {
+ //registerMob("minecraft:glow_squid"); // changed to simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:glow_item_frame", new DataWalkerItems("Item"));
+ }
+
+ private V2688() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2690.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2690.java
new file mode 100644
index 0000000000000000000000000000000000000000..39ffcec6e78229dd62abfd42c1ac64c3ccccc6dc
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2690.java
@@ -0,0 +1,45 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2690 {
+
+ private static final int VERSION = MCVersions.V21W05A;
+
+ private static final Map<String, String> RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:weathered_copper_block", "minecraft:oxidized_copper_block")
+ .put("minecraft:semi_weathered_copper_block", "minecraft:weathered_copper_block")
+ .put("minecraft:lightly_weathered_copper_block", "minecraft:exposed_copper_block")
+ .put("minecraft:weathered_cut_copper", "minecraft:oxidized_cut_copper")
+ .put("minecraft:semi_weathered_cut_copper", "minecraft:weathered_cut_copper")
+ .put("minecraft:lightly_weathered_cut_copper", "minecraft:exposed_cut_copper")
+ .put("minecraft:weathered_cut_copper_stairs", "minecraft:oxidized_cut_copper_stairs")
+ .put("minecraft:semi_weathered_cut_copper_stairs", "minecraft:weathered_cut_copper_stairs")
+ .put("minecraft:lightly_weathered_cut_copper_stairs", "minecraft:exposed_cut_copper_stairs")
+ .put("minecraft:weathered_cut_copper_slab", "minecraft:oxidized_cut_copper_slab")
+ .put("minecraft:semi_weathered_cut_copper_slab", "minecraft:weathered_cut_copper_slab")
+ .put("minecraft:lightly_weathered_cut_copper_slab", "minecraft:exposed_cut_copper_slab")
+ .put("minecraft:waxed_semi_weathered_copper", "minecraft:waxed_weathered_copper")
+ .put("minecraft:waxed_lightly_weathered_copper", "minecraft:waxed_exposed_copper")
+ .put("minecraft:waxed_semi_weathered_cut_copper", "minecraft:waxed_weathered_cut_copper")
+ .put("minecraft:waxed_lightly_weathered_cut_copper", "minecraft:waxed_exposed_cut_copper")
+ .put("minecraft:waxed_semi_weathered_cut_copper_stairs", "minecraft:waxed_weathered_cut_copper_stairs")
+ .put("minecraft:waxed_lightly_weathered_cut_copper_stairs", "minecraft:waxed_exposed_cut_copper_stairs")
+ .put("minecraft:waxed_semi_weathered_cut_copper_slab", "minecraft:waxed_weathered_cut_copper_slab")
+ .put("minecraft:waxed_lightly_weathered_cut_copper_slab", "minecraft:waxed_exposed_cut_copper_slab")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, RENAMES::get);
+ ConverterAbstractBlockRename.register(VERSION, RENAMES::get);
+ }
+
+ private V2690() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2691.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2691.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb87bcedfc2ed8d19b266e925beca0f54b50a0ab
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2691.java
@@ -0,0 +1,29 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2691 {
+
+ private static final int VERSION = MCVersions.V21W05A + 1;
+
+ private static final Map<String, String> RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:waxed_copper", "minecraft:waxed_copper_block")
+ .put("minecraft:oxidized_copper_block", "minecraft:oxidized_copper")
+ .put("minecraft:weathered_copper_block", "minecraft:weathered_copper")
+ .put("minecraft:exposed_copper_block", "minecraft:exposed_copper")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, RENAMES::get);
+ ConverterAbstractBlockRename.register(VERSION, RENAMES::get);
+ }
+
+ private V2691() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2693.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2693.java
new file mode 100644
index 0000000000000000000000000000000000000000..a242e8e9a7a7c80c00ec0d64542b3d7dc3103e24
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2693.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.AddFlagIfAbsent;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V2693 {
+
+ private static final int VERSION = MCVersions.V21W05B + 1;
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new AddFlagIfAbsent(VERSION, "has_increased_height_already", false));
+ }
+
+ private V2693() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2696.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2696.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce568002e54924e001c12271f0bde7183bc23c61
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2696.java
@@ -0,0 +1,42 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2696 {
+
+ private static final int VERSION = MCVersions.V21W07A + 1;
+
+ private static final Map<String, String> RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:grimstone", "minecraft:deepslate")
+ .put("minecraft:grimstone_slab", "minecraft:cobbled_deepslate_slab")
+ .put("minecraft:grimstone_stairs", "minecraft:cobbled_deepslate_stairs")
+ .put("minecraft:grimstone_wall", "minecraft:cobbled_deepslate_wall")
+ .put("minecraft:polished_grimstone", "minecraft:polished_deepslate")
+ .put("minecraft:polished_grimstone_slab", "minecraft:polished_deepslate_slab")
+ .put("minecraft:polished_grimstone_stairs", "minecraft:polished_deepslate_stairs")
+ .put("minecraft:polished_grimstone_wall", "minecraft:polished_deepslate_wall")
+ .put("minecraft:grimstone_tiles", "minecraft:deepslate_tiles")
+ .put("minecraft:grimstone_tile_slab", "minecraft:deepslate_tile_slab")
+ .put("minecraft:grimstone_tile_stairs", "minecraft:deepslate_tile_stairs")
+ .put("minecraft:grimstone_tile_wall", "minecraft:deepslate_tile_wall")
+ .put("minecraft:grimstone_bricks", "minecraft:deepslate_bricks")
+ .put("minecraft:grimstone_brick_slab", "minecraft:deepslate_brick_slab")
+ .put("minecraft:grimstone_brick_stairs", "minecraft:deepslate_brick_stairs")
+ .put("minecraft:grimstone_brick_wall", "minecraft:deepslate_brick_wall")
+ .put("minecraft:chiseled_grimstone", "minecraft:chiseled_deepslate")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, RENAMES::get);
+ ConverterAbstractBlockRename.register(VERSION, RENAMES::get);
+ }
+
+ private V2696() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2700.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2700.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6a2f29b20aa6d7cd431fc63c2d8ed70dc9a2ab8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2700.java
@@ -0,0 +1,22 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V2700 {
+
+ private static final int VERSION = MCVersions.V21W10A + 1;
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:cave_vines_head", "minecraft:cave_vines",
+ "minecraft:cave_vines_body", "minecraft:cave_vines_plant"
+ )
+ )::get);
+ }
+
+ private V2700() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2701.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2701.java
new file mode 100644
index 0000000000000000000000000000000000000000..58535aa2e949bfca9b73bdc1b8f4f5f0a5b4384e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2701.java
@@ -0,0 +1,205 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import com.google.common.collect.Sets;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public final class V2701 {
+
+ private static final int VERSION = MCVersions.V21W10A + 2;
+
+ private static final Pattern INDEX_PATTERN = Pattern.compile("\\[(\\d+)\\]");
+
+ private static final Set<String> PIECE_TYPE = Sets.newHashSet(
+ "minecraft:jigsaw",
+ "minecraft:nvi",
+ "minecraft:pcp",
+ "minecraft:bastionremnant",
+ "minecraft:runtime"
+ );
+ private static final Set<String> FEATURES = Sets.newHashSet(
+ "minecraft:tree",
+ "minecraft:flower",
+ "minecraft:block_pile",
+ "minecraft:random_patch"
+ );
+
+ public static void register() {
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType children = data.getList("Children", ObjectType.MAP);
+
+ if (children == null) {
+ return null;
+ }
+
+ for (int i = 0, len = children.size(); i < len; ++i) {
+ final MapType child = children.getMap(i);
+
+ if (!PIECE_TYPE.contains(child.getString("id"))) {
+ continue;
+ }
+
+ final String poolElement = child.getString("pool_element");
+ if (!"minecraft:feature_pool_element".equals(poolElement)) {
+ continue;
+ }
+
+ final MapType feature = child.getMap("feature");
+ if (feature == null) {
+ continue;
+ }
+
+ final String replacement = convertToString(feature);
+
+ if (replacement != null) {
+ child.setString("feature", replacement);
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private static String getNestedString(final MapType root, final String... paths) {
+ if (paths.length == 0) {
+ throw new IllegalArgumentException("Missing path");
+ }
+
+ Object current = root.getGeneric(paths[0]);
+
+ for (int i = 1; i < paths.length; ++i) {
+ final String path = paths[i];
+
+ final Matcher indexMatcher = INDEX_PATTERN.matcher(path);
+ if (!indexMatcher.matches()) {
+ current = (current instanceof MapType) ? ((MapType)current).getGeneric(path) : null;
+ if (current == null) {
+ break;
+ }
+ continue;
+ }
+
+ final int index = Integer.parseInt(indexMatcher.group(1));
+ if (!(current instanceof ListType)) {
+ current = null;
+ break;
+ } else {
+ final ListType list = (ListType)current;
+ if (index >= 0 && index < list.size()) {
+ current = list.getGeneric(index);
+ } else {
+ current = null;
+ break;
+ }
+ }
+ }
+
+ return current instanceof String ? (String)current : "";
+ }
+
+ private static String convertToString(final MapType feature) {
+ return getReplacement(
+ getNestedString(feature, "type"),
+ getNestedString(feature, "name"),
+ getNestedString(feature, "config", "state_provider", "type"),
+ getNestedString(feature, "config", "state_provider", "state", "Name"),
+ getNestedString(feature, "config", "state_provider", "entries", "[0]", "data", "Name"),
+ getNestedString(feature, "config", "foliage_placer", "type"),
+ getNestedString(feature, "config", "leaves_provider", "state", "Name")
+ );
+ }
+
+ private static String getReplacement(final String type, final String name, final String stateType, final String stateName,
+ final String firstEntryName, final String foliageName, final String leavesName) {
+ final String actualType;
+ if (!type.isEmpty()) {
+ actualType = type;
+ } else {
+ if (name.isEmpty()) {
+ return null;
+ }
+
+ if ("minecraft:normal_tree".equals(name)) {
+ actualType = "minecraft:tree";
+ } else {
+ actualType = name;
+ }
+ }
+
+ if (FEATURES.contains(actualType)) {
+ if ("minecraft:random_patch".equals(actualType)) {
+ if ("minecraft:simple_state_provider".equals(stateType)) {
+ if ("minecraft:sweet_berry_bush".equals(stateName)) {
+ return "minecraft:patch_berry_bush";
+ }
+
+ if ("minecraft:cactus".equals(stateName)) {
+ return "minecraft:patch_cactus";
+ }
+ } else if ("minecraft:weighted_state_provider".equals(stateType) && ("minecraft:grass".equals(firstEntryName) || "minecraft:fern".equals(firstEntryName))) {
+ return "minecraft:patch_taiga_grass";
+ }
+ } else if ("minecraft:block_pile".equals(actualType)) {
+ if (!"minecraft:simple_state_provider".equals(stateType) && !"minecraft:rotated_block_provider".equals(stateType)) {
+ if ("minecraft:weighted_state_provider".equals(stateType)) {
+ if ("minecraft:packed_ice".equals(firstEntryName) || "minecraft:blue_ice".equals(firstEntryName)) {
+ return "minecraft:pile_ice";
+ }
+
+ if ("minecraft:jack_o_lantern".equals(firstEntryName) || "minecraft:pumpkin".equals(firstEntryName)) {
+ return "minecraft:pile_pumpkin";
+ }
+ }
+ } else {
+ if ("minecraft:hay_block".equals(stateName)) {
+ return "minecraft:pile_hay";
+ }
+
+ if ("minecraft:melon".equals(stateName)) {
+ return "minecraft:pile_melon";
+ }
+
+ if ("minecraft:snow".equals(stateName)) {
+ return "minecraft:pile_snow";
+ }
+ }
+ } else {
+ if ("minecraft:flower".equals(actualType)) {
+ return "minecraft:flower_plain";
+ }
+
+ if ("minecraft:tree".equals(actualType)) {
+ if ("minecraft:acacia_foliage_placer".equals(foliageName)) {
+ return "minecraft:acacia";
+ }
+
+ if ("minecraft:blob_foliage_placer".equals(foliageName) && "minecraft:oak_leaves".equals(leavesName)) {
+ return "minecraft:oak";
+ }
+
+ if ("minecraft:pine_foliage_placer".equals(foliageName)) {
+ return "minecraft:pine";
+ }
+
+ if ("minecraft:spruce_foliage_placer".equals(foliageName)) {
+ return "minecraft:spruce";
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private V2701() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2702.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2702.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8af14493078e2e458d0679404ae6bce46289519
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2702.java
@@ -0,0 +1,35 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2702 {
+
+ private static final int VERSION = MCVersions.V21W10A + 3;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> arrowConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.hasKey("pickup")) {
+ return null;
+ }
+
+ final boolean player = data.getBoolean("player", true);
+ data.remove("player");
+
+ data.setByte("pickup", player ? (byte)1 : (byte)0);
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", arrowConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", arrowConverter);
+ }
+
+ private V2702() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java
new file mode 100644
index 0000000000000000000000000000000000000000..45c809b9e62437afdf17d47b0bea7b574e4cbd34
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.AddFlagIfAbsent;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V2707 {
+
+ private static final int VERSION = MCVersions.V21W14A + 1;
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new AddFlagIfAbsent(VERSION, "has_increased_height_already", true));
+
+ //registerMob("minecraft:marker"); // changed to simple in 1.21.5
+ }
+
+ private V2707() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2710.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2710.java
new file mode 100644
index 0000000000000000000000000000000000000000..0967c8c794869a972c1283cab6b3f3cef1d77aec
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2710.java
@@ -0,0 +1,21 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.stats.ConverterAbstractStatsRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V2710 {
+
+ private static final int VERSION = MCVersions.V21W15A + 1;
+
+ public static void register() {
+ ConverterAbstractStatsRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:play_one_minute", "minecraft:play_time"
+ )
+ )::get);
+ }
+
+ private V2710() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2717.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2717.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0d6b2f6b00e0bfce205efa889de1765ef22793a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2717.java
@@ -0,0 +1,25 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2717 {
+
+ private static final int VERSION = MCVersions.V1_17_PRE1 + 1;
+
+ public static void register() {
+ final Map<String, String> rename = new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:azalea_leaves_flowers", "minecraft:flowering_azalea_leaves"
+ )
+ );
+ ConverterAbstractItemRename.register(VERSION, rename::get);
+ ConverterAbstractBlockRename.register(VERSION, rename::get);
+ }
+
+ private V2717() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2825.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2825.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd00c9398791967be6dd10f7183c61902431b27a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2825.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.AddFlagIfAbsent;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V2825 {
+
+ private static final int VERSION = MCVersions.V1_17_1 + 95;
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new AddFlagIfAbsent(VERSION, "has_increased_height_already", false));
+ }
+
+ private V2825() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2831.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2831.java
new file mode 100644
index 0000000000000000000000000000000000000000..a133c1eaf04cbd5a6a701ee2c4ad11553dd84343
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2831.java
@@ -0,0 +1,64 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V2831 {
+
+ private static final int VERSION = MCVersions.V1_17_1 + 101;
+
+ public static void register() {
+ MCTypeRegistry.UNTAGGED_SPAWNER.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "SpawnPotentials", "data", "entity", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, root.getMap("SpawnData"), "entity", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.UNTAGGED_SPAWNER.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType spawnData = root.getMap("SpawnData");
+ if (spawnData != null) {
+ final MapType wrapped = Types.NBT.createEmptyMap();
+ root.setMap("SpawnData", wrapped);
+
+ wrapped.setMap("entity", spawnData);
+ }
+
+ final ListType spawnPotentials = root.getList("SpawnPotentials", ObjectType.MAP);
+ if (spawnPotentials != null) {
+ for (int i = 0, len = spawnPotentials.size(); i < len; ++i) {
+ final MapType spawnPotential = spawnPotentials.getMap(i);
+
+ // new format of weighted list (SpawnPotentials):
+ // root.data -> data
+ // root.weight -> weight
+
+ final MapType entity = spawnPotential.getMap("Entity");
+ final int weight = spawnPotential.getInt("Weight", 1);
+ spawnPotential.remove("Entity");
+ spawnPotential.remove("Weight");
+ spawnPotential.setInt("weight", weight);
+
+ final MapType data = Types.NBT.createEmptyMap();
+ spawnPotential.setMap("data", data);
+
+ data.setMap("entity", entity);
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2831() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java
new file mode 100644
index 0000000000000000000000000000000000000000..53f8474cdd9331d1cc293c360d3f4f14640eedd3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java
@@ -0,0 +1,917 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.mojang.logging.LogUtils;
+import it.unimi.dsi.fastutil.ints.Int2IntLinkedOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntIterator;
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
+import org.apache.commons.lang3.mutable.MutableBoolean;
+import org.slf4j.Logger;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class V2832 {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static final int VERSION = MCVersions.V1_17_1 + 102;
+
+ private static final String[] BIOMES_BY_ID = new String[256]; // rip datapacks
+ static {
+ BIOMES_BY_ID[0] = "minecraft:ocean";
+ BIOMES_BY_ID[1] = "minecraft:plains";
+ BIOMES_BY_ID[2] = "minecraft:desert";
+ BIOMES_BY_ID[3] = "minecraft:mountains";
+ BIOMES_BY_ID[4] = "minecraft:forest";
+ BIOMES_BY_ID[5] = "minecraft:taiga";
+ BIOMES_BY_ID[6] = "minecraft:swamp";
+ BIOMES_BY_ID[7] = "minecraft:river";
+ BIOMES_BY_ID[8] = "minecraft:nether_wastes";
+ BIOMES_BY_ID[9] = "minecraft:the_end";
+ BIOMES_BY_ID[10] = "minecraft:frozen_ocean";
+ BIOMES_BY_ID[11] = "minecraft:frozen_river";
+ BIOMES_BY_ID[12] = "minecraft:snowy_tundra";
+ BIOMES_BY_ID[13] = "minecraft:snowy_mountains";
+ BIOMES_BY_ID[14] = "minecraft:mushroom_fields";
+ BIOMES_BY_ID[15] = "minecraft:mushroom_field_shore";
+ BIOMES_BY_ID[16] = "minecraft:beach";
+ BIOMES_BY_ID[17] = "minecraft:desert_hills";
+ BIOMES_BY_ID[18] = "minecraft:wooded_hills";
+ BIOMES_BY_ID[19] = "minecraft:taiga_hills";
+ BIOMES_BY_ID[20] = "minecraft:mountain_edge";
+ BIOMES_BY_ID[21] = "minecraft:jungle";
+ BIOMES_BY_ID[22] = "minecraft:jungle_hills";
+ BIOMES_BY_ID[23] = "minecraft:jungle_edge";
+ BIOMES_BY_ID[24] = "minecraft:deep_ocean";
+ BIOMES_BY_ID[25] = "minecraft:stone_shore";
+ BIOMES_BY_ID[26] = "minecraft:snowy_beach";
+ BIOMES_BY_ID[27] = "minecraft:birch_forest";
+ BIOMES_BY_ID[28] = "minecraft:birch_forest_hills";
+ BIOMES_BY_ID[29] = "minecraft:dark_forest";
+ BIOMES_BY_ID[30] = "minecraft:snowy_taiga";
+ BIOMES_BY_ID[31] = "minecraft:snowy_taiga_hills";
+ BIOMES_BY_ID[32] = "minecraft:giant_tree_taiga";
+ BIOMES_BY_ID[33] = "minecraft:giant_tree_taiga_hills";
+ BIOMES_BY_ID[34] = "minecraft:wooded_mountains";
+ BIOMES_BY_ID[35] = "minecraft:savanna";
+ BIOMES_BY_ID[36] = "minecraft:savanna_plateau";
+ BIOMES_BY_ID[37] = "minecraft:badlands";
+ BIOMES_BY_ID[38] = "minecraft:wooded_badlands_plateau";
+ BIOMES_BY_ID[39] = "minecraft:badlands_plateau";
+ BIOMES_BY_ID[40] = "minecraft:small_end_islands";
+ BIOMES_BY_ID[41] = "minecraft:end_midlands";
+ BIOMES_BY_ID[42] = "minecraft:end_highlands";
+ BIOMES_BY_ID[43] = "minecraft:end_barrens";
+ BIOMES_BY_ID[44] = "minecraft:warm_ocean";
+ BIOMES_BY_ID[45] = "minecraft:lukewarm_ocean";
+ BIOMES_BY_ID[46] = "minecraft:cold_ocean";
+ BIOMES_BY_ID[47] = "minecraft:deep_warm_ocean";
+ BIOMES_BY_ID[48] = "minecraft:deep_lukewarm_ocean";
+ BIOMES_BY_ID[49] = "minecraft:deep_cold_ocean";
+ BIOMES_BY_ID[50] = "minecraft:deep_frozen_ocean";
+ BIOMES_BY_ID[127] = "minecraft:the_void";
+ BIOMES_BY_ID[129] = "minecraft:sunflower_plains";
+ BIOMES_BY_ID[130] = "minecraft:desert_lakes";
+ BIOMES_BY_ID[131] = "minecraft:gravelly_mountains";
+ BIOMES_BY_ID[132] = "minecraft:flower_forest";
+ BIOMES_BY_ID[133] = "minecraft:taiga_mountains";
+ BIOMES_BY_ID[134] = "minecraft:swamp_hills";
+ BIOMES_BY_ID[140] = "minecraft:ice_spikes";
+ BIOMES_BY_ID[149] = "minecraft:modified_jungle";
+ BIOMES_BY_ID[151] = "minecraft:modified_jungle_edge";
+ BIOMES_BY_ID[155] = "minecraft:tall_birch_forest";
+ BIOMES_BY_ID[156] = "minecraft:tall_birch_hills";
+ BIOMES_BY_ID[157] = "minecraft:dark_forest_hills";
+ BIOMES_BY_ID[158] = "minecraft:snowy_taiga_mountains";
+ BIOMES_BY_ID[160] = "minecraft:giant_spruce_taiga";
+ BIOMES_BY_ID[161] = "minecraft:giant_spruce_taiga_hills";
+ BIOMES_BY_ID[162] = "minecraft:modified_gravelly_mountains";
+ BIOMES_BY_ID[163] = "minecraft:shattered_savanna";
+ BIOMES_BY_ID[164] = "minecraft:shattered_savanna_plateau";
+ BIOMES_BY_ID[165] = "minecraft:eroded_badlands";
+ BIOMES_BY_ID[166] = "minecraft:modified_wooded_badlands_plateau";
+ BIOMES_BY_ID[167] = "minecraft:modified_badlands_plateau";
+ BIOMES_BY_ID[168] = "minecraft:bamboo_jungle";
+ BIOMES_BY_ID[169] = "minecraft:bamboo_jungle_hills";
+ BIOMES_BY_ID[170] = "minecraft:soul_sand_valley";
+ BIOMES_BY_ID[171] = "minecraft:crimson_forest";
+ BIOMES_BY_ID[172] = "minecraft:warped_forest";
+ BIOMES_BY_ID[173] = "minecraft:basalt_deltas";
+ BIOMES_BY_ID[174] = "minecraft:dripstone_caves";
+ BIOMES_BY_ID[175] = "minecraft:lush_caves";
+ BIOMES_BY_ID[177] = "minecraft:meadow";
+ BIOMES_BY_ID[178] = "minecraft:grove";
+ BIOMES_BY_ID[179] = "minecraft:snowy_slopes";
+ BIOMES_BY_ID[180] = "minecraft:snowcapped_peaks";
+ BIOMES_BY_ID[181] = "minecraft:lofty_peaks";
+ BIOMES_BY_ID[182] = "minecraft:stony_peaks";
+ }
+
+ private static final String[] HEIGHTMAP_TYPES = new String[] {
+ "WORLD_SURFACE_WG",
+ "WORLD_SURFACE",
+ "WORLD_SURFACE_IGNORE_SNOW",
+ "OCEAN_FLOOR_WG",
+ "OCEAN_FLOOR",
+ "MOTION_BLOCKING",
+ "MOTION_BLOCKING_NO_LEAVES"
+ };
+
+ private static final Set<String> STATUS_IS_OR_AFTER_SURFACE = new HashSet<>(Arrays.asList(
+ "surface",
+ "carvers",
+ "liquid_carvers",
+ "features",
+ "light",
+ "spawn",
+ "heightmaps",
+ "full"
+ ));
+ private static final Set<String> STATUS_IS_OR_AFTER_NOISE = new HashSet<>(Arrays.asList(
+ "noise",
+ "surface",
+ "carvers",
+ "liquid_carvers",
+ "features",
+ "light",
+ "spawn",
+ "heightmaps",
+ "full"
+ ));
+ private static final Set<String> BLOCKS_BEFORE_FEATURE_STATUS = new HashSet<>(Arrays.asList(
+ "minecraft:air",
+ "minecraft:basalt",
+ "minecraft:bedrock",
+ "minecraft:blackstone",
+ "minecraft:calcite",
+ "minecraft:cave_air",
+ "minecraft:coarse_dirt",
+ "minecraft:crimson_nylium",
+ "minecraft:dirt",
+ "minecraft:end_stone",
+ "minecraft:grass_block",
+ "minecraft:gravel",
+ "minecraft:ice",
+ "minecraft:lava",
+ "minecraft:mycelium",
+ "minecraft:nether_wart_block",
+ "minecraft:netherrack",
+ "minecraft:orange_terracotta",
+ "minecraft:packed_ice",
+ "minecraft:podzol",
+ "minecraft:powder_snow",
+ "minecraft:red_sand",
+ "minecraft:red_sandstone",
+ "minecraft:sand",
+ "minecraft:sandstone",
+ "minecraft:snow_block",
+ "minecraft:soul_sand",
+ "minecraft:soul_soil",
+ "minecraft:stone",
+ "minecraft:terracotta",
+ "minecraft:warped_nylium",
+ "minecraft:warped_wart_block",
+ "minecraft:water",
+ "minecraft:white_terracotta"
+ ));
+
+ private static int getObjectsPerValue(final long[] val) {
+ return (4096 + val.length - 1) / (val.length); // expression is invalid if it returns > 64
+ }
+
+ private static long[] resize(final long[] val, final int oldBitsPerObject, final int newBitsPerObject) {
+ final long oldMask = (1L << oldBitsPerObject) - 1; // works even if bitsPerObject == 64
+ final long newMask = (1L << newBitsPerObject) - 1;
+ final int oldObjectsPerValue = 64 / oldBitsPerObject;
+ final int newObjectsPerValue = 64 / newBitsPerObject;
+
+ if (newBitsPerObject == oldBitsPerObject) {
+ return val;
+ }
+
+ final int items = 4096;
+
+ final long[] ret = new long[(items + newObjectsPerValue - 1) / newObjectsPerValue];
+
+ final int expectedSize = ((items + oldObjectsPerValue - 1) / oldObjectsPerValue);
+ if (val.length != expectedSize) {
+ throw new IllegalStateException("Expected size: " + expectedSize + ", got: " + val.length);
+ }
+
+ int shift = 0;
+ int idx = 0;
+ long newCurr = 0L;
+
+ int currItem = 0;
+ for (int i = 0; i < val.length; ++i) {
+ final long oldCurr = val[i];
+
+ for (int objIdx = 0; currItem < items && objIdx + oldBitsPerObject <= 64; objIdx += oldBitsPerObject, ++currItem) {
+ final long value = (oldCurr >> objIdx) & oldMask;
+
+ if ((value & newMask) != value) {
+ throw new IllegalStateException("Old data storage has values that cannot be moved into new palette (would erase data)!");
+ }
+
+ newCurr |= value << shift;
+ shift += newBitsPerObject;
+
+ if (shift + newBitsPerObject > 64) { // will next write overflow?
+ // must move to next idx
+ ret[idx++] = newCurr;
+ shift = 0;
+ newCurr = 0L;
+ }
+ }
+ }
+
+ // don't forget to write the last one
+ if (shift != 0) {
+ ret[idx] = newCurr;
+ }
+
+ return ret;
+ }
+
+ private static void fixLithiumChunks(final MapType data) {
+ // See https://github.com/CaffeineMC/lithium-fabric/issues/279
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return;
+ }
+
+ final int chunkX = level.getInt("xPos");
+ final int chunkZ = level.getInt("zPos");
+
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections == null) {
+ return;
+ }
+
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ final int sectionY = section.getInt("Y");
+
+ final ListType palette = section.getList("Palette", ObjectType.MAP);
+ final long[] blockStates = section.getLongs("BlockStates");
+
+ if (palette == null || blockStates == null) {
+ continue;
+ }
+
+ final int expectedBits = Math.max(4, ceilLog2(palette.size()));
+ final int gotObjectsPerValue = getObjectsPerValue(blockStates);
+ final int gotBits = 64 / gotObjectsPerValue;
+
+ if (expectedBits == gotBits) {
+ continue;
+ }
+
+ try {
+ section.setLongs("BlockStates", resize(blockStates, gotBits, expectedBits));
+ } catch (final Exception ex) {
+ LOGGER.error("Failed to rewrite mismatched palette and data storage for section y: " + sectionY
+ + " for chunk [" + chunkX + "," + chunkZ + "], palette entries: " + palette.size() + ", data storage size: "
+ + blockStates.length,
+ ex
+ );
+ }
+ }
+ }
+
+ public static void register() {
+ // See V2551 for the layout of world gen settings
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ // converters were added to older versions note whether the world has increased height already or not
+ final boolean noHeightFlag = !data.hasKey("has_increased_height_already");
+ final boolean hasIncreasedHeight = data.getBoolean("has_increased_height_already", true);
+ data.remove("has_increased_height_already");
+
+ final MapType dimensions = data.getMap("dimensions");
+ if (dimensions == null) {
+ // wat
+ return null;
+ }
+
+ // only care about overworld
+ final MapType overworld = dimensions.getMap("minecraft:overworld");
+ if (overworld == null) {
+ // wat
+ return null;
+ }
+
+ final MapType generator = overworld.getMap("generator");
+ if (generator == null) {
+ // wat
+ return null;
+ }
+
+ final String type = generator.getString("type", "");
+ switch (type) {
+ case "minecraft:noise": {
+ final MapType biomeSource = generator.getMap("biome_source");
+ final String sourceType = biomeSource.getString("type");
+
+ boolean largeBiomes = false;
+
+ if ("minecraft:vanilla_layered".equals(sourceType) || (noHeightFlag && "minecraft:multi_noise".equals(sourceType))) {
+ largeBiomes = biomeSource.getBoolean("large_biomes");
+
+ final MapType newBiomeSource = Types.NBT.createEmptyMap();
+ generator.setMap("biome_source", newBiomeSource);
+
+ newBiomeSource.setString("preset", "minecraft:overworld");
+ newBiomeSource.setString("type", "minecraft:multi_noise");
+ }
+
+ if (largeBiomes) {
+ if ("minecraft:overworld".equals(generator.getString("settings"))) {
+ generator.setString("settings", "minecraft:large_biomes");
+ }
+ }
+
+ break;
+ }
+ case "minecraft:flat": {
+ if (!hasIncreasedHeight) {
+ final MapType settings = generator.getMap("settings");
+ if (settings == null) {
+ break;
+ }
+
+ updateLayers(settings.getList("layers", ObjectType.MAP));
+ }
+ break;
+ }
+ default:
+ // do nothing
+ break;
+ }
+
+ return null;
+ }
+ });
+
+
+ // It looks like DFU will only support worlds in the old height format or the new one, any custom one isn't supported
+ // and by not supported I mean it will just treat it as the old format... maybe at least throw in that case?
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ // The below covers padPaletteEntries - this was written BEFORE that code was added to the datafixer -
+ // and this still works, so I'm keeping it. Don't fix what isn't broken.
+ fixLithiumChunks(data); // See https://github.com/CaffeineMC/lithium-fabric/issues/279
+
+ final MapType level = data.getMap("Level");
+
+ if (level == null) {
+ return null;
+ }
+
+ final MapType context = data.getMap("__context"); // Passed through by ChunkStorage
+ final String dimension = context == null ? "" : context.getString("dimension", "");
+ final String generator = context == null ? "" : context.getString("generator", "");
+ final boolean isOverworld = "minecraft:overworld".equals(dimension);
+ final int minSection = isOverworld ? -4 : 0;
+ final MutableBoolean isAlreadyExtended = new MutableBoolean();
+
+ final MapType[] newBiomes = createBiomeSections(level, isOverworld, minSection, isAlreadyExtended);
+ final MapType wrappedEmptyBlockPalette = getEmptyBlockPalette();
+
+ ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections == null) {
+ level.setList("Sections", sections = Types.NBT.createEmptyList());
+ }
+
+ // must update sections for two things:
+ // 1. the biomes are now stored per section, so we must insert the biomes palette into each section (and create them if they don't exist)
+ // 2. each section must now have block states (or at least DFU is ensuring they do, but current code does not require)
+ V2841.SimplePaletteReader bottomSection = null;
+ final Set<String> allBlocks = new HashSet<>();
+ final IntOpenHashSet existingSections = new IntOpenHashSet();
+
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ final int y = section.getInt("Y");
+ final int sectionIndex = y - minSection;
+
+ existingSections.add(y);
+
+ // add in relevant biome section
+ if (sectionIndex >= 0 && sectionIndex < newBiomes.length) {
+ // exclude out of bounds sections (i.e the light sections above and below the world)
+ section.setMap("biomes", newBiomes[sectionIndex]);
+ }
+
+ // update palette
+ final ListType palette = section.getList("Palette", ObjectType.MAP);
+ final long[] blockStates = section.getLongs("BlockStates");
+
+ section.remove("Palette");
+ section.remove("BlockStates");
+
+ if (palette != null) {
+ for (int j = 0, len2 = palette.size(); j < len2; ++j) {
+ allBlocks.add(V2841.getBlockId(palette.getMap(j)));
+ }
+ }
+
+ final MapType palettedContainer;
+ if (palette != null && blockStates != null) {
+ // only if both exist, same as DFU, same as legacy chunk loading code
+ section.setMap("block_states", palettedContainer = wrapPaletteOptimised(palette, blockStates));
+ } else {
+ section.setMap("block_states", palettedContainer = wrappedEmptyBlockPalette.copy()); // must write a palette now, copy so that later edits do not edit them all
+ }
+
+ if (section.getInt("Y", Integer.MAX_VALUE) == 0) {
+ bottomSection = new V2841.SimplePaletteReader(palettedContainer.getList("palette", ObjectType.MAP), palettedContainer.getLongs("data"));
+ }
+ }
+
+ // all existing sections updated, now we must create new sections just for the biomes migration
+ for (int sectionIndex = 0; sectionIndex < newBiomes.length; ++sectionIndex) {
+ final int sectionY = sectionIndex + minSection;
+ if (!existingSections.add(sectionY)) {
+ // exists already
+ continue;
+ }
+
+ final MapType newSection = Types.NBT.createEmptyMap();
+ sections.addMap(newSection);
+
+ newSection.setByte("Y", (byte)sectionY);
+ // must write a palette now, copy so that later edits do not edit them all
+ newSection.setMap("block_states", wrappedEmptyBlockPalette.copy());
+
+ newSection.setGeneric("biomes", newBiomes[sectionIndex]);
+ }
+
+ // update status so interpolation can take place
+ predictChunkStatusBeforeSurface(level, allBlocks);
+
+ // done with sections, update the rest of the chunk
+ updateChunkData(level, isOverworld, isAlreadyExtended.getValue(), "minecraft:noise".equals(generator), bottomSection);
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType dimensions = data.getMap("dimensions");
+
+ if (dimensions == null) {
+ return null;
+ }
+
+ for (final String dimension : dimensions.keys()) {
+ final MapType dimensionData = dimensions.getMap(dimension);
+ if (dimensionData == null) {
+ continue;
+ }
+
+ final MapType generator = dimensionData.getMap("generator");
+ if (generator == null) {
+ continue;
+ }
+
+ final String type = generator.getString("type");
+ if (type == null) {
+ continue;
+ }
+
+ switch (type) {
+ case "minecraft:flat": {
+ final MapType settings = generator.getMap("settings");
+ if (settings == null) {
+ continue;
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.BIOME, settings, "biome", fromVersion, toVersion);
+
+ WalkerUtils.convertListPath(MCTypeRegistry.BLOCK_NAME, settings, "layers", "block", fromVersion, toVersion);
+
+ break;
+ }
+ case "minecraft:noise": {
+ final MapType settings = generator.getMap("settings");
+ if (settings != null) {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_block", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_fluid", fromVersion, toVersion);
+ }
+
+ final MapType biomeSource = generator.getMap("biome_source");
+ if (biomeSource != null) {
+ final String biomeSourceType = biomeSource.getString("type", "");
+ switch (biomeSourceType) {
+ case "minecraft:fixed": {
+ WalkerUtils.convert(MCTypeRegistry.BIOME, biomeSource, "biome", fromVersion, toVersion);
+ break;
+ }
+
+ case "minecraft:multi_noise": {
+ WalkerUtils.convert(MCTypeRegistry.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST, biomeSource, "preset", fromVersion, toVersion);
+
+ // Vanilla's schema is _still_ wrong. It should be DSL.fields("biomes", DSL.list(DSL.fields("biome")))
+ // But it just contains the list part. That obviously can never be the case, because
+ // the root object is a compound, not a list.
+ WalkerUtils.convertListPath(MCTypeRegistry.BIOME, biomeSource, "biomes", "biome", fromVersion, toVersion);
+ break;
+ }
+
+ case "minecraft:checkerboard": {
+ WalkerUtils.convertList(MCTypeRegistry.BIOME, biomeSource, "biomes", fromVersion, toVersion);
+ break;
+ }
+ }
+ }
+
+ break;
+ }
+ }
+ }
+
+ return null;
+ });
+
+ MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion);
+
+ final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP);
+ if (tileTicks != null) {
+ for (int i = 0, len = tileTicks.size(); i < len; ++i) {
+ final MapType tileTick = tileTicks.getMap(i);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion);
+ }
+ }
+
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ if (sections != null) {
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ WalkerUtils.convertList(MCTypeRegistry.BIOME, section.getMap("biomes"), "palette", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section.getMap("block_states"), "palette", fromVersion, toVersion);
+ }
+ }
+
+ WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, level.getMap("Structures"), "Starts", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ private static void predictChunkStatusBeforeSurface(final MapType level, final Set<String> chunkBlocks) {
+ final String status = level.getString("Status", "empty");
+ if (STATUS_IS_OR_AFTER_SURFACE.contains(status)) {
+ return;
+ }
+
+ chunkBlocks.remove("minecraft:air");
+ final boolean chunkNotEmpty = !chunkBlocks.isEmpty();
+ chunkBlocks.removeAll(BLOCKS_BEFORE_FEATURE_STATUS);
+ final boolean chunkFeatureStatus = !chunkBlocks.isEmpty();
+
+ final String update;
+ if (chunkFeatureStatus) {
+ update = "liquid_carvers";
+ } else if (!"noise".equals(status) && !chunkNotEmpty) {
+ update = "biomes".equals(status) ? "structure_references" : status;
+ } else {
+ update = "noise";
+ }
+
+ level.setString("Status", update);
+ }
+
+ private static MapType getEmptyBlockPalette() {
+ final MapType airBlockState = Types.NBT.createEmptyMap();
+ airBlockState.setString("Name", "minecraft:air");
+
+ final ListType emptyBlockPalette = Types.NBT.createEmptyList();
+ emptyBlockPalette.addMap(airBlockState);
+
+ return V2832.wrapPalette(emptyBlockPalette);
+ }
+
+ private static void shiftUpgradeData(final MapType upgradeData, final int shift) {
+ if (upgradeData == null) {
+ return;
+ }
+
+ final MapType indices = upgradeData.getMap("Indices");
+ if (indices == null) {
+ return;
+ }
+
+ RenameHelper.renameKeys(indices, (final String input) -> {
+ return Integer.toString(Integer.parseInt(input) + shift);
+ });
+ }
+
+ private static void updateChunkData(final MapType level, final boolean wantExtendedHeight, final boolean isAlreadyExtended,
+ final boolean onNoiseGenerator, final V2841.SimplePaletteReader bottomSection) {
+ level.remove("Biomes");
+ if (!wantExtendedHeight) {
+ padCarvingMasks(level, 16, 0);
+ return;
+ }
+
+ if (isAlreadyExtended) {
+ padCarvingMasks(level, 24, 0);
+ return;
+ }
+
+ offsetHeightmaps(level);
+ // Difference from DFU: Still convert the Lights data. Just because it's being removed in a later version doesn't mean
+ // that it should be removed here.
+ // Generally, converters act only on the current version to bring it to the next. This principle allows the converter
+ // for the next version to assume that it acts on its current version, not some in-between of the current version
+ // and some future version that did not exist at the time it was written. This allows converters to be written and tested
+ // only with knowledge of the current version and the next version.
+ addEmptyListPadding(level, "Lights");
+ addEmptyListPadding(level, "LiquidsToBeTicked");
+ addEmptyListPadding(level, "PostProcessing");
+ addEmptyListPadding(level, "ToBeTicked");
+ shiftUpgradeData(level.getMap("UpgradeData"), 4); // https://bugs.mojang.com/browse/MC-238076 - fixed now, Mojang fix is identical. No change required.
+ padCarvingMasks(level, 24, 4);
+
+ if (!onNoiseGenerator) {
+ return;
+ }
+
+ final String status = level.getString("Status");
+ if (status == null || "empty".equals(status)) {
+ return;
+ }
+
+ final MapType blendingData = Types.NBT.createEmptyMap();
+ level.setMap("blending_data", blendingData);
+
+ blendingData.setBoolean("old_noise", STATUS_IS_OR_AFTER_NOISE.contains(status));
+
+ if (bottomSection == null) {
+ return;
+ }
+
+ final BitSet missingBedrock = new BitSet(256);
+ boolean hasBedrock = status.equals("noise");
+
+ for (int z = 0; z <= 15; ++z) {
+ for (int x = 0; x <= 15; ++x) {
+ final MapType state = bottomSection.getState(x, 0, z);
+ final String blockId = V2841.getBlockId(state);
+ final boolean isBedrock = state != null && "minecraft:bedrock".equals(blockId);
+ final boolean isAir = state != null && "minecraft:air".equals(blockId);
+ if (isAir) {
+ missingBedrock.set((z << 4) | x);
+ }
+
+ hasBedrock |= isBedrock;
+ }
+ }
+
+ if (hasBedrock && missingBedrock.cardinality() != missingBedrock.size()) {
+ final String targetStatus = "full".equals(status) ? "heightmaps" : status;
+
+ final MapType belowZeroRetrogen = Types.NBT.createEmptyMap();
+ level.setMap("below_zero_retrogen", belowZeroRetrogen);
+
+ belowZeroRetrogen.setString("target_status", targetStatus);
+ belowZeroRetrogen.setLongs("missing_bedrock", missingBedrock.toLongArray());
+
+ level.setString("Status", "empty");
+ }
+
+ level.setBoolean("isLightOn", false);
+ }
+
+ private static void padCarvingMasks(final MapType level, final int newSize, final int offset) {
+ final MapType carvingMasks = level.getMap("CarvingMasks");
+ if (carvingMasks == null) {
+ // if empty, DFU still writes
+ level.setMap("CarvingMasks", Types.NBT.createEmptyMap());
+ return;
+ }
+
+ for (final String key : carvingMasks.keys()) {
+ final long[] old = BitSet.valueOf(carvingMasks.getBytes(key)).toLongArray();
+ final long[] newVal = new long[64 * newSize];
+
+ System.arraycopy(old, 0, newVal, 64 * offset, old.length);
+
+ carvingMasks.setLongs(key, newVal); // no CME: key exists already
+ }
+ }
+
+ private static void addEmptyListPadding(final MapType level, final String path) {
+ ListType list = level.getListUnchecked(path);
+ if (list != null && list.size() == 24) {
+ return;
+ }
+
+ if (list == null) {
+ // difference from DFU: Don't create the damn thing!
+ return;
+ }
+
+
+ // offset the section array to the new format
+ for (int i = 0; i < 4; ++i) {
+ // always create new copies, so that modifying one doesn't modify ALL of them!
+ list.addList(0, Types.NBT.createEmptyList()); // add below
+ list.addList(Types.NBT.createEmptyList()); // add above
+ }
+ }
+
+ private static void offsetHeightmaps(final MapType level) {
+ final MapType heightmaps = level.getMap("Heightmaps");
+ if (heightmaps == null) {
+ return;
+ }
+
+ for (final String key : HEIGHTMAP_TYPES) {
+ offsetHeightmap(heightmaps.getLongs(key));
+ }
+ }
+
+ private static void offsetHeightmap(final long[] heightmap) {
+ if (heightmap == null) {
+ return;
+ }
+
+ // heightmaps are configured to have 9 bits per value, with 256 total values
+ // heightmaps are also relative to the lowest position
+ for (int idx = 0, len = heightmap.length; idx < len; ++idx) {
+ long curr = heightmap[idx];
+ long next = 0L;
+
+ for (int objIdx = 0; objIdx + 9 <= 64; objIdx += 9) {
+ final long value = (curr >> objIdx) & 511L;
+ if (value != 0L) {
+ final long offset = Math.min(511L, value + 64L);
+
+ next |= (offset << objIdx);
+ }
+ }
+
+ heightmap[idx] = next;
+ }
+ }
+
+ private static MapType[] createBiomeSections(final MapType level, final boolean wantExtendedHeight,
+ final int minSection, final MutableBoolean isAlreadyExtended) {
+ final MapType[] ret = new MapType[wantExtendedHeight ? 24 : 16];
+
+ final int[] biomes = level.getInts("Biomes");
+
+ if (biomes != null && biomes.length == 1536) { // magic value for 24 sections of biomes (24 * 4^3)
+ isAlreadyExtended.setValue(true);
+ for (int sectionIndex = 0; sectionIndex < 24; ++sectionIndex) {
+ ret[sectionIndex] = createBiomeSection(biomes, sectionIndex * 64, -1); // -1 is all 1s
+ }
+ } else if (biomes != null && biomes.length == 1024) { // magic value for 24 sections of biomes (16 * 4^3)
+ for (int sectionY = 0; sectionY < 16; ++sectionY) {
+ ret[sectionY - minSection] = createBiomeSection(biomes, sectionY * 64, -1); // -1 is all 1s
+ }
+
+ if (wantExtendedHeight) {
+ // must set the new sections at top and bottom
+ final MapType bottomCopy = createBiomeSection(biomes, 0, 15); // just want the biomes at y = 0
+ final MapType topCopy = createBiomeSection(biomes, 1008, 15); // just want the biomes at y = 252
+
+ for (int sectionIndex = 0; sectionIndex < 4; ++sectionIndex) {
+ ret[sectionIndex] = bottomCopy.copy(); // copy palette so that later possible modifications don't trash all sections
+ }
+
+ for (int sectionIndex = 20; sectionIndex < 24; ++sectionIndex) {
+ ret[sectionIndex] = topCopy.copy(); // copy palette so that later possible modifications don't trash all sections
+ }
+ }
+ } else {
+ final ListType palette = Types.NBT.createEmptyList();
+ palette.addString("minecraft:plains");
+
+ for (int i = 0; i < ret.length; ++i) {
+ ret[i] = wrapPalette(palette.copy()); // copy palette so that later possible modifications don't trash all sections
+ }
+ }
+
+ return ret;
+ }
+
+ private static MapType createBiomeSection(final int[] biomes, final int offset, final int mask) {
+ final Int2IntLinkedOpenHashMap paletteId = new Int2IntLinkedOpenHashMap();
+
+ for (int idx = 0; idx < 64; ++idx) {
+ final int biome = biomes[offset + (idx & mask)];
+ paletteId.putIfAbsent(biome, paletteId.size());
+ }
+
+ final ListType paletteString = Types.NBT.createEmptyList();
+ for (final IntIterator iterator = paletteId.keySet().iterator(); iterator.hasNext();) {
+ final int biomeId = iterator.nextInt();
+ final String biome = biomeId >= 0 && biomeId < BIOMES_BY_ID.length ? BIOMES_BY_ID[biomeId] : null;
+ paletteString.addString(biome == null ? "minecraft:plains" : biome);
+ }
+
+ final int bitsPerObject = ceilLog2(paletteString.size());
+ if (bitsPerObject == 0) {
+ return wrapPalette(paletteString);
+ }
+
+ // manually create packed integer data
+ final int objectsPerValue = 64 / bitsPerObject;
+ final long[] packed = new long[(64 + objectsPerValue - 1) / objectsPerValue];
+
+ int shift = 0;
+ int idx = 0;
+ long curr = 0;
+
+ for (int biome_idx = 0; biome_idx < 64; ++biome_idx) {
+ final int biome = biomes[offset + (biome_idx & mask)];
+
+ curr |= ((long)paletteId.get(biome)) << shift;
+
+ shift += bitsPerObject;
+
+ if (shift + bitsPerObject > 64) { // will next write overflow?
+ // must move to next idx
+ packed[idx++] = curr;
+ shift = 0;
+ curr = 0L;
+ }
+ }
+
+ // don't forget to write the last one
+ if (shift != 0) {
+ packed[idx] = curr;
+ }
+
+ return wrapPalette(paletteString, packed);
+ }
+
+ private static MapType wrapPalette(final ListType palette) {
+ return wrapPalette(palette, null);
+ }
+
+ private static MapType wrapPalette(final ListType palette, final long[] blockStates) {
+ final MapType ret = Types.NBT.createEmptyMap();
+ ret.setList("palette", palette);
+ if (blockStates != null) {
+ ret.setLongs("data", blockStates);
+ }
+
+ return ret;
+ }
+
+ private static MapType wrapPaletteOptimised(final ListType palette, final long[] blockStates) {
+ if (palette.size() == 1) {
+ return wrapPalette(palette);
+ }
+
+ return wrapPalette(palette, blockStates);
+ }
+
+ public static int ceilLog2(final int value) {
+ return value == 0 ? 0 : Integer.SIZE - Integer.numberOfLeadingZeros(value - 1); // see doc of numberOfLeadingZeros
+ }
+
+ private static void updateLayers(final ListType layers) {
+ if (layers == null) {
+ return;
+ }
+
+ layers.addMap(0, createEmptyLayer()); // add at the bottom
+ }
+
+ private static MapType createEmptyLayer() {
+ final MapType ret = Types.NBT.createEmptyMap();
+ ret.setInt("height", 64);
+ ret.setString("block", "minecraft:air");
+
+ return ret;
+ }
+
+ private V2832() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2833.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2833.java
new file mode 100644
index 0000000000000000000000000000000000000000..0db6fcec914d25680ac936cfb67a22f950b66d47
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2833.java
@@ -0,0 +1,31 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2833 {
+
+ private static final int VERSION = MCVersions.V1_17_1 + 103;
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType dimensions = data.getMap("dimensions");
+
+ for (final String dimensionKey : dimensions.keys()) {
+ final MapType dimension = dimensions.getMap(dimensionKey);
+ if (!dimension.hasKey("type")) {
+ throw new IllegalStateException("Unable load old custom worlds.");
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2833() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2838.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2838.java
new file mode 100644
index 0000000000000000000000000000000000000000..356963228d884a0a74e6d7c9922b4ced627bbfb0
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2838.java
@@ -0,0 +1,62 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2838 {
+
+ private static final int VERSION = MCVersions.V21W40A;
+
+ public static final Map<String, String> BIOME_UPDATE = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:badlands_plateau", "minecraft:badlands")
+ .put("minecraft:bamboo_jungle_hills", "minecraft:bamboo_jungle")
+ .put("minecraft:birch_forest_hills", "minecraft:birch_forest")
+ .put("minecraft:dark_forest_hills", "minecraft:dark_forest")
+ .put("minecraft:desert_hills", "minecraft:desert")
+ .put("minecraft:desert_lakes", "minecraft:desert")
+ .put("minecraft:giant_spruce_taiga_hills", "minecraft:old_growth_spruce_taiga")
+ .put("minecraft:giant_spruce_taiga", "minecraft:old_growth_spruce_taiga")
+ .put("minecraft:giant_tree_taiga_hills", "minecraft:old_growth_pine_taiga")
+ .put("minecraft:giant_tree_taiga", "minecraft:old_growth_pine_taiga")
+ .put("minecraft:gravelly_mountains", "minecraft:windswept_gravelly_hills")
+ .put("minecraft:jungle_edge", "minecraft:sparse_jungle")
+ .put("minecraft:jungle_hills", "minecraft:jungle")
+ .put("minecraft:modified_badlands_plateau", "minecraft:badlands")
+ .put("minecraft:modified_gravelly_mountains", "minecraft:windswept_gravelly_hills")
+ .put("minecraft:modified_jungle_edge", "minecraft:sparse_jungle")
+ .put("minecraft:modified_jungle", "minecraft:jungle")
+ .put("minecraft:modified_wooded_badlands_plateau", "minecraft:wooded_badlands")
+ .put("minecraft:mountain_edge", "minecraft:windswept_hills")
+ .put("minecraft:mountains", "minecraft:windswept_hills")
+ .put("minecraft:mushroom_field_shore", "minecraft:mushroom_fields")
+ .put("minecraft:shattered_savanna", "minecraft:windswept_savanna")
+ .put("minecraft:shattered_savanna_plateau", "minecraft:windswept_savanna")
+ .put("minecraft:snowy_mountains", "minecraft:snowy_plains")
+ .put("minecraft:snowy_taiga_hills", "minecraft:snowy_taiga")
+ .put("minecraft:snowy_taiga_mountains", "minecraft:snowy_taiga")
+ .put("minecraft:snowy_tundra", "minecraft:snowy_plains")
+ .put("minecraft:stone_shore", "minecraft:stony_shore")
+ .put("minecraft:swamp_hills", "minecraft:swamp")
+ .put("minecraft:taiga_hills", "minecraft:taiga")
+ .put("minecraft:taiga_mountains", "minecraft:taiga")
+ .put("minecraft:tall_birch_forest", "minecraft:old_growth_birch_forest")
+ .put("minecraft:tall_birch_hills", "minecraft:old_growth_birch_forest")
+ .put("minecraft:wooded_badlands_plateau", "minecraft:wooded_badlands")
+ .put("minecraft:wooded_hills", "minecraft:forest")
+ .put("minecraft:wooded_mountains", "minecraft:windswept_forest")
+ .put("minecraft:lofty_peaks", "minecraft:jagged_peaks")
+ .put("minecraft:snowcapped_peaks", "minecraft:frozen_peaks")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.BIOME, BIOME_UPDATE::get);
+ }
+
+ private V2838() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2841.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2841.java
new file mode 100644
index 0000000000000000000000000000000000000000..52ae7b4dbd1387327cb709c5939fa55cf1f10f7c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2841.java
@@ -0,0 +1,210 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import ca.spottedleaf.dataconverter.util.IntegerUtil;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class V2841 {
+
+ private static final int VERSION = MCVersions.V21W42A + 1;
+
+ private static final Set<String> ALWAYS_WATERLOGGED = new HashSet<>(
+ Arrays.asList(
+ "minecraft:bubble_column",
+ "minecraft:kelp",
+ "minecraft:kelp_plant",
+ "minecraft:seagrass",
+ "minecraft:tall_seagrass"
+ )
+ );
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType level = root.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ {
+ // Why it's renamed here and not the next data version is beyond me.
+ final MapType liquidTicks = level.getMap("LiquidTicks");
+ if (liquidTicks != null) {
+ level.remove("LiquidTicks");
+ level.setMap("fluid_ticks", liquidTicks);
+ }
+ }
+
+ final Int2ObjectOpenHashMap<SimplePaletteReader> sectionBlocks = new Int2ObjectOpenHashMap<>();
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
+ int minSection = 0; // TODO wtf is this
+ if (sections != null) {
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ final int sectionY = section.getInt("Y");
+ if (sectionY < minSection && section.hasKey("biomes")) {
+ minSection = sectionY;
+ }
+
+ final MapType blockStates = section.getMap("block_states");
+ if (blockStates == null) {
+ continue;
+ }
+
+ sectionBlocks.put(sectionY, new SimplePaletteReader(section.getList("palette", ObjectType.MAP), section.getLongs("data")));
+ }
+ }
+
+ level.setByte("yPos", (byte)minSection); // TODO ???????????????????????????????????????
+
+ if (level.hasKey("fluid_ticks") || level.hasKey("TileTicks")) {
+ return null;
+ }
+
+ final int sectionX = level.getInt("xPos");
+ final int sectionZ = level.getInt("zPos");
+
+ final ListType fluidTicks = level.getList("LiquidsToBeTicked", ObjectType.LIST);
+ final ListType blockTicks = level.getList("ToBeTicked", ObjectType.LIST);
+ level.remove("LiquidsToBeTicked");
+ level.remove("ToBeTicked");
+
+ level.setList("fluid_ticks", migrateTickList(fluidTicks, false, sectionBlocks, sectionX, minSection, sectionZ));
+ level.setList("TileTicks", migrateTickList(blockTicks, true, sectionBlocks, sectionX, minSection, sectionZ));
+
+ return null;
+ }
+ });
+ }
+
+ public static ListType migrateTickList(final ListType ticks, final boolean blockTicks, final Int2ObjectOpenHashMap<SimplePaletteReader> sectionBlocks,
+ final int sectionX, final int minSection, final int sectionZ) {
+ final ListType ret = Types.NBT.createEmptyList();
+
+ if (ticks == null) {
+ return ret;
+ }
+
+ for (int sectionIndex = 0, totalSections = ticks.size(); sectionIndex < totalSections; ++sectionIndex) {
+ final int sectionY = sectionIndex + minSection;
+ final ListType sectionTicks = ticks.getList(sectionIndex);
+ final SimplePaletteReader palette = sectionBlocks.get(sectionY);
+
+ for (int i = 0, len = sectionTicks.size(); i < len; ++i) {
+ final int localIndex = sectionTicks.getShort(i) & 0xFFFF;
+ final MapType blockState = palette == null ? null : palette.getState(localIndex);
+ final String subjectId = blockTicks ? getBlockId(blockState) : getLiquidId(blockState);
+
+ ret.addMap(createNewTick(subjectId, localIndex, sectionX, sectionY, sectionZ));
+ }
+ }
+
+ return ret;
+ }
+
+ public static MapType createNewTick(final String subjectId, final int localIndex, final int sectionX, final int sectionY, final int sectionZ) {
+ final int newX = (localIndex & 15) + (sectionX << 4);
+ final int newZ = ((localIndex >> 4) & 15) + (sectionZ << 4);
+ final int newY = ((localIndex >> 8) & 15) + (sectionY << 4);
+
+ final MapType ret = Types.NBT.createEmptyMap();
+
+ ret.setString("i", subjectId);
+ ret.setInt("x", newX);
+ ret.setInt("y", newY);
+ ret.setInt("z", newZ);
+ ret.setInt("t", 0);
+ ret.setInt("p", 0);
+
+ return ret;
+ }
+
+ public static String getBlockId(final MapType blockState) {
+ return blockState == null ? "minecraft:air" : blockState.getString("Name", "minecraft:air");
+ }
+
+ private static String getLiquidId(final MapType blockState) {
+ if (blockState == null) {
+ return "minecraft:empty";
+ }
+
+ final String name = blockState.getString("Name");
+ if (ALWAYS_WATERLOGGED.contains(name)) {
+ return "minecraft:water";
+ }
+
+ final MapType properties = blockState.getMap("Properties");
+ // Correctly read block state properties as strings - https://github.com/PaperMC/DataConverter/issues/6
+ if ("minecraft:water".equals(name)) {
+ return properties != null && "0".equals(properties.getString("level")) ? "minecraft:water" : "minecraft:flowing_water";
+ } else if ("minecraft:lava".equals(name)) {
+ return properties != null && "0".equals(properties.getString("level")) ? "minecraft:lava" : "minecraft:flowing_lava";
+ }
+
+ return (properties != null && "true".equals(properties.getString("waterlogged"))) ? "minecraft:water" : "minecraft:empty";
+ }
+
+ private V2841() {}
+
+ public static final class SimplePaletteReader {
+
+ public final ListType palette;
+ public final long[] data;
+ private final int bitsPerValue;
+ private final long mask;
+ private final int valuesPerLong;
+
+ public SimplePaletteReader(final ListType palette, final long[] data) {
+ this.palette = palette == null ? null : (palette.size() == 0 ? null : palette);
+ this.data = data;
+ this.bitsPerValue = Math.max(4, IntegerUtil.ceilLog2(this.palette == null ? 0 : this.palette.size()));
+ this.mask = (1L << this.bitsPerValue) - 1L;
+ this.valuesPerLong = (int)(64L / this.bitsPerValue);
+ }
+
+ public MapType getState(final int x, final int y, final int z) {
+ final int index = x | (z << 4) | (y << 8);
+ return this.getState(index);
+ }
+
+ public MapType getState(final int index) {
+ final ListType palette = this.palette;
+ if (palette == null) {
+ return null;
+ }
+
+ final int paletteSize = palette.size();
+ if (paletteSize == 1) {
+ return palette.getMap(0);
+ }
+
+ // x86 div computes mod. no loss here using mod
+ // if needed, can compute magic mul and shift for div values using IntegerUtil
+ final int dataIndex = index / this.valuesPerLong;
+ final int localIndex = (index % this.valuesPerLong) * this.bitsPerValue;
+ final long[] data = this.data;
+ if (dataIndex < 0 || dataIndex >= data.length) {
+ return null;
+ }
+
+ final long value = data[dataIndex];
+ final int paletteIndex = (int)((value >>> localIndex) & this.mask);
+ if (paletteIndex < 0 || paletteIndex >= paletteSize) {
+ return null;
+ }
+
+ return palette.getMap(paletteIndex);
+ }
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2842.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2842.java
new file mode 100644
index 0000000000000000000000000000000000000000..82581d4d4f68842a7def842c50dd94980064e14f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2842.java
@@ -0,0 +1,78 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V2842 {
+
+ private static final int VERSION = MCVersions.V21W42A + 2;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType level = root.getMap("Level");
+ root.remove("Level");
+
+ if (!root.isEmpty()) {
+ for (final String key : root.keys()) {
+ if (level.hasKey(key)) {
+ // Don't clobber Level's data
+ continue;
+ }
+ level.setGeneric(key, root.getGeneric(key));
+ }
+ }
+
+ // Rename top level first
+ RenameHelper.renameSingle(level, "TileEntities", "block_entities");
+ RenameHelper.renameSingle(level, "TileTicks", "block_ticks");
+ RenameHelper.renameSingle(level, "Entities", "entities");
+ RenameHelper.renameSingle(level, "Sections", "sections");
+ RenameHelper.renameSingle(level, "Structures", "structures");
+
+ // 2nd level
+ final MapType structures = level.getMap("structures");
+ if (structures != null) {
+ RenameHelper.renameSingle(structures, "Starts", "starts");
+ }
+
+ return level; // Level is now root tag.
+ }
+ });
+
+ MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "entities", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, data, "block_entities", fromVersion, toVersion);
+
+ final ListType blockTicks = data.getList("block_ticks", ObjectType.MAP);
+ if (blockTicks != null) {
+ for (int i = 0, len = blockTicks.size(); i < len; ++i) {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, blockTicks.getMap(i), "i", fromVersion, toVersion);
+ }
+ }
+
+ final ListType sections = data.getList("sections", ObjectType.MAP);
+ if (sections != null) {
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ WalkerUtils.convertList(MCTypeRegistry.BIOME, section.getMap("biomes"), "palette", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section.getMap("block_states"), "palette", fromVersion, toVersion);
+ }
+ }
+
+ WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data.getMap("structures"), "starts", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ private V2842() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3e916a84e67d3d9243e5be2ea6985edd17c7151
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java
@@ -0,0 +1,101 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V2843 {
+
+ private static final int VERSION = MCVersions.V21W42A + 3;
+
+ public static void register() {
+ ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.BIOME,
+ new HashMap<>(
+ Map.of("minecraft:deep_warm_ocean", "minecraft:warm_ocean")
+ )::get
+ );
+
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ private static void moveOutOfBoundTicks(final ListType ticks, final MapType chunkRoot, final int chunkX, final int chunkZ, final String intoKey) {
+ if (ticks == null) {
+ return;
+ }
+
+ ListType outOfBounds = null;
+ for (int i = 0, len = ticks.size(); i < len; ++i) {
+ final MapType tick = ticks.getMap(i);
+ final int x = tick.getInt("x");
+ final int z = tick.getInt("z");
+ // anything > 1 is lost, anything less than 1 stays.
+ if (Math.max(Math.abs(chunkX - (x >> 4)), Math.abs(chunkZ - (z >> 4))) == 1) {
+ // DFU doesn't remove, so neither do we.
+ if (outOfBounds == null) {
+ outOfBounds = Types.NBT.createEmptyList();
+ }
+ outOfBounds.addMap(tick.copy());
+ }
+ }
+
+ if (outOfBounds != null) {
+ MapType upgradeData = chunkRoot.getMap("UpgradeData");
+ if (upgradeData == null) {
+ chunkRoot.setMap("UpgradeData", upgradeData = Types.NBT.createEmptyMap());
+ }
+ upgradeData.setList(intoKey, outOfBounds);
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ // After renames, so use new names
+ final int x = data.getInt("xPos");
+ final int z = data.getInt("zPos");
+
+ moveOutOfBoundTicks(data.getList("block_ticks", ObjectType.MAP), data, x, z, "neighbor_block_ticks");
+ moveOutOfBoundTicks(data.getList("fluid_ticks", ObjectType.MAP), data, x, z, "neighbor_fluid_ticks");
+
+ return null;
+ }
+ });
+
+ // DFU is missing schema for UpgradeData block names
+ MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "entities", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, data, "block_entities", fromVersion, toVersion);
+
+ WalkerUtils.convertListPath(MCTypeRegistry.BLOCK_NAME, data, "block_ticks", "i", fromVersion, toVersion);
+
+ // Even though UpgradeData will retrieve the block from the World when the type no longer exists,
+ // the type from the world may not match what was actually queued. So, even though it may look like we
+ // can skip the walker here, we actually don't if we want to be thorough.
+ WalkerUtils.convertListPath(MCTypeRegistry.BLOCK_NAME, data.getMap("UpgradeData"), "neighbor_block_ticks", "i", fromVersion, toVersion);
+
+ final ListType sections = data.getListUnchecked("sections");
+ if (sections != null) {
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i, null);
+ if (section == null) {
+ continue;
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.BIOME, section.getMap("biomes"), "palette", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section.getMap("block_states"), "palette", fromVersion, toVersion);
+ }
+ }
+
+ WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data.getMap("structures"), "starts", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ private V2843() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2846.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2846.java
new file mode 100644
index 0000000000000000000000000000000000000000..e32224267d53d82ba15942141a5cb7a19eb380f2
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2846.java
@@ -0,0 +1,23 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V2846 {
+
+ private static final int VERSION = MCVersions.V21W44A + 1;
+
+ public static void register() {
+ ConverterAbstractAdvancementsRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:husbandry/play_jukebox_in_meadows", "minecraft:adventure/play_jukebox_in_meadows",
+ "minecraft:adventure/caves_and_cliff", "minecraft:adventure/fall_from_world_height",
+ "minecraft:adventure/ride_strider_in_overworld_lava", "minecraft:nether/ride_strider_in_overworld_lava"
+ )
+ )::get);
+ }
+
+ private V2846() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2852.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2852.java
new file mode 100644
index 0000000000000000000000000000000000000000..843e54be50563a647c946ca032a59a8606f0a246
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2852.java
@@ -0,0 +1,31 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2852 {
+
+ private static final int VERSION = MCVersions.V1_18_PRE5 + 1;
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType dimensions = data.getMap("dimensions");
+
+ for (final String dimensionKey : dimensions.keys()) {
+ final MapType dimension = dimensions.getMap(dimensionKey);
+ if (!dimension.hasKey("type")) {
+ throw new IllegalStateException("Unable load old custom worlds.");
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2852() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2967.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2967.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f5771a22c25d4c37a7c6181e9f81151bb6fe7aa
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2967.java
@@ -0,0 +1,58 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V2967 {
+
+ private static final int VERSION = MCVersions.V22W05A;
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType dimensions = data.getMap("dimensions");
+
+ if (dimensions == null) {
+ return null;
+ }
+
+ for (final String dimension : dimensions.keys()) {
+ final MapType dimensionData = dimensions.getMap(dimension);
+ if (dimensionData == null) {
+ continue;
+ }
+
+ final MapType generator = dimensionData.getMap("generator");
+ if (generator == null) {
+ continue;
+ }
+
+ final MapType settings = generator.getMap("settings");
+ if (settings == null) {
+ continue;
+ }
+
+ final MapType structures = settings.getMap("structures");
+ if (structures == null) {
+ continue;
+ }
+
+ for (final String structureKey : structures.keys()) {
+ structures.getMap(structureKey).setString("type", "minecraft:random_spread");
+ }
+
+ final MapType stronghold = structures.getMap("stronghold");
+ stronghold.setString("type", "minecraft:concentric_rings");
+ structures.setMap("minecraft:stronghold", stronghold.copy());
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2967() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2970.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2970.java
new file mode 100644
index 0000000000000000000000000000000000000000..9dab902eb5c2d581516c6fab9afa579997c2faa6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2970.java
@@ -0,0 +1,209 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import com.google.common.collect.ImmutableMap;
+import com.mojang.logging.LogUtils;
+import it.unimi.dsi.fastutil.objects.Object2IntMap;
+import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import org.slf4j.Logger;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+public final class V2970 {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static final int VERSION = MCVersions.V22W07A + 1;
+ private static final Map<String, BiomeRemap> CONVERSION_MAP = new HashMap<>(
+ ImmutableMap.<String, BiomeRemap>builder()
+ .put("mineshaft", BiomeRemap.create(Map.of(List.of("minecraft:badlands", "minecraft:eroded_badlands", "minecraft:wooded_badlands"), "minecraft:mineshaft_mesa"), "minecraft:mineshaft"))
+ .put("shipwreck", BiomeRemap.create(Map.of(List.of("minecraft:beach", "minecraft:snowy_beach"), "minecraft:shipwreck_beached"), "minecraft:shipwreck"))
+ .put("ocean_ruin", BiomeRemap.create(Map.of(List.of("minecraft:warm_ocean", "minecraft:lukewarm_ocean", "minecraft:deep_lukewarm_ocean"), "minecraft:ocean_ruin_warm"), "minecraft:ocean_ruin_cold"))
+ .put("village", BiomeRemap.create(Map.of(List.of("minecraft:desert"), "minecraft:village_desert", List.of("minecraft:savanna"), "minecraft:village_savanna", List.of("minecraft:snowy_plains"), "minecraft:village_snowy", List.of("minecraft:taiga"), "minecraft:village_taiga"), "minecraft:village_plains"))
+ .put("ruined_portal", BiomeRemap.create(Map.of(List.of("minecraft:desert"), "minecraft:ruined_portal_desert", List.of("minecraft:badlands", "minecraft:eroded_badlands", "minecraft:wooded_badlands", "minecraft:windswept_hills", "minecraft:windswept_forest", "minecraft:windswept_gravelly_hills", "minecraft:savanna_plateau", "minecraft:windswept_savanna", "minecraft:stony_shore", "minecraft:meadow", "minecraft:frozen_peaks", "minecraft:jagged_peaks", "minecraft:stony_peaks", "minecraft:snowy_slopes"), "minecraft:ruined_portal_mountain", List.of("minecraft:bamboo_jungle", "minecraft:jungle", "minecraft:sparse_jungle"), "minecraft:ruined_portal_jungle", List.of("minecraft:deep_frozen_ocean", "minecraft:deep_cold_ocean", "minecraft:deep_ocean", "minecraft:deep_lukewarm_ocean", "minecraft:frozen_ocean", "minecraft:ocean", "minecraft:cold_ocean", "minecraft:lukewarm_ocean", "minecraft:warm_ocean"), "minecraft:ruined_portal_ocean"), "minecraft:ruined_portal")) // Fix MC-248814, ruined_portal_standard->ruined_portal
+ .put("pillager_outpost", BiomeRemap.create("minecraft:pillager_outpost"))
+ .put("mansion", BiomeRemap.create("minecraft:mansion"))
+ .put("jungle_pyramid", BiomeRemap.create("minecraft:jungle_pyramid"))
+ .put("desert_pyramid", BiomeRemap.create("minecraft:desert_pyramid"))
+ .put("igloo", BiomeRemap.create("minecraft:igloo"))
+ .put("swamp_hut", BiomeRemap.create("minecraft:swamp_hut"))
+ .put("stronghold", BiomeRemap.create("minecraft:stronghold"))
+ .put("monument", BiomeRemap.create("minecraft:monument"))
+ .put("fortress", BiomeRemap.create("minecraft:fortress"))
+ .put("endcity", BiomeRemap.create("minecraft:end_city"))
+ .put("buried_treasure", BiomeRemap.create("minecraft:buried_treasure"))
+ .put("nether_fossil", BiomeRemap.create("minecraft:nether_fossil"))
+ .put("bastion_remnant", BiomeRemap.create("minecraft:bastion_remnant"))
+ .build()
+ );
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ private static Object2IntOpenHashMap<String> countBiomes(final MapType chunk) {
+ final ListType sections = chunk.getList("sections", ObjectType.MAP);
+ if (sections == null) {
+ return null;
+ }
+
+ final Object2IntOpenHashMap<String> ret = new Object2IntOpenHashMap<>();
+
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ final MapType biomes = section.getMap("biomes");
+
+ if (biomes == null) {
+ continue;
+ }
+
+ final ListType palette = biomes.getList("palette", ObjectType.STRING);
+
+ if (palette == null) {
+ continue;
+ }
+
+ for (int k = 0, len2 = palette.size(); k < len2; ++k) {
+ ret.addTo(palette.getString(k), 1);
+ }
+ }
+
+ return ret;
+ }
+
+ private static String getStructureConverted(String id, final Object2IntOpenHashMap<String> biomeCount) {
+ id = id.toLowerCase(Locale.ROOT);
+ final BiomeRemap remap = CONVERSION_MAP.get(id);
+ if (remap == null) {
+ return null;
+ }
+ if (remap.biomeToNewStructure == null || biomeCount == null) {
+ return remap.dfl;
+ }
+
+ final Object2IntOpenHashMap<String> remapCount = new Object2IntOpenHashMap<>();
+
+ for (final Iterator<Object2IntMap.Entry<String>> iterator = biomeCount.object2IntEntrySet().fastIterator(); iterator.hasNext();) {
+ final Object2IntMap.Entry<String> entry = iterator.next();
+ final String remappedStructure = remap.biomeToNewStructure.get(entry.getKey());
+ if (remappedStructure != null) {
+ remapCount.addTo(remappedStructure, entry.getIntValue());
+ }
+ }
+
+ String converted = remap.dfl;
+ int maxCount = 0;
+
+ for (final Iterator<Object2IntMap.Entry<String>> iterator = remapCount.object2IntEntrySet().fastIterator(); iterator.hasNext();) {
+ final Object2IntMap.Entry<String> entry = iterator.next();
+ final int count = entry.getIntValue();
+ if (count > maxCount) {
+ maxCount = count;
+ converted = entry.getKey();
+ }
+ }
+
+ return converted;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType structures = data.getMap("structures");
+ if (structures == null || structures.isEmpty()) {
+ return null;
+ }
+
+ final Object2IntOpenHashMap<String> biomeCounts = countBiomes(data);
+
+ final MapType starts = structures.getMap("starts");
+ final MapType references = structures.getMap("References");
+
+ if (starts != null) {
+ final MapType newStarts = data.getTypeUtil().createEmptyMap();
+ structures.setMap("starts", newStarts);
+
+ for (final String key : starts.keys()) {
+ final MapType value = starts.getMap(key);
+ if ("INVALID".equals(value.getString("id", "INVALID"))) {
+ continue;
+ }
+
+ final String remapped = getStructureConverted(key, biomeCounts);
+
+ if (remapped == null) {
+ LOGGER.warn("Encountered unknown structure in dataconverter: " + key);
+ continue;
+ }
+
+ value.setString("id", remapped);
+ newStarts.setMap(remapped, value);
+ }
+ }
+
+ // This TRULY is a guess, no idea what biomes the referent has.
+ if (references != null) {
+ final MapType newReferences = data.getTypeUtil().createEmptyMap();
+ structures.setMap("References", newReferences);
+ for (final String key : references.keys()) {
+ final long[] value = references.getLongs(key);
+ if (value.length == 0) {
+ continue;
+ }
+
+ final String newKey = getStructureConverted(key, biomeCounts);
+ if (newKey == null) {
+ LOGGER.warn("Encountered unknown structure reference in dataconverter: " + key);
+ continue;
+ }
+
+ newReferences.setLongs(newKey, value);
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2970() {}
+
+ private static final class BiomeRemap {
+
+ public final Map<String, String> biomeToNewStructure;
+ public final String dfl;
+
+ private BiomeRemap(final Map<String, String> biomeToNewStructure, final String dfl) {
+ this.biomeToNewStructure = biomeToNewStructure;
+ this.dfl = dfl;
+ }
+
+ public static BiomeRemap create(final String newId) {
+ return new BiomeRemap(null, newId);
+ }
+
+ public static BiomeRemap create(final Map<List<String>, String> biomeMap, final String newId) {
+ final Map<String, String> biomeToNewStructure = new HashMap<>();
+
+ for (final Map.Entry<List<String>, String> entry : biomeMap.entrySet()) {
+ final List<String> biomes = entry.getKey();
+ final String newBiomeStructure = entry.getValue();
+
+ for (int i = 0, len = biomes.size(); i < len; ++i) {
+ final String biome = biomes.get(i);
+ if (biomeToNewStructure.putIfAbsent(biome, newBiomeStructure) != null) {
+ throw new IllegalStateException("Duplicate biome remap: " + biome + " -> " + newBiomeStructure + ", but already mapped to " + biomeToNewStructure.get(biome));
+ }
+ }
+ }
+
+ return new BiomeRemap(biomeToNewStructure, newId);
+ }
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3077.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3077.java
new file mode 100644
index 0000000000000000000000000000000000000000..61d77841d0ce4ecb22922c8777886917ac54e39f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3077.java
@@ -0,0 +1,40 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V3077 {
+
+ private static final int VERSION = MCVersions.V1_18_2 + 102;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final boolean isLightOn = data.getBoolean("isLightOn");
+ if (isLightOn) {
+ return null;
+ }
+
+ final ListType sections = data.getList("sections", ObjectType.MAP);
+ if (sections == null) {
+ return null;
+ }
+
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+ section.remove("BlockLight");
+ section.remove("SkyLight");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3077() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7e13f2b60c80a04749763e05875212655ff42cf
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java
@@ -0,0 +1,19 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.game_event.GameEventListenerWalker;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+
+public final class V3078 {
+
+ private static final int VERSION = MCVersions.V1_18_2 + 103;
+
+ public static void register() {
+ //registerMob("minecraft:frog"); // changed to simple in 1.21.5
+ //registerMob("minecraft:tadpole"); // changed to simple in 1.21.5
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:sculk_shrieker", new GameEventListenerWalker());
+ }
+
+ private V3078() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3081.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3081.java
new file mode 100644
index 0000000000000000000000000000000000000000..776b0f7d507e8fa7f62f25bd251c97c86eea3961
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3081.java
@@ -0,0 +1,17 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.game_event.GameEventListenerWalker;
+
+public final class V3081 {
+
+ private static final int VERSION = MCVersions.V22W11A + 1;
+
+ public static void register() {
+ //registerMob("minecraft:warden"); // changed to simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:warden", new GameEventListenerWalker());
+ }
+
+ private V3081() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3082.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3082.java
new file mode 100644
index 0000000000000000000000000000000000000000..79768b25a32a5333f8cb6ec6e8c422478a6891df
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3082.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+
+public final class V3082 {
+
+ private static final int VERSION = MCVersions.V22W11A + 2;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:chest_boat", new DataWalkerItemLists("Items"));
+ }
+
+ private V3082() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java
new file mode 100644
index 0000000000000000000000000000000000000000..35df14855a519c6bed1bc01f6b2bda491bf29441
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java
@@ -0,0 +1,19 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.game_event.GameEventListenerWalker;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+
+public final class V3083 {
+
+ private static final int VERSION = MCVersions.V22W12A + 1;
+
+ public static void register() {
+ //registerMob("minecraft:allay"); // changed to simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:allay", new DataWalkerItemLists("Inventory"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:allay", new GameEventListenerWalker());
+ }
+
+ private V3083() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3084.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3084.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a096226995e89285054b4ab35ed3e14ae4da694
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3084.java
@@ -0,0 +1,42 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3084 {
+
+ private static final int VERSION = MCVersions.V22W12A + 2;
+
+ private static final Map<String, String> GAME_EVENT_RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("minecraft:block_press", "minecraft:block_activate")
+ .put("minecraft:block_switch", "minecraft:block_activate")
+ .put("minecraft:block_unpress", "minecraft:block_deactivate")
+ .put("minecraft:block_unswitch", "minecraft:block_deactivate")
+ .put("minecraft:drinking_finish", "minecraft:drink")
+ .put("minecraft:elytra_free_fall", "minecraft:elytra_glide")
+ .put("minecraft:entity_damaged", "minecraft:entity_damage")
+ .put("minecraft:entity_dying", "minecraft:entity_die")
+ .put("minecraft:entity_killed", "minecraft:entity_die")
+ .put("minecraft:mob_interact", "minecraft:entity_interact")
+ .put("minecraft:ravager_roar", "minecraft:entity_roar")
+ .put("minecraft:ring_bell", "minecraft:block_change")
+ .put("minecraft:shulker_close", "minecraft:container_close")
+ .put("minecraft:shulker_open", "minecraft:container_open")
+ .put("minecraft:wolf_shaking", "minecraft:entity_shake")
+ .build()
+ );
+
+ public static void register() {
+ ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.GAME_EVENT_NAME, (final String name) -> {
+ return GAME_EVENT_RENAMES.get(NamespaceUtil.correctNamespace(name));
+ });
+ }
+
+ private V3084() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3086.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3086.java
new file mode 100644
index 0000000000000000000000000000000000000000..f06412a417ba12111c9e8f30b747ed3ad6dcbcb6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3086.java
@@ -0,0 +1,54 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterCriteriaRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterEntityToVariant;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import com.google.common.collect.ImmutableMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3086 {
+
+ private static final int VERSION = MCVersions.V22W13A + 1;
+
+ private static final Int2ObjectOpenHashMap<String> CAT_ID_CONVERSION = new Int2ObjectOpenHashMap<>();
+ static {
+ CAT_ID_CONVERSION.defaultReturnValue("minecraft:tabby");
+ CAT_ID_CONVERSION.put(0, "minecraft:tabby");
+ CAT_ID_CONVERSION.put(1, "minecraft:black");
+ CAT_ID_CONVERSION.put(2, "minecraft:red");
+ CAT_ID_CONVERSION.put(3, "minecraft:siamese");
+ CAT_ID_CONVERSION.put(4, "minecraft:british");
+ CAT_ID_CONVERSION.put(5, "minecraft:calico");
+ CAT_ID_CONVERSION.put(6, "minecraft:persian");
+ CAT_ID_CONVERSION.put(7, "minecraft:ragdoll");
+ CAT_ID_CONVERSION.put(8, "minecraft:white");
+ CAT_ID_CONVERSION.put(9, "minecraft:jellie");
+ CAT_ID_CONVERSION.put(10, "minecraft:all_black");
+ }
+
+ private static final Map<String, String> CAT_ADVANCEMENTS_CONVERSION = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("textures/entity/cat/tabby.png", "minecraft:tabby")
+ .put("textures/entity/cat/black.png", "minecraft:black")
+ .put("textures/entity/cat/red.png", "minecraft:red")
+ .put("textures/entity/cat/siamese.png", "minecraft:siamese")
+ .put("textures/entity/cat/british_shorthair.png", "minecraft:british")
+ .put("textures/entity/cat/calico.png", "minecraft:calico")
+ .put("textures/entity/cat/persian.png", "minecraft:persian")
+ .put("textures/entity/cat/ragdoll.png", "minecraft:ragdoll")
+ .put("textures/entity/cat/white.png", "minecraft:white")
+ .put("textures/entity/cat/jellie.png", "minecraft:jellie")
+ .put("textures/entity/cat/all_black.png", "minecraft:all_black")
+ .build()
+ );
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:cat", new ConverterEntityToVariant(VERSION, "CatType", CAT_ID_CONVERSION::get));
+ MCTypeRegistry.ADVANCEMENTS.addStructureConverter(new ConverterCriteriaRename(VERSION, "minecraft:husbandry/complete_catalogue", CAT_ADVANCEMENTS_CONVERSION::get));
+ }
+
+ private V3086() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3087.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3087.java
new file mode 100644
index 0000000000000000000000000000000000000000..b296229502491b54f6352ee1f9db0023296b36ec
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3087.java
@@ -0,0 +1,24 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterEntityToVariant;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+
+public final class V3087 {
+
+ private static final int VERSION = MCVersions.V22W13A + 2;
+
+ private static final Int2ObjectOpenHashMap<String> FROG_ID_CONVERSION = new Int2ObjectOpenHashMap<>();
+ static {
+ FROG_ID_CONVERSION.put(0, "minecraft:temperate");
+ FROG_ID_CONVERSION.put(1, "minecraft:warm");
+ FROG_ID_CONVERSION.put(2, "minecraft:cold");
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:frog", new ConverterEntityToVariant(VERSION, "Variant", FROG_ID_CONVERSION::get));
+ }
+
+ private V3087() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3088.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3088.java
new file mode 100644
index 0000000000000000000000000000000000000000..2752dfd1a7ff896e2ed736846980da5adde6e657
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3088.java
@@ -0,0 +1,25 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterAddBlendingData;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V3088 {
+
+ // this class originally targeted 3079 but was changed to target a later version without changing the converter, zero clue why
+ // this class then targeted 3088 but was changed to target 3441
+ // to maintain integrity of the data version, I chose to extract the converter to a separate class and use it in both versions
+ // the reason it is important to never change old converters once released is that it creates _two_ versions under the same id.
+ // Consider the case where a user force upgrades their world, but does not load the chunk. Then, consider the case where
+ // the user does not force upgrade their world. Then, Mojang comes along and makes a decision like this and now both
+ // players load the chunk - they went through a different conversion process, which ultimately creates two versions.
+ // Unfortunately this fix doesn't exactly resolve it, as anyone running Mojang's converters will now be different
+ // from DataConverter's. It's broadly a dumb situation all around that could be avoided if Mojang wasn't being careless here.
+ private static final int VERSION = MCVersions.V22W14A;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new ConverterAddBlendingData(VERSION));
+ }
+
+ private V3088() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3090.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3090.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9ad7b4f734ae2c1a19d7a0c5dd7a3cca0e4084f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3090.java
@@ -0,0 +1,25 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3090 {
+
+ private static final int VERSION = MCVersions.V22W15A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:painting", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "Motive", "variant");
+ RenameHelper.renameSingle(data, "Facing", "facing");
+ return null;
+ }
+ });
+ }
+
+ private V3090() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3093.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3093.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1cb70feb6815eebe2d2b547cf75841837332240
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3093.java
@@ -0,0 +1,24 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3093 {
+
+ private static final int VERSION = MCVersions.V22W17A;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:goat", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setBoolean("HasLeftHorn", true);
+ data.setBoolean("HasRightHorn", true);
+ return null;
+ }
+ });
+ }
+
+ private V3093() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3094.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3094.java
new file mode 100644
index 0000000000000000000000000000000000000000..a856d65f411b3fe91eebb429a7dab58dff9520ba
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3094.java
@@ -0,0 +1,44 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3094 {
+
+ private static final int VERSION = MCVersions.V22W17A + 1;
+
+ private static final String[] SOUND_VARIANT_TO_INSTRUMENT = new String[] {
+ "minecraft:ponder_goat_horn",
+ "minecraft:sing_goat_horn",
+ "minecraft:seek_goat_horn",
+ "minecraft:feel_goat_horn",
+ "minecraft:admire_goat_horn",
+ "minecraft:call_goat_horn",
+ "minecraft:yearn_goat_horn",
+ "minecraft:dream_goat_horn"
+ };
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:goat_horn", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+
+ if (tag == null) {
+ return null;
+ }
+
+ final int soundVariant = tag.getInt("SoundVariant");
+ tag.remove("SoundVariant");
+
+ tag.setString("instrument", SOUND_VARIANT_TO_INSTRUMENT[soundVariant < 0 || soundVariant >= SOUND_VARIANT_TO_INSTRUMENT.length ? 0 : soundVariant]);
+
+ return null;
+ }
+ });
+ }
+
+ private V3094() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3097.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3097.java
new file mode 100644
index 0000000000000000000000000000000000000000..a86aee0c6acd1afeb647df4c8d27c333a78f1c47
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3097.java
@@ -0,0 +1,63 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterCriteriaRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterEntityVariantRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.poi.ConverterPoiDelete;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public final class V3097 {
+
+ private static final int VERSION = MCVersions.V22W19A + 1;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> removeFilteredBookText = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ tag.remove("filtered_title");
+ tag.remove("filtered_pages");
+
+ return null;
+ }
+ };
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:writable_book", removeFilteredBookText);
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:written_book", removeFilteredBookText);
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.remove("FilteredText1");
+ data.remove("FilteredText2");
+ data.remove("FilteredText3");
+ data.remove("FilteredText4");
+
+ return null;
+ }
+ });
+
+ final Map<String, String> britishRenamer = new HashMap<>(Map.of(
+ "minecraft:british", "minecraft:british_shorthair"
+ ));
+ final Set<String> poiRemove = new HashSet<>(Set.of(
+ "minecraft:unemployed",
+ "minecraft:nitwit"
+ ));
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:cat", new ConverterEntityVariantRename(VERSION, britishRenamer::get));
+ MCTypeRegistry.ADVANCEMENTS.addStructureConverter(new ConverterCriteriaRename(VERSION, "minecraft:husbandry/complete_catalogue", britishRenamer::get));
+ MCTypeRegistry.POI_CHUNK.addStructureConverter(new ConverterPoiDelete(VERSION, poiRemove::contains));
+ }
+
+ private V3097() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3108.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3108.java
new file mode 100644
index 0000000000000000000000000000000000000000..7393cf136f6753c3d58bdd33d5087a2dc0de7db3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3108.java
@@ -0,0 +1,29 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3108 {
+
+ private static final int VERSION = MCVersions.V1_19_1_PRE1 + 1;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType context = data.getMap("__context");
+ if ("minecraft:overworld".equals(context == null ? null : context.getString("dimension"))) {
+ return null;
+ }
+
+ data.remove("blending_data");
+
+ return null;
+ }
+ });
+ }
+
+ private V3108() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3201.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3201.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd4b0f27e73e2ea26e1fa2237061055e8a7ded82
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3201.java
@@ -0,0 +1,35 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3201 {
+
+ private static final int VERSION = MCVersions.V1_19_2 + 81;
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ private static void fixList(final MapType data, final String target) {
+ if (data == null) {
+ return;
+ }
+ final String curr = data.getString(target);
+ if (curr == null) {
+ return;
+ }
+ data.setString(target, curr.replace("\"programer_art\"", "\"programmer_art\""));
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ fixList(data, "resourcePacks");
+ fixList(data, "incompatibleResourcePacks");
+ return null;
+ }
+ });
+ }
+
+ private V3201() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3202.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3202.java
new file mode 100644
index 0000000000000000000000000000000000000000..697b2fd839312f97877703a8d60b35c59c95ede3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3202.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V3202 {
+
+ private static final int VERSION = MCVersions.V1_19_2 + 82;
+
+ public static void register() {
+ V99.registerSign(VERSION, "minecraft:hanging_sign");
+ }
+
+ private V3202() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc8339de34a9edb1396479d70e5e76757e0264f8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+
+public final class V3203 {
+
+ private static final int VERSION = MCVersions.V1_19_2 + 83;
+
+ public static void register() {
+ //registerMob("minecraft:camel"); // changed to simple in 1.21.5
+ }
+
+ private V3203() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3204.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3204.java
new file mode 100644
index 0000000000000000000000000000000000000000..87053c0c1de258770e7630830307ab484915aad8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3204.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+
+public final class V3204 {
+
+ private static final int VERSION = MCVersions.V1_19_2 + 84;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:chiseled_bookshelf", new DataWalkerItemLists("Items"));
+ }
+
+ private V3204() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3209.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3209.java
new file mode 100644
index 0000000000000000000000000000000000000000..85270a36c5f75b1c6be49e461b302c3339c95750
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3209.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterFlattenSpawnEgg;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V3209 {
+
+ private static final int VERSION = MCVersions.V22W45A + 1;
+
+ public static void register() {
+ // Note: This converter reads entity id from its sub data, but we need no breakpoint because entity ids are not
+ // remapped this version
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:pig_spawn_egg", new ConverterFlattenSpawnEgg(VERSION, 0));
+ }
+
+ private V3209() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3214.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3214.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7ef09ed0c145d0e5adef04e9e969c837904c5ce
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3214.java
@@ -0,0 +1,30 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3214 {
+
+ private static final int VERSION = MCVersions.V1_19_3_PRE3 + 1;
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String value = data.getString("ao");
+
+ if ("0".equals(value)) {
+ data.setString("ao", "false");
+ } else if ("1".equals(value) || "2".equals(value)) {
+ data.setString("ao", "true");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3214() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3319.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3319.java
new file mode 100644
index 0000000000000000000000000000000000000000..98944037c86cefb42f89674a2eb1abe20a90c800
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3319.java
@@ -0,0 +1,23 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3319 {
+
+ private static final int VERSION = MCVersions.V1_19_3 + 101;
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setString("onboardAccessibility", "false");
+ return null;
+ }
+ });
+ }
+
+ private V3319() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3322.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3322.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e09176559a30272ef86754f29265afe686ea2ad
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3322.java
@@ -0,0 +1,84 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public final class V3322 {
+
+ private static final int VERSION = MCVersions.V23W04A + 1;
+
+ private static final Set<String> EFFECT_ITEM_TYPES = new HashSet<>(
+ Set.of(
+ "minecraft:potion",
+ "minecraft:splash_potion",
+ "minecraft:lingering_potion",
+ "minecraft:tipped_arrow"
+ )
+ );
+
+ private static void updateEffectList(final MapType root, final String path) {
+ if (root == null) {
+ return;
+ }
+
+ final ListType effects = root.getList(path, ObjectType.MAP);
+
+ if (effects == null) {
+ return;
+ }
+
+ for (int i = 0, len = effects.size(); i < len; ++i) {
+ final MapType data = effects.getMap(i);
+ final MapType factorData = data.getMap("FactorCalculationData");
+ if (factorData == null) {
+ continue;
+ }
+
+ final int timestamp = factorData.getInt("effect_changed_timestamp", -1);
+ factorData.remove("effect_changed_timestamp");
+
+ final int duration = data.getInt("Duration", -1);
+
+ final int ticksActive = timestamp - duration;
+ factorData.setInt("ticks_active", ticksActive);
+ }
+ }
+
+ public static void register() {
+ final DataConverter<MapType, MapType> entityEffectFix = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateEffectList(data, "Effects");
+ updateEffectList(data, "ActiveEffects");
+ updateEffectList(data, "CustomPotionEffects");
+ return null;
+ }
+ };
+
+ MCTypeRegistry.PLAYER.addStructureConverter(entityEffectFix);
+ MCTypeRegistry.ENTITY.addStructureConverter(entityEffectFix);
+
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+ if (!EFFECT_ITEM_TYPES.contains(id)) {
+ return null;
+ }
+
+ updateEffectList(data.getMap("tag"), "CustomPotionEffects");
+
+ return null;
+ }
+ });
+ }
+
+ private V3322() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3325.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3325.java
new file mode 100644
index 0000000000000000000000000000000000000000..eeba493c110f645b8f95e8229a256a6b90e03e85
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3325.java
@@ -0,0 +1,19 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+
+public final class V3325 {
+
+ private static final int VERSION = MCVersions.V23W05A + 2;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:item_display", new DataWalkerItems("item"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:block_display", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "block_state"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:text_display", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "text"));
+ }
+
+ private V3325() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e72885b5f7f15b3a02a99ab3fb054f7f6375aa8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+
+public final class V3326 {
+
+ private static final int VERSION = MCVersions.V23W06A;
+
+ public static void register() {
+ //registerMob("minecraft:sniffer"); // changed to simple in 1.21.5
+ }
+
+ private V3326() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3327.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3327.java
new file mode 100644
index 0000000000000000000000000000000000000000..7051d4f01b6f43f3d435d21d65b83ba702ffda41
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3327.java
@@ -0,0 +1,19 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerListPaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+
+public final class V3327 {
+
+ private static final int VERSION = MCVersions.V23W06A + 1;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:decorated_pot", new DataWalkerListPaths<>(MCTypeRegistry.ITEM_NAME, "shards"));
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:decorated_pot", new DataWalkerItems("item"));
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:suspicious_sand", new DataWalkerItems("item"));
+ }
+
+ private V3327() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3328.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3328.java
new file mode 100644
index 0000000000000000000000000000000000000000..75a3cbc8e6749abd4bceff710d2f7c3ca6df9d70
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3328.java
@@ -0,0 +1,15 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V3328 {
+
+ private static final int VERSION = MCVersions.V23W06A + 2;
+
+ public static void register() {
+ // registers simple entity "minecraft:interaction"
+ }
+
+ private V3328() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java
new file mode 100644
index 0000000000000000000000000000000000000000..203dfd16e37870b549e92ddd1483adeebbdbd9a4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java
@@ -0,0 +1,46 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.tileentity.ConverterAbstractTileEntityRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3438 {
+
+ public static final int VERSION = MCVersions.V1_19_4 + 101;
+
+ public static void register() {
+ // brushable block rename
+ MCTypeRegistry.TILE_ENTITY.copyWalkers(VERSION, "minecraft:suspicious_sand", "minecraft:brushable_block");
+
+ ConverterAbstractTileEntityRename.register(VERSION, new HashMap<>(Map.of(
+ "minecraft:suspicious_sand", "minecraft:brushable_block"
+ ))::get);
+
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:brushable_block", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "loot_table", "LootTable");
+ RenameHelper.renameSingle(data, "loot_table_seed", "LootTableSeed");
+ return null;
+ }
+ });
+
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ Map.of(
+ "minecraft:pottery_shard_archer", "minecraft:archer_pottery_shard",
+ "minecraft:pottery_shard_prize", "minecraft:prize_pottery_shard",
+ "minecraft:pottery_shard_arms_up", "minecraft:arms_up_pottery_shard",
+ "minecraft:pottery_shard_skull", "minecraft:skull_pottery_shard"
+ )
+ )::get);
+ }
+
+ private V3438() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java
new file mode 100644
index 0000000000000000000000000000000000000000..d449c62b7be3748dfc34c11cf4d929974c9a5191
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java
@@ -0,0 +1,119 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3439 {
+
+ private static final int VERSION = MCVersions.V1_19_4 + 102;
+
+ private static void handleSignText(final MapType text, final long fromVersion, final long toVersion) {
+ if (text == null) {
+ return;
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, text, "messages", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, text, "filtered_messages", fromVersion, toVersion);
+ }
+
+ static void registerSign(final int version, final String id) {
+ MCTypeRegistry.TILE_ENTITY.addWalker(version, id, (final MapType data, final long fromVersion, final long toVersion) -> {
+ handleSignText(data.getMap("front_text"), fromVersion, toVersion);
+ handleSignText(data.getMap("back_text"), fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ public static void register() {
+ final DataConverter<MapType, MapType> signTileUpdater = new DataConverter<>(VERSION) {
+ private static final String DEFAULT_COLOR = "black";
+
+ private static ListType migrateToList(final MapType root, final String prefix) {
+ if (root == null) {
+ return null;
+ }
+
+ final ListType ret = root.getTypeUtil().createEmptyList();
+
+ ret.addString(root.getString(prefix.concat("1"), ComponentUtils.EMPTY));
+ ret.addString(root.getString(prefix.concat("2"), ComponentUtils.EMPTY));
+ ret.addString(root.getString(prefix.concat("3"), ComponentUtils.EMPTY));
+ ret.addString(root.getString(prefix.concat("4"), ComponentUtils.EMPTY));
+
+ return ret;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ // front text
+ final MapType frontText = data.getTypeUtil().createEmptyMap();
+ data.setMap("front_text", frontText);
+
+ final ListType frontMessages = migrateToList(data, "Text");
+ frontText.setList("messages", frontMessages);
+
+ ListType frontFilteredMessages = null;
+
+ for (int i = 0; i < 4; ++i) {
+ final String filtered = data.getString("FilteredText" + i);
+ if (filtered == null) {
+ if (frontFilteredMessages != null) {
+ frontFilteredMessages.addString(frontMessages.getString(i));
+ }
+ continue;
+ }
+
+ if (frontFilteredMessages == null) {
+ frontFilteredMessages = data.getTypeUtil().createEmptyList();
+ for (int k = 0; k < i; ++k) {
+ frontFilteredMessages.addString(frontMessages.getString(k));
+ }
+ }
+
+ frontFilteredMessages.addString(filtered);
+ }
+
+ if (frontFilteredMessages != null) {
+ frontText.setList("filtered_messages", frontFilteredMessages);
+ }
+
+ frontText.setString("color", data.getString("Color", DEFAULT_COLOR));
+ frontText.setBoolean("has_glowing_text", data.getBoolean("GlowingText", false));
+ frontText.setBoolean("_filtered_correct", true);
+
+ // back text
+ final MapType backText = data.getTypeUtil().createEmptyMap();
+ data.setMap("back_text", backText);
+
+ final ListType blankMessages = data.getTypeUtil().createEmptyList();
+ backText.setList("messages", blankMessages);
+
+ for (int i = 0; i < 4; ++i) {
+ blankMessages.addString(ComponentUtils.EMPTY);
+ }
+
+ backText.setString("color", DEFAULT_COLOR);
+ backText.setBoolean("has_glowing_text", false);
+
+ // misc
+ data.setBoolean("is_waxed", false);
+ return null;
+ }
+ };
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", signTileUpdater);
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:hanging_sign", signTileUpdater);
+
+ registerSign(VERSION, "minecraft:sign");
+ // in 1.21.6 this was changed to a subversion. I don't see why we need that change.
+ registerSign(VERSION, "minecraft:hanging_sign");
+ }
+
+ private V3439() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java
new file mode 100644
index 0000000000000000000000000000000000000000..5cc9844fb342731e997b449e9b711c3b6d8e5762
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+import java.util.Arrays;
+import java.util.HashSet;
+
+public final class V3440 {
+
+ private static final int VERSION = MCVersions.V1_19_4 + 103;
+
+ public static void register() {
+ // Note: MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST is namespaced string
+ ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST, (final String in) -> {
+ return "minecraft:overworld_update_1_20".equals(NamespaceUtil.correctNamespace(in)) ? "minecraft:overworld" : null;
+ });
+ MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(
+ Arrays.asList(
+ "minecraft:update_1_20"
+ )
+ )));
+ }
+
+ private V3440() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3441.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3441.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cf41561b4a229ba4d60540f85ba0a8946bb9753
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3441.java
@@ -0,0 +1,17 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterAddBlendingData;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V3441 {
+
+ private static final int VERSION = MCVersions.V1_19_4 + 104;
+
+ public static void register() {
+ // See V3088 for why this converter is duplicated here and in V3088
+ MCTypeRegistry.CHUNK.addStructureConverter(new ConverterAddBlendingData(VERSION));
+ }
+
+ private V3441() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3447.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3447.java
new file mode 100644
index 0000000000000000000000000000000000000000..5db4a5222bf80f01c128d97ec849b89003837beb
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3447.java
@@ -0,0 +1,49 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3447 {
+
+ private static final int VERSION = MCVersions.V23W14A + 2;
+
+ public static void register() {
+ final String[] targets = new String[] {
+ "minecraft:angler_pottery_shard",
+ "minecraft:archer_pottery_shard",
+ "minecraft:arms_up_pottery_shard",
+ "minecraft:blade_pottery_shard",
+ "minecraft:brewer_pottery_shard",
+ "minecraft:burn_pottery_shard",
+ "minecraft:danger_pottery_shard",
+ "minecraft:explorer_pottery_shard",
+ "minecraft:friend_pottery_shard",
+ "minecraft:heart_pottery_shard",
+ "minecraft:heartbreak_pottery_shard",
+ "minecraft:howl_pottery_shard",
+ "minecraft:miner_pottery_shard",
+ "minecraft:mourner_pottery_shard",
+ "minecraft:plenty_pottery_shard",
+ "minecraft:prize_pottery_shard",
+ "minecraft:sheaf_pottery_shard",
+ "minecraft:shelter_pottery_shard",
+ "minecraft:skull_pottery_shard",
+ "minecraft:snort_pottery_shard"
+ };
+ // shard->sherd
+ final Map<String, String> rename = new HashMap<>(targets.length);
+
+ for (final String target : targets) {
+ final String replace = target.replace("_pottery_shard", "_pottery_sherd");
+ if (rename.put(target, replace) != null) {
+ throw new IllegalArgumentException("Duplicate target " + target);
+ }
+ }
+
+ ConverterAbstractItemRename.register(VERSION, rename::get);
+ }
+
+ private V3447() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3448.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3448.java
new file mode 100644
index 0000000000000000000000000000000000000000..b9d7e81938320a30fb881a6be9e377aea4c75cec
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3448.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerListPaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3448 {
+
+ private static final int VERSION = MCVersions.V23W14A + 3;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:decorated_pot", new DataWalkerListPaths<>(MCTypeRegistry.ITEM_NAME, "sherds"));
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:decorated_pot", new DataWalkerItems("item"));
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:decorated_pot", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "shards", "sherds");
+ return null;
+ }
+ });
+ }
+
+ private V3448() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3450.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3450.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e7f34a40280a7704c4a4d1c03a7dda8e030aff5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3450.java
@@ -0,0 +1,23 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterRenameStatus;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3450 {
+
+ private static final int VERSION = MCVersions.V23W16A + 1;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new ConverterRenameStatus(VERSION, new HashMap<>(
+ Map.of(
+ "minecraft:liquid_carvers", "minecraft:carvers",
+ "minecraft:heightmaps", "minecraft:spawn"
+ )
+ )::get));
+ }
+
+ private V3450() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3451.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3451.java
new file mode 100644
index 0000000000000000000000000000000000000000..7383d49edd6998ce93b13e135dcad43145c4e23a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3451.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V3451 {
+
+ private static final int VERSION = MCVersions.V23W16A + 2;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.remove("isLightOn");
+
+ final ListType sections = data.getList("sections", ObjectType.MAP);
+ if (sections == null) {
+ return null;
+ }
+
+ for (int i = 0, len = sections.size(); i < len; ++i) {
+ final MapType section = sections.getMap(i);
+
+ section.remove("BlockLight");
+ section.remove("SkyLight");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3451() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3459.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3459.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ef8c0f17c49405e38f299891c98791905e572de
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3459.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3459 {
+
+ private static final int VERSION = MCVersions.V1_20_PRE5 + 1;
+
+ public static void register() {
+ MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.hasKey("DragonFight")) {
+ return null;
+ }
+
+ final MapType dimensionData = data.getMap("DimensionData");
+ if (dimensionData == null) {
+ return null;
+ }
+
+ final MapType endData = dimensionData.getMap("1");
+ if (endData != null) {
+ final MapType dragonFight = endData.<String>getMap("DragonFight", endData.getTypeUtil().createEmptyMap()).copy();
+ V3807.flattenBlockPos(dragonFight, "ExitPortalLocation");
+ data.setMap("DragonFight", dragonFight);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3459() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3564.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3564.java
new file mode 100644
index 0000000000000000000000000000000000000000..8448981de260b7af33ea8ed62866b6fb95f544e5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3564.java
@@ -0,0 +1,94 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V3564 {
+
+ private static final int VERSION = MCVersions.V1_20_1 + 99;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> converter = new DataConverter<>(VERSION) {
+
+ private static final String[] LEGACY_FIELDS = new String[] {
+ "Text1",
+ "Text2",
+ "Text3",
+ "Text4",
+
+ "FilteredText1",
+ "FilteredText2",
+ "FilteredText3",
+ "FilteredText4",
+
+ "Color",
+
+ "GlowingText"
+ };
+
+
+ private static void updateText(final MapType text) {
+ if (text == null) {
+ return;
+ }
+
+ if (text.getBoolean("_filtered_correct", false)) {
+ text.remove("_filtered_correct");
+ return;
+ }
+
+ final ListType filteredMessages = text.getList("filtered_messages", ObjectType.STRING);
+
+ if (filteredMessages == null || filteredMessages.size() == 0) {
+ return;
+ }
+
+ // should treat null here as empty list
+ final ListType messages = text.getList("messages", ObjectType.STRING);
+
+ final ListType newFilteredList = filteredMessages.getTypeUtil().createEmptyList();
+ boolean newFilteredIsEmpty = true;
+
+ for (int i = 0, len = filteredMessages.size(); i < len; ++i) {
+ final String filtered = filteredMessages.getString(i);
+ final String message = messages != null && i < messages.size() ? messages.getString(i) : ComponentUtils.EMPTY;
+
+ final String newFiltered = ComponentUtils.EMPTY.equals(filtered) ? message : filtered;
+
+ newFilteredList.addString(newFiltered);
+
+ newFilteredIsEmpty = newFilteredIsEmpty && ComponentUtils.EMPTY.equals(newFiltered);
+ }
+
+ if (newFilteredIsEmpty) {
+ text.remove("filtered_messages");
+ } else {
+ text.setList("filtered_messages", newFilteredList);
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ updateText(data.getMap("front_text"));
+ updateText(data.getMap("back_text"));
+
+ for (final String toRemove : LEGACY_FIELDS) {
+ data.remove(toRemove);
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", converter);
+ // I don't know why this was moved to a sub version, but we don't need to do that.
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:hanging_sign", converter);
+ }
+
+ private V3564() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3565.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3565.java
new file mode 100644
index 0000000000000000000000000000000000000000..d0e6bcd9c4b48743a522ea2b79fa97fe27eb8cc8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3565.java
@@ -0,0 +1,32 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3565 {
+
+ private static final int VERSION = MCVersions.V1_20_1 + 100;
+
+ public static void register() {
+ MCTypeRegistry.SAVED_DATA_RANDOM_SEQUENCES.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType oldData = root.getMap("data");
+ if (oldData == null) {
+ return null;
+ }
+
+ final MapType newData = root.getTypeUtil().createEmptyMap();
+ root.setMap("data", newData);
+
+ newData.setMap("sequences", oldData);
+
+ return null;
+ }
+ });
+ }
+
+ private V3565() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3566.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3566.java
new file mode 100644
index 0000000000000000000000000000000000000000..cae496fd174ac38b36885bdfa36805cd5c8321be
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3566.java
@@ -0,0 +1,58 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3566 {
+
+ private static final int VERSION = MCVersions.V1_20_1 + 101;
+
+ public static void register() {
+ MCTypeRegistry.SAVED_DATA_SCOREBOARD.addStructureConverter(new DataConverter<>(VERSION) {
+
+ private static final Map<String, String> SLOT_RENAMES = new HashMap<>(
+ ImmutableMap.<String, String>builder()
+ .put("slot_0", "list")
+ .put("slot_1", "sidebar")
+ .put("slot_2", "below_name")
+ .put("slot_3", "sidebar.team.black")
+ .put("slot_4", "sidebar.team.dark_blue")
+ .put("slot_5", "sidebar.team.dark_green")
+ .put("slot_6", "sidebar.team.dark_aqua")
+ .put("slot_7", "sidebar.team.dark_red")
+ .put("slot_8", "sidebar.team.dark_purple")
+ .put("slot_9", "sidebar.team.gold")
+ .put("slot_10", "sidebar.team.gray")
+ .put("slot_11", "sidebar.team.dark_gray")
+ .put("slot_12", "sidebar.team.blue")
+ .put("slot_13", "sidebar.team.green")
+ .put("slot_14", "sidebar.team.aqua")
+ .put("slot_15", "sidebar.team.red")
+ .put("slot_16", "sidebar.team.light_purple")
+ .put("slot_17", "sidebar.team.yellow")
+ .put("slot_18", "sidebar.team.white")
+ .build()
+ );
+
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+ RenameHelper.renameKeys(data.getMap("DisplaySlots"), SLOT_RENAMES::get);
+
+ return null;
+ }
+ });
+ }
+
+ private V3566() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3568.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3568.java
new file mode 100644
index 0000000000000000000000000000000000000000..96a7c836b278a150164c7632a5b88c14a2978d52
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3568.java
@@ -0,0 +1,245 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public final class V3568 {
+
+ private static final int VERSION = MCVersions.V23W31A + 1;
+
+ private static final String[] EFFECT_ID_MAP = new String[34];
+ static {
+ EFFECT_ID_MAP[1] = "minecraft:speed";
+ EFFECT_ID_MAP[2] = "minecraft:slowness";
+ EFFECT_ID_MAP[3] = "minecraft:haste";
+ EFFECT_ID_MAP[4] = "minecraft:mining_fatigue";
+ EFFECT_ID_MAP[5] = "minecraft:strength";
+ EFFECT_ID_MAP[6] = "minecraft:instant_health";
+ EFFECT_ID_MAP[7] = "minecraft:instant_damage";
+ EFFECT_ID_MAP[8] = "minecraft:jump_boost";
+ EFFECT_ID_MAP[9] = "minecraft:nausea";
+ EFFECT_ID_MAP[10] = "minecraft:regeneration";
+ EFFECT_ID_MAP[11] = "minecraft:resistance";
+ EFFECT_ID_MAP[12] = "minecraft:fire_resistance";
+ EFFECT_ID_MAP[13] = "minecraft:water_breathing";
+ EFFECT_ID_MAP[14] = "minecraft:invisibility";
+ EFFECT_ID_MAP[15] = "minecraft:blindness";
+ EFFECT_ID_MAP[16] = "minecraft:night_vision";
+ EFFECT_ID_MAP[17] = "minecraft:hunger";
+ EFFECT_ID_MAP[18] = "minecraft:weakness";
+ EFFECT_ID_MAP[19] = "minecraft:poison";
+ EFFECT_ID_MAP[20] = "minecraft:wither";
+ EFFECT_ID_MAP[21] = "minecraft:health_boost";
+ EFFECT_ID_MAP[22] = "minecraft:absorption";
+ EFFECT_ID_MAP[23] = "minecraft:saturation";
+ EFFECT_ID_MAP[24] = "minecraft:glowing";
+ EFFECT_ID_MAP[25] = "minecraft:levitation";
+ EFFECT_ID_MAP[26] = "minecraft:luck";
+ EFFECT_ID_MAP[27] = "minecraft:unluck";
+ EFFECT_ID_MAP[28] = "minecraft:slow_falling";
+ EFFECT_ID_MAP[29] = "minecraft:conduit_power";
+ EFFECT_ID_MAP[30] = "minecraft:dolphins_grace";
+ EFFECT_ID_MAP[31] = "minecraft:bad_omen";
+ EFFECT_ID_MAP[32] = "minecraft:hero_of_the_village";
+ EFFECT_ID_MAP[33] = "minecraft:darkness";
+ }
+ private static final Set<String> EFFECT_ITEMS =
+ new HashSet<>(
+ Set.of(
+ "minecraft:potion",
+ "minecraft:splash_potion",
+ "minecraft:lingering_potion",
+ "minecraft:tipped_arrow"
+ )
+ );
+
+ private static String readLegacyEffect(final MapType data, final String path) {
+ final Number id = data.getNumber(path);
+ if (id == null) {
+ return null;
+ }
+
+ final int castedId = id.intValue();
+ return castedId >= 0 && castedId < EFFECT_ID_MAP.length ? EFFECT_ID_MAP[castedId] : null;
+ }
+
+ private static void convertLegacyEffect(final MapType data, final String legacyPath, final String newPath) {
+ final Number id = data.getNumber(legacyPath);
+ data.remove(legacyPath);
+
+ if (id == null) {
+ return;
+ }
+
+ final int castedId = id.intValue();
+ final String newId = castedId >= 0 && castedId < EFFECT_ID_MAP.length ? EFFECT_ID_MAP[castedId] : null;
+
+ if (newId == null) {
+ return;
+ }
+
+ data.setString(newPath, newId);
+ }
+
+ private static final Map<String, String> MOB_EFFECT_RENAMES = new HashMap<>();
+ static {
+ MOB_EFFECT_RENAMES.put("Ambient", "ambient");
+ MOB_EFFECT_RENAMES.put("Amplifier", "amplifier");
+ MOB_EFFECT_RENAMES.put("Duration", "duration");
+ MOB_EFFECT_RENAMES.put("ShowParticles", "show_particles");
+ MOB_EFFECT_RENAMES.put("ShowIcon", "show_icon");
+ MOB_EFFECT_RENAMES.put("FactorCalculationData", "factor_calculation_data");
+ MOB_EFFECT_RENAMES.put("HiddenEffect", "hidden_effect");
+ }
+
+ private static void convertMobEffect(final MapType mobEffect) {
+ if (mobEffect == null) {
+ return;
+ }
+
+ convertLegacyEffect(mobEffect, "Id", "id");
+
+ for (final Map.Entry<String, String> rename : MOB_EFFECT_RENAMES.entrySet()) {
+ RenameHelper.renameSingle(mobEffect, rename.getKey(), rename.getValue());
+ }
+
+ convertMobEffect(mobEffect.getMap("hidden_effect"));
+ }
+
+ private static void convertMobEffectList(final MapType data, final String oldPath, final String newPath) {
+ final ListType effects = data.getList(oldPath, ObjectType.MAP);
+ if (effects == null) {
+ return;
+ }
+
+ for (int i = 0, len = effects.size(); i < len; ++i) {
+ convertMobEffect(effects.getMap(i));
+ }
+
+ data.remove(oldPath);
+ data.setList(newPath, effects);
+ }
+
+ private static void removeAndSet(final MapType data, final String toRemovePath,
+ final String toSetPath, final Object toSet) {
+ data.remove(toRemovePath);
+ if (toSet != null) {
+ data.setGeneric(toSetPath, toSet);
+ }
+ }
+
+ private static void updateSuspiciousStew(final MapType from, final MapType into) {
+ removeAndSet(into, "EffectId", "id", readLegacyEffect(from, "EffectId"));
+ removeAndSet(into, "EffectDuration", "duration", from.getGeneric("EffectDuration"));
+ }
+
+ public static void register() {
+ final DataConverter<MapType, MapType> beaconConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertLegacyEffect(data, "Primary", "primary_effect");
+ convertLegacyEffect(data, "Secondary", "secondary_effect");
+
+ return null;
+ }
+ };
+
+ final DataConverter<MapType, MapType> mooshroomConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType newEffect = data.getTypeUtil().createEmptyMap();
+ updateSuspiciousStew(data, newEffect);
+
+ data.remove("EffectId");
+ data.remove("EffectDuration");
+
+ if (!newEffect.isEmpty()) {
+ final ListType stewEffects = data.getTypeUtil().createEmptyList();
+ data.setList("stew_effects", stewEffects);
+
+ stewEffects.addMap(newEffect);
+ }
+
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> arrowConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertMobEffectList(data, "CustomPotionEffects", "custom_potion_effects");
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> areaEffectCloudConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertMobEffectList(data, "Effects", "effects");
+ return null;
+ }
+ };
+ final DataConverter<MapType, MapType> livingEntityConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertMobEffectList(data, "ActiveEffects", "active_effects");
+ return null;
+ }
+ };
+
+ final DataConverter<MapType, MapType> itemConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final String id = root.getString("id");
+
+ final MapType tag = root.getMap("tag");
+
+ if (tag == null) {
+ return null;
+ }
+
+ if ("minecraft:suspicious_stew".equals(id)) {
+ RenameHelper.renameSingle(tag, "Effects", "effects");
+
+ final ListType effects = tag.getList("effects", ObjectType.MAP);
+
+ if (effects != null) {
+ for (int i = 0, len = effects.size(); i < len; ++i) {
+ final MapType effect = effects.getMap(i);
+ updateSuspiciousStew(effect, effect);
+ }
+ }
+
+ return null;
+ }
+
+ if (EFFECT_ITEMS.contains(id)) {
+ convertMobEffectList(tag, "CustomPotionEffects", "custom_potion_effects");
+ return null;
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beacon", beaconConverter);
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:mooshroom", mooshroomConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", areaEffectCloudConverter);
+ MCTypeRegistry.ENTITY.addStructureConverter(livingEntityConverter);
+
+ MCTypeRegistry.PLAYER.addStructureConverter(livingEntityConverter);
+
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(itemConverter);
+ }
+
+ private V3568() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3682.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3682.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba7e9c7c17a36222e384c78f6a260a97490a3610
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3682.java
@@ -0,0 +1,16 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+
+public final class V3682 {
+
+ private static final int VERSION = MCVersions.V23W41A + 1;
+
+ public static void register() {
+ V1458.namedInventory(VERSION, "minecraft:crafter");
+ }
+
+ private V3682() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3683.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3683.java
new file mode 100644
index 0000000000000000000000000000000000000000..d91b8d638af2d104de989bdf727f74914727fbd8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3683.java
@@ -0,0 +1,33 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3683 {
+
+ private static final int VERSION = MCVersions.V23W41A + 2;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:tnt", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "Fuse", "fuse");
+
+ final MapType defaultState = data.getTypeUtil().createEmptyMap();
+ data.setMap("block_state", defaultState);
+
+ defaultState.setString("Name", "minecraft:tnt");
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:tnt", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "block_state"));
+ }
+
+ private V3683() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3685.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3685.java
new file mode 100644
index 0000000000000000000000000000000000000000..4393d5395259f9aaf941ad15352ac6615f44841a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3685.java
@@ -0,0 +1,64 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+
+public final class V3685 {
+
+ private static final int VERSION = MCVersions.V23W42A + 1;
+
+ private static String getType(final MapType arrow) {
+ return "minecraft:empty".equals(arrow.getString("Potion", "minecraft:empty")) ? "minecraft:arrow" : "minecraft:tipped_arrow";
+ }
+
+ private static MapType createItem(final TypeUtil<?> util, final String id, final int count) {
+ final MapType ret = util.createEmptyMap();
+
+ ret.setString("id", id);
+ ret.setInt("Count", count);
+
+ return ret;
+ }
+
+ private static void registerArrowEntity(final String id) {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState"));
+ // new: item
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItems("item"));
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "Trident", "item");
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setMap("item", createItem(data.getTypeUtil(), getType(data), 1));
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setMap("item", createItem(data.getTypeUtil(), "minecraft:spectral_arrow", 1));
+ return null;
+ }
+ });
+
+ registerArrowEntity("minecraft:trident");
+ registerArrowEntity("minecraft:spectral_arrow");
+ registerArrowEntity("minecraft:arrow");
+ }
+
+ private V3685() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3a8af24d80ed3fa9f205eb8d97bbd1defb9cbc8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V3689 {
+
+ private static final int VERSION = MCVersions.V23W44A + 1;
+
+ public static void register() {
+ //registerMob("minecraft:breeze"); // changed to simple in 1.21.5
+ // minecraft:wind_charge is a simple entity
+ // minecraft:breeze_wind_charge is a simple entity
+
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:trial_spawner", (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, data, "spawn_potentials", "data", "entity", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("spawn_data"), "entity", fromVersion, toVersion);
+ return null;
+ });
+ }
+
+ private V3689() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3692.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3692.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fc62f9cadb990790420376d5c80b14775b71a48
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3692.java
@@ -0,0 +1,25 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3692 {
+
+ private static final int VERSION = MCVersions.V23W46A + 1;
+
+ private static final Map<String, String> GRASS_RENAME = new HashMap<>(
+ Map.of(
+ "minecraft:grass", "minecraft:short_grass"
+ )
+ );
+
+ public static void register() {
+ ConverterAbstractBlockRename.register(VERSION, GRASS_RENAME::get);
+ ConverterAbstractItemRename.register(VERSION, GRASS_RENAME::get);
+ }
+
+ private V3692() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3799.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3799.java
new file mode 100644
index 0000000000000000000000000000000000000000..546d69f22b52f00cf2fa9bacc5fda6d2f116f148
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3799.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V3799 {
+
+ private static final int VERSION = MCVersions.V1_20_4 + 99;
+
+ public static void register() {
+ //V100.registerEquipment(VERSION, "minecraft:armadillo"); // changed to simple in 1.21.5
+ }
+
+ private V3799() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3800.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3800.java
new file mode 100644
index 0000000000000000000000000000000000000000..a40397feb5962bd5f4a44cc85bb359f5f99ff03a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3800.java
@@ -0,0 +1,23 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3800 {
+
+ private static final int VERSION = MCVersions.V1_20_4 + 100;
+
+ public static void register() {
+ final Map<String, String> renames = new HashMap<>(
+ Map.of(
+ "minecraft:scute", "minecraft:turtle_scute"
+ )
+ );
+
+ ConverterAbstractItemRename.register(VERSION, renames::get);
+ }
+
+ private V3800() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3803.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3803.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ff5e2f1a386d75b6d0d6fc3160f2241bf74b262
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3803.java
@@ -0,0 +1,24 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterEnchantmentsRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3803 {
+
+ private static final int VERSION = MCVersions.V23W51B + 1;
+
+ public static void register() {
+ final Map<String, String> renames = new HashMap<>(
+ Map.of(
+ "minecraft:sweeping", "minecraft:sweeping_edge"
+ )
+ );
+
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new ConverterEnchantmentsRename(VERSION, renames::get));
+ }
+
+ private V3803() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3807.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3807.java
new file mode 100644
index 0000000000000000000000000000000000000000..b329a8086c695c1c16ece6dd40c0cbfdc3d04835
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3807.java
@@ -0,0 +1,72 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V3807 {
+
+ private static final int VERSION = MCVersions.V24W04A + 1;
+
+ public static void flattenBlockPos(final MapType data, final String path) {
+ if (data == null) {
+ return;
+ }
+
+ final MapType pos = data.getMap(path);
+ if (pos == null) {
+ return;
+ }
+
+ final Number x = pos.getNumber("X");
+ final Number y = pos.getNumber("Y");
+ final Number z = pos.getNumber("Z");
+
+ if (x == null || y == null || z == null) {
+ return;
+ }
+
+ data.setInts(path, new int[] { x.intValue(), y.intValue(), z.intValue() });
+ }
+
+ public static void register() {
+ // Step 0
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:vault", (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root.getMap("config"), "key_item", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root.getMap("server_data"), "items_to_eject", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root.getMap("shared_data"), "display_item", fromVersion, toVersion);
+
+ return null;
+ });
+
+ // Step 1
+ MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION, 1) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType data = root.getMap("data");
+
+ if (data == null) {
+ return null;
+ }
+
+ final ListType banners = data.getList("banners", ObjectType.MAP);
+
+ if (banners == null) {
+ return null;
+ }
+
+ for (int i = 0, len = banners.size(); i < len; ++i) {
+ V3807.flattenBlockPos(banners.getMap(i), "Pos");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3807() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7c4f912d9baf6df0392aee3c73f8f0a8ad938c3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java
@@ -0,0 +1,79 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V3808 {
+
+ private static final int VERSION = MCVersions.V24W04A + 2;
+
+ public static void register() {
+ class BodyArmorConverter extends DataConverter<MapType, MapType> {
+ private final String path;
+ private final boolean clearArmor;
+
+ public BodyArmorConverter(final int toVersion, final String path, final boolean clearArmor) {
+ this(toVersion, 0, path, clearArmor);
+ }
+
+ public BodyArmorConverter(final int toVersion, final int versionStep, final String path, final boolean clearArmor) {
+ super(toVersion, versionStep);
+
+ this.path = path;
+ this.clearArmor = clearArmor;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType prev = data.getMap(this.path);
+
+ if (prev == null) {
+ return null;
+ }
+
+ data.remove(this.path);
+
+ data.setMap("body_armor_item", prev);
+ data.setFloat("body_armor_drop_chance", 2.0F);
+
+ if (this.clearArmor) {
+ final ListType armor = data.getList("ArmorItems", ObjectType.MAP);
+ if (armor != null && armor.size() > 2) {
+ armor.setMap(2, data.getTypeUtil().createEmptyMap());
+ }
+
+ final ListType chances = data.getList("ArmorDropChances", ObjectType.FLOAT);
+ if (chances != null && chances.size() > 2) {
+ chances.setFloat(2, 0.085F);
+ }
+ }
+
+ return null;
+ }
+ }
+
+ // Step 0
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:horse", new BodyArmorConverter(VERSION, "ArmorItem", true));
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:horse", new DataWalkerItems("SaddleItem"));
+
+ // Step 1
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:llama", new BodyArmorConverter(VERSION, 1, "DecorItem", false));
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 1, "minecraft:llama", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 1, "minecraft:llama", new DataWalkerItems("SaddleItem"));
+
+ // Step 2
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:trader_llama", new BodyArmorConverter(VERSION, 2, "DecorItem", false));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 2, "minecraft:trader_llama", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, 2, "minecraft:trader_llama", new DataWalkerItems("SaddleItem"));
+ }
+
+ private V3808() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3809.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3809.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5d3efbf4b32e813a66c2be700123a6f4cae4f28
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3809.java
@@ -0,0 +1,41 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V3809 {
+
+ private static final int VERSION = MCVersions.V24W05A;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> slotConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType items = data.getList("Items", ObjectType.MAP);
+ if (items == null) {
+ return null;
+ }
+
+ for (int i = 0, len = items.size(); i < len; ++i) {
+ final MapType item = items.getMap(i);
+
+ final int slot = item.getInt("Slot", 2);
+ item.setByte("Slot", (byte)(slot - 2));
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:llama", slotConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:trader_llama", slotConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:mule", slotConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:donkey", slotConverter);
+ }
+
+ private V3809() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3812.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3812.java
new file mode 100644
index 0000000000000000000000000000000000000000..8465ca45a23c940bcab16450598562cf8c037051
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3812.java
@@ -0,0 +1,48 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+
+public final class V3812 {
+
+ private static final int VERSION = MCVersions.V24W05B + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:wolf", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ boolean doubleHealth = false;
+
+ final ListType attributes = data.getList("Attributes", ObjectType.MAP);
+ if (attributes != null) {
+ for (int i = 0, len = attributes.size(); i < len; ++i) {
+ final MapType attribute = attributes.getMap(i);
+
+ if (!"minecraft:generic.max_health".equals(NamespaceUtil.correctNamespace(attribute.getString("Name")))) {
+ continue;
+ }
+
+ final double base = attribute.getDouble("Base", 0.0D);
+ if (base == 20.0D) {
+ attribute.setDouble("Base", 40.0D);
+ doubleHealth = true;
+ }
+ }
+ }
+
+ if (doubleHealth) {
+ data.setFloat("Health", data.getFloat("Health", 0.0F) * 2.0F);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3812() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java
new file mode 100644
index 0000000000000000000000000000000000000000..8169c681b04f0d6dfd21c890ae4123d638ca4513
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java
@@ -0,0 +1,137 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+
+public final class V3813 {
+
+ private static final int VERSION = MCVersions.V24W05B + 2;
+
+ private static final String[] PATROLLING_MOBS = new String[] {
+ "minecraft:witch",
+ "minecraft:ravager",
+ "minecraft:pillager",
+ "minecraft:illusioner",
+ "minecraft:evoker",
+ "minecraft:vindicator"
+ };
+
+ public static void register() {
+ class RootPositionConverter extends DataConverter<MapType, MapType> {
+ private final RenamePair[] convert;
+
+ public RootPositionConverter(final int toVersion, final RenamePair[] convert) {
+ this(toVersion, 0, convert);
+ }
+
+ public RootPositionConverter(final int toVersion, final int versionStep, final RenamePair[] convert) {
+ super(toVersion, versionStep);
+ this.convert = convert;
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ for (final RenamePair rename : this.convert) {
+ V3807.flattenBlockPos(data, rename.from);
+ RenameHelper.renameSingle(data, rename.from, rename.to);
+ }
+ return null;
+ }
+ }
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:bee", new RootPositionConverter(VERSION, new RenamePair[] {
+ new RenamePair("HivePos", "hive_pos"),
+ new RenamePair("FlowerPos", "flower_pos")
+ }));
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:end_crystal", new RootPositionConverter(VERSION, new RenamePair[] {
+ new RenamePair("BeamTarget", "beam_target"),
+ }));
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:wandering_trader", new RootPositionConverter(VERSION, new RenamePair[] {
+ new RenamePair("WanderTarget", "wander_target"),
+ }));
+
+ final RootPositionConverter patrolConverter = new RootPositionConverter(VERSION, new RenamePair[] {
+ new RenamePair("PatrolTarget", "patrol_target"),
+ });
+ for (final String id : PATROLLING_MOBS) {
+ MCTypeRegistry.ENTITY.addConverterForId(id, patrolConverter);
+ }
+
+ MCTypeRegistry.ENTITY.addStructureConverter(new RootPositionConverter(VERSION, new RenamePair[] {
+ new RenamePair("Leash", "leash"),
+ }));
+
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beehive", new RootPositionConverter(VERSION, new RenamePair[] {
+ new RenamePair("FlowerPos", "flower_pos"),
+ }));
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:end_gateway", new RootPositionConverter(VERSION, new RenamePair[] {
+ new RenamePair("ExitPortal", "exit_portal"),
+ }));
+
+ MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType data = root.getMap("data");
+
+ if (data == null) {
+ return null;
+ }
+
+ final ListType frames = data.getList("frames", ObjectType.MAP);
+ if (frames != null) {
+ for (int i = 0, len = frames.size(); i < len; ++i) {
+ final MapType frame = frames.getMap(i);
+
+ V3807.flattenBlockPos(frame, "Pos");
+
+ RenameHelper.renameSingle(frame, "Pos", "pos");
+ RenameHelper.renameSingle(frame, "Rotation", "rotation");
+ RenameHelper.renameSingle(frame, "EntityId", "entity_id");
+ }
+ }
+
+ final ListType banners = data.getList("banners", ObjectType.MAP);
+ for (int i = 0, len = banners.size(); i < len; ++i) {
+ final MapType banner = banners.getMap(i);
+
+ RenameHelper.renameSingle(banner, "Pos", "pos");
+ RenameHelper.renameSingle(banner, "Color", "color");
+ RenameHelper.renameSingle(banner, "Name", "name");
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:compass", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+
+ if (tag == null) {
+ return null;
+ }
+
+ V3807.flattenBlockPos(tag, "LodestonePos");
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, root.getMap("data"), "banners", "name", fromVersion, toVersion);
+ return null;
+ });
+ }
+
+ private V3813() {}
+
+ private static record RenamePair(String from, String to) {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3814.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3814.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4cc52620afb728533efe988bf2066ffc947f2d6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3814.java
@@ -0,0 +1,21 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.attributes.ConverterAbstractOldAttributesRename;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3814 {
+
+ private static final int VERSION = MCVersions.V24W05B + 3;
+
+ public static void register() {
+ final Map<String, String> renames = new HashMap<>(
+ Map.of("minecraft:horse.jump_strength", "minecraft:generic.jump_strength")
+ );
+
+ ConverterAbstractOldAttributesRename.register(VERSION, renames::get);
+ }
+
+ private V3814() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3816.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3816.java
new file mode 100644
index 0000000000000000000000000000000000000000..b339e9559a3b5cadfab5e0c79327acace4df04b8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3816.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V3816 {
+
+ private static final int VERSION = MCVersions.V24W06A + 1;
+
+ public static void register() {
+ //V100.registerEquipment(VERSION, "minecraft:bogged"); // changed to simple in 1.21.5
+ }
+
+ private V3816() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java
new file mode 100644
index 0000000000000000000000000000000000000000..96f21374468614655e8c25e314e18c92eba7b41a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java
@@ -0,0 +1,361 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterItemStackToDataComponents;
+import ca.spottedleaf.dataconverter.minecraft.converters.particle.ConverterParticleToNBT;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.Types;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V3818 {
+
+ private static final int VERSION = MCVersions.V24W07A + 1;
+
+ private static final String[] BANNER_COLOURS = new String[] {
+ "white",
+ "orange",
+ "magenta",
+ "light_blue",
+ "yellow",
+ "lime",
+ "pink",
+ "gray",
+ "light_gray",
+ "cyan",
+ "purple",
+ "blue",
+ "brown",
+ "green",
+ "red",
+ "black",
+ };
+
+ public static String getBannerColour(final int id) {
+ return id >= 0 && id < BANNER_COLOURS.length ? BANNER_COLOURS[id] : BANNER_COLOURS[0];
+ }
+
+ public static void register() {
+ // Step 0
+ // Note: No breakpoint needed, nothing nests hotbar
+ MCTypeRegistry.HOTBAR.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ for (final String key : data.keys()) {
+ final ListType itemList = data.getList(key, ObjectType.MAP);
+ if (itemList != null) {
+ for (int i = 0, len = itemList.size(); i < len; ++i) {
+ final MapType item = itemList.getMap(i);
+
+ final String id = item.getString("id");
+ final int count = item.getInt("Count");
+
+ if ("minecraft:air".equals(id) || count <= 0) {
+ itemList.setMap(i, item.getTypeUtil().createEmptyMap());
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beehive", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "Bees", "bees");
+
+ final ListType bees = data.getList("bees", ObjectType.MAP);
+ if (bees != null) {
+ for (int i = 0, len = bees.size(); i < len; ++i) {
+ final MapType bee = bees.getMap(i);
+
+ RenameHelper.renameSingle(bee, "EntityData", "entity_data");
+ RenameHelper.renameSingle(bee, "TicksInHive", "ticks_in_hive");
+ RenameHelper.renameSingle(bee, "MinOccupationTicks", "min_ticks_in_hive");
+ }
+ }
+
+ return null;
+ }
+ });
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:beehive", (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "bees", "entity_data", fromVersion, toVersion);
+
+ return null;
+ });
+
+ // Step 1
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION, 1) {
+ private static final Map<String, String> PATTERN_UPDATE = new HashMap<>();
+ static {
+ PATTERN_UPDATE.put("b", "minecraft:base");
+ PATTERN_UPDATE.put("bl", "minecraft:square_bottom_left");
+ PATTERN_UPDATE.put("br", "minecraft:square_bottom_right");
+ PATTERN_UPDATE.put("tl", "minecraft:square_top_left");
+ PATTERN_UPDATE.put("tr", "minecraft:square_top_right");
+ PATTERN_UPDATE.put("bs", "minecraft:stripe_bottom");
+ PATTERN_UPDATE.put("ts", "minecraft:stripe_top");
+ PATTERN_UPDATE.put("ls", "minecraft:stripe_left");
+ PATTERN_UPDATE.put("rs", "minecraft:stripe_right");
+ PATTERN_UPDATE.put("cs", "minecraft:stripe_center");
+ PATTERN_UPDATE.put("ms", "minecraft:stripe_middle");
+ PATTERN_UPDATE.put("drs", "minecraft:stripe_downright");
+ PATTERN_UPDATE.put("dls", "minecraft:stripe_downleft");
+ PATTERN_UPDATE.put("ss", "minecraft:small_stripes");
+ PATTERN_UPDATE.put("cr", "minecraft:cross");
+ PATTERN_UPDATE.put("sc", "minecraft:straight_cross");
+ PATTERN_UPDATE.put("bt", "minecraft:triangle_bottom");
+ PATTERN_UPDATE.put("tt", "minecraft:triangle_top");
+ PATTERN_UPDATE.put("bts", "minecraft:triangles_bottom");
+ PATTERN_UPDATE.put("tts", "minecraft:triangles_top");
+ PATTERN_UPDATE.put("ld", "minecraft:diagonal_left");
+ PATTERN_UPDATE.put("rd", "minecraft:diagonal_up_right");
+ PATTERN_UPDATE.put("lud", "minecraft:diagonal_up_left");
+ PATTERN_UPDATE.put("rud", "minecraft:diagonal_right");
+ PATTERN_UPDATE.put("mc", "minecraft:circle");
+ PATTERN_UPDATE.put("mr", "minecraft:rhombus");
+ PATTERN_UPDATE.put("vh", "minecraft:half_vertical");
+ PATTERN_UPDATE.put("hh", "minecraft:half_horizontal");
+ PATTERN_UPDATE.put("vhr", "minecraft:half_vertical_right");
+ PATTERN_UPDATE.put("hhb", "minecraft:half_horizontal_bottom");
+ PATTERN_UPDATE.put("bo", "minecraft:border");
+ PATTERN_UPDATE.put("cbo", "minecraft:curly_border");
+ PATTERN_UPDATE.put("gra", "minecraft:gradient");
+ PATTERN_UPDATE.put("gru", "minecraft:gradient_up");
+ PATTERN_UPDATE.put("bri", "minecraft:bricks");
+ PATTERN_UPDATE.put("glb", "minecraft:globe");
+ PATTERN_UPDATE.put("cre", "minecraft:creeper");
+ PATTERN_UPDATE.put("sku", "minecraft:skull");
+ PATTERN_UPDATE.put("flo", "minecraft:flower");
+ PATTERN_UPDATE.put("moj", "minecraft:mojang");
+ PATTERN_UPDATE.put("pig", "minecraft:piglin");
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType patterns = data.getList("Patterns", ObjectType.MAP);
+ if (patterns != null) {
+ for (int i = 0, len = patterns.size(); i < len; ++i) {
+ final MapType pattern = patterns.getMap(i);
+
+ final String patternName = pattern.getString("Pattern");
+ if (patternName != null) {
+ final String renamed = PATTERN_UPDATE.get(patternName);
+ if (renamed != null) {
+ pattern.setString("Pattern", renamed);
+ }
+ }
+ RenameHelper.renameSingle(pattern, "Pattern", "pattern");
+
+ final String newColour = getBannerColour(pattern.getInt("Color"));
+ pattern.setString("Color", newColour);
+ RenameHelper.renameSingle(pattern, "Color", "color");
+ }
+ }
+ RenameHelper.renameSingle(data, "Patterns", "patterns");
+
+ return null;
+ }
+ });
+
+ // Step 2
+ // Note: there is nothing after the previous breakpoint (1.19.4) that reads nested entity item
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", new DataConverter<>(VERSION, 2) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final Object potion = data.getGeneric("Potion");
+ final Object customPotionEffects = data.getGeneric("custom_potion_effects");
+ final Object color = data.getGeneric("Color");
+
+ if (potion == null && customPotionEffects == null && color == null) {
+ return null;
+ }
+
+ data.remove("Potion");
+ data.remove("custom_potion_effects");
+ data.remove("Color");
+
+ final MapType item = data.getMap("item");
+ if (item == null) {
+ return null;
+ }
+
+ final MapType tag = item.getOrCreateMap("tag");
+
+ if (potion != null) {
+ tag.setGeneric("Potion", potion);
+ }
+ if (customPotionEffects != null) {
+ tag.setGeneric("custom_potion_effects", customPotionEffects);
+ }
+ if (color != null) {
+ tag.setGeneric("CustomPotionColor", color);
+ }
+
+ return null;
+ }
+ });
+
+ // Step 3
+ // next version: 4059
+ MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, 3, new DataWalker<>() {
+ private static void walkBlockPredicates(final MapType root, final long fromVersion, final long toVersion) {
+ if (root.hasKey("blocks", ObjectType.STRING)) {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion);
+ } else if (root.hasKey("blocks", ObjectType.LIST)) {
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion);
+ }
+ }
+
+ @Override
+ public MapType walk(final MapType root, final long fromVersion, final long toVersion) {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "minecraft:bees", "entity_data", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.TILE_ENTITY, root, "minecraft:block_entity_data", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:bundle_contents", fromVersion, toVersion);
+
+ final MapType canBreak = root.getMap("minecraft:can_break");
+ if (canBreak != null) {
+ final ListType predicates = canBreak.getList("predicates", ObjectType.MAP);
+ if (predicates != null) {
+ for (int i = 0, len = predicates.size(); i < len; ++i) {
+ walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion);
+ }
+ }
+ // Not handled by DFU: simple encoding does not require "predicates"
+ walkBlockPredicates(canBreak, fromVersion, toVersion);
+ }
+
+ final MapType canPlaceOn = root.getMap("minecraft:can_place_on");
+ if (canPlaceOn != null) {
+ final ListType predicates = canPlaceOn.getList("predicates", ObjectType.MAP);
+ if (predicates != null) {
+ for (int i = 0, len = predicates.size(); i < len; ++i) {
+ walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion);
+ }
+ }
+ // Not handled by DFU: simple encoding does not require "predicates"
+ walkBlockPredicates(canPlaceOn, fromVersion, toVersion);
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:charged_projectiles", fromVersion, toVersion);
+ WalkerUtils.convertListPath(MCTypeRegistry.ITEM_STACK, root, "minecraft:container", "item", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, root, "minecraft:entity_data", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_NAME, root, "minecraft:pot_decorations", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root.getMap("minecraft:food"), "using_converts_to", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:custom_name", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:item_name", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:lore", fromVersion, toVersion);
+
+ final MapType writtenBookContent = root.getMap("minecraft:written_book_content");
+ if (writtenBookContent != null) {
+ // This logic is OK up until we need to convert TEXT_COMPONENT to NBT.
+ // But that's for the next walker to handle.
+ final ListType pages = writtenBookContent.getListUnchecked("pages");
+ if (pages != null) {
+ for (int i = 0, len = pages.size(); i < len; ++i) {
+ final Object pageGeneric = pages.getGeneric(i);
+ if (pageGeneric instanceof String string) {
+ final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(string, fromVersion, toVersion);
+ if (convertedGeneric != null) {
+ pages.setGeneric(i, convertedGeneric);
+ }
+ } else if (pageGeneric instanceof MapType mapType) {
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "raw", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "filtered", fromVersion, toVersion);
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+
+ // Step 4
+ MCTypeRegistry.PARTICLE.addStructureConverter(new DataConverter<>(VERSION, 4) {
+ @Override
+ public MapType convert(final Object input, final long sourceVersion, final long toVersion) {
+ if (!(input instanceof String flat)) {
+ return null;
+ }
+
+ return ConverterParticleToNBT.convert(flat, Types.NBT);
+ }
+ });
+
+ MCTypeRegistry.PARTICLE.addStructureWalker(VERSION, 4, (final Object input, final long fromVersion, final long toVersion) -> {
+ if (!(input instanceof MapType)) {
+ return null;
+ }
+
+ final MapType root = (MapType)input;
+
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "item", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, root, "block_state", fromVersion, toVersion);
+
+ return null;
+ });
+
+ // Step 5
+ // Note: needs breakpoint, reads nested tile entity data
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION, 5) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ return ConverterItemStackToDataComponents.convertItem(data);
+ }
+ });
+
+ MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, 5, (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, root, "id", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.DATA_COMPONENTS, root, "components", fromVersion, toVersion);
+
+ return null;
+ });
+
+ // Step 6
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION, 6) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final Object color = data.getGeneric("Color");
+ final Object effects = data.getGeneric("effects");
+ final Object potion = data.getGeneric("Potion");
+
+ if (color == null && effects == null && potion == null) {
+ return null;
+ }
+ data.remove("Color");
+ data.remove("effects");
+ data.remove("Potion");
+
+ final MapType potionContents = data.getTypeUtil().createEmptyMap();
+ data.setMap("potion_contents", potionContents);
+
+ if (color != null) {
+ potionContents.setGeneric("custom_color", color);
+ }
+
+ if (effects != null) {
+ potionContents.setGeneric("custom_effects", effects);
+ }
+
+ if (potion != null) {
+ potionContents.setGeneric("potion", potion);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3818() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3820.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3820.java
new file mode 100644
index 0000000000000000000000000000000000000000..8672d40af44a92516256a97d9912a08a6dcb446c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3820.java
@@ -0,0 +1,81 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterItemStackToDataComponents;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3820 {
+
+ private static final int VERSION = MCVersions.V24W09A + 1;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:skull", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final Object skullOwner = data.getGeneric("SkullOwner");
+ final Object extraType = data.getGeneric("ExtraType");
+
+ if (skullOwner == null && extraType == null) {
+ return null;
+ }
+
+ data.remove("SkullOwner");
+ data.remove("ExtraType");
+
+ data.setMap(
+ "profile",
+ ConverterItemStackToDataComponents.convertProfile(
+ skullOwner == null ? extraType : skullOwner, data.getTypeUtil()
+ )
+ );
+
+ return null;
+ }
+ });
+ // I don't see why this converter is necessary, V3818 should have converted correctly...
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType components = data.getMap("components");
+
+ if (components == null) {
+ return null;
+ }
+
+ final MapType oldTarget = components.getMap("minecraft:lodestone_target");
+ if (oldTarget == null) {
+ return null;
+ }
+
+ components.remove("minecraft:lodestone_target");
+ components.setMap("minecraft:lodestone_tracker", oldTarget);
+
+ final Object pos = oldTarget.getGeneric("pos");
+ final Object dim = oldTarget.getGeneric("dimension");
+
+ if (pos == null || dim == null) {
+ return null;
+ }
+
+ oldTarget.remove("pos");
+ oldTarget.remove("dimension");
+
+ final MapType target = oldTarget.getTypeUtil().createEmptyMap();
+ oldTarget.setMap("target", target);
+
+ target.setGeneric("pos", pos);
+ target.setGeneric("dimension", dim);
+
+ return null;
+ }
+ });
+
+ // Moved from V99 to here, as 21w10a is when custom_name was added
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:skull", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "custom_name"));
+ }
+
+ private V3820() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3825.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3825.java
new file mode 100644
index 0000000000000000000000000000000000000000..547c7fe79f4602aefee5910335b147669acde031
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3825.java
@@ -0,0 +1,153 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class V3825 {
+
+ private static final int VERSION = MCVersions.V24W12A + 1;
+
+ private static final Set<String> BANNER_NAMES = new HashSet<>(
+ Arrays.asList(
+ "block.minecraft.ominous_banner"
+ )
+ );
+ private static final Set<String> MAP_NAMES = new HashSet<>(
+ Arrays.asList(
+ "filled_map.buried_treasure",
+ "filled_map.explorer_jungle",
+ "filled_map.explorer_swamp",
+ "filled_map.mansion",
+ "filled_map.monument",
+ "filled_map.trial_chambers",
+ "filled_map.village_desert",
+ "filled_map.village_plains",
+ "filled_map.village_savanna",
+ "filled_map.village_snowy",
+ "filled_map.village_taiga"
+ )
+ );
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ private static void convertName(final MapType components, final Set<String> standardNames) {
+ final String customName = components.getString("minecraft:custom_name");
+ if (customName == null) {
+ return;
+ }
+
+ final String translation = ComponentUtils.retrieveTranslationString(customName);
+ if (translation == null) {
+ return;
+ }
+
+ if (standardNames.contains(translation)) {
+ components.remove("minecraft:custom_name");
+ components.setString("minecraft:item_name", customName);
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ final String id = data.getString("id");
+ if (id == null) {
+ return null;
+ }
+
+ switch (id) {
+ case "minecraft:white_banner": {
+ convertName(components, BANNER_NAMES);
+ break;
+ }
+ case "minecraft:filled_map": {
+ convertName(components, MAP_NAMES);
+ break;
+ }
+ }
+
+ return null;
+ }
+ });
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String customName = data.getString("CustomName");
+ if (customName == null || !"block.minecraft.ominous_banner".equals(ComponentUtils.retrieveTranslationString(customName))) {
+ return null;
+ }
+
+ data.remove("CustomName");
+
+ final MapType components = data.getOrCreateMap("components");
+
+ components.setString("minecraft:item_name", customName);
+ components.setMap("minecraft:hide_additional_tooltip", components.getTypeUtil().createEmptyMap());
+
+ return null;
+ }
+ });
+ // DFU does not change the schema, even though it moves spawn_potentials
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:trial_spawner", (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType normalConfig = data.getMap("normal_config");
+ if (normalConfig != null) {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, normalConfig, "spawn_potentials", "data", "entity", fromVersion, toVersion);
+ }
+ final MapType ominousConfig = data.getMap("ominous_config");
+ if (ominousConfig != null) {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, ominousConfig, "spawn_potentials", "data", "entity", fromVersion, toVersion);
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("spawn_data"), "entity", fromVersion, toVersion);
+ return null;
+ });
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:trial_spawner", new DataConverter<>(VERSION) {
+ private static final String[] NORMAL_CONFIG_KEYS = new String[] {
+ "spawn_range",
+ "total_mobs",
+ "simultaneous_mobs",
+ "total_mobs_added_per_player",
+ "simultaneous_mobs_added_per_player",
+ "ticks_between_spawn",
+ "spawn_potentials",
+ "loot_tables_to_eject",
+ "items_to_drop_when_ominous"
+ };
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType normalConfig = data.getTypeUtil().createEmptyMap();
+
+ for (final String normalKey : NORMAL_CONFIG_KEYS) {
+ final Object normalValue = data.getGeneric(normalKey);
+ if (normalValue != null) {
+ data.remove(normalKey);
+ normalConfig.setGeneric(normalKey, normalValue);
+ }
+ }
+
+ if (!normalConfig.isEmpty()) {
+ data.setMap("normal_config", normalConfig);
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:ominous_item_spawner", new DataWalkerItems("item"));
+ }
+
+ private V3825() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3828.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3828.java
new file mode 100644
index 0000000000000000000000000000000000000000..084b61402b954f4b29156a08d53b29d6c08fe692
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3828.java
@@ -0,0 +1,37 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+
+public final class V3828 {
+
+ private static final int VERSION = MCVersions.V24W14A + 1;
+
+ public static void register() {
+ MCTypeRegistry.VILLAGER_TRADE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType buyB = data.getMap("buyB");
+
+ if (buyB == null) {
+ return null;
+ }
+
+ final String id = NamespaceUtil.correctNamespace(buyB.getString("id", "minecraft:air"));
+ final int count = buyB.getInt("count", 0);
+
+ // Fix DFU: use count <= 0 instead of count == 0
+ if ("minecraft:air".equals(id) || count <= 0) {
+ data.remove("buyB");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3828() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3833.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3833.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4f0152c8c1b1dacd09b880e5415c2ca05f93956
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3833.java
@@ -0,0 +1,36 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+
+public final class V3833 {
+
+ private static final int VERSION = MCVersions.V1_20_5_PRE4 + 1;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:brushable_block", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType item = data.getMap("item");
+ if (item == null) {
+ return null;
+ }
+
+ final String id = NamespaceUtil.correctNamespace(item.getString("id", "minecraft:air"));
+ final int count = item.getInt("count", 0);
+
+ // Fix DFU: use count <= 0 instead of count == 0
+ if ("minecraft:air".equals(id) || count <= 0) {
+ data.remove("item");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3833() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3938.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3938.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a6d144c2f074403bde8a62377ca6986c0c12a84
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3938.java
@@ -0,0 +1,24 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+
+public final class V3938 {
+
+ private static final int VERSION = MCVersions.V1_20_6 + 99;
+
+ private static void registerArrow(final String id) {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState"));
+ // new: weapon
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItems("item", "weapon"));
+ }
+
+ public static void register() {
+ registerArrow("minecraft:spectral_arrow");
+ registerArrow("minecraft:arrow");
+ }
+
+ private V3938() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3939.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3939.java
new file mode 100644
index 0000000000000000000000000000000000000000..2bcacb82a57bcdca6af699936b22db0ebe925f1b
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3939.java
@@ -0,0 +1,22 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import java.util.Arrays;
+import java.util.HashSet;
+
+public final class V3939 {
+
+ private static final int VERSION = MCVersions.V1_20_6 + 100;
+
+ public static void register() {
+ MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(
+ Arrays.asList(
+ "minecraft:update_1_21"
+ )
+ )));
+ }
+
+ private V3939() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3943.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3943.java
new file mode 100644
index 0000000000000000000000000000000000000000..5bbfb32568d0367422f801a1402409f497959eb8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3943.java
@@ -0,0 +1,34 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V3943 {
+
+ private static final int VERSION = MCVersions.V24W19B + 1;
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String oldRange = data.getString("menuBackgroundBlurriness", "0.5");
+
+ int newRange;
+ try {
+ newRange = (int)Math.round(Double.parseDouble(oldRange) * 10.0);
+ } catch (final NumberFormatException ex) {
+ newRange = 5;
+ }
+
+ // note: options are always string, so DFU is wrong to use int
+ data.setString("menuBackgroundBlurriness", Integer.toString(newRange));
+
+ return null;
+ }
+ });
+ }
+
+ private V3943() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3945.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3945.java
new file mode 100644
index 0000000000000000000000000000000000000000..28f2c6f6562bb5f11c6519a7beae5f86e37541a7
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3945.java
@@ -0,0 +1,244 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
+
+public final class V3945 {
+
+ private static final int VERSION = MCVersions.V24W20A + 1;
+
+ private static final Map<UUID, String> UUID_TO_ID = new HashMap<>(
+ ImmutableMap.<UUID, String>builder()
+ .put(UUID.fromString("736565d2-e1a7-403d-a3f8-1aeb3e302542"), "minecraft:creative_mode_block_range")
+ .put(UUID.fromString("98491ef6-97b1-4584-ae82-71a8cc85cf73"), "minecraft:creative_mode_entity_range")
+ .put(UUID.fromString("91AEAA56-376B-4498-935B-2F7F68070635"), "minecraft:effect.speed")
+ .put(UUID.fromString("7107DE5E-7CE8-4030-940E-514C1F160890"), "minecraft:effect.slowness")
+ .put(UUID.fromString("AF8B6E3F-3328-4C0A-AA36-5BA2BB9DBEF3"), "minecraft:effect.haste")
+ .put(UUID.fromString("55FCED67-E92A-486E-9800-B47F202C4386"), "minecraft:effect.mining_fatigue")
+ .put(UUID.fromString("648D7064-6A60-4F59-8ABE-C2C23A6DD7A9"), "minecraft:effect.strength")
+ .put(UUID.fromString("C0105BF3-AEF8-46B0-9EBC-92943757CCBE"), "minecraft:effect.jump_boost")
+ .put(UUID.fromString("22653B89-116E-49DC-9B6B-9971489B5BE5"), "minecraft:effect.weakness")
+ .put(UUID.fromString("5D6F0BA2-1186-46AC-B896-C61C5CEE99CC"), "minecraft:effect.health_boost")
+ .put(UUID.fromString("EAE29CF0-701E-4ED6-883A-96F798F3DAB5"), "minecraft:effect.absorption")
+ .put(UUID.fromString("03C3C89D-7037-4B42-869F-B146BCB64D2E"), "minecraft:effect.luck")
+ .put(UUID.fromString("CC5AF142-2BD2-4215-B636-2605AED11727"), "minecraft:effect.unluck")
+ .put(UUID.fromString("6555be74-63b3-41f1-a245-77833b3c2562"), "minecraft:evil")
+ .put(UUID.fromString("1eaf83ff-7207-4596-b37a-d7a07b3ec4ce"), "minecraft:powder_snow")
+ .put(UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D"), "minecraft:sprinting")
+ .put(UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0"), "minecraft:attacking")
+ .put(UUID.fromString("766bfa64-11f3-11ea-8d71-362b9e155667"), "minecraft:baby")
+ .put(UUID.fromString("7E0292F2-9434-48D5-A29F-9583AF7DF27F"), "minecraft:covered")
+ .put(UUID.fromString("9e362924-01de-4ddd-a2b2-d0f7a405a174"), "minecraft:suffocating")
+ .put(UUID.fromString("5CD17E52-A79A-43D3-A529-90FDE04B181E"), "minecraft:drinking")
+ .put(UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836"), "minecraft:baby")
+ .put(UUID.fromString("49455A49-7EC5-45BA-B886-3B90B23A1718"), "minecraft:attacking")
+ .put(UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), "minecraft:armor.boots")
+ .put(UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), "minecraft:armor.leggings")
+ .put(UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), "minecraft:armor.chestplate")
+ .put(UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150"), "minecraft:armor.helmet")
+ .put(UUID.fromString("C1C72771-8B8E-BA4A-ACE0-81A93C8928B2"), "minecraft:armor.body")
+ .put(UUID.fromString("b572ecd2-ac0c-4071-abde-9594af072a37"), "minecraft:enchantment.fire_protection")
+ .put(UUID.fromString("40a9968f-5c66-4e2f-b7f4-2ec2f4b3e450"), "minecraft:enchantment.blast_protection")
+ .put(UUID.fromString("07a65791-f64d-4e79-86c7-f83932f007ec"), "minecraft:enchantment.respiration")
+ .put(UUID.fromString("60b1b7db-fffd-4ad0-817c-d6c6a93d8a45"), "minecraft:enchantment.aqua_affinity")
+ .put(UUID.fromString("11dc269a-4476-46c0-aff3-9e17d7eb6801"), "minecraft:enchantment.depth_strider")
+ .put(UUID.fromString("87f46a96-686f-4796-b035-22e16ee9e038"), "minecraft:enchantment.soul_speed")
+ .put(UUID.fromString("b9716dbd-50df-4080-850e-70347d24e687"), "minecraft:enchantment.soul_speed")
+ .put(UUID.fromString("92437d00-c3a7-4f2e-8f6c-1f21585d5dd0"), "minecraft:enchantment.swift_sneak")
+ .put(UUID.fromString("5d3d087b-debe-4037-b53e-d84f3ff51f17"), "minecraft:enchantment.sweeping_edge")
+ .put(UUID.fromString("3ceb37c0-db62-46b5-bd02-785457b01d96"), "minecraft:enchantment.efficiency")
+ .put(UUID.fromString("CB3F55D3-645C-4F38-A497-9C13A33DB5CF"), "minecraft:base_attack_damage")
+ .put(UUID.fromString("FA233E1C-4180-4865-B01B-BCCE9785ACA3"), "minecraft:base_attack_speed")
+ .build()
+ );
+ private static final Map<String, String> NAME_TO_ID = new HashMap<>(
+ Map.of(
+ "Random spawn bonus", "minecraft:random_spawn_bonus",
+ "Random zombie-spawn bonus", "minecraft:zombie_random_spawn_bonus",
+ "Leader zombie bonus", "minecraft:leader_zombie_bonus",
+ "Zombie reinforcement callee charge", "minecraft:reinforcement_callee_charge",
+ "Zombie reinforcement caller charge", "minecraft:reinforcement_caller_charge"
+ )
+ );
+
+ private static UUID makeUUID(final int[] arr) {
+ if (arr == null || arr.length != 4) {
+ return null;
+ }
+
+ final long most = ((long)arr[0] << 32) | ((long)arr[1] & 0xFFFFFFFFL);
+ final long least = ((long)arr[2] << 32) | ((long)arr[3] & 0xFFFFFFFFL);
+
+ return new UUID(most, least);
+ }
+
+ private static ListType remapModifiers(final ListType list) {
+ final Map<String, MapType> ret = new LinkedHashMap<>();
+
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType modifier = list.<String>getMap(i).copy();
+
+ final UUID uuid = makeUUID(modifier.getInts("uuid"));
+ final String name = modifier.getString("name", "");
+
+ final String remappedUUID = UUID_TO_ID.get(uuid);
+ final String remappedName = NAME_TO_ID.get(name);
+
+ if (remappedUUID != null) {
+ modifier.remove("uuid");
+ modifier.remove("name");
+
+ modifier.setString("id", remappedUUID);
+
+ ret.put(remappedUUID, modifier);
+ } else if (remappedName != null) {
+ final MapType existing = ret.get(remappedName);
+ if (existing != null) {
+ existing.setDouble("amount",
+ existing.getDouble("amount", 0.0) + modifier.getDouble("amount", 0.0)
+ );
+ } else {
+ modifier.remove("uuid");
+ modifier.remove("name");
+
+ modifier.setString("id", remappedName);
+
+ ret.put(remappedName, modifier);
+ }
+ } else {
+ final String id = "minecraft:" + (uuid == null ? "unknown" : uuid.toString().toLowerCase(Locale.ROOT));
+
+ modifier.setString("id", id);
+
+ ret.put(id, modifier);
+ }
+ }
+
+ final ListType retList = list.getTypeUtil().createEmptyList();
+
+ for (final MapType modifier : ret.values()) {
+ retList.addMap(modifier);
+ }
+
+ return retList;
+ }
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ final MapType attributeModifiers = components.getMap("minecraft:attribute_modifiers");
+ if (attributeModifiers == null) {
+ return null;
+ }
+
+ final ListType modifiers = attributeModifiers.getList("modifiers", ObjectType.MAP);
+ if (modifiers == null) {
+ return null;
+ }
+
+ attributeModifiers.setList("modifiers", remapModifiers(modifiers));
+
+ return null;
+ }
+ });
+
+ final DataConverter<MapType, MapType> entityConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "Attributes", "attributes");
+
+ final ListType attributes = data.getList("attributes", ObjectType.MAP);
+ if (attributes == null) {
+ return null;
+ }
+
+ for (int i = 0, len = attributes.size(); i < len; ++i) {
+ final MapType attribute = attributes.getMap(i);
+
+ RenameHelper.renameSingle(attribute, "Name", "id");
+ RenameHelper.renameSingle(attribute, "Base", "base");
+ RenameHelper.renameSingle(attribute, "Modifiers", "modifiers");
+
+ final ListType modifiers = attribute.getList("modifiers", ObjectType.MAP);
+
+ if (modifiers == null) {
+ continue;
+ }
+
+ for (int j = 0, len2 = modifiers.size(); j < len2; ++j) {
+ final MapType modifier = modifiers.getMap(j);
+
+ RenameHelper.renameSingle(modifier, "UUID", "uuid");
+ RenameHelper.renameSingle(modifier, "Name", "name");
+ RenameHelper.renameSingle(modifier, "Amount", "amount");
+ final String newOp;
+ switch (modifier.getInt("Operation", 0)) {
+ case 0: {
+ newOp = "add_value";
+ break;
+ }
+ case 1: {
+ newOp = "add_multiplied_base";
+ break;
+ }
+ case 2: {
+ newOp = "add_multiplied_total";
+ break;
+ }
+ default: {
+ newOp = "invalid";
+ break;
+ }
+ }
+ modifier.remove("Operation");
+ modifier.setString("operation", newOp);
+ }
+
+ attribute.setList("modifiers", remapModifiers(modifiers));
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addStructureConverter(entityConverter);
+ MCTypeRegistry.PLAYER.addStructureConverter(entityConverter);
+
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:jukebox", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final long playingFor = data.getLong("TickCount") - data.getLong("RecordStartTick");
+
+ data.remove("IsPlaying");
+ data.remove("TickCount");
+ data.remove("RecordStartTick");
+
+ if (playingFor > 0L) {
+ data.setLong("ticks_since_song_started", playingFor);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3945() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4054.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4054.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a76415944b6ad8b98f917acd3c7157e9fccdd5f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4054.java
@@ -0,0 +1,46 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4054 {
+
+ private static final int VERSION = MCVersions.V1_21_1 + 99;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertComponents(data.getMap("components"));
+ return null;
+ }
+ });
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:white_banner", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertComponents(data.getMap("components"));
+ return null;
+ }
+ });
+ }
+
+ private static void convertComponents(final MapType components) {
+ if (components == null) {
+ return;
+ }
+
+ final String itemNameKey = ComponentUtils.retrieveTranslationString(components.getString("minecraft:item_name"));
+
+ if (!"block.minecraft.ominous_banner".equals(itemNameKey)) {
+ return;
+ }
+
+ components.setString("minecraft:rarity", "uncommon");
+ components.setString("minecraft:item_name", ComponentUtils.createTranslatableComponent("block.minecraft.ominous_banner"));
+ }
+
+ private V4054() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4055.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4055.java
new file mode 100644
index 0000000000000000000000000000000000000000..45b141a651d954554fcca68f36c0b3344328d902
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4055.java
@@ -0,0 +1,41 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.attributes.ConverterAbstractAttributesRename;
+import ca.spottedleaf.dataconverter.util.NamespaceUtil;
+
+public final class V4055 {
+
+ private static final int VERSION = MCVersions.V1_21_1 + 100;
+
+ private static final Prefix[] PREFIXES_TO_REMOVE = new Prefix[] {
+ new Prefix("generic."),
+ new Prefix("horse."),
+ new Prefix("player."),
+ new Prefix("zombie.")
+ };
+
+ private static record Prefix(String raw, String namespaced) {
+ public Prefix(final String raw) {
+ this(raw, NamespaceUtil.correctNamespace(raw));
+ }
+ }
+
+ public static void register() {
+ ConverterAbstractAttributesRename.register(VERSION, (final String input) -> {
+ final String namespacedInput = NamespaceUtil.correctNamespace(input);
+
+ for (final Prefix prefix : PREFIXES_TO_REMOVE) {
+ if (!namespacedInput.startsWith(prefix.namespaced())) {
+ continue;
+ }
+
+ return "minecraft:".concat(namespacedInput.substring(prefix.namespaced().length()));
+ }
+
+ return null;
+ });
+ }
+
+ private V4055() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4057.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4057.java
new file mode 100644
index 0000000000000000000000000000000000000000..4165efcb182a52d4f1d52f25e684ab8f36cf4c79
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4057.java
@@ -0,0 +1,33 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4057 {
+
+ private static final int VERSION = MCVersions.V1_21_1 + 102;
+
+ public static void register() {
+ MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType carvingMasks = data.getMap("CarvingMasks");
+ if (carvingMasks == null) {
+ return null;
+ }
+ data.remove("CarvingMasks");
+
+ final long[] airMask = carvingMasks.getLongs("AIR");
+ if (airMask != null) {
+ data.setLongs("carving_mask", airMask);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4057() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4a1bb8aa512203d28fb683d204762f322862921
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java
@@ -0,0 +1,164 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+
+public final class V4059 {
+
+ private static final int VERSION = MCVersions.V24W33A + 1;
+
+ public static void register() {
+ // previous version: 3818.3
+ // next version: 4307
+ MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, new DataWalker<>() {
+ private static void walkBlockPredicates(final MapType root, final long fromVersion, final long toVersion) {
+ if (root.hasKey("blocks", ObjectType.STRING)) {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion);
+ } else if (root.hasKey("blocks", ObjectType.LIST)) {
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion);
+ }
+ }
+
+ @Override
+ public MapType walk(final MapType root, final long fromVersion, final long toVersion) {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "minecraft:bees", "entity_data", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.TILE_ENTITY, root, "minecraft:block_entity_data", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:bundle_contents", fromVersion, toVersion);
+
+ final MapType canBreak = root.getMap("minecraft:can_break");
+ if (canBreak != null) {
+ final ListType predicates = canBreak.getList("predicates", ObjectType.MAP);
+ if (predicates != null) {
+ for (int i = 0, len = predicates.size(); i < len; ++i) {
+ walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion);
+ }
+ }
+ // Not handled by DFU: simple encoding does not require "predicates"
+ walkBlockPredicates(canBreak, fromVersion, toVersion);
+ }
+
+ final MapType canPlaceOn = root.getMap("minecraft:can_place_on");
+ if (canPlaceOn != null) {
+ final ListType predicates = canPlaceOn.getList("predicates", ObjectType.MAP);
+ if (predicates != null) {
+ for (int i = 0, len = predicates.size(); i < len; ++i) {
+ walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion);
+ }
+ }
+ // Not handled by DFU: simple encoding does not require "predicates"
+ walkBlockPredicates(canPlaceOn, fromVersion, toVersion);
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:charged_projectiles", fromVersion, toVersion);
+ WalkerUtils.convertListPath(MCTypeRegistry.ITEM_STACK, root, "minecraft:container", "item", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, root, "minecraft:entity_data", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_NAME, root, "minecraft:pot_decorations", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "minecraft:use_remainder", fromVersion, toVersion);
+
+ final MapType equippable = root.getMap("minecraft:equippable");
+ if (equippable != null) {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, equippable, "allowed_entities", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY_NAME, equippable, "allowed_entities", fromVersion, toVersion);
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:custom_name", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:item_name", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:lore", fromVersion, toVersion);
+
+ final MapType writtenBookContent = root.getMap("minecraft:written_book_content");
+ if (writtenBookContent != null) {
+ final ListType pages = writtenBookContent.getListUnchecked("pages");
+ // This logic needs to correctly handle both the NBT format of TEXT_COMPONENT and the JSON format.
+ if (pages != null) {
+ for (int i = 0, len = pages.size(); i < len; ++i) {
+ final Object pageGeneric = pages.getGeneric(i);
+ final boolean isNBTFormat = fromVersion >= DataConverter.encodeVersions(V4290.VERSION, 0);
+ // Note: We only parse ListType for 4290 and above as only a String was valid JSON. List of anything was not valid.
+ if (pageGeneric instanceof String || (isNBTFormat && pageGeneric instanceof ListType)) { // handles: String case (JSON/NBT), ListType case (NBT)
+ final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(pageGeneric, fromVersion, toVersion);
+ if (convertedGeneric != null) {
+ pages.setGeneric(i, convertedGeneric);
+ }
+ } else if (pageGeneric instanceof MapType mapType) {
+ // Need to handle: Filterable format and regular NBT Component format are both MapType...
+ if (mapType.hasKey("raw") || mapType.hasKey("filtered")) {
+ // Assume filterable format
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "raw", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "filtered", fromVersion, toVersion);
+ } else if (isNBTFormat) {
+ final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(mapType, fromVersion, toVersion);
+ if (convertedGeneric != null) {
+ pages.setGeneric(i, convertedGeneric);
+ }
+ } // else: invalid data
+ } // else: invalid data
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType food = data.getMap("minecraft:food");
+ if (food == null) {
+ return null;
+ }
+
+ final TypeUtil<?> typeUtil = data.getTypeUtil();
+
+ final float eatSeconds = food.getFloat("eat_seconds", 1.6F);
+
+ final ListType oldEffects = food.getList("effects", ObjectType.MAP);
+ final ListType newEffects = typeUtil.createEmptyList();
+ if (oldEffects != null) {
+ for (int i = 0, len = oldEffects.size(); i < len; ++i) {
+ final MapType oldEffect = oldEffects.getMap(i);
+
+ final MapType newEffect = typeUtil.createEmptyMap();
+ newEffects.addMap(newEffect);
+
+ newEffect.setString("type", "minecraft:apply_effects");
+
+ final Object oldEffectEffect = oldEffect.getGeneric("effect");
+ final ListType newEffectEffects = typeUtil.createEmptyList();
+ newEffectEffects.addGeneric(oldEffectEffect);
+ newEffect.setList("effects", newEffectEffects);
+
+ newEffect.setFloat("probability", oldEffect.getFloat("probability", 1.0F));
+ }
+ }
+
+ final Object convertsTo = food.getGeneric("using_converts_to");
+ if (convertsTo != null) {
+ data.setGeneric("minecraft:use_remainder", convertsTo);
+ }
+
+ food.remove("eat_seconds");
+ food.remove("effects");
+ food.remove("using_converts_to");
+
+ final MapType consumable = typeUtil.createEmptyMap();
+ data.setMap("minecraft:consumable", consumable);
+
+ consumable.setFloat("consume_seconds", eatSeconds);
+ consumable.setList("on_consume_effects", newEffects);
+
+ return null;
+ }
+ });
+ }
+
+ private V4059() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4061.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4061.java
new file mode 100644
index 0000000000000000000000000000000000000000..b092188f5e4f0fa3224fac3cd36f5c1ee6a7f0a4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4061.java
@@ -0,0 +1,112 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.nbt.NBTMapType;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.datafixers.util.Pair;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.TagParser;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V4061 {
+
+ private static final int VERSION = MCVersions.V24W34A + 1;
+
+ private static final Map<Pair<MapType, MapType>, String> CONVERT_MAP = new HashMap<>();
+ static {
+ addConversion("trial_chamber/breeze", "{simultaneous_mobs: 1.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:breeze\"}}, weight: 1}], ticks_between_spawn: 20, total_mobs: 2.0f, total_mobs_added_per_player: 1.0f}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], simultaneous_mobs: 2.0f, total_mobs: 4.0f}");
+ addConversion("trial_chamber/melee/husk", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:husk\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:husk\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_melee\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/melee/spider", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:spider\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}],simultaneous_mobs: 4.0f, total_mobs: 12.0f}");
+ addConversion("trial_chamber/melee/zombie", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:zombie\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}],spawn_potentials: [{data: {entity: {id: \"minecraft:zombie\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_melee\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/ranged/poison_skeleton", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:bogged\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}],spawn_potentials: [{data: {entity: {id: \"minecraft:bogged\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/ranged/skeleton", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:skeleton\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:skeleton\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/ranged/stray", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:stray\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:stray\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/slow_ranged/poison_skeleton", "{simultaneous_mobs: 4.0f, simultaneous_mobs_added_per_player: 2.0f, spawn_potentials: [{data: {entity: {id: \"minecraft:bogged\"}}, weight: 1}], ticks_between_spawn: 160}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:bogged\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/slow_ranged/skeleton", "{simultaneous_mobs: 4.0f, simultaneous_mobs_added_per_player: 2.0f, spawn_potentials: [{data: {entity: {id: \"minecraft:skeleton\"}}, weight: 1}], ticks_between_spawn: 160}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:skeleton\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/slow_ranged/stray", "{simultaneous_mobs: 4.0f, simultaneous_mobs_added_per_player: 2.0f, spawn_potentials: [{data: {entity: {id: \"minecraft:stray\"}}, weight: 1}], ticks_between_spawn: 160}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}],spawn_potentials: [{data: {entity: {id: \"minecraft:stray\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/small_melee/baby_zombie", "{simultaneous_mobs: 2.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {IsBaby: 1b, id: \"minecraft:zombie\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {IsBaby: 1b, id: \"minecraft:zombie\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_melee\", slot_drop_chances: 0.0f}}, weight: 1}]}");
+ addConversion("trial_chamber/small_melee/cave_spider", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:cave_spider\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], simultaneous_mobs: 4.0f, total_mobs: 12.0f}");
+ addConversion("trial_chamber/small_melee/silverfish", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:silverfish\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], simultaneous_mobs: 4.0f, total_mobs: 12.0f}");
+ addConversion("trial_chamber/small_melee/slime", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {Size: 1, id: \"minecraft:slime\"}}, weight: 3}, {data: {entity: {Size: 2, id: \"minecraft:slime\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], simultaneous_mobs: 4.0f, total_mobs: 12.0f}");
+ }
+
+ private static void addConversion(final String keyPath, final String normalsNBT, final String ominoussNBT) {
+ final String fullKey = "minecraft:".concat(keyPath);
+
+ final CompoundTag normalNBT = parseNBT(normalsNBT);
+ final MapType normalMapType = new NBTMapType(normalNBT);
+ final CompoundTag ominousNBT = parseNBT(ominoussNBT);
+
+ final CompoundTag ominousMerged = normalNBT.copy().merge(ominousNBT);
+
+ CONVERT_MAP.put(Pair.of(normalMapType, new NBTMapType(ominousNBT)), fullKey);
+ CONVERT_MAP.put(Pair.of(normalMapType, new NBTMapType(ominousMerged)), fullKey);
+ CONVERT_MAP.put(Pair.of(normalMapType, new NBTMapType(removeDefaults(ominousMerged.copy()))), fullKey);
+ }
+
+ private static CompoundTag parseNBT(final String sNBT) {
+ try {
+ return TagParser.parseCompoundFully(sNBT);
+ } catch (final CommandSyntaxException ex) {
+ throw new IllegalArgumentException("Failed to parse NBT: " + sNBT, ex);
+ }
+ }
+
+ private static CompoundTag removeDefaults(final CompoundTag config) {
+ if (config.getIntOr("spawn_range", 0) == 4) {
+ config.remove("spawn_range");
+ }
+
+ if (config.getFloatOr("total_mobs", 0.0F) == 6.0F) {
+ config.remove("total_mobs");
+ }
+
+ if (config.getFloatOr("simultaneous_mobs", 0.0F) == 2.0F) {
+ config.remove("simultaneous_mobs");
+ }
+
+ if (config.getFloatOr("total_mobs_added_per_player", 0.0F) == 2.0F) {
+ config.remove("total_mobs_added_per_player");
+ }
+
+ if (config.getFloatOr("simultaneous_mobs_added_per_player", 0.0F) == 1.0F) {
+ config.remove("simultaneous_mobs_added_per_player");
+ }
+
+ if (config.getIntOr("ticks_between_spawn", 0) == 40) {
+ config.remove("ticks_between_spawn");
+ }
+
+ return config;
+ }
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:trial_spawner", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType normalConfig = data.getMap("normal_config");
+ final MapType ominousConfig = data.getMap("ominous_config");
+
+ if (normalConfig == null || ominousConfig == null) {
+ return null;
+ }
+
+ final String newKey = CONVERT_MAP.get(new Pair<>(normalConfig, ominousConfig));
+ if (newKey == null) {
+ return null;
+ }
+
+ data.setString("normal_config", newKey.concat("/normal"));
+ data.setString("ominous_config", newKey.concat("/ominous"));
+
+ return null;
+ }
+ });
+ }
+
+ private V4061() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4064.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4064.java
new file mode 100644
index 0000000000000000000000000000000000000000..a3bde5f57589d8ec3f1b1d1332ec8a1780bd1f47
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4064.java
@@ -0,0 +1,36 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4064 {
+
+ private static final int VERSION = MCVersions.V24W36A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ if (components.hasKey("minecraft:fire_resistant")) {
+ components.remove("minecraft:fire_resistant");
+
+ final MapType damageResistant = components.getTypeUtil().createEmptyMap();
+ components.setMap("minecraft:damage_resistant", damageResistant);
+
+ damageResistant.setString("types", "#minecraft:is_fire");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4064() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4067.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4067.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f3d0dc9353444a3826d77272f974a3362e845e1
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4067.java
@@ -0,0 +1,143 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+public final class V4067 {
+
+ private static final int VERSION = MCVersions.V24W38A + 1;
+
+ private static final record BoatType(String name, String suffix) {}
+ private static final BoatType[] BOAT_TYPES = new BoatType[] {
+ new BoatType("oak", "boat"),
+ new BoatType("spruce", "boat"),
+ new BoatType("birch", "boat"),
+ new BoatType("jungle", "boat"),
+ new BoatType("acacia", "boat"),
+ new BoatType("cherry", "boat"),
+ new BoatType("dark_oak", "boat"),
+ new BoatType("mangrove", "boat"),
+ new BoatType("bamboo", "raft")
+ };
+
+ private static void registerChestBoat(final String id) {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItemLists("Items"));
+ }
+
+ public static void register() {
+ // minecraft:oak_boat is a simple entity
+ // minecraft:spruce_boat is a simple entity
+ // minecraft:birch_boat is a simple entity
+ // minecraft:jungle_boat is a simple entity
+ // minecraft:acacia_boat is a simple entity
+ // minecraft:cherry_boat is a simple entity
+ // minecraft:dark_oak_boat is a simple entity
+ // minecraft:mangrove_boat is a simple entity
+ // minecraft:bamboo_raft is a simple entity
+
+ registerChestBoat("minecraft:oak_chest_boat");
+ registerChestBoat("minecraft:spruce_chest_boat");
+ registerChestBoat("minecraft:birch_chest_boat");
+ registerChestBoat("minecraft:jungle_chest_boat");
+ registerChestBoat("minecraft:acacia_chest_boat");
+ registerChestBoat("minecraft:cherry_chest_boat");
+ registerChestBoat("minecraft:dark_oak_chest_boat");
+ registerChestBoat("minecraft:mangrove_chest_boat");
+ registerChestBoat("minecraft:bamboo_chest_raft");
+
+ // we do not update V704 to set the new boat types, as the new ids are only registered here
+ // if we updated V704 to set the new boat types, then the registered walkers for the chest_boat would not run before
+ // V4067 as they are only registered here
+
+ // to ensure that the id is correctly set eventually, we will force Type to the correct value based on the item id
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final Map<String, String> BOAT_TYPES_BY_ITEM_ID = new HashMap<>();
+ static {
+ for (final BoatType boatType : BOAT_TYPES) {
+ BOAT_TYPES_BY_ITEM_ID.put(boatType.name() + "_" + boatType.suffix(), boatType.name());
+ BOAT_TYPES_BY_ITEM_ID.put(boatType.name() + "_chest_" + boatType.suffix(), boatType.name());
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+ final String boatType = BOAT_TYPES_BY_ITEM_ID.get(id);
+
+ if (boatType == null) {
+ return null;
+ }
+
+ final MapType components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ final MapType entityData = components.getMap("minecraft:entity_data");
+ if (entityData == null) {
+ return null;
+ }
+
+ entityData.setString("Type", boatType);
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final Map<String, String> NORMAL_REMAPPING = new HashMap<>(BOAT_TYPES.length);
+ static {
+ for (final BoatType type : BOAT_TYPES) {
+ NORMAL_REMAPPING.put(type.name(), type.name() + "_" + type.suffix());
+ }
+ }
+ private static final Map<String, String> CHEST_REMAPPING = new HashMap<>(BOAT_TYPES.length);
+ static {
+ for (final BoatType type : BOAT_TYPES) {
+ CHEST_REMAPPING.put(type.name(), type.name() + "_chest_" + type.suffix());
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+ if (id == null) {
+ // wat
+ return null;
+ }
+
+ final boolean normalBoat = id.equals("minecraft:boat");
+ final boolean chestBoat = id.equals("minecraft:chest_boat");
+
+ if (!normalBoat && !chestBoat) {
+ return null;
+ }
+
+ final String type = data.getString("Type");
+ data.remove("Type");
+
+ if (normalBoat) {
+ data.setString("id", NORMAL_REMAPPING.getOrDefault(type, "minecraft:oak_boat"));
+ } else {
+ data.setString("id", CHEST_REMAPPING.getOrDefault(type, "minecraft:oak_chest_boat"));
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(
+ new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(Arrays.asList("minecraft:bundle")))
+ );
+ }
+
+ private V4067() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4068.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4068.java
new file mode 100644
index 0000000000000000000000000000000000000000..d24c33863e66010f4a6394a9afcc8ad7600969de
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4068.java
@@ -0,0 +1,65 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import com.google.common.escape.Escaper;
+import com.google.common.escape.Escapers;
+
+public final class V4068 {
+ public static final Escaper ESCAPER = Escapers.builder().addEscape('"', "\\\"").addEscape('\\', "\\\\").build();
+
+ private static final int VERSION = MCVersions.V24W38A + 2;
+
+ private static void convertLock(final MapType root, final String srcPath, final String dstPath) {
+ if (root == null) {
+ return;
+ }
+
+ final Object lockGeneric = root.getGeneric(srcPath);
+ if (lockGeneric == null) {
+ return;
+ }
+
+ final TypeUtil<?> typeUtil = root.getTypeUtil();
+
+ root.remove(srcPath);
+
+ if (lockGeneric instanceof String lock && !lock.isEmpty()) {
+ final MapType newLock = typeUtil.createEmptyMap();
+ root.setMap(dstPath, newLock);
+
+ final MapType lockComponents = typeUtil.createEmptyMap();
+ newLock.setMap("components", lockComponents);
+
+ lockComponents.setString("minecraft:custom_name", ESCAPER.escape(lock));
+ }
+ }
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ convertLock(components, "minecraft:lock", "minecraft:lock");
+
+ return null;
+ }
+ });
+ MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ convertLock(data, "Lock", "lock");
+ return null;
+ }
+ });
+ }
+
+ private V4068() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4070.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4070.java
new file mode 100644
index 0000000000000000000000000000000000000000..b85673d792d4b1c317d312ba607a0d30c2f57ea9
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4070.java
@@ -0,0 +1,22 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+
+public final class V4070 {
+
+ private static final int VERSION = MCVersions.V24W39A + 1;
+
+ private static void registerChestBoat(final String id) {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItemLists("Items"));
+ }
+
+ public static void register() {
+ // minecraft:pale_oak_boat is a simple entity
+
+ registerChestBoat("minecraft:pale_oak_chest_boat");
+ }
+
+ private V4070() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java
new file mode 100644
index 0000000000000000000000000000000000000000..d00e834ebb7ebdd544f4934375a5a8ba1882d89e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java
@@ -0,0 +1,17 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V4071 {
+
+ private static final int VERSION = MCVersions.V24W39A + 2;
+
+ public static void register() {
+ //registerMob("minecraft:creaking"); // changed to simple in 1.21.5
+ //registerMob("minecraft:creaking_transient"); // changed to simple in 1.21.5
+
+ // minecraft:creaking_heart is a simple tile entity
+ }
+
+ private V4071() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4081.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4081.java
new file mode 100644
index 0000000000000000000000000000000000000000..214dd539edabc44ada373012b1256747ca373e92
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4081.java
@@ -0,0 +1,27 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4081 {
+
+ private static final int VERSION = MCVersions.V1_21_2 + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:salmon", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if ("large".equals(data.getString("type"))) {
+ return null;
+ }
+
+ data.setString("type", "medium");
+ return null;
+ }
+ });
+ }
+
+ private V4081() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4173.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4173.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9cff7ce434ca60196c25c44cd98e28dc5b9d151
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4173.java
@@ -0,0 +1,24 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4173 {
+
+ private static final int VERSION = MCVersions.V1_21_3 + 91;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "TNTFuse", "fuse");
+ return null;
+ }
+ });
+ }
+
+ private V4173() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4175.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4175.java
new file mode 100644
index 0000000000000000000000000000000000000000..5812c07643dc21d0db4ebe808ffda0612454c00f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4175.java
@@ -0,0 +1,40 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+
+public final class V4175 {
+
+ private static final int VERSION = MCVersions.V24W44A + 1;
+
+ public static void register() {
+ MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data.getMap("minecraft:equippable"), "model", "asset_id");
+
+ final Number modelData = data.getNumber("minecraft:custom_model_data");
+ if (modelData != null) {
+ final TypeUtil<?> typeUtil = data.getTypeUtil();
+
+ final MapType newModelData = typeUtil.createEmptyMap();
+ data.setMap("minecraft:custom_model_data", newModelData);
+
+ final ListType floats = typeUtil.createEmptyList();
+ newModelData.setList("floats", floats);
+
+ floats.addFloat(modelData.floatValue());
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4175() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4176.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4176.java
new file mode 100644
index 0000000000000000000000000000000000000000..c60f6da5422cc31a92164b5bc62f2afb8e962b00
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4176.java
@@ -0,0 +1,44 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4176 {
+
+ private static final int VERSION = MCVersions.V24W44A + 2;
+
+ private static void fixInvalidLock(final MapType root, final String path) {
+ final MapType lock = root.getMap(path);
+ if (lock == null || lock.size() != 1) {
+ return;
+ }
+
+ final MapType components = lock.getMap("components");
+ if (components == null || components.size() != 1 || !"\"\"".equals(components.getString("minecraft:custom_name"))) {
+ return;
+ }
+
+ root.remove(path);
+ }
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ fixInvalidLock(data, "lock");
+ return null;
+ }
+ });
+ MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ fixInvalidLock(data, "minecraft:lock");
+ return null;
+ }
+ });
+ }
+
+ private V4176() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4180.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4180.java
new file mode 100644
index 0000000000000000000000000000000000000000..76eeb8739d9c517a7843545f230853d214ecb8b2
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4180.java
@@ -0,0 +1,22 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import java.util.Arrays;
+import java.util.HashSet;
+
+public final class V4180 {
+
+ private static final int VERSION = MCVersions.V1_21_4_PRE1 + 1;
+
+ public static void register() {
+ MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(
+ Arrays.asList(
+ "minecraft:winter_drop"
+ )
+ )));
+ }
+
+ private V4180() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4181.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4181.java
new file mode 100644
index 0000000000000000000000000000000000000000..8533e5924f5d5542692f511c11487c05bf61f486
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4181.java
@@ -0,0 +1,36 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4181 {
+
+ private static final int VERSION = MCVersions.V1_21_4_PRE1 + 2;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> furnaceConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "CookTime", "cooking_time_spent");
+ RenameHelper.renameSingle(data, "CookTimeTotal", "cooking_total_time");
+ RenameHelper.renameSingle(data, "BurnTime", "lit_time_remaining");
+
+ final Object litTotalTime = data.getGeneric("lit_time_remaining");
+ if (litTotalTime != null) {
+ data.setGeneric("lit_total_time", litTotalTime);
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:furnace", furnaceConverter);
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:smoker", furnaceConverter);
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:blast_furnace", furnaceConverter);
+ }
+
+ private V4181() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4185.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4185.java
new file mode 100644
index 0000000000000000000000000000000000000000..8b4041d3d3a4a001bf06eaedbddad1b297122b12
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4185.java
@@ -0,0 +1,17 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterAddBlendingData;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V4185 {
+
+ private static final int VERSION = MCVersions.V1_21_4_RC1 + 1;
+
+ public static void register() {
+ // See V3088 for why this converter is duplicated in here, V3441, and V3088
+ MCTypeRegistry.CHUNK.addStructureConverter(new ConverterAddBlendingData(VERSION));
+ }
+
+ private V4185() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4187.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4187.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d09c4218d0db8119d1681bf95900be830557fa3
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4187.java
@@ -0,0 +1,69 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.attributes.ConverterEntityAttributesBaseValueUpdater;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V4187 {
+
+ private static final int VERSION = MCVersions.V1_21_4_RC2 + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId(
+ "minecraft:villager",
+ new ConverterEntityAttributesBaseValueUpdater(
+ VERSION, "minecraft:follow_range",
+ (final double curr) -> {
+ return curr == 48.0 ? 16.0 : curr;
+ }
+ )
+ );
+ MCTypeRegistry.ENTITY.addConverterForId(
+ "minecraft:bee",
+ new ConverterEntityAttributesBaseValueUpdater(
+ VERSION, "minecraft:follow_range",
+ (final double curr) -> {
+ return curr == 48.0 ? 16.0 : curr;
+ }
+ )
+ );
+ MCTypeRegistry.ENTITY.addConverterForId(
+ "minecraft:allay",
+ new ConverterEntityAttributesBaseValueUpdater(
+ VERSION, "minecraft:follow_range",
+ (final double curr) -> {
+ return curr == 48.0 ? 16.0 : curr;
+ }
+ )
+ );
+ MCTypeRegistry.ENTITY.addConverterForId(
+ "minecraft:llama",
+ new ConverterEntityAttributesBaseValueUpdater(
+ VERSION, "minecraft:follow_range",
+ (final double curr) -> {
+ return curr == 48.0 ? 16.0 : curr;
+ }
+ )
+ );
+ MCTypeRegistry.ENTITY.addConverterForId(
+ "minecraft:piglin_brute",
+ new ConverterEntityAttributesBaseValueUpdater(
+ VERSION, "minecraft:follow_range",
+ (final double curr) -> {
+ return curr == 16.0 ? 12.0 : curr;
+ }
+ )
+ );
+ MCTypeRegistry.ENTITY.addConverterForId(
+ "minecraft:warden",
+ new ConverterEntityAttributesBaseValueUpdater(
+ VERSION, "minecraft:follow_range",
+ (final double curr) -> {
+ return curr == 16.0 ? 24.0 : curr;
+ }
+ )
+ );
+ }
+
+ private V4187() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java
new file mode 100644
index 0000000000000000000000000000000000000000..d5dfa9a64e2d3f9a37a5bdde60b92ed93bd89aed
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java
@@ -0,0 +1,312 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import ca.spottedleaf.dataconverter.types.Types;
+import ca.spottedleaf.dataconverter.types.nbt.NBTMapType;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
+import com.mojang.logging.LogUtils;
+import net.minecraft.nbt.TagParser;
+import org.slf4j.Logger;
+
+public final class V4290 {
+
+ public static final int VERSION = MCVersions.V1_21_4 + 101;
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static void convertNestedList(final ListType components) {
+ if (components == null) {
+ return;
+ }
+ for (int i = 0, len = components.size(); i < len; ++i) {
+ convertNested(components.getGeneric(i));
+ }
+ }
+
+ private static void convertNested(final Object component) {
+ if (component instanceof ListType listType) {
+ convertNestedList(listType);
+ } else if (component instanceof MapType root) {
+ convertLegacyHover(root);
+
+ convertNestedList(root.getListUnchecked("extra"));
+ convertNested(root.getGeneric("separator"));
+
+ final MapType hoverEvent = root.getMap("hoverEvent");
+ if (hoverEvent != null) {
+ switch (hoverEvent.getString("action", "")) {
+ case "show_text": {
+ convertNested(hoverEvent.getGeneric("contents"));
+ break;
+ }
+ case "show_item": {
+ break;
+ }
+ case "show_entity": {
+ convertNested(hoverEvent.getGeneric("name"));
+ break;
+ }
+ // default: do nothing
+ }
+ }
+ } // else: should only be string
+ }
+
+ private static void convertLegacyHover(final MapType textComponent) {
+ final TypeUtil<?> typeUtil = textComponent.getTypeUtil();
+ final MapType hoverEvent = textComponent.getMap("hoverEvent");
+ if (hoverEvent == null) {
+ return;
+ }
+
+ final Object legacyValue = hoverEvent.getGeneric("value");
+ if (legacyValue == null) {
+ // nothing to do here
+ return;
+ }
+
+ switch (hoverEvent.getString("action", "")) {
+ case "show_text": {
+ // value -> another text component; all we need to do is just move it to contents
+ hoverEvent.remove("value");
+ hoverEvent.setGeneric("contents", legacyValue);
+ break;
+ }
+ case "show_item": {
+ // value -> snbt of serialized item
+ hoverEvent.remove("value");
+ if (!(legacyValue instanceof String legacyItemStr)) {
+ LOGGER.error("Legacy HoverEvent with action=show_item has invalid value, expected string: " + legacyValue);
+ break;
+ }
+
+ final MapType legacyItem;
+ try {
+ legacyItem = new NBTMapType(TagParser.parseCompoundFully(legacyItemStr));
+ } catch (final Exception ex) {
+ LOGGER.error("Failed to parse SNBT for legacy item HoverEvent: " + legacyItemStr, ex);
+ break;
+ }
+
+ // note: blindly take precedence over non-legacy data
+ hoverEvent.setMap("contents", legacyItem);
+ break;
+ }
+ case "show_entity": {
+ // value -> snbt of {name:<string json text component>,type:<string>,id:<dashed uuid>}
+ hoverEvent.remove("value");
+ if (!(legacyValue instanceof String legacyEntityStr)) {
+ LOGGER.error("Legacy HoverEvent with action=show_entity has invalid value, expected string: " + legacyValue);
+ break;
+ }
+
+ final MapType legacyEntity;
+ try {
+ legacyEntity = new NBTMapType(TagParser.parseCompoundFully(legacyEntityStr));
+ } catch (final Exception ex) {
+ LOGGER.error("Failed to parse SNBT for legacy entity HoverEvent: " + legacyEntityStr, ex);
+ break;
+ }
+
+ final MapType newContents = typeUtil.createEmptyMap();
+ // note: blindly take precedence over non-legacy data
+ hoverEvent.setMap("contents", newContents);
+
+ final String name = legacyEntity.getString("name");
+ if (name != null) {
+ newContents.setString("name", name);
+ }
+ final String type = legacyEntity.getString("type");
+ if (type != null) {
+ newContents.setString("type", type);
+ }
+ final String id = legacyEntity.getString("id");
+ if (id != null) {
+ newContents.setString("id", id);
+ }
+
+ break;
+ }
+ // default: do nothing
+ }
+ }
+
+ private static void directWalkComponentList(final ListType list, final long fromVersion, final long toVersion) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ directWalkComponent(list.getGeneric(i), fromVersion, toVersion);
+ }
+ }
+
+ private static void directWalkComponent(final Object input, final long fromVersion, final long toVersion) {
+ if (input instanceof ListType listType) {
+ directWalkComponentList(listType, fromVersion, toVersion);
+ } else if (input instanceof MapType root) {
+ final ListType extra = root.getListUnchecked("extra");
+ if (extra != null) {
+ directWalkComponentList(extra, fromVersion, toVersion);
+ }
+
+ final Object separator = root.getGeneric("separator");
+ if (separator != null) {
+ directWalkComponent(separator, fromVersion, toVersion);
+ }
+
+ final MapType clickEvent = root.getMap("clickEvent");
+ if (clickEvent != null) {
+ switch (clickEvent.getString("action", "")) {
+ case "run_command":
+ case "suggest_command": {
+ WalkerUtils.convert(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, clickEvent, "value", fromVersion, toVersion);
+ break;
+ }
+ }
+ }
+
+ final MapType hoverEvent = root.getMap("hoverEvent");
+ if (hoverEvent != null) {
+ switch (hoverEvent.getString("action", "")) {
+ case "show_text": {
+ final Object contents = hoverEvent.getGeneric("contents");
+ if (contents != null) {
+ directWalkComponent(contents, fromVersion, toVersion);
+ }
+ break;
+ }
+ case "show_item": {
+ if (hoverEvent.hasKey("contents", ObjectType.STRING)) {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, hoverEvent, "contents", fromVersion, toVersion);
+ } else {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, hoverEvent, "contents", fromVersion, toVersion);
+ }
+ break;
+ }
+ case "show_entity": {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, hoverEvent, "type", fromVersion, toVersion);
+
+ final Object name = hoverEvent.getGeneric("name");
+ if (name != null) {
+ directWalkComponent(name, fromVersion, toVersion);
+ }
+ break;
+ }
+ // default: do nothing
+ }
+ }
+ } // else: should only be string
+ }
+
+ public static void register() {
+ MCTypeRegistry.TEXT_COMPONENT.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public Object convert(final Object data, final long sourceVersion, final long toVersion) {
+ if (data instanceof ListType) {
+ // will be iterated by walker
+ return null;
+ }
+ if (data instanceof MapType) {
+ // (probably) iterated by walker
+ return null;
+ }
+ if (data instanceof Number number) {
+ // text component parsed as list of numbers, which was then iterated by walker
+ // we need to convert to correct type, which is string
+ return number.toString();
+ }
+ if (data instanceof Boolean bool) {
+ // text component parsed as list of booleans, which was then iterated by walker
+ // we need to convert to correct type, which is string
+ return bool.toString();
+ }
+
+ if (!(data instanceof String unparsedJson)) {
+ throw new IllegalArgumentException("Wrong type for text component: " + data);
+ }
+
+ try {
+ final JsonElement json = JsonParser.parseString(unparsedJson);
+
+ if (!json.isJsonNull()) {
+ final Object generic = Types.JSON.convertFromBaseToGeneric(json, Types.NBT);
+ final Object ret = switch (generic) {
+ case Number nt -> nt.toString(); // json may parse as integer, need to convert to string
+ case Boolean bt -> bt.toString(); // json may parse as boolean, need to convert to string
+ case String s -> s; // simple string component
+ case ListType lt -> lt; // list of text components
+ case MapType ct -> ct; // complex text component
+ case byte[] bt -> throw new IllegalStateException("Unexpected byte[] output from JsonTypeUtil");
+ case int[] it -> throw new IllegalStateException("Unexpected int[] output from JsonTypeUtil");
+ case long[] lt -> throw new IllegalStateException("Unexpected long[] output from JsonTypeUtil");
+ // null is handled by isJsonNull()
+ default -> throw new IllegalStateException("Unknown nbt type: " + generic);
+ };
+
+ convertNested(ret);
+ directWalkComponent(ret, sourceVersion, toVersion);
+ return ret;
+ }
+ } catch (final JsonParseException ex) {
+ LOGGER.error("Failed to convert json to nbt: " + unparsedJson, ex);
+ }
+
+ return null;
+ }
+ });
+
+ // step 1
+ MCTypeRegistry.TEXT_COMPONENT.addStructureWalker(VERSION, 1, (final Object input, final long fromVersion, final long toVersion) -> {
+ if (input instanceof ListType listType) {
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, listType, fromVersion, toVersion);
+ } else if (input instanceof MapType root) {
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "extra", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "separator", fromVersion, toVersion);
+
+ final MapType clickEvent = root.getMap("clickEvent");
+ if (clickEvent != null) {
+ switch (clickEvent.getString("action", "")) {
+ case "run_command":
+ case "suggest_command": {
+ WalkerUtils.convert(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, clickEvent, "value", fromVersion, toVersion);
+ break;
+ }
+ }
+ }
+
+ final MapType hoverEvent = root.getMap("hoverEvent");
+ if (hoverEvent != null) {
+ switch (hoverEvent.getString("action", "")) {
+ case "show_text": {
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, hoverEvent, "contents", fromVersion, toVersion);
+ break;
+ }
+ case "show_item": {
+ if (hoverEvent.hasKey("contents", ObjectType.STRING)) {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, hoverEvent, "contents", fromVersion, toVersion);
+ } else {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, hoverEvent, "contents", fromVersion, toVersion);
+ }
+ break;
+ }
+ case "show_entity": {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, hoverEvent, "type", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, hoverEvent, "name", fromVersion, toVersion);
+ break;
+ }
+ // default: do nothing
+ }
+ }
+ } // else: should only be string
+ return null;
+ });
+ }
+
+ private V4290() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4291.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4291.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c01fa1f41735dd54641533ce6eefec381270993
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4291.java
@@ -0,0 +1,45 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4291 {
+
+ public static final int VERSION = MCVersions.V1_21_4 + 102;
+
+ public static void register() {
+ // V4290 correctly handles legacy hover events, so we skip that converter.
+ MCTypeRegistry.TEXT_COMPONENT.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final String[] BOOLEAN_PATHS_TO_CONVERT = new String[] {
+ "bold",
+ "italic",
+ "underlined",
+ "strikethrough",
+ "obfuscated",
+ // add extra interpret field
+ "interpret",
+ };
+
+ private static void convertToBoolean(final MapType data, final String path) {
+ final String value = data.getString(path);
+ if (value != null) {
+ data.setBoolean(path, Boolean.parseBoolean(value));
+ }
+ }
+
+ @Override
+ public Object convert(final Object data, final long sourceVersion, final long toVersion) {
+ if (data instanceof MapType root) {
+ for (final String path : BOOLEAN_PATHS_TO_CONVERT) {
+ convertToBoolean(root, path);
+ }
+ } // else: list -> handled by walker, string -> no formatting to convert
+ return null;
+ }
+ });
+ }
+
+ private V4291() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4292.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4292.java
new file mode 100644
index 0000000000000000000000000000000000000000..34f20d3cb6595eaa11e00126804ef7bd3fafa05b
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4292.java
@@ -0,0 +1,180 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.CopyHelper;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import java.net.URI;
+
+public final class V4292 {
+
+ private static final int VERSION = MCVersions.V1_21_4 + 103;
+
+ public static void register() {
+ MCTypeRegistry.TEXT_COMPONENT.addStructureConverter(new DataConverter<>(VERSION) {
+ private static boolean isWebUrl(final String value) {
+ try {
+ final String scheme = new URI(value).getScheme();
+
+ return "http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme);
+ } catch (final Exception ex) {
+ return false;
+ }
+ }
+
+ private static boolean isValidCommandOrChat(final String value) {
+ for (int i = 0, len = value.length(); i < len; ++i) {
+ final char c = value.charAt(i);
+
+ if (c < ' ' || c == 127 || c == 167) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private static Integer parseInteger(final MapType root, final String path) {
+ final Object value = root.getGeneric(path);
+ if (value instanceof String string) {
+ try {
+ return Integer.parseInt(string);
+ } catch (final Exception ex) {
+ return null;
+ }
+ } else if (value instanceof Number number) {
+ return Integer.valueOf(number.intValue());
+ }
+
+ return null;
+ }
+
+ @Override
+ public Object convert(final Object data, final long sourceVersion, final long toVersion) {
+ if (!(data instanceof MapType root)) {
+ // list or string, don't care about formatting for those
+ return null;
+ }
+
+ RenameHelper.renameSingle(root, "hoverEvent", "hover_event");
+ final MapType hoverEvent = root.getMap("hover_event");
+ if (hoverEvent != null) {
+ switch (hoverEvent.getString("action", "")) {
+ case "show_text": {
+ RenameHelper.renameSingle(hoverEvent, "contents", "value");
+ break;
+ }
+ case "show_item": {
+ if (hoverEvent.hasKey("contents", ObjectType.STRING)) {
+ RenameHelper.renameSingle(hoverEvent, "contents", "id");
+ } else {
+ final MapType contents = hoverEvent.getOrCreateMap("contents");
+ hoverEvent.remove("contents");
+
+ CopyHelper.move(contents, "id", hoverEvent, "id");
+ CopyHelper.move(contents, "count", hoverEvent, "count");
+ CopyHelper.move(contents, "components", hoverEvent, "components");
+ }
+ break;
+ }
+ case "show_entity": {
+ final MapType contents = hoverEvent.getOrCreateMap("contents");
+ hoverEvent.remove("contents");
+
+ CopyHelper.move(contents, "id", hoverEvent, "uuid");
+ CopyHelper.move(contents, "type", hoverEvent, "id");
+ CopyHelper.move(contents, "name", hoverEvent, "name");
+
+ break;
+ }
+
+ // default: do nothing
+ }
+ }
+
+ RenameHelper.renameSingle(root, "clickEvent", "click_event");
+ final MapType clickEvent = root.getMap("click_event");
+ if (clickEvent != null) {
+ final String value = clickEvent.getString("value", "");
+
+ switch (clickEvent.getString("action", "")) {
+ case "open_url": {
+ if (!isWebUrl(value)) {
+ root.remove("click_event");
+ break;
+ }
+ RenameHelper.renameSingle(clickEvent, "value", "url");
+ break;
+ }
+ case "open_file": {
+ RenameHelper.renameSingle(clickEvent, "value", "path");
+ break;
+ }
+ case "run_command":
+ case "suggest_command": {
+ if (!isValidCommandOrChat(value)) {
+ root.remove("click_event");
+ break;
+ }
+ RenameHelper.renameSingle(clickEvent, "value", "command");
+ break;
+ }
+ case "change_page": {
+ final Integer page = parseInteger(clickEvent, "value");
+ if (page == null) {
+ root.remove("click_event");
+ break;
+ }
+ clickEvent.remove("value");
+ clickEvent.setInt("page", Math.max(1, page.intValue()));
+ }
+
+ // default: do nothing
+ }
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TEXT_COMPONENT.addStructureWalker(VERSION, (final Object input, final long fromVersion, final long toVersion) -> {
+ if (input instanceof ListType listType) {
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, listType, fromVersion, toVersion);
+ } else if (input instanceof MapType root) {
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "extra", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "separator", fromVersion, toVersion);
+
+
+ WalkerUtils.convert(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, root.getMap("clickEvent"), "command", fromVersion, toVersion);
+
+ final MapType hoverEvent = root.getMap("hover_event");
+ if (hoverEvent != null) {
+ switch (hoverEvent.getString("action", "")) {
+ case "show_text": {
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, hoverEvent, "value", fromVersion, toVersion);
+ break;
+ }
+ case "show_item": {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "hover_event", fromVersion, toVersion);
+ break;
+ }
+ case "show_entity": {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, hoverEvent, "id", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, hoverEvent, "name", fromVersion, toVersion);
+ break;
+ }
+ // default: do nothing
+ }
+ }
+ } // else: should only be string
+ return null;
+ });
+ }
+
+ private V4292() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4293.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4293.java
new file mode 100644
index 0000000000000000000000000000000000000000..aac34658c39c568baba069ae151bcd7802bdad27
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4293.java
@@ -0,0 +1,71 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4293 {
+
+ private static final int VERSION = MCVersions.V1_21_4 + 104;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final float DEFAULT = 0.085f;
+
+ private static final String[] ARMOR_SLOTS = new String[] {
+ "feet",
+ "legs",
+ "chest",
+ "head"
+ };
+
+ private static final String[] HAND_SLOTS = new String[] {
+ "mainhand",
+ "offhand"
+ };
+
+ private static void convertDropChances(final MapType root, final String srcPath, final String[] names, final MapType dst) {
+ final ListType oldChances = root.getListUnchecked(srcPath);
+
+ if (oldChances == null) {
+ return;
+ }
+
+ for (int i = 0, len = Math.min(oldChances.size(), names.length); i < len; ++i) {
+ final float chance = oldChances.getFloat(i, DEFAULT);
+ if (chance != DEFAULT) {
+ dst.setFloat(names[i], chance);
+ }
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType dropChances = data.getTypeUtil().createEmptyMap();
+
+ convertDropChances(data, "ArmorDropChances", ARMOR_SLOTS, dropChances);
+ convertDropChances(data, "HandDropChances", HAND_SLOTS, dropChances);
+
+ data.remove("ArmorDropChances");
+ data.remove("HandDropChances");
+
+ final float body = data.getFloat("body_armor_drop_chance", DEFAULT);
+ data.remove("body_armor_drop_chance");
+
+ if (body != DEFAULT) {
+ dropChances.setFloat("body", body);
+ }
+
+ if (!dropChances.isEmpty()) {
+ data.setMap("drop_chances", dropChances);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4293() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4294.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4294.java
new file mode 100644
index 0000000000000000000000000000000000000000..86f4c268197d90270768786f3911258e841040ea
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4294.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4294 {
+
+ private static final int VERSION = MCVersions.V1_21_4 + 105;
+
+ public static void register() {
+ MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:creaking_heart".equals(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType properties = data.getMap("Properties");
+ if (properties == null) {
+ return null;
+ }
+
+ final String active = properties.getString("active");
+ if (active == null) {
+ return null;
+ }
+ properties.remove("active");
+ properties.setString("creaking_heart_state", active.equals("true") ? "awake" : "uprooted");
+
+ return null;
+ }
+ });
+ }
+
+ private V4294() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4295.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4295.java
new file mode 100644
index 0000000000000000000000000000000000000000..e85a156f21f826faf5e04a5f93df7e3b77ebc15c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4295.java
@@ -0,0 +1,17 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterAddBlendingData;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+
+public final class V4295 {
+
+ private static final int VERSION = MCVersions.V1_21_4 + 106;
+
+ public static void register() {
+ // See V3088 for why this converter is duplicated in here, V4185, V3441, and V3088
+ MCTypeRegistry.CHUNK.addStructureConverter(new ConverterAddBlendingData(VERSION));
+ }
+
+ private V4295() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4296.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4296.java
new file mode 100644
index 0000000000000000000000000000000000000000..a22ee6dee2f14a61688734a1afa71dc55d90ff43
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4296.java
@@ -0,0 +1,23 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4296 {
+
+ private static final int VERSION = MCVersions.V1_21_4 + 107;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setFloat("potion_duration_scale", 0.25f);
+ return null;
+ }
+ });
+ }
+
+ private V4296() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4297.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4297.java
new file mode 100644
index 0000000000000000000000000000000000000000..83c2c4e3e3c73e605d0f57b7c85db1bef64f982f
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4297.java
@@ -0,0 +1,51 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+
+public final class V4297 {
+
+ private static final int VERSION = MCVersions.V1_21_4 + 108;
+
+ public static void register() {
+ MCTypeRegistry.SAVED_DATA_TICKETS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+ final long[] forced = data.getLongs("Forced");
+ if (forced == null) {
+ return null;
+ }
+
+ data.remove("Forced");
+
+ final TypeUtil<?> typeUtil = data.getTypeUtil();
+
+ final ListType tickets = typeUtil.createEmptyList();
+ data.setList("tickets", tickets);
+
+ for (final long coordinate : forced) {
+ final MapType ticket = typeUtil.createEmptyMap();
+ tickets.addMap(ticket);
+
+ ticket.setString("type", "minecraft:forced");
+ ticket.setInt("level", 31);
+ ticket.setLong("ticks_left", 0L);
+ ticket.setLong("chunk_pos", coordinate);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4297() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4299.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4299.java
new file mode 100644
index 0000000000000000000000000000000000000000..e09c5ed9bd872ddb4d809b28434d35d48b065564
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4299.java
@@ -0,0 +1,140 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+
+public final class V4299 {
+
+ private static final int VERSION = MCVersions.V25W02A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final String[] AXOLOTL_VARIANT_LOOKUP = new String[] {
+ "lucy",
+ "wild",
+ "gold",
+ "cyan",
+ "blue",
+ };
+
+ private static final Int2ObjectOpenHashMap<String> FISH_PATTERN_LOOKUP = new Int2ObjectOpenHashMap<>();
+ static {
+ FISH_PATTERN_LOOKUP.defaultReturnValue("kob");
+ FISH_PATTERN_LOOKUP.put(1,"flopper");
+ FISH_PATTERN_LOOKUP.put(256,"sunstreak");
+ FISH_PATTERN_LOOKUP.put(257,"stripey");
+ FISH_PATTERN_LOOKUP.put(512,"snooper");
+ FISH_PATTERN_LOOKUP.put(513,"glitter");
+ FISH_PATTERN_LOOKUP.put(768,"dasher");
+ FISH_PATTERN_LOOKUP.put(769,"blockfish");
+ FISH_PATTERN_LOOKUP.put(1024,"brinely");
+ FISH_PATTERN_LOOKUP.put(1025,"betty");
+ FISH_PATTERN_LOOKUP.put(1280,"spotty");
+ FISH_PATTERN_LOOKUP.put(1281,"clayfish");
+ }
+
+ private static String lookupAxolotl(final int index) {
+ return index >= 0 && index < AXOLOTL_VARIANT_LOOKUP.length ? AXOLOTL_VARIANT_LOOKUP[index] : AXOLOTL_VARIANT_LOOKUP[0];
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ final String id = data.getString("id");
+ switch (id) {
+ case "minecraft:axolotl_bucket": {
+ final MapType bucketEntityData = components.getMap("minecraft:bucket_entity_data");
+ if (bucketEntityData == null) {
+ break;
+ }
+
+ final Number variant = bucketEntityData.getNumber("Variant");
+ if (variant == null) {
+ break;
+ }
+
+ bucketEntityData.remove("Variant");
+ components.setString("minecraft:axolotl/variant", lookupAxolotl(variant.intValue()));
+
+ break;
+ }
+ case "minecraft:salmon_bucket": {
+ final MapType bucketEntityData = components.getMap("minecraft:bucket_entity_data");
+ if (bucketEntityData == null) {
+ break;
+ }
+
+ final Object type = bucketEntityData.getGeneric("type");
+ if (type == null) {
+ break;
+ }
+ bucketEntityData.remove("type");
+ components.setGeneric("minecraft:salmon/size", type);
+
+ break;
+ }
+ case "minecraft:tropical_fish_bucket": {
+ final MapType bucketEntityData = components.getMap("minecraft:bucket_entity_data");
+ if (bucketEntityData == null) {
+ break;
+ }
+
+ final Number variantBoxed = bucketEntityData.getNumber("BucketVariantTag");
+ if (variantBoxed == null) {
+ break;
+ }
+ bucketEntityData.remove("BucketVariantTag");
+
+ final int variant = variantBoxed.intValue();
+
+ final String fishPattern = FISH_PATTERN_LOOKUP.get(variant & 0xFFFF);
+ final String baseColour = V3818.getBannerColour((variant >>> 16) & 0xFF);
+ final String patternColour = V3818.getBannerColour((variant >>> 24) & 0xFF);
+
+ components.setString("minecraft:tropical_fish/pattern", fishPattern);
+ components.setString("minecraft:tropical_fish/base_color", baseColour);
+ components.setString("minecraft:tropical_fish/pattern_color", patternColour);
+
+ break;
+ }
+ case "minecraft:painting": {
+ final MapType entityData = components.getMap("minecraft:entity_data");
+
+ if (entityData == null) {
+ break;
+ }
+
+ if (!"minecraft:painting".equals(entityData.getString("id"))) {
+ break;
+ }
+
+ final Object variant = entityData.getGeneric("variant");
+ if (variant != null) {
+ entityData.remove("variant");
+ components.setGeneric("minecraft:painting/variant", variant);
+ }
+ if (entityData.size() == 1) {
+ components.remove("minecraft:entity_data");
+ }
+
+ break;
+ }
+ default: {
+ return null;
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4299() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4300.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4300.java
new file mode 100644
index 0000000000000000000000000000000000000000..0619fc8509177e8f66e6a33072249d2468789fef
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4300.java
@@ -0,0 +1,89 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class V4300 {
+
+ private static final int VERSION = MCVersions.V25W02A + 2;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final Set<String> SADDLE_ITEM_ENTITIES = new HashSet<>(
+ Arrays.asList(
+ "minecraft:horse",
+ "minecraft:skeleton_horse",
+ "minecraft:zombie_horse",
+ "minecraft:donkey",
+ "minecraft:mule",
+ "minecraft:camel",
+ "minecraft:llama",
+ "minecraft:trader_llama"
+ )
+ );
+ private static final Set<String> SADDLE_FLAG_ENTITIES = new HashSet<>(
+ Arrays.asList(
+ "minecraft:pig",
+ "minecraft:strider"
+ )
+ );
+
+ private static void setGuaranteedSaddleDropChance(final MapType data) {
+ data.getOrCreateMap("drop_chances").setFloat("saddle", 2.0f);
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+
+ if (SADDLE_ITEM_ENTITIES.contains(id)) {
+ if (!RenameHelper.renameSingle(data, "SaddleItem", "saddle")) {
+ return null;
+ }
+
+ setGuaranteedSaddleDropChance(data);
+
+ return null;
+ } else if (SADDLE_FLAG_ENTITIES.contains(id)) {
+ final boolean saddle = data.getBoolean("Saddle");
+ data.remove("Saddle");
+
+ if (!saddle) {
+ return null;
+ }
+
+ final MapType saddleItem = data.getTypeUtil().createEmptyMap();
+ data.setMap("saddle", saddleItem);
+ saddleItem.setString("id", "minecraft:saddle");
+ saddleItem.setInt("count", 1);
+
+ setGuaranteedSaddleDropChance(data);
+
+ return null;
+ }
+
+ return null;
+ }
+ });
+
+ // saddle item moved to `saddle`, which is now under ENTITY_EQUIPMENT
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:llama", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trader_llama", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:donkey", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:mule", new DataWalkerItemLists("Items"));
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:horse", DataWalker.noOp());
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:skeleton_horse", DataWalker.noOp());
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:zombie_horse", DataWalker.noOp());
+ }
+
+ private V4300() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4301.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4301.java
new file mode 100644
index 0000000000000000000000000000000000000000..3eef93d9666ccf4fd748f137daa25613fefae548
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4301.java
@@ -0,0 +1,93 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4301 {
+
+ private static final int VERSION = MCVersions.V25W02A + 3;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY_EQUIPMENT.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final String[] ARMOR_SLOTS = new String[] {
+ "feet",
+ "legs",
+ "chest",
+ "head"
+ };
+
+ private static final String[] HAND_SLOTS = new String[] {
+ "mainhand",
+ "offhand"
+ };
+
+ private static MapType filterItem(final MapType item) {
+ return item == null || item.hasKey("id") ? item : null;
+ }
+
+ private static void setIfNonNull(final MapType dst, final String dstKey, final MapType value) {
+ if (value != null) {
+ dst.setMap(dstKey, value);
+ }
+ }
+
+ private static void moveItems(final MapType src, final String srcPath, final String[] names, final MapType dst) {
+ final ListType items = src.getListUnchecked(srcPath);
+ if (items == null) {
+ return;
+ }
+
+ for (int i = 0, len = Math.min(items.size(), names.length); i < len; ++i) {
+ final MapType item = filterItem(items.getMap(i, null));
+ if (item != null) {
+ dst.setMap(names[i], item);
+ }
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType equipment = data.getTypeUtil().createEmptyMap();
+
+ setIfNonNull(equipment, "body", filterItem(data.getMap("body_armor_item")));
+ setIfNonNull(equipment, "saddle", filterItem(data.getMap("saddle")));
+
+ moveItems(data, "ArmorItems", ARMOR_SLOTS, equipment);
+ moveItems(data, "HandItems", HAND_SLOTS, equipment);
+
+ data.remove("ArmorItems");
+ data.remove("HandItems");
+ data.remove("body_armor_item");
+ data.remove("saddle");
+
+ if (!equipment.isEmpty()) {
+ data.setMap("equipment", equipment);
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY_EQUIPMENT.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType equipment = data.getMap("equipment");
+ if (equipment != null) {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "mainhand", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "offhand", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "feet", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "legs", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "chest", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "head", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "body", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "saddle", fromVersion, toVersion);
+ }
+
+ return null;
+ });
+ }
+
+ private V4301() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4302.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4302.java
new file mode 100644
index 0000000000000000000000000000000000000000..7eb1d865cf8ba91f15b0bb6460de7c26853bb21b
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4302.java
@@ -0,0 +1,17 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V4302 {
+
+ private static final int VERSION = MCVersions.V25W02A + 4;
+
+ public static void register() {
+
+
+ // test_block is simple TE
+ // test_instance_block is simple TE
+ }
+
+ private V4302() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4303.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4303.java
new file mode 100644
index 0000000000000000000000000000000000000000..dd5827a250807c810ac352547a868151dbae95df
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4303.java
@@ -0,0 +1,30 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4303 {
+
+ private static final int VERSION = MCVersions.V25W02A + 5;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> fallConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final float fallDistance = data.getFloat("FallDistance", 0.0f);
+ data.remove("FallDistance");
+
+ data.setDouble("fall_distance", (double)fallDistance);
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addStructureConverter(fallConverter);
+ MCTypeRegistry.PLAYER.addStructureConverter(fallConverter);
+ }
+
+ private V4303() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4305.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4305.java
new file mode 100644
index 0000000000000000000000000000000000000000..90bd5dad4efaa654adbda610a287fea26519a352
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4305.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4305 {
+
+ private static final int VERSION = MCVersions.V25W03A + 1;
+
+ public static void register() {
+ MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:test_block".equals(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType properties = data.getMap("Properties");
+ if (properties == null) {
+ return null;
+ }
+
+ final String mode = properties.getString("test_block_mode");
+ if (mode == null) {
+ return null;
+ }
+ properties.remove("test_block_mode");
+ properties.setString("mode", mode);
+
+ return null;
+ }
+ });
+ }
+
+ private V4305() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4306.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4306.java
new file mode 100644
index 0000000000000000000000000000000000000000..f5b46c9f10719ce0e2014eb2289648fc7f4aa904
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4306.java
@@ -0,0 +1,37 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4306 {
+
+ private static final int VERSION = MCVersions.V25W03A + 2;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:potion", new DataConverter<>(VERSION) {
+ private static boolean matchItem(final MapType item, final String id) {
+ if (item == null) {
+ return false;
+ }
+
+ return id.equals(item.getString("id"));
+ }
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setString("id", matchItem(data.getMap("Item"), "minecraft:lingering_potion") ? "minecraft:lingering_potion" : "minecraft:splash_potion");
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:potion", "minecraft:splash_potion");
+ MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:potion", "minecraft:lingering_potion");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", DataWalker.noOp());
+ }
+
+ private V4306() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4307.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4307.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2877c20f389d0131e1dd208b464f590671e5d82
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4307.java
@@ -0,0 +1,224 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+public final class V4307 {
+
+ private static final int VERSION = MCVersions.V25W03A + 3;
+
+ public static void register() {
+ MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final String[] ADDITIONAL_TOOLTIP_COMPONENTS = new String[] {
+ "minecraft:banner_patterns",
+ "minecraft:bees",
+ "minecraft:block_entity_data",
+ "minecraft:block_state",
+ "minecraft:bundle_contents",
+ "minecraft:charged_projectiles",
+ "minecraft:container",
+ "minecraft:container_loot",
+ "minecraft:firework_explosion",
+ "minecraft:fireworks",
+ "minecraft:instrument",
+ "minecraft:map_id",
+ "minecraft:painting/variant",
+ "minecraft:pot_decorations",
+ "minecraft:potion_contents",
+ "minecraft:tropical_fish/pattern",
+ "minecraft:written_book_content"
+ };
+
+ private static void unwrapBlockPredicates(final MapType root, final String path, final Set<String> hiddenComponents) {
+ final MapType component = root.getMap(path);
+ if (component == null) {
+ return;
+ }
+
+ final Object predicates = component.getGeneric("predicates");
+ if (predicates == null) {
+ return;
+ }
+ root.setGeneric(path, predicates);
+ if (!component.getBoolean("show_in_tooltip", true)) {
+ hiddenComponents.add(path);
+ }
+ }
+
+ private static void updateComponent(final MapType root, final String path, final Set<String> hiddenComponents) {
+ final MapType component = root.getMap(path);
+ if (component == null) {
+ return;
+ }
+
+ if (!component.getBoolean("show_in_tooltip", true)) {
+ hiddenComponents.add(path);
+ }
+
+ component.remove("show_in_tooltip");
+ }
+
+ private static void updateComponentAndUnwrap(final MapType root, final String componentPath, final String unwrapPath, final Set<String> hiddenComponents) {
+ final MapType component = root.getMap(componentPath);
+ if (component == null) {
+ return;
+ }
+
+ if (!component.getBoolean("show_in_tooltip", true)) {
+ hiddenComponents.add(componentPath);
+ }
+
+ component.remove("show_in_tooltip");
+
+ final Object wrapped = component.getGeneric(unwrapPath);
+ if (wrapped != null) {
+ root.setGeneric(componentPath, wrapped);
+ }
+ }
+
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final Set<String> hiddenComponents = new LinkedHashSet<>();
+
+ unwrapBlockPredicates(root, "minecraft:can_break", hiddenComponents);
+ unwrapBlockPredicates(root, "minecraft:can_place_on", hiddenComponents);
+
+ updateComponent(root, "minecraft:trim", hiddenComponents);
+ updateComponent(root, "minecraft:unbreakable", hiddenComponents);
+
+ updateComponentAndUnwrap(root, "minecraft:dyed_color", "rgb", hiddenComponents);
+ updateComponentAndUnwrap(root, "minecraft:attribute_modifiers", "modifiers", hiddenComponents);
+ updateComponentAndUnwrap(root, "minecraft:enchantments", "levels", hiddenComponents);
+ updateComponentAndUnwrap(root, "minecraft:stored_enchantments", "levels", hiddenComponents);
+ updateComponentAndUnwrap(root, "minecraft:jukebox_playable", "song", hiddenComponents);
+
+ final boolean hideTooltip = root.hasKey("minecraft:hide_tooltip");
+ final boolean hideAdditionalTooltip = root.hasKey("minecraft:hide_additional_tooltip");
+
+ if (hideAdditionalTooltip) {
+ for (final String component : ADDITIONAL_TOOLTIP_COMPONENTS) {
+ if (root.hasKey(component)) {
+ hiddenComponents.add(component);
+ }
+ }
+ }
+
+ root.remove("minecraft:hide_tooltip");
+ root.remove("minecraft:hide_additional_tooltip");
+
+ if (hideTooltip || !hiddenComponents.isEmpty()) {
+ final TypeUtil<?> typeUtil = root.getTypeUtil();
+
+ final MapType tooltipDisplay = typeUtil.createEmptyMap();
+ final ListType hiddenComponentsList = typeUtil.createEmptyList();
+
+ root.setMap("minecraft:tooltip_display", tooltipDisplay);
+ tooltipDisplay.setBoolean("hide_tooltip", hideTooltip);
+ tooltipDisplay.setList("hidden_components", hiddenComponentsList);
+
+ for (final String component : hiddenComponents) {
+ hiddenComponentsList.addString(component);
+ }
+ }
+
+ return null;
+ }
+ });
+
+ // previous version: 4059
+ MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, new DataWalker<>() {
+ private static void walkBlockPredicate(final MapType data, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ if (data.hasKey("blocks", ObjectType.LIST)) {
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, data, "blocks", fromVersion, toVersion);
+ } else {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, data, "blocks", fromVersion, toVersion);
+ }
+ }
+
+ private static void walkBlockPredicates(final MapType root, final String path, final long fromVersion, final long toVersion) {
+ final Object value = root.getGeneric(path);
+
+ if (value instanceof MapType data) {
+ walkBlockPredicate(data, fromVersion, toVersion);
+ } else if (value instanceof ListType list) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ walkBlockPredicate(list.getMap(i, null), fromVersion, toVersion);
+ }
+ }
+ }
+
+ @Override
+ public MapType walk(final MapType root, final long fromVersion, final long toVersion) {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "minecraft:bees", "entity_data", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.TILE_ENTITY, root, "minecraft:block_entity_data", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:bundle_contents", fromVersion, toVersion);
+
+ walkBlockPredicates(root, "minecraft:can_break", fromVersion, toVersion);
+ walkBlockPredicates(root, "minecraft:can_place_on", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:charged_projectiles", fromVersion, toVersion);
+ WalkerUtils.convertListPath(MCTypeRegistry.ITEM_STACK, root, "minecraft:container", "item", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, root, "minecraft:entity_data", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_NAME, root, "minecraft:pot_decorations", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "minecraft:use_remainder", fromVersion, toVersion);
+
+ final MapType equippable = root.getMap("minecraft:equippable");
+ if (equippable != null) {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, equippable, "allowed_entities", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY_NAME, equippable, "allowed_entities", fromVersion, toVersion);
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:custom_name", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:item_name", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:lore", fromVersion, toVersion);
+
+ final MapType writtenBookContent = root.getMap("minecraft:written_book_content");
+ if (writtenBookContent != null) {
+ final ListType pages = writtenBookContent.getListUnchecked("pages");
+ if (pages != null) {
+ for (int i = 0, len = pages.size(); i < len; ++i) {
+ final Object pageGeneric = pages.getGeneric(i);
+ if (pageGeneric instanceof String || pageGeneric instanceof ListType) { // handles: String case, ListType case
+ final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(pageGeneric, fromVersion, toVersion);
+ if (convertedGeneric != null) {
+ pages.setGeneric(i, convertedGeneric);
+ }
+ } else if (pageGeneric instanceof MapType mapType) {
+ // Need to handle: Filterable format and regular NBT Component format are both MapType...
+ if (mapType.hasKey("raw") || mapType.hasKey("filtered")) {
+ // Assume filterable format
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "raw", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "filtered", fromVersion, toVersion);
+ } else {
+ // Assume regular NBT format
+ final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(pageGeneric, fromVersion, toVersion);
+ if (convertedGeneric != null) {
+ pages.setGeneric(i, convertedGeneric);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4307() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4309.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4309.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b73fcafb812f24aede33868ef87408a60ef19c8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4309.java
@@ -0,0 +1,109 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4309 {
+
+ private static final int VERSION = MCVersions.V25W04A + 1;
+
+ public static int[] makeBlockPosition(final Number x, final Number y, final Number z) {
+ return new int[] { x.intValue(), y.intValue(), z.intValue() };
+ }
+
+ public static void convertBlockPosition(final MapType data, final String xPath, final String yPath, final String zPath,
+ final String toPath) {
+ final Number x = data.getNumber(xPath);
+ final Number y = data.getNumber(yPath);
+ final Number z = data.getNumber(zPath);
+
+ if (x == null || y == null || z == null) {
+ return;
+ }
+
+ data.remove(xPath);
+ data.remove(yPath);
+ data.remove(zPath);
+
+ data.setInts(toPath, makeBlockPosition(x, y, z));
+ }
+
+ public static void register() {
+ MCTypeRegistry.SAVED_DATA_RAIDS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+ RenameHelper.renameSingle(data, "Raids", "raids");
+ RenameHelper.renameSingle(data, "Tick", "tick");
+ RenameHelper.renameSingle(data, "NextAvailableID", "next_id");
+
+ final ListType raids = data.getListUnchecked("raids");
+ if (raids != null) {
+ for (int i = 0, len = raids.size(); i < len; ++i) {
+ final MapType raid = raids.getMap(i, null);
+ if (raid == null) {
+ continue;
+ }
+
+ convertBlockPosition(raid, "CX", "CY", "CZ", "center");
+
+ RenameHelper.renameSingle(raid, "Id", "id");
+ RenameHelper.renameSingle(raid, "Started", "started");
+ RenameHelper.renameSingle(raid, "Active", "active");
+ RenameHelper.renameSingle(raid, "TicksActive", "ticks_active");
+ RenameHelper.renameSingle(raid, "BadOmenLevel", "raid_omen_level");
+ RenameHelper.renameSingle(raid, "GroupsSpawned", "groups_spawned");
+ RenameHelper.renameSingle(raid, "PreRaidTicks", "cooldown_ticks");
+ RenameHelper.renameSingle(raid, "PostRaidTicks", "post_raid_ticks");
+ RenameHelper.renameSingle(raid, "TotalHealth", "total_health");
+ RenameHelper.renameSingle(raid, "NumGroups", "group_count");
+ RenameHelper.renameSingle(raid, "Status", "status");
+ RenameHelper.renameSingle(raid, "HeroesOfTheVillage", "heroes_of_the_village");
+ }
+ }
+
+ return null;
+ }
+ });
+ MCTypeRegistry.SAVED_DATA_TICKETS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final MapType data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+
+ final ListType tickets = data.getListUnchecked("tickets");
+ if (tickets == null) {
+ return null;
+ }
+
+ for (int i = 0, len = tickets.size(); i < len; ++i) {
+ final MapType ticket = tickets.getMap(i, null);
+ if (ticket == null) {
+ continue;
+ }
+
+ if (ticket.hasKey("chunk_pos")) {
+ final long coordinate = ticket.getLong("chunk_pos", 0L);
+
+ ticket.setInts("chunk_pos", new int[] { (int)coordinate, (int)(coordinate >>> 32) });
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4309() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4311.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4311.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec8dacda319762effbd01c58cb1d41ff00fc7aa1
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4311.java
@@ -0,0 +1,22 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V4311 {
+
+ private static final int VERSION = MCVersions.V25W05A + 1;
+
+ private static final Map<String, String> ADVANCEMENTS_RENAME = new HashMap<>();
+ static {
+ ADVANCEMENTS_RENAME.put("minecraft:nether/use_lodestone", "minecraft:adventure/use_lodestone");
+ }
+
+ public static void register() {
+ ConverterAbstractAdvancementsRename.register(VERSION, ADVANCEMENTS_RENAME::get);
+ }
+
+ private V4311() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4312.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4312.java
new file mode 100644
index 0000000000000000000000000000000000000000..7015d97cb5b97d59ca41f63ba23da1edfb6bae0a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4312.java
@@ -0,0 +1,89 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import java.util.Map;
+
+public final class V4312 {
+
+ private static final int VERSION = MCVersions.V25W05A + 2;
+
+ public static void register() {
+ MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) {
+ private static final Int2ObjectOpenHashMap<String> SLOT_MOVE_MAPPING = new Int2ObjectOpenHashMap<>(
+ Map.of(
+ 100, "feet",
+ 101, "legs",
+ 102, "chest",
+ 103, "head",
+ -106, "offhand"
+ )
+ );
+
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final ListType inventory = data.getListUnchecked("Inventory");
+ if (inventory == null) {
+ return null;
+ }
+
+ final MapType equipment = data.getTypeUtil().createEmptyMap();
+
+ for (int i = 0; i < inventory.size(); ++i) {
+ final MapType item = inventory.getMap(i, null);
+ if (item == null) {
+ continue;
+ }
+
+ final int slot = item.getInt("Slot", Integer.MIN_VALUE);
+ final String equipmentKey = SLOT_MOVE_MAPPING.get(slot);
+
+ if (equipmentKey == null) {
+ continue;
+ }
+
+ inventory.remove(i--);
+
+ item.remove("Slot");
+ equipment.setMap(equipmentKey, item);
+ }
+
+ data.setMap("equipment", equipment);
+
+ return null;
+ }
+ });
+
+ // Note: See V1458 for why we walk CustomName
+ MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("RootVehicle"), "Entity", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "ender_pearls", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "EnderItems", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityLeft", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityRight", fromVersion, toVersion);
+
+ final MapType recipeBook = data.getMap("recipeBook");
+ if (recipeBook != null) {
+ WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "recipes", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "toBeDisplayed", fromVersion, toVersion);
+ }
+
+ // "From CB"
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "CustomName", fromVersion, toVersion);
+
+ return MCTypeRegistry.ENTITY_EQUIPMENT.convert(data, fromVersion, toVersion);
+ });
+
+ }
+
+ private V4312() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4314.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4314.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b61eb6776c517b553c76a6bd3651d3f7c7155c5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4314.java
@@ -0,0 +1,110 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.CopyHelper;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+
+public final class V4314 {
+
+ private static final int VERSION = MCVersions.V25W06A + 1;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> livingEntityConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ V4309.convertBlockPosition(data, "SleepingX", "SleepingY", "SleepingZ", "sleeping_pos");
+ return null;
+ }
+ };
+
+ MCTypeRegistry.PLAYER.addStructureConverter(livingEntityConverter);
+ MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType root, final long sourceVersion, final long toVersion) {
+ final TypeUtil<?> typeUtil = root.getTypeUtil();
+
+ final Number spawnX = root.getNumber("SpawnX");
+ final Number spawnY = root.getNumber("SpawnY");
+ final Number spawnZ = root.getNumber("SpawnZ");
+ if (spawnX != null && spawnY != null && spawnZ != null) {
+ root.remove("SpawnX");
+ root.remove("SpawnY");
+ root.remove("SpawnZ");
+
+ final MapType respawn = typeUtil.createEmptyMap();
+ root.setMap("respawn", respawn);
+
+ respawn.setInts("pos", V4309.makeBlockPosition(spawnX, spawnY, spawnZ));
+
+ CopyHelper.move(root, "SpawnAngle", respawn, "angle");
+ CopyHelper.move(root, "SpawnDimension", respawn, "dimension");
+ CopyHelper.move(root, "SpawnForced", respawn, "forced");
+ }
+
+ final MapType netherPos = root.getMap("enteredNetherPosition");
+ if (netherPos != null) {
+ root.remove("enteredNetherPosition");
+
+ final ListType newPos = typeUtil.createEmptyList();
+ root.setList("entered_nether_pos", newPos);
+
+ newPos.addDouble(netherPos.getDouble("x", 0.0));
+ newPos.addDouble(netherPos.getDouble("y", 0.0));
+ newPos.addDouble(netherPos.getDouble("z", 0.0));
+ }
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addStructureConverter(livingEntityConverter);
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:vex", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ V4309.convertBlockPosition(data, "BoundX", "BoundY", "BoundZ", "bound_pos");
+ RenameHelper.renameSingle(data, "LifeTicks", "life_ticks");
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:phantom", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ V4309.convertBlockPosition(data, "AX", "AY", "AZ", "anchor_pos");
+ RenameHelper.renameSingle(data, "Size", "size");
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:turtle", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.remove("TravelPosX");
+ data.remove("TravelPosY");
+ data.remove("TravelPosZ");
+ V4309.convertBlockPosition(data, "HomePosX", "HomePosY", "HomePosZ", "home_pos");
+ RenameHelper.renameSingle(data, "HasEgg", "has_egg");
+ return null;
+ }
+ });
+
+ final DataConverter<MapType, MapType> attachedBlockConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ V4309.convertBlockPosition(data, "TileX", "TileY", "TileZ", "block_pos");
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:item_frame", attachedBlockConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:glow_item_frame", attachedBlockConverter);
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:painting", attachedBlockConverter);
+ // Note: Leash entities never wrote TileX/Y/Z and don't read block_pos... Why is this here then?
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:leash_knot", attachedBlockConverter);
+ }
+
+ private V4314() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4420.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4420.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d95461b89963acc2c999f31aada04cead295b96
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4420.java
@@ -0,0 +1,26 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V4420 {
+
+ private static final int VERSION = MCVersions.V1_21_5 + 95;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "Particle", "custom_particle");
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:area_effect_cloud", new DataWalkerTypePaths<>(MCTypeRegistry.PARTICLE, "custom_particle"));
+ }
+
+ private V4420() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4421.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4421.java
new file mode 100644
index 0000000000000000000000000000000000000000..3802412c0443cce233f897852a201eebbb0504bc
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4421.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V4421 {
+
+ private static final int VERSION = MCVersions.V1_21_5 + 96;
+
+ public static void register() {
+ // happy_ghast is simple entity
+ }
+
+ private V4421() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4424.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4424.java
new file mode 100644
index 0000000000000000000000000000000000000000..690794c0963a4935390b4830202cb6b78dcf29da
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4424.java
@@ -0,0 +1,22 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import java.util.Arrays;
+import java.util.HashSet;
+
+public final class V4424 {
+
+ private static final int VERSION = MCVersions.V25W15A + 2;
+
+ public static void register() {
+ MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(
+ Arrays.asList(
+ "minecraft:locator_bar"
+ )
+ )));
+ }
+
+ private V4424() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V501.java b/ca/spottedleaf/dataconverter/minecraft/versions/V501.java
new file mode 100644
index 0000000000000000000000000000000000000000..da5731090c1de479b77d0d9a1b66d217f7f4eeb5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V501.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V501 {
+
+ private static final int VERSION = MCVersions.V16W20A;
+
+ public static void register() {
+ //registerMob("PolarBear"); // is now simple in 1.21.5
+ }
+
+ private V501() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V502.java b/ca/spottedleaf/dataconverter/minecraft/versions/V502.java
new file mode 100644
index 0000000000000000000000000000000000000000..2b6f3eef26a27e800f87a189c63250293b812e50
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V502.java
@@ -0,0 +1,45 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.concurrent.ThreadLocalRandom;
+
+public final class V502 {
+
+ private static final int VERSION = MCVersions.V16W20A + 1;
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, (final String name) -> {
+ return "minecraft:cooked_fished".equals(name) ? "minecraft:cooked_fish" : null;
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("Zombie", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!data.getBoolean("IsVillager")) {
+ return null;
+ }
+
+ data.remove("IsVillager");
+
+ if (data.hasKey("ZombieType")) {
+ return null;
+ }
+
+ int type = data.getInt("VillagerProfession", -1);
+ // Vanilla doesn't remove the profession tag, so we don't!
+ if (type < 0 || type >= 6) {
+ type = ThreadLocalRandom.current().nextInt(6);
+ }
+
+ data.setInt("ZombieType", type);
+
+ return null;
+ }
+ });
+ }
+
+ private V502() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V505.java b/ca/spottedleaf/dataconverter/minecraft/versions/V505.java
new file mode 100644
index 0000000000000000000000000000000000000000..112e287bf2bd21650798f089d6860b9714f19067
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V505.java
@@ -0,0 +1,23 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V505 {
+
+ private static final int VERSION = MCVersions.V16W21B + 1;
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.setString("useVbo", "true");
+ return null;
+ }
+ });
+ }
+
+ private V505() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V700.java b/ca/spottedleaf/dataconverter/minecraft/versions/V700.java
new file mode 100644
index 0000000000000000000000000000000000000000..63e3c70cc817bd8729ad177df8d388036bb7241d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V700.java
@@ -0,0 +1,28 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V700 {
+
+ private static final int VERSION = MCVersions.V1_10_2 + 188;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("Guardian", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (data.getBoolean("Elder")) {
+ data.setString("id", "ElderGuardian");
+ }
+ data.remove("Elder");
+ return null;
+ }
+ });
+
+ //registerMob("ElderGuardian"); // is now simple in 1.21.5
+ }
+
+ private V700() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V701.java b/ca/spottedleaf/dataconverter/minecraft/versions/V701.java
new file mode 100644
index 0000000000000000000000000000000000000000..5fa1afd449c2a45efccc3966c34310bb695ad082
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V701.java
@@ -0,0 +1,37 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V701 {
+
+ private static final int VERSION = MCVersions.V1_10_2 + 189;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("Skeleton", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int type = data.getInt("SkeletonType");
+ data.remove("SkeletonType");
+
+ switch (type) {
+ case 1:
+ data.setString("id", "WitherSkeleton");
+ break;
+ case 2:
+ data.setString("id", "Stray");
+ break;
+ }
+
+ return null;
+ }
+ });
+
+ //registerMob("WitherSkeleton"); // is now simple in 1.21.5
+ //registerMob("Stray"); // is now simple in 1.21.5
+ }
+
+ private V701() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V702.java b/ca/spottedleaf/dataconverter/minecraft/versions/V702.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2408f8e0c2e62155c51e8383448d5e64bbb58f5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V702.java
@@ -0,0 +1,51 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V702 {
+
+ private static final int VERSION = MCVersions.V1_10_2 + 190;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("Zombie", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int zombieType = data.getInt("ZombieType");
+ data.remove("ZombieType");
+
+ switch (zombieType) {
+ case 0:
+ default:
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ data.setString("id", "ZombieVillager");
+ data.setInt("Profession", zombieType - 1);
+ break;
+
+ case 6:
+ data.setString("id", "Husk");
+ break;
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "ZombieVillager", (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, root.getMap("Offers"), "Recipes", fromVersion, toVersion);
+ return null;
+ });
+ //registerMob("Husk"); // is now simple in 1.21.5
+ }
+
+ private V702() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V703.java b/ca/spottedleaf/dataconverter/minecraft/versions/V703.java
new file mode 100644
index 0000000000000000000000000000000000000000..d56ec81710d23b6bcbc6c5daad6e22a355df3056
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V703.java
@@ -0,0 +1,62 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V703 {
+
+ private static final int VERSION = MCVersions.V1_10_2 + 191;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("EntityHorse", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final int type = data.getInt("Type");
+ data.remove("Type");
+
+ switch (type) {
+ case 0:
+ default:
+ data.setString("id", "Horse");
+ break;
+
+ case 1:
+ data.setString("id", "Donkey");
+ break;
+
+ case 2:
+ data.setString("id", "Mule");
+ break;
+
+ case 3:
+ data.setString("id", "ZombieHorse");
+ break;
+
+ case 4:
+ data.setString("id", "SkeletonHorse");
+ break;
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Horse", new DataWalkerItems("ArmorItem", "SaddleItem"));
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Donkey", new DataWalkerItems("SaddleItem"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Donkey", new DataWalkerItemLists("Items"));
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Mule", new DataWalkerItems("SaddleItem"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Mule", new DataWalkerItemLists("Items"));
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "ZombieHorse", new DataWalkerItems("SaddleItem"));
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "SkeletonHorse", new DataWalkerItems("SaddleItem"));
+ }
+
+ private V703() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V704.java b/ca/spottedleaf/dataconverter/minecraft/versions/V704.java
new file mode 100644
index 0000000000000000000000000000000000000000..16e188ae63c8a545bbc57a58b30311bb9721b826
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V704.java
@@ -0,0 +1,467 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookEnforceNamespacedID;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.item_name.DataWalkerItemNames;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap;
+import com.mojang.logging.LogUtils;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.registries.BuiltInRegistries;
+import net.minecraft.world.item.BlockItem;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.EntityBlock;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import org.slf4j.Logger;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public final class V704 {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static final int VERSION = MCVersions.V1_10_2 + 192;
+
+ public static final Map<String, String> ITEM_ID_TO_TILE_ENTITY_ID = new HashMap<>() {
+ @Override
+ public String put(final String key, final String value) {
+ if (this.containsKey(key)) {
+ LOGGER.error("Duplicate item id to tile key: " + key);
+ throw new RuntimeException(); // only devs should see the consequence of this... at least start up the damn thing...
+ }
+ return super.put(key, value);
+ }
+ };
+ static {
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:furnace", "minecraft:furnace");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:lit_furnace", "minecraft:furnace");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:chest", "minecraft:chest");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:trapped_chest", "minecraft:chest");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:ender_chest", "minecraft:ender_chest");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:jukebox", "minecraft:jukebox");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dispenser", "minecraft:dispenser");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dropper", "minecraft:dropper");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:mob_spawner", "minecraft:mob_spawner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:spawner", "minecraft:mob_spawner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:noteblock", "minecraft:noteblock");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:brewing_stand", "minecraft:brewing_stand");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:enhanting_table", "minecraft:enchanting_table");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:command_block", "minecraft:command_block");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:beacon", "minecraft:beacon");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:skull", "minecraft:skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:daylight_detector", "minecraft:daylight_detector");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:hopper", "minecraft:hopper");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:flower_pot", "minecraft:flower_pot");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:repeating_command_block", "minecraft:command_block");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:chain_command_block", "minecraft:command_block");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:white_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:orange_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:magenta_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:light_blue_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:yellow_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:lime_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:pink_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:gray_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:silver_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:cyan_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:purple_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:blue_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:brown_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:green_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:red_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:black_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:light_gray_shulker_box", "minecraft:shulker_box");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:white_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:orange_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:magenta_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:light_blue_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:yellow_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:lime_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:pink_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:gray_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:silver_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:cyan_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:purple_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:blue_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:brown_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:green_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:red_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:black_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:standing_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:wall_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:piston_head", "minecraft:piston");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:daylight_detector_inverted", "minecraft:daylight_detector");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:unpowered_comparator", "minecraft:comparator");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:powered_comparator", "minecraft:comparator");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:wall_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:standing_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:structure_block", "minecraft:structure_block");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:end_portal", "minecraft:end_portal");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:end_gateway", "minecraft:end_gateway");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:shield", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:white_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:orange_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:magenta_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:light_blue_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:yellow_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:lime_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:pink_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:gray_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:silver_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:cyan_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:purple_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:blue_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:brown_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:green_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:red_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:black_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:oak_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:spruce_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:birch_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:jungle_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:acacia_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dark_oak_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:crimson_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:warped_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:skeleton_skull", "minecraft:skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:wither_skeleton_skull", "minecraft:skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:zombie_head", "minecraft:skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:player_head", "minecraft:skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:creeper_head", "minecraft:skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dragon_head", "minecraft:skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:barrel", "minecraft:barrel");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:conduit", "minecraft:conduit");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:smoker", "minecraft:smoker");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:blast_furnace", "minecraft:blast_furnace");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:lectern", "minecraft:lectern");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:bell", "minecraft:bell");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:jigsaw", "minecraft:jigsaw");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:campfire", "minecraft:campfire");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:bee_nest", "minecraft:beehive");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:beehive", "minecraft:beehive");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:sculk_sensor", "minecraft:sculk_sensor");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:decorated_pot", "minecraft:decorated_pot");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:crafter", "minecraft:crafter");
+
+ // These are missing from Vanilla up to 1.20.5
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:enchanting_table", "minecraft:enchanting_table");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:comparator", "minecraft:comparator");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:light_gray_bed", "minecraft:bed");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:light_gray_banner", "minecraft:banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:soul_campfire", "minecraft:campfire");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:sculk_catalyst", "minecraft:sculk_catalyst");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:mangrove_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:sculk_shrieker", "minecraft:sculk_shrieker");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:chiseled_bookshelf", "minecraft:chiseled_bookshelf");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:bamboo_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:oak_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:spruce_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:birch_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:jungle_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:acacia_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dark_oak_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:mangrove_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:bamboo_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:crimson_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:warped_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:piglin_head", "minecraft:skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:suspicious_sand", "minecraft:brushable_block"); // note: this was renamed in the past, see special case in the itemstack walker
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:cherry_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:cherry_hanging_sign", "minecraft:sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:suspicious_gravel", "minecraft:brushable_block");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:calibrated_sculk_sensor", "minecraft:calibrated_sculk_sensor");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:trial_spawner", "minecraft:trial_spawner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:vault", "minecraft:vault");
+ }
+
+ // This class is responsible for also integrity checking the item id to tile id map here, we just use the item registry to figure it out
+ // No longer need to do this, as items now use components in 1.20.5
+ /*static {
+ for (final Item item : BuiltInRegistries.ITEM) {
+ if (!(item instanceof BlockItem)) {
+ continue;
+ }
+
+ if (!(((BlockItem)item).getBlock() instanceof EntityBlock entityBlock)) {
+ continue;
+ }
+
+ String possibleId;
+ try {
+ final BlockEntity entity = entityBlock.newBlockEntity(new BlockPos(0, 0, 0), ((Block)entityBlock).defaultBlockState());
+ if (entity != null) {
+ possibleId = BlockEntityType.getKey(entity.getType()).toString();
+ } else {
+ possibleId = null;
+ }
+ } catch (final Throwable th) {
+ possibleId = null;
+ }
+
+ final String itemName = BuiltInRegistries.ITEM.getKey(item).toString();
+ final String mappedTo = ITEM_ID_TO_TILE_ENTITY_ID.get(itemName);
+ if (mappedTo == null) {
+ LOGGER.error("Item id " + itemName + " does not contain tile mapping! (V704)");
+ } else if (possibleId != null && !mappedTo.equals(possibleId)) {
+ final boolean chestCase = mappedTo.equals("minecraft:chest") && possibleId.equals("minecraft:trapped_chest");
+ final boolean signCase = mappedTo.equals("minecraft:sign") && possibleId.equals("minecraft:hanging_sign");
+ // save data is identical for the chest and sign case, so we don't care
+ // it's also important to note that there is no versioning for this map, so it is possible
+ // that mapping them correctly could cause issues converting old data
+ if (!chestCase && !signCase) {
+ LOGGER.error("Item id " + itemName + " is mapped to the wrong tile entity! Mapped to: " + mappedTo + ", expected: " + possibleId);
+ }
+ }
+ }
+ }*/
+
+ private static Long2ObjectArraySortedMap<String> makeSingle(final int k1, final String v1) {
+ final Long2ObjectArraySortedMap<String> ret = new Long2ObjectArraySortedMap<>();
+
+ ret.put(DataConverter.encodeVersions(k1, 0), v1);
+
+ return ret;
+ }
+
+ private static Long2ObjectArraySortedMap<String> makeDouble(final int k1, final String v1,
+ final int k2, final String v2) {
+ final Long2ObjectArraySortedMap<String> ret = new Long2ObjectArraySortedMap<>();
+
+ ret.put(DataConverter.encodeVersions(k1, 0), v1);
+ ret.put(DataConverter.encodeVersions(k2, 0), v2);
+
+ return ret;
+ }
+
+ private static final Map<String, Long2ObjectArraySortedMap<String>> ITEM_ID_TO_ENTITY_ID = new HashMap<>();
+ static {
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:armor_stand", makeDouble(V99.VERSION, "ArmorStand", V705.VERSION, "minecraft:armor_stand"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:painting", makeDouble(V99.VERSION, "Painting", V705.VERSION, "minecraft:painting"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:boat", makeDouble(V99.VERSION, "Boat", V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:oak_boat", makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:oak_chest_boat", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:spruce_boat",makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:spruce_chest_boat", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:birch_boat", makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:birch_chest_boat", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:jungle_boat", makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:jungle_chest_boat", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:acacia_boat", makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:acacia_chest_boat", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:cherry_boat", makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:cherry_chest_boat", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:dark_oak_boat", makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:dark_oak_chest_boat", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:mangrove_boat", makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:mangrove_chest_boat", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:bamboo_raft", makeSingle(V705.VERSION, "minecraft:boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:bamboo_chest_raft", makeSingle(V705.VERSION, "minecraft:chest_boat"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:minecart", makeDouble(V99.VERSION, "MinecartRideable", V705.VERSION, "minecraft:minecart"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:chest_minecart", makeDouble(V99.VERSION, "MinecartChest", V705.VERSION, "minecraft:chest_minecart"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:furnace_minecart", makeDouble(V99.VERSION, "MinecartFurnace", V705.VERSION, "minecraft:furnace_minecart"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:tnt_minecart", makeDouble(V99.VERSION, "MinecartTNT", V705.VERSION, "minecraft:tnt_minecart"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:hopper_minecart", makeDouble(V99.VERSION, "MinecartHopper", V705.VERSION, "minecraft:hopper_minecart"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:item_frame", makeDouble(V99.VERSION, "ItemFrame", V705.VERSION, "minecraft:item_frame"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:glow_item_frame", makeSingle(V705.VERSION, "minecraft:glow_item_frame"));
+
+ // Mojang missed these
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:pufferfish_bucket", makeSingle(V705.VERSION, "minecraft:pufferfish"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:salmon_bucket", makeSingle(V705.VERSION, "minecraft:salmon"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:cod_bucket", makeSingle(V705.VERSION, "minecraft:cod"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:tropical_fish_bucket", makeSingle(V705.VERSION, "minecraft:tropical_fish"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:axolotl_bucket", makeSingle(V705.VERSION, "minecraft:axolotl"));
+ ITEM_ID_TO_ENTITY_ID.put("minecraft:tadpole_bucket", makeSingle(V705.VERSION, "minecraft:tadpole"));
+ }
+
+ private static final Map<String, String> TILE_ID_UPDATE = new HashMap<>();
+ static {
+ TILE_ID_UPDATE.put("Airportal", "minecraft:end_portal");
+ TILE_ID_UPDATE.put("Banner", "minecraft:banner");
+ TILE_ID_UPDATE.put("Beacon", "minecraft:beacon");
+ TILE_ID_UPDATE.put("Cauldron", "minecraft:brewing_stand");
+ TILE_ID_UPDATE.put("Chest", "minecraft:chest");
+ TILE_ID_UPDATE.put("Comparator", "minecraft:comparator");
+ TILE_ID_UPDATE.put("Control", "minecraft:command_block");
+ TILE_ID_UPDATE.put("DLDetector", "minecraft:daylight_detector");
+ TILE_ID_UPDATE.put("Dropper", "minecraft:dropper");
+ TILE_ID_UPDATE.put("EnchantTable", "minecraft:enchanting_table");
+ TILE_ID_UPDATE.put("EndGateway", "minecraft:end_gateway");
+ TILE_ID_UPDATE.put("EnderChest", "minecraft:ender_chest");
+ TILE_ID_UPDATE.put("FlowerPot", "minecraft:flower_pot");
+ TILE_ID_UPDATE.put("Furnace", "minecraft:furnace");
+ TILE_ID_UPDATE.put("Hopper", "minecraft:hopper");
+ TILE_ID_UPDATE.put("MobSpawner", "minecraft:mob_spawner");
+ TILE_ID_UPDATE.put("Music", "minecraft:noteblock");
+ TILE_ID_UPDATE.put("Piston", "minecraft:piston");
+ TILE_ID_UPDATE.put("RecordPlayer", "minecraft:jukebox");
+ TILE_ID_UPDATE.put("Sign", "minecraft:sign");
+ TILE_ID_UPDATE.put("Skull", "minecraft:skull");
+ TILE_ID_UPDATE.put("Structure", "minecraft:structure_block");
+ TILE_ID_UPDATE.put("Trap", "minecraft:dispenser");
+ }
+
+ // These do not need a walker, so we can ignore them not being registered.
+ private static final Set<String> IGNORE_ABSENT_WALKERS = new HashSet<>(
+ Arrays.asList(
+ "Airportal",
+ "DLDetector",
+ "Comparator",
+ "EnchantTable",
+ "EndGateway",
+ "Music",
+ "Beacon",
+ // note: contains blockId and blockData, but handled by flattening converters
+ "Piston",
+ "Structure",
+ "EnderChest",
+ // See V99
+ "Skull",
+ "Banner"
+ )
+ );
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String id = data.getString("id");
+ if (id == null) {
+ return null;
+ }
+
+ data.setString("id", TILE_ID_UPDATE.getOrDefault(id, id));
+ return null;
+ }
+ });
+
+
+ for (final Map.Entry<String, String> entry : TILE_ID_UPDATE.entrySet()) {
+ final String oldId = entry.getKey();
+ final String newId = entry.getValue();
+
+ if (!MCTypeRegistry.TILE_ENTITY.hasWalkers(oldId) && !IGNORE_ABSENT_WALKERS.contains(oldId)) {
+ LOGGER.error("(V704) Failed to find walkers for " + oldId);
+ }
+
+ MCTypeRegistry.TILE_ENTITY.copyWalkers(VERSION, oldId, newId);
+ }
+
+ MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, data, "id", fromVersion, toVersion);
+
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final String itemId = data.getString("id");
+
+ // only things here are in tag, if changed update if above
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, tag, "Items", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, tag, "ChargedProjectiles", fromVersion, toVersion);
+ if ("minecraft:written_book".equals(itemId)) {
+ // These are only text component for WRITTEN books! DFU blindly will mark this as TEXT_COMPONENT.
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, tag, "pages", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, tag, "filtered_pages", fromVersion, toVersion);
+ }
+ // Vanilla blindly marks these as TEXT_COMPONENT even though they are only converted after the versions noted
+ // below.
+ if (toVersion >= DataConverter.encodeVersions(V1458.VERSION, 0)) {
+ final MapType display = tag.getMap("display");
+ if (display != null) {
+ // only TEXT_COMPONENT in V1458
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, display, "Name", fromVersion, toVersion);
+ if (toVersion >= DataConverter.encodeVersions(V1803.VERSION, 0)) {
+ // only TEXT_COMPONENT in V1803
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, display, "Lore", fromVersion, toVersion);
+ }
+ }
+ }
+
+ MapType entityTag = tag.getMap("EntityTag");
+ if (entityTag != null) {
+ final String entityId;
+ if (itemId != null && itemId.contains("_spawn_egg")) {
+ // V1451 changes spawn eggs to have the sub entity id be a part of the item id, but of course Mojang never
+ // bothered to write in logic to set the sub entity id, so we have to.
+ // format is ALWAYS <namespace>:<id>_spawn_egg post flattening
+ entityId = itemId.substring(0, itemId.indexOf("_spawn_egg"));
+ } else {
+ final Long2ObjectArraySortedMap<String> mappingByVersion = ITEM_ID_TO_ENTITY_ID.get(itemId);
+ final String mapped = mappingByVersion == null ? null : mappingByVersion.getFloor(fromVersion);
+ entityId = mapped == null ? entityTag.getString("id") : mapped;
+ }
+
+ if (entityId == null) {
+ if (!"minecraft:air".equals(itemId)) {
+ LOGGER.warn("Unable to resolve Entity for ItemStack (V704): " + itemId);
+ }
+ } else {
+ if (!entityTag.hasKey("id", ObjectType.STRING)) {
+ entityTag.setString("id", entityId);
+ }
+ }
+
+ final MapType replace = MCTypeRegistry.ENTITY.convert(entityTag, fromVersion, toVersion);
+
+ if (replace != null) {
+ entityTag = replace;
+ tag.setMap("EntityTag", entityTag);
+ }
+ }
+
+ MapType blockEntityTag = tag.getMap("BlockEntityTag");
+ if (blockEntityTag != null) {
+ final String entityId;
+ if (fromVersion < DataConverter.encodeVersions(V3438.VERSION, 0) && "minecraft:suspicious_sand".equals(itemId)) {
+ // renamed after this version, and since the id is a mapping to just string we need to special case this
+ entityId = "minecraft:suspicious_sand";
+ } else {
+ entityId = ITEM_ID_TO_TILE_ENTITY_ID.get(itemId);
+ }
+
+ if (entityId == null) {
+ if (!"minecraft:air".equals(itemId)) {
+ LOGGER.warn("Unable to resolve BlockEntity for ItemStack (V704): " + itemId);
+ }
+ } else {
+ if (!blockEntityTag.hasKey("id", ObjectType.STRING)) {
+ blockEntityTag.setString("id", entityId);
+ }
+ }
+ final MapType replace = MCTypeRegistry.TILE_ENTITY.convert(blockEntityTag, fromVersion, toVersion);
+ if (replace != null) {
+ blockEntityTag = replace;
+ tag.setMap("BlockEntityTag", blockEntityTag);
+ }
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanDestroy", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanPlaceOn", fromVersion, toVersion);
+
+ return null;
+ });
+
+ // Enforce namespace for ids
+ MCTypeRegistry.TILE_ENTITY.addStructureHook(VERSION, new DataHookEnforceNamespacedID());
+ }
+
+ private V704() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V705.java b/ca/spottedleaf/dataconverter/minecraft/versions/V705.java
new file mode 100644
index 0000000000000000000000000000000000000000..333a86b4a041df2f9679799f64037ebea33746c0
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V705.java
@@ -0,0 +1,209 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookEnforceNamespacedID;
+import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookValueTypeEnforceNamespaced;
+import ca.spottedleaf.dataconverter.minecraft.walkers.block_name.DataWalkerBlockNames;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.minecraft.walkers.tile_entity.DataWalkerTileEntities;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V705 {
+
+ public static final int VERSION = MCVersions.V1_10_2 + 193;
+
+ private static final Map<String, String> ENTITY_ID_UPDATE = new HashMap<>();
+ static {
+ ENTITY_ID_UPDATE.put("AreaEffectCloud", "minecraft:area_effect_cloud");
+ ENTITY_ID_UPDATE.put("ArmorStand", "minecraft:armor_stand");
+ ENTITY_ID_UPDATE.put("Arrow", "minecraft:arrow");
+ ENTITY_ID_UPDATE.put("Bat", "minecraft:bat");
+ ENTITY_ID_UPDATE.put("Blaze", "minecraft:blaze");
+ ENTITY_ID_UPDATE.put("Boat", "minecraft:boat");
+ ENTITY_ID_UPDATE.put("CaveSpider", "minecraft:cave_spider");
+ ENTITY_ID_UPDATE.put("Chicken", "minecraft:chicken");
+ ENTITY_ID_UPDATE.put("Cow", "minecraft:cow");
+ ENTITY_ID_UPDATE.put("Creeper", "minecraft:creeper");
+ ENTITY_ID_UPDATE.put("Donkey", "minecraft:donkey");
+ ENTITY_ID_UPDATE.put("DragonFireball", "minecraft:dragon_fireball");
+ ENTITY_ID_UPDATE.put("ElderGuardian", "minecraft:elder_guardian");
+ ENTITY_ID_UPDATE.put("EnderCrystal", "minecraft:ender_crystal");
+ ENTITY_ID_UPDATE.put("EnderDragon", "minecraft:ender_dragon");
+ ENTITY_ID_UPDATE.put("Enderman", "minecraft:enderman");
+ ENTITY_ID_UPDATE.put("Endermite", "minecraft:endermite");
+ ENTITY_ID_UPDATE.put("EyeOfEnderSignal", "minecraft:eye_of_ender_signal");
+ ENTITY_ID_UPDATE.put("FallingSand", "minecraft:falling_block");
+ ENTITY_ID_UPDATE.put("Fireball", "minecraft:fireball");
+ ENTITY_ID_UPDATE.put("FireworksRocketEntity", "minecraft:fireworks_rocket");
+ ENTITY_ID_UPDATE.put("Ghast", "minecraft:ghast");
+ ENTITY_ID_UPDATE.put("Giant", "minecraft:giant");
+ ENTITY_ID_UPDATE.put("Guardian", "minecraft:guardian");
+ ENTITY_ID_UPDATE.put("Horse", "minecraft:horse");
+ ENTITY_ID_UPDATE.put("Husk", "minecraft:husk");
+ ENTITY_ID_UPDATE.put("Item", "minecraft:item");
+ ENTITY_ID_UPDATE.put("ItemFrame", "minecraft:item_frame");
+ ENTITY_ID_UPDATE.put("LavaSlime", "minecraft:magma_cube");
+ ENTITY_ID_UPDATE.put("LeashKnot", "minecraft:leash_knot");
+ ENTITY_ID_UPDATE.put("MinecartChest", "minecraft:chest_minecart");
+ ENTITY_ID_UPDATE.put("MinecartCommandBlock", "minecraft:commandblock_minecart");
+ ENTITY_ID_UPDATE.put("MinecartFurnace", "minecraft:furnace_minecart");
+ ENTITY_ID_UPDATE.put("MinecartHopper", "minecraft:hopper_minecart");
+ ENTITY_ID_UPDATE.put("MinecartRideable", "minecraft:minecart");
+ ENTITY_ID_UPDATE.put("MinecartSpawner", "minecraft:spawner_minecart");
+ ENTITY_ID_UPDATE.put("MinecartTNT", "minecraft:tnt_minecart");
+ ENTITY_ID_UPDATE.put("Mule", "minecraft:mule");
+ ENTITY_ID_UPDATE.put("MushroomCow", "minecraft:mooshroom");
+ ENTITY_ID_UPDATE.put("Ozelot", "minecraft:ocelot");
+ ENTITY_ID_UPDATE.put("Painting", "minecraft:painting");
+ ENTITY_ID_UPDATE.put("Pig", "minecraft:pig");
+ ENTITY_ID_UPDATE.put("PigZombie", "minecraft:zombie_pigman");
+ ENTITY_ID_UPDATE.put("PolarBear", "minecraft:polar_bear");
+ ENTITY_ID_UPDATE.put("PrimedTnt", "minecraft:tnt");
+ ENTITY_ID_UPDATE.put("Rabbit", "minecraft:rabbit");
+ ENTITY_ID_UPDATE.put("Sheep", "minecraft:sheep");
+ ENTITY_ID_UPDATE.put("Shulker", "minecraft:shulker");
+ ENTITY_ID_UPDATE.put("ShulkerBullet", "minecraft:shulker_bullet");
+ ENTITY_ID_UPDATE.put("Silverfish", "minecraft:silverfish");
+ ENTITY_ID_UPDATE.put("Skeleton", "minecraft:skeleton");
+ ENTITY_ID_UPDATE.put("SkeletonHorse", "minecraft:skeleton_horse");
+ ENTITY_ID_UPDATE.put("Slime", "minecraft:slime");
+ ENTITY_ID_UPDATE.put("SmallFireball", "minecraft:small_fireball");
+ ENTITY_ID_UPDATE.put("SnowMan", "minecraft:snowman");
+ ENTITY_ID_UPDATE.put("Snowball", "minecraft:snowball");
+ ENTITY_ID_UPDATE.put("SpectralArrow", "minecraft:spectral_arrow");
+ ENTITY_ID_UPDATE.put("Spider", "minecraft:spider");
+ ENTITY_ID_UPDATE.put("Squid", "minecraft:squid");
+ ENTITY_ID_UPDATE.put("Stray", "minecraft:stray");
+ ENTITY_ID_UPDATE.put("ThrownEgg", "minecraft:egg");
+ ENTITY_ID_UPDATE.put("ThrownEnderpearl", "minecraft:ender_pearl");
+ ENTITY_ID_UPDATE.put("ThrownExpBottle", "minecraft:xp_bottle");
+ ENTITY_ID_UPDATE.put("ThrownPotion", "minecraft:potion");
+ ENTITY_ID_UPDATE.put("Villager", "minecraft:villager");
+ ENTITY_ID_UPDATE.put("VillagerGolem", "minecraft:villager_golem");
+ ENTITY_ID_UPDATE.put("Witch", "minecraft:witch");
+ ENTITY_ID_UPDATE.put("WitherBoss", "minecraft:wither");
+ ENTITY_ID_UPDATE.put("WitherSkeleton", "minecraft:wither_skeleton");
+ ENTITY_ID_UPDATE.put("WitherSkull", "minecraft:wither_skull");
+ ENTITY_ID_UPDATE.put("Wolf", "minecraft:wolf");
+ ENTITY_ID_UPDATE.put("XPOrb", "minecraft:xp_orb");
+ ENTITY_ID_UPDATE.put("Zombie", "minecraft:zombie");
+ ENTITY_ID_UPDATE.put("ZombieHorse", "minecraft:zombie_horse");
+ ENTITY_ID_UPDATE.put("ZombieVillager", "minecraft:zombie_villager");
+ }
+
+ private static void registerThrowableProjectile(final String id) {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerBlockNames("inTile"));
+ }
+
+ public static void register() {
+ ConverterAbstractEntityRename.register(VERSION, ENTITY_ID_UPDATE::get);
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:area_effect_cloud", new DataWalkerTypePaths<>(MCTypeRegistry.PARTICLE, "Particle"));
+ //registerMob("minecraft:armor_stand"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:arrow", new DataWalkerBlockNames("inTile"));
+ //registerMob("minecraft:bat"); // now simple in 1.21.5
+ //registerMob("minecraft:blaze"); // now simple in 1.21.5
+ //registerMob("minecraft:cave_spider"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:chest_minecart", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:chest_minecart", new DataWalkerItemLists("Items"));
+ //registerMob("minecraft:chicken"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:commandblock_minecart", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:commandblock_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "LastOutput"));
+ //registerMob("minecraft:cow"); // now simple in 1.21.5
+ //registerMob("minecraft:creeper"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:donkey", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:donkey", new DataWalkerItems("SaddleItem"));
+ registerThrowableProjectile("minecraft:egg");
+ //registerMob("minecraft:elder_guardian"); // now simple in 1.21.5
+ //registerMob("minecraft:ender_dragon"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:enderman", new DataWalkerBlockNames("carried"));
+ //registerMob("minecraft:endermite"); // now simple in 1.21.5
+ registerThrowableProjectile("minecraft:ender_pearl");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:falling_block", new DataWalkerBlockNames("Block"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:falling_block", new DataWalkerTileEntities("TileEntityData"));
+ registerThrowableProjectile("minecraft:fireball");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:fireworks_rocket", new DataWalkerItems("FireworksItem"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:furnace_minecart", new DataWalkerBlockNames("DisplayTile"));
+ //registerMob("minecraft:ghast"); // now simple in 1.21.5
+ //registerMob("minecraft:giant"); // now simple in 1.21.5
+ //registerMob("minecraft:guardian"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:hopper_minecart", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:hopper_minecart", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:horse", new DataWalkerItems("ArmorItem", "SaddleItem"));
+ //registerMob("minecraft:husk"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:item", new DataWalkerItems("Item"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:item_frame", new DataWalkerItems("Item"));
+ //registerMob("minecraft:magma_cube"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:minecart", new DataWalkerBlockNames("DisplayTile"));
+ //registerMob("minecraft:mooshroom"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:mule", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:mule", new DataWalkerItems("SaddleItem"));
+ //registerMob("minecraft:ocelot"); // now simple in 1.21.5
+ //registerMob("minecraft:pig"); // now simple in 1.21.5
+ //registerMob("minecraft:polar_bear"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerItems("Potion"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerBlockNames("inTile"));
+ //registerMob("minecraft:rabbit"); // now simple in 1.21.5
+ //registerMob("minecraft:sheep"); // now simple in 1.21.5
+ //registerMob("minecraft:shulker"); // now simple in 1.21.5
+ //registerMob("minecraft:silverfish"); // now simple in 1.21.5
+ //registerMob("minecraft:skeleton"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:skeleton_horse", new DataWalkerItems("SaddleItem"));
+ //registerMob("minecraft:slime"); // now simple in 1.21.5
+ registerThrowableProjectile("minecraft:small_fireball");
+ registerThrowableProjectile("minecraft:snowball");
+ //registerMob("minecraft:snowman"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spawner_minecart", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spawner_minecart", (final MapType data, final long fromVersion, final long toVersion) -> {
+ return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ });
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spectral_arrow", new DataWalkerBlockNames("inTile"));
+ //registerMob("minecraft:spider"); // now simple in 1.21.5
+ //registerMob("minecraft:squid"); // now simple in 1.21.5
+ //registerMob("minecraft:stray"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:tnt_minecart", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:villager", (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion);
+
+ WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion);
+
+ return null;
+ });
+ //registerMob("minecraft:villager_golem"); // now simple in 1.21.5
+ //registerMob("minecraft:witch"); // now simple in 1.21.5
+ //registerMob("minecraft:wither"); // now simple in 1.21.5
+ //registerMob("minecraft:wither_skeleton"); // now simple in 1.21.5
+ registerThrowableProjectile("minecraft:wither_skull");
+ //registerMob("minecraft:wolf"); // now simple in 1.21.5
+ registerThrowableProjectile("minecraft:xp_bottle");
+ //registerMob("minecraft:zombie"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:zombie_horse", new DataWalkerItems("SaddleItem"));
+ //registerMob("minecraft:zombie_pigman"); // now simple in 1.21.5
+ //registerMob("minecraft:zombie_villager"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:zombie_villager", (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion);
+
+ return null;
+ });
+ //registerMob("minecraft:evocation_illager"); // now simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:llama", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:llama", new DataWalkerItems("SaddleItem", "DecorItem"));
+ //registerMob("minecraft:vex"); // now simple in 1.21.5
+ //registerMob("minecraft:vindication_illager"); // now simple in 1.21.5
+ // Don't need to re-register itemstack walker, the V704 will correctly choose the right id for armorstand based on
+ // the source version
+
+ // Enforce namespace for ids
+ MCTypeRegistry.ENTITY.addStructureHook(VERSION, new DataHookEnforceNamespacedID());
+ MCTypeRegistry.ENTITY_NAME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced());
+ }
+
+ private V705() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V804.java b/ca/spottedleaf/dataconverter/minecraft/versions/V804.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f71c76352bf32d91826dab2e0b8dc8393afcfdc
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V804.java
@@ -0,0 +1,59 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V804 {
+
+ private static final int VERSION = MCVersions.V16W35A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:banner", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType blockEntity = tag.getMap("BlockEntityTag");
+ if (blockEntity == null) {
+ return null;
+ }
+
+ if (!blockEntity.hasKey("Base", ObjectType.NUMBER)) {
+ return null;
+ }
+
+ data.setShort("Damage", (short)(blockEntity.getShort("Base") & 15));
+
+ final MapType display = tag.getMap("display");
+ if (display != null) {
+ final ListType lore = display.getList("Lore", ObjectType.STRING);
+ if (lore != null) {
+ if (lore.size() == 1 && "(+NBT)".equals(lore.getString(0))) {
+ return null;
+ }
+ }
+ }
+
+ blockEntity.remove("Base");
+ if (blockEntity.isEmpty()) {
+ tag.remove("BlockEntityTag");
+ }
+
+ if (tag.isEmpty()) {
+ data.remove("tag");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V804() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V806.java b/ca/spottedleaf/dataconverter/minecraft/versions/V806.java
new file mode 100644
index 0000000000000000000000000000000000000000..510262ad7ff4ab12548e04906a96b7334fe8271d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V806.java
@@ -0,0 +1,39 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V806 {
+
+ private static final int VERSION = MCVersions.V16W36A + 1;
+
+ public static void register() {
+ final DataConverter<MapType, MapType> potionWaterUpdater = new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ MapType tag = data.getMap("tag");
+ if (tag == null) {
+ tag = Types.NBT.createEmptyMap();
+ data.setMap("tag", tag);
+ }
+
+ if (!tag.hasKey("Potion", ObjectType.STRING)) {
+ tag.setString("Potion", "minecraft:water");
+ }
+
+ return null;
+ }
+ };
+
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:potion", potionWaterUpdater);
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:splash_potion", potionWaterUpdater);
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:lingering_potion", potionWaterUpdater);
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:tipped_arrow", potionWaterUpdater);
+ }
+
+ private V806() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V808.java b/ca/spottedleaf/dataconverter/minecraft/versions/V808.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1bd8f279b3dd38296564fc4b1cf7322c7d1c686
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V808.java
@@ -0,0 +1,29 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V808 {
+
+ private static final int VERSION = MCVersions.V16W38A + 1;
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker", new DataConverter<>(VERSION, 1) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ if (!data.hasKey("Color", ObjectType.NUMBER)) {
+ data.setByte("Color", (byte)10);
+ }
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:shulker_box", new DataWalkerItemLists("Items"));
+ }
+
+ private V808() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V813.java b/ca/spottedleaf/dataconverter/minecraft/versions/V813.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f79651b6d35464823988bd2aba57d08a0ac7613
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V813.java
@@ -0,0 +1,64 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V813 {
+
+ private static final int VERSION = MCVersions.V16W40A;
+
+ private static final String[] SHULKER_ID_BY_COLOUR = new String[] {
+ "minecraft:white_shulker_box",
+ "minecraft:orange_shulker_box",
+ "minecraft:magenta_shulker_box",
+ "minecraft:light_blue_shulker_box",
+ "minecraft:yellow_shulker_box",
+ "minecraft:lime_shulker_box",
+ "minecraft:pink_shulker_box",
+ "minecraft:gray_shulker_box",
+ "minecraft:silver_shulker_box",
+ "minecraft:cyan_shulker_box",
+ "minecraft:purple_shulker_box",
+ "minecraft:blue_shulker_box",
+ "minecraft:brown_shulker_box",
+ "minecraft:green_shulker_box",
+ "minecraft:red_shulker_box",
+ "minecraft:black_shulker_box"
+ };
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:shulker_box", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType blockEntity = tag.getMap("BlockEntityTag");
+ if (blockEntity == null) {
+ return null;
+ }
+
+ final int color = blockEntity.getInt("Color");
+ blockEntity.remove("Color");
+
+ data.setString("id", SHULKER_ID_BY_COLOUR[color % SHULKER_ID_BY_COLOUR.length]);
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:shulker_box", new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ data.remove("Color");
+ return null;
+ }
+ });
+ }
+
+ private V813() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V816.java b/ca/spottedleaf/dataconverter/minecraft/versions/V816.java
new file mode 100644
index 0000000000000000000000000000000000000000..edbf9c01a44a77f87bdc186bdfaf36b408a31f4e
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V816.java
@@ -0,0 +1,27 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.Locale;
+
+public final class V816 {
+
+ private static final int VERSION = MCVersions.V16W43A;
+
+ public static void register() {
+ MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType convert(final MapType data, final long sourceVersion, final long toVersion) {
+ final String lang = data.getString("lang");
+ if (lang != null) {
+ data.setString("lang", lang.toLowerCase(Locale.ROOT));
+ }
+ return null;
+ }
+ });
+ }
+
+ private V816() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V820.java b/ca/spottedleaf/dataconverter/minecraft/versions/V820.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d59cb380e625bb2658216d4a6cb8faebdd147c5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V820.java
@@ -0,0 +1,21 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+
+public final class V820 {
+
+ private static final int VERSION = MCVersions.V1_11 + 1;
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, new HashMap<>(
+ ImmutableMap.of(
+ "minecraft:totem", "minecraft:totem_of_undying"
+ )
+ )::get);
+ }
+
+ private V820() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V99.java b/ca/spottedleaf/dataconverter/minecraft/versions/V99.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a2a82bc7c18667bed10086203d995f9effe3399
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V99.java
@@ -0,0 +1,418 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.converters.datatypes.DataHook;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.MCDataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperItemNameV102;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookEnforceNamespacedID;
+import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookValueTypeEnforceNamespaced;
+import ca.spottedleaf.dataconverter.minecraft.walkers.block_name.DataWalkerBlockNames;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.minecraft.walkers.item_name.DataWalkerItemNames;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+import ca.spottedleaf.dataconverter.minecraft.walkers.tile_entity.DataWalkerTileEntities;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import com.mojang.logging.LogUtils;
+import org.slf4j.Logger;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class V99 {
+
+ // Structure for all data before data upgrading was added to minecraft (pre 15w32a)
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ public static final int VERSION = MCVersions.V15W32A - 1;
+
+ private static final Map<String, String> ITEM_ID_TO_TILE_ENTITY_ID = new HashMap<>();
+ static {
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:furnace", "Furnace");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:lit_furnace", "Furnace");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:chest", "Chest");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:trapped_chest", "Chest");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:ender_chest", "EnderChest");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:jukebox", "RecordPlayer");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dispenser", "Trap");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dropper", "Dropper");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:sign", "Sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:mob_spawner", "MobSpawner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:noteblock", "Music");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:brewing_stand", "Cauldron");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:enhanting_table", "EnchantTable");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:command_block", "CommandBlock");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:beacon", "Beacon");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:skull", "Skull");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:daylight_detector", "DLDetector");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:hopper", "Hopper");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:banner", "Banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:flower_pot", "FlowerPot");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:repeating_command_block", "CommandBlock");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:chain_command_block", "CommandBlock");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:standing_sign", "Sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:wall_sign", "Sign");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:piston_head", "Piston");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:daylight_detector_inverted", "DLDetector");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:unpowered_comparator", "Comparator");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:powered_comparator", "Comparator");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:wall_banner", "Banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:standing_banner", "Banner");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:structure_block", "Structure");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:end_portal", "Airportal");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:end_gateway", "EndGateway");
+ ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:shield", "Banner");
+ }
+
+ private static void registerProjectile(final String id) {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerBlockNames("inTile"));
+ }
+
+ private static void registerInventory(final String id) {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, id, new DataWalkerItemLists("Items"));
+ }
+
+ static void registerSign(final int version, final String id) {
+ // NOTE: In 1.7.10, the text was not TEXT_COMPONENT but in 1.8 it is.
+ MCTypeRegistry.TILE_ENTITY.addWalker(version, id, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "Text1", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "Text2", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "Text3", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "Text4", fromVersion, toVersion);
+
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "FilteredText1", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "FilteredText2", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "FilteredText3", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "FilteredText4", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ public static void register() {
+ // entities
+ MCTypeRegistry.ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "Riding", fromVersion, toVersion);
+
+ return MCTypeRegistry.ENTITY_EQUIPMENT.convert(data, fromVersion, toVersion);
+ });
+ MCTypeRegistry.ENTITY_EQUIPMENT.addStructureWalker(VERSION, new DataWalkerItemLists("Equipment"));
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Item", new DataWalkerItems("Item"));
+ registerProjectile("ThrownEgg");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Arrow", new DataWalkerBlockNames("inTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "TippedArrow", new DataWalkerBlockNames("inTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "SpectralArrow", new DataWalkerBlockNames("inTile"));
+ registerProjectile("Snowball");
+ registerProjectile("Fireball");
+ registerProjectile("SmallFireball");
+ registerProjectile("ThrownEnderpearl");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "ThrownPotion", new DataWalkerBlockNames("inTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "ThrownPotion", new DataWalkerItems("Potion"));
+ registerProjectile("ThrownExpBottle");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "ItemFrame", new DataWalkerItems("Item"));
+ registerProjectile("WitherSkull");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "FallingSand", new DataWalkerBlockNames("Block"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "FallingSand", new DataWalkerTileEntities("TileEntityData"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "FireworksRocketEntity", new DataWalkerItems("FireworksItem"));
+ // Note: Minecart is the generic entity. It can be subtyped via an int to become one of the specific minecarts
+ // (i.e rideable, chest, furnace, tnt, etc)
+ // Because of this, we add all walkers to the generic type, even though they might not be needed.
+ // Vanilla does not make the generic minecart convert spawners, but we do.
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Minecart", new DataWalkerBlockNames("DisplayTile")); // for all minecart types
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Minecart", new DataWalkerItemLists("Items")); // for chest types
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Minecart", (final MapType data, final long fromVersion, final long toVersion) -> {
+ return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ }); // for spawner type
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartRideable", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartChest", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartChest", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartFurnace", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartTNT", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartSpawner", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartSpawner", (final MapType data, final long fromVersion, final long toVersion) -> {
+ return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ });
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartHopper", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartHopper", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartCommandBlock", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartCommandBlock", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "LastOutput"));
+ // mob -> simple as equipment is moved to base ENTITY
+ //registerMob("ArmorStand"); // changed to simple in 1.21.5
+ //registerMob("Creeper"); // changed to simple in 1.21.5
+ //registerMob("Skeleton"); // changed to simple in 1.21.5
+ //registerMob("Spider"); // changed to simple in 1.21.5
+ //registerMob("Giant"); // changed to simple in 1.21.5
+ //registerMob("Zombie"); // changed to simple in 1.21.5
+ //registerMob("Slime"); // changed to simple in 1.21.5
+ //registerMob("Ghast"); // changed to simple in 1.21.5
+ //registerMob("PigZombie"); // changed to simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Enderman", new DataWalkerBlockNames("carried"));
+ //registerMob("CaveSpider"); // changed to simple in 1.21.5
+ //registerMob("Silverfish"); // changed to simple in 1.21.5
+ //registerMob("Blaze"); // changed to simple in 1.21.5
+ //registerMob("LavaSlime"); // changed to simple in 1.21.5
+ //registerMob("EnderDragon"); // changed to simple in 1.21.5
+ //registerMob("WitherBoss"); // changed to simple in 1.21.5
+ //registerMob("Bat"); // changed to simple in 1.21.5
+ //registerMob("Witch"); // changed to simple in 1.21.5
+ //registerMob("Endermite"); // changed to simple in 1.21.5
+ //registerMob("Guardian"); // changed to simple in 1.21.5
+ //registerMob("Pig"); // changed to simple in 1.21.5
+ //registerMob("Sheep"); // changed to simple in 1.21.5
+ //registerMob("Cow"); // changed to simple in 1.21.5
+ //registerMob("Chicken"); // changed to simple in 1.21.5
+ //registerMob("Squid"); // changed to simple in 1.21.5
+ //registerMob("Wolf"); // changed to simple in 1.21.5
+ //registerMob("MushroomCow"); // changed to simple in 1.21.5
+ //registerMob("SnowMan"); // changed to simple in 1.21.5
+ //registerMob("Ozelot"); // changed to simple in 1.21.5
+ //registerMob("VillagerGolem"); // changed to simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "EntityHorse", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "EntityHorse", new DataWalkerItems("ArmorItem", "SaddleItem"));
+ //registerMob("Rabbit"); // changed to simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Villager", new DataWalkerItemLists("Inventory"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Villager", (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion);
+
+ return null;
+ });
+ //registerMob("Shulker"); // changed to simple in 1.21.5
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "AreaEffectCloud", new DataWalkerTypePaths<>(MCTypeRegistry.PARTICLE, "Particle"));
+
+ // tile entities
+ MCTypeRegistry.TILE_ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.DATA_COMPONENTS, data, "components", fromVersion, toVersion);
+
+ return null;
+ });
+
+ // Inventory -> new DataWalkerItemLists("Items")
+ registerInventory("Furnace");
+ registerInventory("Chest");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "RecordPlayer", new DataWalkerItems("RecordItem"));
+ registerInventory("Trap");
+ registerInventory("Dropper");
+ registerSign(VERSION, "Sign");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "MobSpawner", (final MapType data, final long fromVersion, final long toVersion) -> {
+ return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ });
+ registerInventory("Cauldron");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "Control",
+ new DataWalkerTypePaths<>(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, "Command")
+ );
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "Control", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "LastOutput"));
+ // skull doesn't even have custom_name in legacy versions! Why is it being walked here in DFU?????
+ registerInventory("Hopper");
+ // Banner CustomName is a string, not TEXT_COMPONENT. Fix Vanilla incorrectly converting this
+ // Note: Vanilla does not properly handle this case for FlowerPot, it will not convert int ids!
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "FlowerPot", new DataWalkerItemNames("Item"));
+
+ // rest
+
+ MCTypeRegistry.LEVEL.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, data, "CustomBossEvents", "Name", fromVersion, toVersion);
+
+ return MCTypeRegistry.LIGHTWEIGHT_LEVEL.convert(data, fromVersion, toVersion);
+ });
+
+ MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, data, "id", fromVersion, toVersion);
+
+ final MapType tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final String itemId = getStringId(data.getGeneric("id"));
+
+ // only things here are in tag, if changed update if above
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, tag, "Items", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, tag, "ChargedProjectiles", fromVersion, toVersion);
+ if ("minecraft:written_book".equals(itemId)) {
+ // These are only text component for WRITTEN books! DFU blindly will mark this as TEXT_COMPONENT.
+ // Like signs, they are only a real TEXT_COMPONENT (possibly!) in 1.8. We really can't distinguish between
+ // them though.
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, tag, "pages", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, tag, "filtered_pages", fromVersion, toVersion);
+ }
+ // Note: In this version, display IS NEVER a TEXT_COMPONENT! This fixes incorrectly converting the display tag
+
+ MapType entityTag = tag.getMap("EntityTag");
+ if (entityTag != null) {
+ final String entityId;
+ if ("minecraft:armor_stand".equals(itemId)) {
+ // The check for version id is removed here. For whatever reason, the legacy
+ // data converters used entity id "minecraft:armor_stand" when version was greater-than 514,
+ // but entity ids were not namespaced until V705! So somebody fucked up the legacy converters.
+ // DFU agrees with my analysis here, it will only set the entityId here to the namespaced variant
+ // with the V705 schema.
+ entityId = "ArmorStand";
+ } else if ("minecraft:item_frame".equals(itemId)) {
+ // add missing item_frame entity id
+ entityId = "ItemFrame";
+ } else if ("minecraft:painting".equals(itemId)) {
+ entityId = "Painting";
+ } else {
+ entityId = entityTag.getString("id");
+ }
+
+ final boolean removeId;
+ if (entityId == null) {
+ if (!"minecraft:air".equals(itemId)) {
+ LOGGER.warn("Unable to resolve Entity for ItemStack (V99): " + data.getGeneric("id"));
+ }
+ removeId = false;
+ } else {
+ removeId = !entityTag.hasKey("id", ObjectType.STRING);
+ if (removeId) {
+ entityTag.setString("id", entityId);
+ }
+ }
+
+ final MapType replace = MCTypeRegistry.ENTITY.convert(entityTag, fromVersion, toVersion);
+
+ if (replace != null) {
+ entityTag = replace;
+ tag.setMap("EntityTag", entityTag);
+ }
+ if (removeId) {
+ entityTag.remove("id");
+ }
+ }
+
+ MapType blockEntityTag = tag.getMap("BlockEntityTag");
+ if (blockEntityTag != null) {
+ final String entityId = ITEM_ID_TO_TILE_ENTITY_ID.get(itemId);
+ final boolean removeId;
+ if (entityId == null) {
+ if (!"minecraft:air".equals(itemId)) {
+ LOGGER.warn("Unable to resolve BlockEntity for ItemStack (V99): " + data.getGeneric("id"));
+ }
+ removeId = false;
+ } else {
+ removeId = !blockEntityTag.hasKey("id", ObjectType.STRING);
+ blockEntityTag.setString("id", entityId);
+ }
+ final MapType replace = MCTypeRegistry.TILE_ENTITY.convert(blockEntityTag, fromVersion, toVersion);
+ if (replace != null) {
+ blockEntityTag = replace;
+ tag.setMap("BlockEntityTag", blockEntityTag);
+ }
+ if (removeId) {
+ blockEntityTag.remove("id");
+ }
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanDestroy", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanPlaceOn", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.PLAYER.addStructureWalker(VERSION, new DataWalkerItemLists("Inventory", "EnderItems"));
+
+ MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ final MapType level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion);
+
+ final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP);
+ if (tileTicks != null) {
+ for (int i = 0, len = tileTicks.size(); i < len; ++i) {
+ final MapType tileTick = tileTicks.getMap(i);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion);
+ }
+ }
+
+ return null;
+ });
+
+ MCTypeRegistry.ENTITY_CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Entities", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, root, "banners", "Name", fromVersion, toVersion);
+ WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, root.getMap("data"), "banners", "Name", fromVersion, toVersion);
+ return null;
+ });
+ MCTypeRegistry.SAVED_DATA_SCOREBOARD.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ final MapType data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.OBJECTIVE, data, "Objectives", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.TEAM, data, "Teams", fromVersion, toVersion);
+ WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, data, "PlayerScores", "display", fromVersion, toVersion);
+
+ return null;
+ });
+ MCTypeRegistry.SAVED_DATA_STRUCTURE_FEATURE_INDICES.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ final MapType data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+ WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data, "Features", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.TEAM.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "MemberNamePrefix", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "MemberNameSuffix", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "DisplayName", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.VILLAGER_TRADE.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "buy", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "buyB", fromVersion, toVersion);
+ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "sell", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.STRUCTURE.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "entities", "nbt", fromVersion, toVersion);
+ WalkerUtils.convertListPath(MCTypeRegistry.TILE_ENTITY, root, "blocks", "nbt", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, root, "palette", fromVersion, toVersion);
+
+ return null;
+ });
+
+ // Enforce namespacing for ids
+ MCTypeRegistry.BLOCK_NAME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced());
+ MCTypeRegistry.ITEM_NAME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced());
+ MCTypeRegistry.ITEM_STACK.addStructureHook(VERSION, new DataHookEnforceNamespacedID());
+
+ // Entity is absent; the String form is not yet namespaced, unlike the above.
+ }
+
+ private static String getStringId(final Object id) {
+ if (id instanceof String string) {
+ return string;
+ } else if (id instanceof Number number) {
+ return HelperItemNameV102.getNameFromId(number.intValue());
+ } else {
+ return null;
+ }
+ }
+
+ private V99() {}
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/block_name/DataWalkerBlockNames.java b/ca/spottedleaf/dataconverter/minecraft/walkers/block_name/DataWalkerBlockNames.java
new file mode 100644
index 0000000000000000000000000000000000000000..930e014858ef635ebe25f7f92dc81ba0eaac50a8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/block_name/DataWalkerBlockNames.java
@@ -0,0 +1,11 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.block_name;
+
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+
+public final class DataWalkerBlockNames extends DataWalkerTypePaths<Object, Object> {
+
+ public DataWalkerBlockNames(final String... paths) {
+ super(MCTypeRegistry.BLOCK_NAME, paths);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java b/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java
new file mode 100644
index 0000000000000000000000000000000000000000..618c6d141c30506123dc7acae793355a3f6ff02c
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java
@@ -0,0 +1,21 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.game_event;
+
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class GameEventListenerWalker implements DataWalker<MapType> {
+
+ @Override
+ public MapType walk(final MapType data, final long fromVersion, final long toVersion) {
+ final MapType listener = data.getMap("listener");
+ if (listener == null) {
+ return null;
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.GAME_EVENT_NAME, listener.getMap("event"), "game_event", fromVersion, toVersion);
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerListPaths.java b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerListPaths.java
new file mode 100644
index 0000000000000000000000000000000000000000..6fd706b2fc0b979a3b2b8175127b935ec3f8486d
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerListPaths.java
@@ -0,0 +1,38 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.generic;
+
+import ca.spottedleaf.dataconverter.converters.datatypes.DataType;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public class DataWalkerListPaths<T, R> implements DataWalker<MapType> {
+
+ protected final DataType<T, R> type;
+ protected final String[] paths;
+
+ public DataWalkerListPaths(final DataType<T, R> type, final String... paths) {
+ this.type = type;
+ this.paths = paths;
+ }
+
+ @Override
+ public final MapType walk(final MapType data, final long fromVersion, final long toVersion) {
+ final DataType<T, R> type = this.type;
+ for (final String path : this.paths) {
+ final ListType list = data.getListUnchecked(path);
+ if (list == null) {
+ continue;
+ }
+
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final Object current = list.getGeneric(i);
+ final Object converted = type.convert((T)current, fromVersion, toVersion);
+ if (converted != null) {
+ list.setGeneric(i, converted);
+ }
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerTypePaths.java b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerTypePaths.java
new file mode 100644
index 0000000000000000000000000000000000000000..961da39f6d64a6b569071e4351648432961a6a33
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerTypePaths.java
@@ -0,0 +1,34 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.generic;
+
+import ca.spottedleaf.dataconverter.converters.datatypes.DataType;
+import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public class DataWalkerTypePaths<T, R> implements DataWalker<MapType> {
+
+ protected final DataType<T, R> type;
+ protected final String[] paths;
+
+ public DataWalkerTypePaths(final DataType<T, R> type, final String... paths) {
+ this.type = type;
+ this.paths = paths;
+ }
+
+ @Override
+ public final MapType walk(final MapType data, final long fromVersion, final long toVersion) {
+ for (final String path : this.paths) {
+ final Object current = data.getGeneric(path);
+ if (current == null) {
+ continue;
+ }
+
+ final Object converted = this.type.convert((T)current, fromVersion, toVersion);
+
+ if (converted != null) {
+ data.setGeneric(path, converted);
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c865e0c4e05cb3161e5003b5ce6f0b83ad40463
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java
@@ -0,0 +1,199 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.generic;
+
+import ca.spottedleaf.dataconverter.converters.datatypes.DataType;
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCValueType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import java.util.ArrayList;
+
+public final class WalkerUtils {
+
+ public static void convert(final MCDataType type, final MapType data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final MapType map = data.getMap(path);
+ if (map != null) {
+ final MapType replace = type.convert(map, fromVersion, toVersion);
+ if (replace != null) {
+ data.setMap(path, replace);
+ }
+ }
+ }
+
+ public static void convertList(final MCDataType type, final MapType data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getListUnchecked(path);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType listVal = list.getMap(i, null);
+ if (listVal == null) {
+ continue;
+ }
+
+ final MapType replace = type.convert(listVal, fromVersion, toVersion);
+ if (replace != null) {
+ list.setMap(i, replace);
+ }
+ }
+ }
+ }
+
+ public static void convertListPath(final MCDataType type, final MapType data, final String listPath, final String elementPath,
+ final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getListUnchecked(listPath);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ WalkerUtils.convert(type, list.getMap(i, null), elementPath, fromVersion, toVersion);
+ }
+ }
+ }
+
+ public static void convertListPath(final MCDataType type, final MapType data, final String listPath, final String elementPath1,
+ final String elementPath2, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getListUnchecked(listPath);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType listVal = list.getMap(i, null);
+ if (listVal == null) {
+ continue;
+ }
+
+ WalkerUtils.convert(type, listVal.getMap(elementPath1), elementPath2, fromVersion, toVersion);
+ }
+ }
+ }
+
+ public static void convert(final DataType<Object, Object> type, final MapType data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final Object value = data.getGeneric(path);
+ if (value != null) {
+ final Object converted = type.convert(value, fromVersion, toVersion);
+ if (converted != null) {
+ data.setGeneric(path, converted);
+ }
+ }
+ }
+
+ public static void convert(final DataType<Object, Object> type, final ListType data, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ for (int i = 0, len = data.size(); i < len; ++i) {
+ final Object value = data.getGeneric(i);
+ final Object converted = type.convert(value, fromVersion, toVersion);
+ if (converted != null) {
+ data.setGeneric(i, converted);
+ }
+ }
+ }
+
+ public static void convertList(final DataType<Object, Object> type, final MapType data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getListUnchecked(path);
+ if (list != null) {
+ convert(type, list, fromVersion, toVersion);
+ }
+ }
+
+ public static void convertListPath(final DataType<Object, Object> type, final MapType data, final String listPath, final String elementPath,
+ final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getListUnchecked(listPath);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ WalkerUtils.convert(type, list.getMap(i, null), elementPath, fromVersion, toVersion);
+ }
+ }
+ }
+
+ public static void convertListPath(final DataType<Object, Object> type, final MapType data, final String listPath, final String elementPath1,
+ final String elementPath2, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getListUnchecked(listPath);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType listVal = list.getMap(i, null);
+ if (listVal == null) {
+ continue;
+ }
+
+ WalkerUtils.convert(type, listVal.getMap(elementPath1), elementPath2, fromVersion, toVersion);
+ }
+ }
+ }
+
+ public static void convertKeys(final DataType<Object, Object> type, final MapType data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final MapType map = data.getMap(path);
+ if (map != null) {
+ convertKeys(type, map, fromVersion, toVersion);
+ }
+ }
+
+ public static void convertKeys(final DataType<Object, Object> type, final MapType data, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ RenameHelper.renameKeys(data, (final String input) -> {
+ return (String)type.convert(input, fromVersion, toVersion);
+ });
+ }
+
+ public static void convertValues(final MCDataType type, final MapType data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ convertValues(type, data.getMap(path), fromVersion, toVersion);
+ }
+
+ public static void convertValues(final MCDataType type, final MapType data, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ for (final String key : data.keys()) {
+ final MapType value = data.getMap(key);
+ if (value != null) {
+ final MapType replace = type.convert(value, fromVersion, toVersion);
+ if (replace != null) {
+ // no CME, key is in map already
+ data.setMap(key, replace);
+ }
+ }
+ }
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/item_name/DataWalkerItemNames.java b/ca/spottedleaf/dataconverter/minecraft/walkers/item_name/DataWalkerItemNames.java
new file mode 100644
index 0000000000000000000000000000000000000000..14e291efd864d97dcf83db01c09b9daaae1949bd
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/item_name/DataWalkerItemNames.java
@@ -0,0 +1,11 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.item_name;
+
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+
+public final class DataWalkerItemNames extends DataWalkerTypePaths<Object, Object> {
+
+ public DataWalkerItemNames(final String... paths) {
+ super(MCTypeRegistry.ITEM_NAME, paths);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItemLists.java b/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItemLists.java
new file mode 100644
index 0000000000000000000000000000000000000000..4541d2e80f806e62ade419b8f54475fd0aa6d9e8
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItemLists.java
@@ -0,0 +1,12 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.itemstack;
+
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerListPaths;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public class DataWalkerItemLists extends DataWalkerListPaths<MapType, MapType> {
+
+ public DataWalkerItemLists(final String... paths) {
+ super(MCTypeRegistry.ITEM_STACK, paths);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItems.java b/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItems.java
new file mode 100644
index 0000000000000000000000000000000000000000..fac29551a3093459a8fd8eceb6323e615c729a97
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItems.java
@@ -0,0 +1,12 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.itemstack;
+
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public class DataWalkerItems extends DataWalkerTypePaths<MapType, MapType> {
+
+ public DataWalkerItems(final String... paths) {
+ super(MCTypeRegistry.ITEM_STACK, paths);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/tile_entity/DataWalkerTileEntities.java b/ca/spottedleaf/dataconverter/minecraft/walkers/tile_entity/DataWalkerTileEntities.java
new file mode 100644
index 0000000000000000000000000000000000000000..14d72f19a429ac12f38cc79f526d465b386c9a15
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/walkers/tile_entity/DataWalkerTileEntities.java
@@ -0,0 +1,12 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.tile_entity;
+
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class DataWalkerTileEntities extends DataWalkerTypePaths<MapType, MapType> {
+
+ public DataWalkerTileEntities(final String... paths) {
+ super(MCTypeRegistry.TILE_ENTITY, paths);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/types/ListType.java b/ca/spottedleaf/dataconverter/types/ListType.java
new file mode 100644
index 0000000000000000000000000000000000000000..54a6b9db0bc3579735bb473f1e1f4a8c7d4bc6f6
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/ListType.java
@@ -0,0 +1,272 @@
+package ca.spottedleaf.dataconverter.types;
+
+public interface ListType {
+
+ public TypeUtil<?> getTypeUtil();
+
+ @Override
+ public int hashCode();
+
+ @Override
+ public boolean equals(final Object other);
+
+ // Provides a deep copy of this list
+ public ListType copy();
+
+ // Returns the type of all elements in this list. Returns NONE if empty, returns UNDEFINED if not supported, MIXED if mixed types
+ public ObjectType getUniformType();
+
+ public int size();
+
+ public void remove(final int index);
+
+ public Object getGeneric(final int index);
+
+ public default void setGeneric(final int index, final Object to) {
+ if (to instanceof Number) {
+ if (to instanceof Byte b) {
+ this.setByte(index, b.byteValue());
+ return;
+ } else if (to instanceof Short s) {
+ this.setShort(index, s.shortValue());
+ return;
+ } else if (to instanceof Integer i) {
+ this.setInt(index, i.intValue());
+ return;
+ } else if (to instanceof Long l) {
+ this.setLong(index, l.longValue());
+ return;
+ } else if (to instanceof Float f) {
+ this.setFloat(index, f.floatValue());
+ return;
+ } else if (to instanceof Double d) {
+ this.setDouble(index, d.doubleValue());
+ return;
+ } // else fall through to throw
+ } else if (to instanceof MapType m) {
+ this.setMap(index, m);
+ return;
+ } else if (to instanceof ListType l) {
+ this.setList(index, l);
+ return;
+ } else if (to instanceof String s) {
+ this.setString(index, s);
+ return;
+ } else if (to.getClass().isArray()) {
+ if (to instanceof byte[] bytes) {
+ this.setBytes(index, bytes);
+ return;
+ } else if (to instanceof short[] shorts) {
+ this.setShorts(index, shorts);
+ return;
+ } else if (to instanceof int[] ints) {
+ this.setInts(index, ints);
+ return;
+ } else if (to instanceof long[] longs) {
+ this.setLongs(index, longs);
+ return;
+ } // else fall through to throw
+ }
+
+ throw new IllegalArgumentException("Object " + to + " is not a valid type!");
+ }
+
+ // types here are strict. if the type on get does not match the underlying type, will throw - except for the
+ // default parameter methods, in such cases the default value will be returned.
+
+ public Number getNumber(final int index);
+
+ public Number getNumber(final int index, final Number dfl);
+
+ // if the value at index is a Number but not a byte, then returns the number casted to byte.
+ public byte getByte(final int index);
+
+ // if the value at index is a Number but not a byte, then returns the number casted to byte.
+ public byte getByte(final int index, final byte dfl);
+
+ public void setByte(final int index, final byte to);
+
+ // if the value at index is a Number but not a short, then returns the number casted to short.
+ public short getShort(final int index);
+
+ // if the value at index is a Number but not a short, then returns the number casted to short.
+ public short getShort(final int index, final short dfl);
+
+ public void setShort(final int index, final short to);
+
+ // if the value at index is a Number but not a int, then returns the number casted to int.
+ public int getInt(final int index);
+
+ // if the value at index is a Number but not a int, then returns the number casted to int.
+ public int getInt(final int index, final int dfl);
+
+ public void setInt(final int index, final int to);
+
+ // if the value at index is a Number but not a long, then returns the number casted to long.
+ public long getLong(final int index);
+
+ // if the value at index is a Number but not a long, then returns the number casted to long.
+ public long getLong(final int index, final long dfl);
+
+ public void setLong(final int index, final long to);
+
+ // if the value at index is a Number but not a float, then returns the number casted to float.
+ public float getFloat(final int index);
+
+ // if the value at index is a Number but not a float, then returns the number casted to float.
+ public float getFloat(final int index, final float dfl);
+
+ public void setFloat(final int index, final float to);
+
+ // if the value at index is a Number but not a double, then returns the number casted to double.
+ public double getDouble(final int index);
+
+ // if the value at index is a Number but not a double, then returns the number casted to double.
+ public double getDouble(final int index, final double dfl);
+
+ public void setDouble(final int index, final double to);
+
+ public byte[] getBytes(final int index);
+
+ public byte[] getBytes(final int index, final byte[] bytes);
+
+ public void setBytes(final int index, final byte[] to);
+
+ public short[] getShorts(final int index);
+
+ public short[] getShorts(final int index, final short[] dfl);
+
+ public void setShorts(final int index, final short[] to);
+
+ public int[] getInts(final int index);
+
+ public int[] getInts(final int index, final int[] dfl);
+
+ public void setInts(final int index, final int[] to);
+
+ public long[] getLongs(final int index);
+
+ public long[] getLongs(final int index, final long[] dfl);
+
+ public void setLongs(final int index, final long[] to);
+
+ public ListType getList(final int index);
+
+ public ListType getList(final int index, final ListType dfl);
+
+ public void setList(final int index, final ListType list);
+
+ public MapType getMap(final int index);
+
+ public MapType getMap(final int index, final MapType dfl);
+
+ public void setMap(final int index, final MapType to);
+
+ public String getString(final int index);
+
+ public String getString(final int index, final String dfl);
+
+ public void setString(final int index, final String to);
+
+ public default void addGeneric(final Object to) {
+ if (to instanceof Number) {
+ if (to instanceof Byte b) {
+ this.addByte(b.byteValue());
+ return;
+ } else if (to instanceof Short s) {
+ this.addShort(s.shortValue());
+ return;
+ } else if (to instanceof Integer i) {
+ this.addInt(i.intValue());
+ return;
+ } else if (to instanceof Long l) {
+ this.addLong(l.longValue());
+ return;
+ } else if (to instanceof Float f) {
+ this.addFloat(f.floatValue());
+ return;
+ } else if (to instanceof Double d) {
+ this.addDouble(d.doubleValue());
+ return;
+ } // else fall through to throw
+ } else if (to instanceof MapType m) {
+ this.addMap(m);
+ return;
+ } else if (to instanceof ListType l) {
+ this.addList(l);
+ return;
+ } else if (to instanceof String s) {
+ this.addString(s);
+ return;
+ } else if (to.getClass().isArray()) {
+ if (to instanceof byte[] bytes) {
+ this.addByteArray(bytes);
+ return;
+ } else if (to instanceof short[] shorts) {
+ this.addShortArray(shorts);
+ return;
+ } else if (to instanceof int[] ints) {
+ this.addIntArray(ints);
+ return;
+ } else if (to instanceof long[] longs) {
+ this.addLongArray(longs);
+ return;
+ } // else fall through to throw
+ }
+
+ throw new IllegalArgumentException("Object " + to + " is not a valid type!");
+ }
+
+ public void addByte(final byte b);
+
+ public void addByte(final int index, final byte b);
+
+ public void addShort(final short s);
+
+ public void addShort(final int index, final short s);
+
+ public void addInt(final int i);
+
+ public void addInt(final int index, final int i);
+
+ public void addLong(final long l);
+
+ public void addLong(final int index, final long l);
+
+ public void addFloat(final float f);
+
+ public void addFloat(final int index, final float f);
+
+ public void addDouble(final double d);
+
+ public void addDouble(final int index, final double d);
+
+ public void addByteArray(final byte[] arr);
+
+ public void addByteArray(final int index, final byte[] arr);
+
+ public void addShortArray(final short[] arr);
+
+ public void addShortArray(final int index, final short[] arr);
+
+ public void addIntArray(final int[] arr);
+
+ public void addIntArray(final int index, final int[] arr);
+
+ public void addLongArray(final long[] arr);
+
+ public void addLongArray(final int index, final long[] arr);
+
+ public void addList(final ListType list);
+
+ public void addList(final int index, final ListType list);
+
+ public void addMap(final MapType map);
+
+ public void addMap(final int index, final MapType map);
+
+ public void addString(final String string);
+
+ public void addString(final int index, final String string);
+
+}
diff --git a/ca/spottedleaf/dataconverter/types/MapType.java b/ca/spottedleaf/dataconverter/types/MapType.java
new file mode 100644
index 0000000000000000000000000000000000000000..709edd3e92fb8f73b8f9ae192162a72ce7f99fac
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/MapType.java
@@ -0,0 +1,220 @@
+package ca.spottedleaf.dataconverter.types;
+
+import java.util.Set;
+
+public interface MapType {
+
+ public TypeUtil<?> getTypeUtil();
+
+ @Override
+ public int hashCode();
+
+ @Override
+ public boolean equals(final Object other);
+
+ public int size();
+
+ public boolean isEmpty();
+
+ public void clear();
+
+ public Set<String> keys();
+
+ // Provides a deep copy of this map
+ public MapType copy();
+
+ public boolean hasKey(final String key);
+
+ public boolean hasKey(final String key, final ObjectType type);
+
+ public void remove(final String key);
+
+ public Object getGeneric(final String key);
+
+ // types here are not strict. if the key maps to a different type, default is always returned
+ // if default is not a parameter, then default is always null
+
+ public Number getNumber(final String key);
+
+ public Number getNumber(final String key, final Number dfl);
+
+ public boolean getBoolean(final String key);
+
+ public boolean getBoolean(final String key, final boolean dfl);
+
+ public void setBoolean(final String key, final boolean val);
+
+ // if the mapped value is a Number but not a byte, then the number is casted to byte. If the mapped value does not exist or is not a number, returns 0
+ public byte getByte(final String key);
+
+ // if the mapped value is a Number but not a byte, then the number is casted to byte. If the mapped value does not exist or is not a number, returns dfl
+ public byte getByte(final String key, final byte dfl);
+
+ public void setByte(final String key, final byte val);
+
+ // if the mapped value is a Number but not a short, then the number is casted to short. If the mapped value does not exist or is not a number, returns 0
+ public short getShort(final String key);
+
+ // if the mapped value is a Number but not a short, then the number is casted to short. If the mapped value does not exist or is not a number, returns dfl
+ public short getShort(final String key, final short dfl);
+
+ public void setShort(final String key, final short val);
+
+ // if the mapped value is a Number but not a int, then the number is casted to int. If the mapped value does not exist or is not a number, returns 0
+ public int getInt(final String key);
+
+ // if the mapped value is a Number but not a int, then the number is casted to int. If the mapped value does not exist or is not a number, returns dfl
+ public int getInt(final String key, final int dfl);
+
+ public void setInt(final String key, final int val);
+
+ // if the mapped value is a Number but not a long, then the number is casted to long. If the mapped value does not exist or is not a number, returns 0
+ public long getLong(final String key);
+
+ // if the mapped value is a Number but not a long, then the number is casted to long. If the mapped value does not exist or is not a number, returns dfl
+ public long getLong(final String key, final long dfl);
+
+ public void setLong(final String key, final long val);
+
+ // if the mapped value is a Number but not a float, then the number is casted to float. If the mapped value does not exist or is not a number, returns 0
+ public float getFloat(final String key);
+
+ // if the mapped value is a Number but not a float, then the number is casted to float. If the mapped value does not exist or is not a number, returns dfl
+ public float getFloat(final String key, final float dfl);
+
+ public void setFloat(final String key, final float val);
+
+ // if the mapped value is a Number but not a double, then the number is casted to double. If the mapped value does not exist or is not a number, returns 0
+ public double getDouble(final String key);
+
+ // if the mapped value is a Number but not a double, then the number is casted to double. If the mapped value does not exist or is not a number, returns dfl
+ public double getDouble(final String key, final double dfl);
+
+ public void setDouble(final String key, final double val);
+
+ public byte[] getBytes(final String key);
+
+ public byte[] getBytes(final String key, final byte[] dfl);
+
+ public void setBytes(final String key, final byte[] val);
+
+ public short[] getShorts(final String key);
+
+ public short[] getShorts(final String key, final short[] dfl);
+
+ public void setShorts(final String key, final short[] val);
+
+ public int[] getInts(final String key);
+
+ public int[] getInts(final String key, final int[] dfl);
+
+ public void setInts(final String key, final int[] val);
+
+ public long[] getLongs(final String key);
+
+ public long[] getLongs(final String key, final long[] dfl);
+
+ public void setLongs(final String key, final long[] val);
+
+ public ListType getListUnchecked(final String key);
+
+ public ListType getListUnchecked(final String key, final ListType dfl);
+
+ public default ListType getList(final String key, final ObjectType type) {
+ return this.getList(key, type, null);
+ }
+
+ public default ListType getOrCreateList(final String key, final ObjectType type) {
+ ListType ret = this.getList(key, type);
+ if (ret == null) {
+ this.setList(key, ret = this.getTypeUtil().createEmptyList());
+ }
+
+ return ret;
+ }
+
+ public default ListType getList(final String key, final ObjectType type, final ListType dfl) {
+ final ListType ret = this.getListUnchecked(key, null);
+ final ObjectType retType;
+ if (ret != null && ((retType = ret.getUniformType()) == type || retType == ObjectType.UNDEFINED || retType == ObjectType.NONE)) {
+ return ret;
+ } else {
+ return dfl;
+ }
+ }
+
+ public void setList(final String key, final ListType val);
+
+ public MapType getMap(final String key);
+
+ public default MapType getOrCreateMap(final String key) {
+ MapType ret = this.getMap(key);
+ if (ret == null) {
+ this.setMap(key, ret = this.getTypeUtil().createEmptyMap());
+ }
+
+ return ret;
+ }
+
+ public MapType getMap(final String key, final MapType dfl);
+
+ public void setMap(final String key, final MapType val);
+
+ public String getString(final String key);
+
+ public String getString(final String key, final String dfl);
+
+ public void setString(final String key, final String val);
+
+ public default void setGeneric(final String key, final Object value) {
+ if (value instanceof Boolean bool) {
+ this.setBoolean(key, bool.booleanValue());
+ return;
+ } else if (value instanceof Number) {
+ if (value instanceof Byte b) {
+ this.setByte(key, b.byteValue());
+ return;
+ } else if (value instanceof Short s) {
+ this.setShort(key, s.shortValue());
+ return;
+ } else if (value instanceof Integer i) {
+ this.setInt(key, i.intValue());
+ return;
+ } else if (value instanceof Long l) {
+ this.setLong(key, l.longValue());
+ return;
+ } else if (value instanceof Float f) {
+ this.setFloat(key, f.floatValue());
+ return;
+ } else if (value instanceof Double d) {
+ this.setDouble(key, d.doubleValue());
+ return;
+ } // else fall through to throw
+ } else if (value instanceof MapType map) {
+ this.setMap(key, map);
+ return;
+ } else if (value instanceof ListType list) {
+ this.setList(key, list);
+ return;
+ } else if (value instanceof String string) {
+ this.setString(key, string);
+ return;
+ } else if (value.getClass().isArray()) {
+ if (value instanceof byte[] bytes) {
+ this.setBytes(key, bytes);
+ return;
+ } else if (value instanceof short[] shorts) {
+ this.setShorts(key, shorts);
+ return;
+ } else if (value instanceof int[] ints) {
+ this.setInts(key, ints);
+ return;
+ } else if (value instanceof long[] longs) {
+ this.setLongs(key, longs);
+ return;
+ } // else fall through to throw
+ }
+
+ throw new IllegalArgumentException("Object " + value + " is not a valid type!");
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/types/ObjectType.java b/ca/spottedleaf/dataconverter/types/ObjectType.java
new file mode 100644
index 0000000000000000000000000000000000000000..9775d810ba28e59d4eec6c79643c4bcaeb97fc31
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/ObjectType.java
@@ -0,0 +1,73 @@
+package ca.spottedleaf.dataconverter.types;
+
+public enum ObjectType {
+ NONE(null),
+ BYTE(Byte.class),
+ SHORT(Short.class),
+ INT(Integer.class),
+ LONG(Long.class),
+ FLOAT(Float.class),
+ DOUBLE(Double.class),
+ NUMBER(Number.class),
+ BYTE_ARRAY(byte[].class),
+ SHORT_ARRAY(short[].class),
+ INT_ARRAY(int[].class),
+ LONG_ARRAY(long[].class),
+ LIST(ListType.class),
+ MAP(MapType.class),
+ STRING(String.class),
+ UNDEFINED(null),
+ MIXED(null);
+
+ private final Class<?> clazz;
+ private final boolean isNumber;
+
+ private ObjectType(final Class<?> clazz) {
+ this.clazz = clazz;
+ this.isNumber = clazz != null && Number.class.isAssignableFrom(clazz);
+ }
+
+ public boolean isNumber() {
+ return this.isNumber;
+ }
+
+ public Class<?> getObjectClass() {
+ return this.clazz;
+ }
+
+ public static ObjectType getType(final Object object) {
+ if (object instanceof Number) {
+ if (object instanceof Byte) {
+ return BYTE;
+ } else if (object instanceof Short) {
+ return SHORT;
+ } else if (object instanceof Integer) {
+ return INT;
+ } else if (object instanceof Long) {
+ return LONG;
+ } else if (object instanceof Float) {
+ return FLOAT;
+ } else if (object instanceof Double) {
+ return DOUBLE;
+ } // else return null
+ } else if (object instanceof MapType) {
+ return MAP;
+ } else if (object instanceof ListType) {
+ return LIST;
+ } else if (object instanceof String) {
+ return STRING;
+ } else if (object.getClass().isArray()) {
+ if (object instanceof byte[]) {
+ return BYTE_ARRAY;
+ } else if (object instanceof short[]) {
+ return SHORT_ARRAY;
+ } else if (object instanceof int[]) {
+ return INT_ARRAY;
+ } else if (object instanceof long[]) {
+ return LONG_ARRAY;
+ } // else return null
+ }
+
+ return null;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/types/TypeUtil.java b/ca/spottedleaf/dataconverter/types/TypeUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4170c188d9e7150ef7b728d4992d10ec8dab4fa4
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/TypeUtil.java
@@ -0,0 +1,26 @@
+package ca.spottedleaf.dataconverter.types;
+
+public interface TypeUtil<T> {
+
+ public ListType createEmptyList();
+
+ public MapType createEmptyMap();
+
+ public default Object convertFromBaseToGeneric(final T input, final TypeUtil<?> to) {
+ return this.convertTo(this.baseToGeneric(input), to);
+ }
+
+ public default <D> D convertBaseToBase(final T input, final TypeUtil<D> to) {
+ return to.genericToBase(this.convertFromBaseToGeneric(input, to));
+ }
+
+ public default <D> D convertGenericToBase(final Object valueGeneric, final TypeUtil<D> to) {
+ return to.genericToBase(this.convertTo(valueGeneric, to));
+ }
+
+ public Object convertTo(final Object valueGeneric, final TypeUtil<?> to);
+
+ public Object baseToGeneric(final T input);
+
+ public T genericToBase(final Object input);
+}
diff --git a/ca/spottedleaf/dataconverter/types/Types.java b/ca/spottedleaf/dataconverter/types/Types.java
new file mode 100644
index 0000000000000000000000000000000000000000..750aa7b31732d81eb01c80b45b13a830ae7feb91
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/Types.java
@@ -0,0 +1,14 @@
+package ca.spottedleaf.dataconverter.types;
+
+import ca.spottedleaf.dataconverter.types.json.JsonTypeUtil;
+import ca.spottedleaf.dataconverter.types.nbt.NBTTypeUtil;
+
+public interface Types {
+
+ public static final NBTTypeUtil NBT = new NBTTypeUtil();
+
+ public static final JsonTypeUtil JSON = new JsonTypeUtil(false);
+
+ // why does this exist
+ public static final JsonTypeUtil JSON_COMPRESSED = new JsonTypeUtil(true);
+}
diff --git a/ca/spottedleaf/dataconverter/types/json/JsonListType.java b/ca/spottedleaf/dataconverter/types/json/JsonListType.java
new file mode 100644
index 0000000000000000000000000000000000000000..58d0bf4931e7516b39d9d31b4807cfa28efeee0a
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/json/JsonListType.java
@@ -0,0 +1,510 @@
+package ca.spottedleaf.dataconverter.types.json;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+public final class JsonListType implements ListType {
+
+ final JsonArray array;
+ final boolean compressed;
+
+ public JsonListType(final boolean compressed) {
+ this.array = new JsonArray();
+ this.compressed = compressed;
+ }
+
+ public JsonListType(final JsonArray array, final boolean compressed) {
+ this.array = array;
+ this.compressed = compressed;
+ }
+
+ @Override
+ public TypeUtil<JsonElement> getTypeUtil() {
+ return this.compressed ? Types.JSON_COMPRESSED : Types.JSON;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj == null || obj.getClass() != JsonListType.class) {
+ return false;
+ }
+
+ return this.array.equals(((JsonListType)obj).array);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.array.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "JsonListType{" +
+ "array=" + this.array +
+ ", compressed=" + this.compressed +
+ '}';
+ }
+
+ public JsonArray getJson() {
+ return this.array;
+ }
+
+ @Override
+ public ListType copy() {
+ return new JsonListType(this.array.deepCopy(), this.compressed);
+ }
+
+ @Override
+ public ObjectType getUniformType() {
+ return ObjectType.UNDEFINED;
+ }
+
+ @Override
+ public int size() {
+ return this.array.size();
+ }
+
+ @Override
+ public void remove(final int index) {
+ this.array.remove(index);
+ }
+
+ @Override
+ public Object getGeneric(final int index) {
+ return Types.JSON.baseToGeneric(this.array.get(index));
+ }
+
+ @Override
+ public Number getNumber(final int index) {
+ final JsonElement element = this.array.get(index);
+ if (element instanceof JsonPrimitive) {
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isNumber()) {
+ return primitive.getAsNumber();
+ } else if (primitive.isBoolean()) {
+ return primitive.getAsBoolean() ? Byte.valueOf((byte)1) : Byte.valueOf((byte)0);
+ } else if (this.compressed && primitive.isString()) {
+ try {
+ return Integer.valueOf(Integer.parseInt(primitive.getAsString()));
+ } catch (final NumberFormatException ex) {
+ return null;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public Number getNumber(final int index, final Number dfl) {
+ final Number ret = this.getNumber(index);
+ return ret == null ? dfl : ret;
+ }
+
+ @Override
+ public byte getByte(final int index) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? (byte)0 : number.byteValue();
+ }
+
+ @Override
+ public byte getByte(final int index, final byte dfl) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? dfl : number.byteValue();
+ }
+
+ @Override
+ public void setByte(final int index, final byte to) {
+ this.array.set(index, new JsonPrimitive(Byte.valueOf(to)));
+ }
+
+ @Override
+ public short getShort(final int index) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? (short)0 : number.shortValue();
+ }
+
+ @Override
+ public short getShort(final int index, final short dfl) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? dfl : number.shortValue();
+ }
+
+ @Override
+ public void setShort(final int index, final short to) {
+ this.array.set(index, new JsonPrimitive(Short.valueOf(to)));
+ }
+
+ @Override
+ public int getInt(final int index) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? 0 : number.intValue();
+ }
+
+ @Override
+ public int getInt(final int index, final int dfl) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? dfl : number.intValue();
+ }
+
+ @Override
+ public void setInt(final int index, final int to) {
+ this.array.set(index, new JsonPrimitive(Integer.valueOf(to)));
+ }
+
+ @Override
+ public long getLong(final int index) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? 0L : number.longValue();
+ }
+
+ @Override
+ public long getLong(final int index, final long dfl) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? dfl : number.longValue();
+ }
+
+ @Override
+ public void setLong(final int index, final long to) {
+ this.array.set(index, new JsonPrimitive(Long.valueOf(to)));
+ }
+
+ @Override
+ public float getFloat(final int index) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? 0.0f : number.floatValue();
+ }
+
+ @Override
+ public float getFloat(final int index, final float dfl) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? dfl : number.floatValue();
+ }
+
+ @Override
+ public void setFloat(final int index, final float to) {
+ this.array.set(index, new JsonPrimitive(Float.valueOf(to)));
+ }
+
+ @Override
+ public double getDouble(final int index) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? 0.0 : number.doubleValue();
+ }
+
+ @Override
+ public double getDouble(final int index, final double dfl) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? dfl : number.doubleValue();
+ }
+
+ @Override
+ public void setDouble(final int index, final double to) {
+ this.array.set(index, new JsonPrimitive(Double.valueOf(to)));
+ }
+
+ @Override
+ public byte[] getBytes(final int index) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public byte[] getBytes(final int index, final byte[] dfl) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setBytes(final int index, final byte[] to) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public short[] getShorts(final int index) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public short[] getShorts(final int index, final short[] dfl) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setShorts(final int index, final short[] to) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int[] getInts(final int index) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int[] getInts(final int index, final int[] dfl) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setInts(final int index, final int[] to) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public long[] getLongs(final int index) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public long[] getLongs(final int index, final long[] dfl) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setLongs(final int index, final long[] to) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public ListType getList(final int index) {
+ final JsonElement element = this.array.get(index);
+ if (element instanceof JsonArray) {
+ return new JsonListType((JsonArray)element, this.compressed);
+ }
+ return null;
+ }
+
+ @Override
+ public ListType getList(final int index, final ListType dfl) {
+ final ListType ret = this.getList(index);
+ return ret == null ? dfl : ret;
+ }
+
+ @Override
+ public void setList(final int index, final ListType list) {
+ this.array.set(index, ((JsonListType)list).array);
+ }
+
+ @Override
+ public MapType getMap(final int index) {
+ final JsonElement element = this.array.get(index);
+ if (element instanceof JsonObject) {
+ return new JsonMapType((JsonObject)element, this.compressed);
+ }
+ return null;
+ }
+
+ @Override
+ public MapType getMap(final int index, final MapType dfl) {
+ final MapType ret = this.getMap(index);
+ return ret == null ? dfl : ret;
+ }
+
+ @Override
+ public void setMap(final int index, final MapType to) {
+ this.array.set(index, ((JsonMapType)to).map);
+ }
+
+ @Override
+ public String getString(final int index) {
+ final JsonElement element = this.array.get(index);
+ if (element instanceof JsonPrimitive) {
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isString() || (this.compressed && primitive.isNumber())) {
+ return primitive.getAsString();
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public String getString(final int index, final String dfl) {
+ final String ret = this.getString(index);
+ return ret == null ? dfl : ret;
+ }
+
+ @Override
+ public void setString(final int index, final String to) {
+ this.array.set(index, new JsonPrimitive(to));
+ }
+
+ @Override
+ public void addByte(final byte b) {
+ this.array.add(Byte.valueOf(b));
+ }
+
+ @Override
+ public void addByte(final int index, final byte b) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addShort(final short s) {
+ this.array.add(Short.valueOf(s));
+ }
+
+ @Override
+ public void addShort(final int index, final short s) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addInt(final int i) {
+ this.array.add(Integer.valueOf(i));
+ }
+
+ @Override
+ public void addInt(final int index, final int i) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addLong(final long l) {
+ this.array.add(Long.valueOf(l));
+ }
+
+ @Override
+ public void addLong(final int index, final long l) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addFloat(final float f) {
+ this.array.add(Float.valueOf(f));
+ }
+
+ @Override
+ public void addFloat(final int index, final float f) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addDouble(final double d) {
+ this.array.add(Double.valueOf(d));
+ }
+
+ @Override
+ public void addDouble(final int index, final double d) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addByteArray(final byte[] arr) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addByteArray(final int index, final byte[] arr) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addShortArray(final short[] arr) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addShortArray(final int index, final short[] arr) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addIntArray(final int[] arr) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addIntArray(final int index, final int[] arr) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addLongArray(final long[] arr) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addLongArray(final int index, final long[] arr) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addList(final ListType list) {
+ this.array.add(((JsonListType)list).array);
+ }
+
+ @Override
+ public void addList(final int index, final ListType list) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addMap(final MapType map) {
+ this.array.add(((JsonMapType)map).map);
+ }
+
+ @Override
+ public void addMap(final int index, final MapType map) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addString(final String string) {
+ this.array.add(string);
+ }
+
+ @Override
+ public void addString(final int index, final String string) {
+ // doesn't implement any methods for adding at index... yee haw...
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/types/json/JsonMapType.java b/ca/spottedleaf/dataconverter/types/json/JsonMapType.java
new file mode 100644
index 0000000000000000000000000000000000000000..6704da4a40522a4f40cd770a4cbaaa8e6f67cc31
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/json/JsonMapType.java
@@ -0,0 +1,472 @@
+package ca.spottedleaf.dataconverter.types.json;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import ca.spottedleaf.dataconverter.types.Types;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+public final class JsonMapType implements MapType {
+
+ final JsonObject map;
+ final boolean compressed;
+
+ public JsonMapType(final boolean compressed) {
+ this.map = new JsonObject();
+ this.compressed = compressed;
+ }
+
+ public JsonMapType(final JsonObject map, final boolean compressed) {
+ this.map = map;
+ this.compressed = compressed;
+ }
+
+ @Override
+ public TypeUtil<JsonElement> getTypeUtil() {
+ return this.compressed ? Types.JSON_COMPRESSED : Types.JSON;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj == null || obj.getClass() != JsonMapType.class) {
+ return false;
+ }
+
+ return this.map.equals(((JsonMapType)obj).map);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.map.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "JsonMapType{" +
+ "map=" + this.map +
+ ", compressed=" + this.compressed +
+ '}';
+ }
+
+ public JsonObject getJson() {
+ return this.map;
+ }
+
+ @Override
+ public int size() {
+ return this.map.entrySet().size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return this.map.entrySet().isEmpty();
+ }
+
+ @Override
+ public void clear() {
+ this.map.entrySet().clear();
+ }
+
+ @Override
+ public Set<String> keys() {
+ // ah shit. no keyset method
+ final Set<String> keys = new LinkedHashSet<>();
+
+ for (final Map.Entry<String, JsonElement> entry : this.map.entrySet()) {
+ keys.add(entry.getKey());
+ }
+
+ return keys;
+ }
+
+ @Override
+ public MapType copy() {
+ return new JsonMapType(this.map.deepCopy(), this.compressed);
+ }
+
+ @Override
+ public boolean hasKey(final String key) {
+ return this.map.has(key);
+ }
+
+ @Override
+ public boolean hasKey(final String key, final ObjectType type) {
+ final JsonElement element = this.map.get(key);
+ if (element == null) {
+ return false;
+ }
+
+ if (type == ObjectType.UNDEFINED) {
+ return true;
+ }
+
+ if (element.isJsonArray()) {
+ return type == ObjectType.LIST;
+ } else if (element.isJsonObject()) {
+ return type == ObjectType.MAP;
+ } else if (element.isJsonNull()) {
+ return false;
+ }
+
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isString()) {
+ return type == ObjectType.STRING || (this.compressed && type == ObjectType.NUMBER);
+ } else if (primitive.isBoolean()) {
+ return type.isNumber();
+ } else {
+ // is number
+ final Number number = primitive.getAsNumber();
+ if (number instanceof Byte) {
+ return type == ObjectType.BYTE || (this.compressed && type == ObjectType.STRING);
+ } else if (number instanceof Short) {
+ return type == ObjectType.SHORT || (this.compressed && type == ObjectType.STRING);
+ } else if (number instanceof Integer) {
+ return type == ObjectType.INT || (this.compressed && type == ObjectType.STRING);
+ } else if (number instanceof Long) {
+ return type == ObjectType.LONG || (this.compressed && type == ObjectType.STRING);
+ } else if (number instanceof Float) {
+ return type == ObjectType.FLOAT || (this.compressed && type == ObjectType.STRING);
+ } else {
+ return type == ObjectType.DOUBLE || (this.compressed && type == ObjectType.STRING);
+ }
+ }
+ }
+
+ @Override
+ public void remove(final String key) {
+ this.map.remove(key);
+ }
+
+ @Override
+ public Object getGeneric(final String key) {
+ final JsonElement element = this.map.get(key);
+ if (element == null || element.isJsonNull()) {
+ return null;
+ } else if (element.isJsonObject()) {
+ return new JsonMapType((JsonObject)element, this.compressed);
+ } else if (element.isJsonArray()) {
+ return new JsonListType((JsonArray)element, this.compressed);
+ } else {
+ // primitive
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isNumber()) {
+ return primitive.getAsNumber();
+ } else if (primitive.isString()) {
+ return primitive.getAsString();
+ } else if (primitive.isBoolean()) {
+ return Boolean.valueOf(primitive.getAsBoolean());
+ } else {
+ throw new IllegalStateException("Unknown json object " + element);
+ }
+ }
+ }
+
+ @Override
+ public Number getNumber(final String key) {
+ return this.getNumber(key, null);
+ }
+
+ @Override
+ public Number getNumber(final String key, final Number dfl) {
+ final JsonElement element = this.map.get(key);
+ if (element instanceof JsonPrimitive) {
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isNumber()) {
+ return primitive.getAsNumber();
+ } else if (primitive.isBoolean()) {
+ return primitive.getAsBoolean() ? Byte.valueOf((byte)1) : Byte.valueOf((byte)0);
+ } else if (this.compressed && primitive.isString()) {
+ try {
+ return Integer.valueOf(Integer.parseInt(primitive.getAsString()));
+ } catch (final NumberFormatException ex) {
+ return null;
+ }
+ }
+ }
+
+ return dfl;
+ }
+
+ @Override
+ public boolean getBoolean(final String key) {
+ return this.getBoolean(key, false);
+ }
+
+ @Override
+ public boolean getBoolean(final String key, final boolean dfl) {
+ final JsonElement element = this.map.get(key);
+ if (element instanceof JsonPrimitive) {
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isNumber()) {
+ return primitive.getAsNumber().byteValue() != 0;
+ } else if (primitive.isBoolean()) {
+ return primitive.getAsBoolean();
+ }
+ }
+
+ return dfl;
+ }
+
+ @Override
+ public void setBoolean(final String key, final boolean val) {
+ this.map.addProperty(key, Boolean.valueOf(val));
+ }
+
+ @Override
+ public byte getByte(final String key) {
+ return this.getByte(key, (byte)0);
+ }
+
+ @Override
+ public byte getByte(final String key, final byte dfl) {
+ final Number ret = this.getNumber(key, null);
+ return ret == null ? dfl : ret.byteValue();
+ }
+
+ @Override
+ public void setByte(final String key, final byte val) {
+ this.map.addProperty(key, Byte.valueOf(val));
+ }
+
+ @Override
+ public short getShort(final String key) {
+ return this.getShort(key, (short)0);
+ }
+
+ @Override
+ public short getShort(final String key, final short dfl) {
+ final Number ret = this.getNumber(key, null);
+ return ret == null ? dfl : ret.shortValue();
+ }
+
+ @Override
+ public void setShort(final String key, final short val) {
+ this.map.addProperty(key, Short.valueOf(val));
+ }
+
+ @Override
+ public int getInt(final String key) {
+ return this.getInt(key, 0);
+ }
+
+ @Override
+ public int getInt(final String key, final int dfl) {
+ final Number ret = this.getNumber(key, null);
+ return ret == null ? dfl : ret.intValue();
+ }
+
+ @Override
+ public void setInt(final String key, final int val) {
+ this.map.addProperty(key, Integer.valueOf(val));
+ }
+
+ @Override
+ public long getLong(final String key) {
+ return this.getLong(key, 0L);
+ }
+
+ @Override
+ public long getLong(final String key, final long dfl) {
+ final Number ret = this.getNumber(key, null);
+ return ret == null ? dfl : ret.longValue();
+ }
+
+ @Override
+ public void setLong(final String key, final long val) {
+ this.map.addProperty(key, Long.valueOf(val));
+ }
+
+ @Override
+ public float getFloat(final String key) {
+ return this.getFloat(key, 0.0F);
+ }
+
+ @Override
+ public float getFloat(final String key, final float dfl) {
+ final Number ret = this.getNumber(key, null);
+ return ret == null ? dfl : ret.floatValue();
+ }
+
+ @Override
+ public void setFloat(final String key, final float val) {
+ this.map.addProperty(key, Float.valueOf(val));
+ }
+
+ @Override
+ public double getDouble(final String key) {
+ return this.getDouble(key, 0.0D);
+ }
+
+ @Override
+ public double getDouble(final String key, final double dfl) {
+ final Number ret = this.getNumber(key, null);
+ return ret == null ? dfl : ret.doubleValue();
+ }
+
+ @Override
+ public void setDouble(final String key, final double val) {
+ this.map.addProperty(key, Double.valueOf(val));
+ }
+
+ @Override
+ public byte[] getBytes(final String key) {
+ return this.getBytes(key, null);
+ }
+
+ @Override
+ public byte[] getBytes(final String key, final byte[] dfl) {
+ return dfl;
+ }
+
+ @Override
+ public void setBytes(final String key, final byte[] val) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public short[] getShorts(final String key) {
+ return this.getShorts(key, null);
+ }
+
+ @Override
+ public short[] getShorts(final String key, final short[] dfl) {
+ return dfl;
+ }
+
+ @Override
+ public void setShorts(final String key, final short[] val) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int[] getInts(final String key) {
+ return this.getInts(key, null);
+ }
+
+ @Override
+ public int[] getInts(final String key, final int[] dfl) {
+ return dfl;
+ }
+
+ @Override
+ public void setInts(final String key, final int[] val) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public long[] getLongs(final String key) {
+ return this.getLongs(key, null);
+ }
+
+ @Override
+ public long[] getLongs(final String key, final long[] dfl) {
+ return dfl;
+ }
+
+ @Override
+ public void setLongs(final String key, final long[] val) {
+ // JSON does not support raw primitive arrays
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public ListType getListUnchecked(final String key) {
+ return this.getListUnchecked(key, null);
+ }
+
+ @Override
+ public ListType getListUnchecked(final String key, final ListType dfl) {
+ final JsonElement element = this.map.get(key);
+ if (element instanceof JsonArray) {
+ return new JsonListType((JsonArray)element, this.compressed);
+ }
+
+ return dfl;
+ }
+
+ @Override
+ public void setList(final String key, final ListType val) {
+ this.map.add(key, ((JsonListType)val).getJson());
+ }
+
+ @Override
+ public MapType getMap(final String key) {
+ return this.getMap(key, null);
+ }
+
+ @Override
+ public MapType getMap(final String key, final MapType dfl) {
+ final JsonElement element = this.map.get(key);
+ if (element instanceof JsonObject) {
+ return new JsonMapType((JsonObject)element, this.compressed);
+ }
+
+ return dfl;
+ }
+
+ @Override
+ public void setMap(final String key, final MapType val) {
+ this.map.add(key, ((JsonMapType)val).map);
+ }
+
+ @Override
+ public String getString(final String key) {
+ return this.getString(key, null);
+ }
+
+ @Override
+ public String getString(final String key, final String dfl) {
+ final JsonElement element = this.map.get(key);
+ if (element instanceof JsonPrimitive) {
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isString()) {
+ return primitive.getAsString();
+ } else if (this.compressed && primitive.isNumber()) {
+ return primitive.getAsString();
+ }
+ }
+
+ return dfl;
+ }
+
+ public String getForcedString(final String key) {
+ return this.getForcedString(key, null);
+ }
+
+ public String getForcedString(final String key, final String dfl) {
+ final JsonElement element = this.map.get(key);
+ if (element instanceof JsonPrimitive) {
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isString()) {
+ return primitive.getAsString();
+ } else if (primitive.isNumber()) {
+ return primitive.getAsString();
+ }
+
+ return primitive.toString();
+ } else if (element != null) {
+ return element.toString();
+ }
+
+ return dfl;
+ }
+
+ @Override
+ public void setString(final String key, final String val) {
+ this.map.addProperty(key, val);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java b/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ace24bdd5e5da4333e25c9c681007e6a85d52ab
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java
@@ -0,0 +1,181 @@
+package ca.spottedleaf.dataconverter.types.json;
+
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.CopyHelper;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import java.math.BigDecimal;
+import java.util.Map;
+
+public final class JsonTypeUtil implements TypeUtil<JsonElement> {
+
+ private final boolean compressed;
+
+ public JsonTypeUtil(final boolean compressed) {
+ this.compressed = compressed;
+ }
+
+ public boolean isCompressed() {
+ return this.compressed;
+ }
+
+ @Override
+ public ListType createEmptyList() {
+ return new JsonListType(this.compressed);
+ }
+
+ @Override
+ public MapType createEmptyMap() {
+ return new JsonMapType(this.compressed);
+ }
+
+ @Override
+ public Object convertTo(final Object valueGeneric, final TypeUtil<?> to) {
+ if (valueGeneric == null || valueGeneric instanceof String || valueGeneric instanceof Boolean) {
+ return valueGeneric;
+ }
+ if (valueGeneric instanceof Number number) {
+ if (CopyHelper.sanitizeNumber(number) == null) {
+ throw new IllegalStateException("Unknown type: " + number);
+ }
+ return number;
+ }
+ if (valueGeneric instanceof JsonListType listType) {
+ return convertJson(to, listType.array, this.compressed); // override input compression
+ }
+ if (valueGeneric instanceof JsonMapType mapType) {
+ return convertJson(to, mapType.map, this.compressed); // override input compression
+ }
+ throw new IllegalStateException("Unknown type: " + valueGeneric);
+ }
+
+ @Override
+ public Object convertFromBaseToGeneric(final JsonElement input, final TypeUtil<?> to) {
+ return convertJsonToGeneric(to, input, this.compressed);
+ }
+
+ @Override
+ public Object baseToGeneric(final JsonElement input) {
+ if (input == null) {
+ return null;
+ }
+ if (input instanceof JsonObject jsonObject) {
+ return new JsonMapType(jsonObject, this.compressed);
+ } else if (input instanceof JsonArray array) {
+ return new JsonListType(array, this.compressed);
+ } else if (input instanceof JsonNull) {
+ return null;
+ } else {
+ final JsonPrimitive primitive = (JsonPrimitive)input;
+ if (primitive.isBoolean()) {
+ return Boolean.valueOf(primitive.getAsBoolean());
+ } else if (primitive.isNumber()) {
+ final Number number = CopyHelper.sanitizeNumber(primitive.getAsNumber());
+ return number != null ? number : convertBDToGeneric(primitive.getAsBigDecimal());
+ } else if (primitive.isString()) {
+ return primitive.getAsString();
+ }
+ }
+
+ throw new IllegalStateException("Unrecognized type " + input);
+ }
+
+ @Override
+ public JsonElement genericToBase(final Object input) {
+ if (input == null) {
+ return JsonNull.INSTANCE;
+ } else if (input instanceof JsonMapType mapType) {
+ return mapType.map;
+ } else if (input instanceof JsonListType listType) {
+ return listType.array;
+ } else if (input instanceof Boolean bool) {
+ return new JsonPrimitive(bool);
+ } else if (input instanceof Number number) {
+ return new JsonPrimitive(number);
+ } else if (input instanceof String string) {
+ return new JsonPrimitive(string);
+ }
+
+ throw new IllegalStateException("Unrecognized type " + input);
+ }
+
+ private static Number convertBDToGeneric(final BigDecimal input) {
+ try {
+ final long l = input.longValueExact();
+ final byte b = (byte)l;
+ final short s = (short)l;
+ final int i = (int)l;
+
+ if ((long)b == l) {
+ return Byte.valueOf(b);
+ }
+ if ((long)s == l) {
+ return Short.valueOf(s);
+ }
+ if ((long)i == l) {
+ return Integer.valueOf(i);
+ }
+
+ return Long.valueOf(l);
+ } catch (final ArithmeticException ex) {
+ final double d = input.doubleValue(); // possibly lose precision!
+ final float f = (float)d;
+
+ return (double)f == d ? Float.valueOf(f) : Double.valueOf(d);
+ }
+ }
+
+ private static Object convertJsonToGeneric(final TypeUtil<?> to, final JsonElement element, final boolean compressed) {
+ if (element == null) {
+ return null;
+ }
+ if (element instanceof JsonObject jsonObject) {
+ return convertJson(to, jsonObject, compressed);
+ } else if (element instanceof JsonArray array) {
+ return convertJson(to, array, compressed);
+ } else if (element instanceof JsonNull) {
+ return null;
+ } else {
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isBoolean()) {
+ return Boolean.valueOf(primitive.getAsBoolean());
+ } else if (primitive.isNumber()) {
+ final Number number = CopyHelper.sanitizeNumber(primitive.getAsNumber());
+ return number != null ? number : convertBDToGeneric(primitive.getAsBigDecimal());
+ } else if (primitive.isString()) {
+ return primitive.getAsString();
+ }
+ }
+
+ throw new IllegalStateException("Unrecognized type " + element);
+ }
+
+ private static MapType convertJson(final TypeUtil<?> to, final JsonObject json, final boolean compressed) {
+ final MapType ret = to.createEmptyMap();
+ for (final Map.Entry<String, JsonElement> entry : json.entrySet()) {
+ final Object obj = convertJsonToGeneric(to, entry.getValue(), compressed);
+ if (obj == null) {
+ continue;
+ }
+
+ ret.setGeneric(entry.getKey(), obj);
+ }
+
+ return ret;
+ }
+
+ private static ListType convertJson(final TypeUtil<?> to, final JsonArray json, final boolean compressed) {
+ final ListType ret = to.createEmptyList();
+
+ for (int i = 0, len = json.size(); i < len; ++i) {
+ ret.addGeneric(convertJsonToGeneric(to, json.get(i), compressed));
+ }
+
+ return ret;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java b/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4882e90c8845694032e4a43e75bbf35c5eed873
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java
@@ -0,0 +1,582 @@
+package ca.spottedleaf.dataconverter.types.nbt;
+
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import ca.spottedleaf.dataconverter.types.Types;
+import net.minecraft.nbt.ByteArrayTag;
+import net.minecraft.nbt.ByteTag;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.DoubleTag;
+import net.minecraft.nbt.FloatTag;
+import net.minecraft.nbt.IntArrayTag;
+import net.minecraft.nbt.IntTag;
+import net.minecraft.nbt.ListTag;
+import net.minecraft.nbt.LongArrayTag;
+import net.minecraft.nbt.LongTag;
+import net.minecraft.nbt.NumericTag;
+import net.minecraft.nbt.ShortTag;
+import net.minecraft.nbt.StringTag;
+import net.minecraft.nbt.Tag;
+
+public final class NBTListType implements ListType {
+
+ final ListTag list;
+
+ public NBTListType() {
+ this.list = new ListTag();
+ }
+
+ public NBTListType(final ListTag tag) {
+ this.list = tag;
+ }
+
+ @Override
+ public TypeUtil<Tag> getTypeUtil() {
+ return Types.NBT;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || obj.getClass() != NBTListType.class) {
+ return false;
+ }
+
+ return this.list.equals(((NBTListType)obj).list);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.list.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "NBTListType{" +
+ "list=" + this.list +
+ '}';
+ }
+
+ public ListTag getTag() {
+ return this.list;
+ }
+
+ @Override
+ public ListType copy() {
+ return new NBTListType(this.list.copy());
+ }
+
+ static ObjectType getType(final byte id) {
+ switch (id) {
+ case Tag.TAG_END:
+ return ObjectType.NONE;
+ case Tag.TAG_BYTE:
+ return ObjectType.BYTE;
+ case Tag.TAG_SHORT:
+ return ObjectType.SHORT;
+ case Tag.TAG_INT:
+ return ObjectType.INT;
+ case Tag.TAG_LONG:
+ return ObjectType.LONG;
+ case Tag.TAG_FLOAT:
+ return ObjectType.FLOAT;
+ case Tag.TAG_DOUBLE:
+ return ObjectType.DOUBLE;
+ case Tag.TAG_BYTE_ARRAY:
+ return ObjectType.BYTE_ARRAY;
+ case Tag.TAG_STRING:
+ return ObjectType.STRING;
+ case Tag.TAG_LIST:
+ return ObjectType.LIST;
+ case Tag.TAG_COMPOUND:
+ return ObjectType.MAP;
+ case Tag.TAG_INT_ARRAY:
+ return ObjectType.INT_ARRAY;
+ case Tag.TAG_LONG_ARRAY:
+ return ObjectType.LONG_ARRAY;
+ default:
+ throw new IllegalStateException("Unknown type: " + id);
+ }
+ }
+
+ @Override
+ public ObjectType getUniformType() {
+ ObjectType curr = null;
+
+ for (int i = 0, len = this.list.size(); i < len; ++i) {
+ final Tag tag = this.list.get(i);
+ final ObjectType tagType = getType(tag.getId());
+ if (curr == null) {
+ curr = tagType;
+ } else if (tagType != curr) {
+ return ObjectType.MIXED;
+ }
+ }
+
+ return curr == null ? ObjectType.NONE : curr;
+ }
+
+ @Override
+ public int size() {
+ return this.list.size();
+ }
+
+ @Override
+ public void remove(final int index) {
+ this.list.remove(index);
+ }
+
+ @Override
+ public Object getGeneric(final int index) {
+ return Types.NBT.baseToGeneric(this.list.get(index));
+ }
+
+ @Override
+ public Number getNumber(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ throw new IllegalStateException();
+ }
+ return numericTag.box();
+ }
+
+ @Override
+ public Number getNumber(final int index, final Number dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ return dfl;
+ }
+ return numericTag.box();
+ }
+
+ @Override
+ public byte getByte(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ throw new IllegalStateException();
+ }
+ return numericTag.byteValue();
+ }
+
+ @Override
+ public byte getByte(final int index, final byte dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ return dfl;
+ }
+ return numericTag.byteValue();
+ }
+
+ @Override
+ public void setByte(final int index, final byte to) {
+ this.list.set(index, ByteTag.valueOf(to));
+ }
+
+ @Override
+ public short getShort(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ throw new IllegalStateException();
+ }
+ return numericTag.shortValue();
+ }
+
+ @Override
+ public short getShort(final int index, final short dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ return dfl;
+ }
+ return numericTag.shortValue();
+ }
+
+ @Override
+ public void setShort(final int index, final short to) {
+ this.list.set(index, ShortTag.valueOf(to));
+ }
+
+ @Override
+ public int getInt(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ throw new IllegalStateException();
+ }
+ return numericTag.intValue();
+ }
+
+ @Override
+ public int getInt(final int index, final int dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ return dfl;
+ }
+ return numericTag.intValue();
+ }
+
+ @Override
+ public void setInt(final int index, final int to) {
+ this.list.set(index, IntTag.valueOf(to));
+ }
+
+ @Override
+ public long getLong(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ throw new IllegalStateException();
+ }
+ return numericTag.longValue();
+ }
+
+ @Override
+ public long getLong(final int index, final long dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ return dfl;
+ }
+ return numericTag.longValue();
+ }
+
+ @Override
+ public void setLong(final int index, final long to) {
+ this.list.set(index, LongTag.valueOf(to));
+ }
+
+ @Override
+ public float getFloat(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ throw new IllegalStateException();
+ }
+ return numericTag.floatValue();
+ }
+
+ @Override
+ public float getFloat(final int index, final float dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ return dfl;
+ }
+ return numericTag.floatValue();
+ }
+
+ @Override
+ public void setFloat(final int index, final float to) {
+ this.list.set(index, FloatTag.valueOf(to));
+ }
+
+ @Override
+ public double getDouble(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ throw new IllegalStateException();
+ }
+ return numericTag.doubleValue();
+ }
+
+ @Override
+ public double getDouble(final int index, final double dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag numericTag)) {
+ return dfl;
+ }
+ return numericTag.doubleValue();
+ }
+
+ @Override
+ public void setDouble(final int index, final double to) {
+ this.list.set(index, DoubleTag.valueOf(to));
+ }
+
+ @Override
+ public byte[] getBytes(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof ByteArrayTag bytes)) {
+ throw new IllegalStateException();
+ }
+ return bytes.getAsByteArray();
+ }
+
+
+ @Override
+ public byte[] getBytes(final int index, final byte[] dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof ByteArrayTag bytes)) {
+ return dfl;
+ }
+ return bytes.getAsByteArray();
+ }
+
+ @Override
+ public void setBytes(final int index, final byte[] to) {
+ this.list.set(index, new ByteArrayTag(to));
+ }
+
+ @Override
+ public short[] getShorts(final int index) {
+ // NBT does not support shorts
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public short[] getShorts(final int index, final short[] dfl) {
+ // NBT does not support shorts
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setShorts(final int index, final short[] to) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int[] getInts(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof IntArrayTag ints)) {
+ throw new IllegalStateException();
+ }
+ return ints.getAsIntArray();
+ }
+
+ @Override
+ public int[] getInts(final int index, final int[] dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof IntArrayTag ints)) {
+ return dfl;
+ }
+ return ints.getAsIntArray();
+ }
+
+ @Override
+ public void setInts(final int index, final int[] to) {
+ this.list.set(index, new IntArrayTag(to));
+ }
+
+ @Override
+ public long[] getLongs(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof LongArrayTag longs)) {
+ throw new IllegalStateException();
+ }
+ return longs.getAsLongArray();
+ }
+
+ @Override
+ public long[] getLongs(final int index, final long[] dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof LongArrayTag longs)) {
+ return dfl;
+ }
+ return longs.getAsLongArray();
+ }
+
+ @Override
+ public void setLongs(final int index, final long[] to) {
+ this.list.set(index, new LongArrayTag(to));
+ }
+
+ @Override
+ public ListType getList(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof ListTag list)) {
+ throw new IllegalStateException();
+ }
+ return new NBTListType(list);
+ }
+
+ @Override
+ public ListType getList(final int index, final ListType dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof ListTag list)) {
+ return dfl;
+ }
+ return new NBTListType(list);
+ }
+
+ @Override
+ public void setList(final int index, final ListType list) {
+ this.list.set(index, ((NBTListType)list).getTag());
+ }
+
+ @Override
+ public MapType getMap(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof CompoundTag compoundTag)) {
+ throw new IllegalStateException();
+ }
+ return new NBTMapType(compoundTag);
+ }
+
+ @Override
+ public MapType getMap(final int index, final MapType dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof CompoundTag compoundTag)) {
+ return dfl;
+ }
+ return new NBTMapType(compoundTag);
+ }
+
+ @Override
+ public void setMap(final int index, final MapType to) {
+ this.list.set(index, ((NBTMapType)to).getTag());
+ }
+
+ @Override
+ public String getString(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof StringTag stringTag)) {
+ throw new IllegalStateException();
+ }
+ return stringTag.value();
+ }
+
+
+ @Override
+ public String getString(final int index, final String dfl) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof StringTag stringTag)) {
+ return dfl;
+ }
+ return stringTag.value();
+ }
+
+ @Override
+ public void setString(final int index, final String to) {
+ this.list.set(index, StringTag.valueOf(to));
+ }
+
+ @Override
+ public void addByte(final byte b) {
+ this.list.add(ByteTag.valueOf(b));
+ }
+
+ @Override
+ public void addByte(final int index, final byte b) {
+ this.list.add(index, ByteTag.valueOf(b));
+ }
+
+ @Override
+ public void addShort(final short s) {
+ this.list.add(ShortTag.valueOf(s));
+ }
+
+ @Override
+ public void addShort(final int index, final short s) {
+ this.list.add(index, ShortTag.valueOf(s));
+ }
+
+ @Override
+ public void addInt(final int i) {
+ this.list.add(IntTag.valueOf(i));
+ }
+
+ @Override
+ public void addInt(final int index, final int i) {
+ this.list.add(index, IntTag.valueOf(i));
+ }
+
+ @Override
+ public void addLong(final long l) {
+ this.list.add(LongTag.valueOf(l));
+ }
+
+ @Override
+ public void addLong(final int index, final long l) {
+ this.list.add(index, LongTag.valueOf(l));
+ }
+
+ @Override
+ public void addFloat(final float f) {
+ this.list.add(FloatTag.valueOf(f));
+ }
+
+ @Override
+ public void addFloat(final int index, final float f) {
+ this.list.add(index, FloatTag.valueOf(f));
+ }
+
+ @Override
+ public void addDouble(final double d) {
+ this.list.add(DoubleTag.valueOf(d));
+ }
+
+ @Override
+ public void addDouble(final int index, final double d) {
+ this.list.add(index, DoubleTag.valueOf(d));
+ }
+
+ @Override
+ public void addByteArray(final byte[] arr) {
+ this.list.add(new ByteArrayTag(arr));
+ }
+
+ @Override
+ public void addByteArray(final int index, final byte[] arr) {
+ this.list.add(index, new ByteArrayTag(arr));
+ }
+
+ @Override
+ public void addShortArray(final short[] arr) {
+ // NBT does not support short[]
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addShortArray(final int index, final short[] arr) {
+ // NBT does not support short[]
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addIntArray(final int[] arr) {
+ this.list.add(new IntArrayTag(arr));
+ }
+
+ @Override
+ public void addIntArray(final int index, final int[] arr) {
+ this.list.add(index, new IntArrayTag(arr));
+ }
+
+ @Override
+ public void addLongArray(final long[] arr) {
+ this.list.add(new LongArrayTag(arr));
+ }
+
+ @Override
+ public void addLongArray(final int index, final long[] arr) {
+ this.list.add(index, new LongArrayTag(arr));
+ }
+
+ @Override
+ public void addList(final ListType list) {
+ this.list.add(((NBTListType)list).getTag());
+ }
+
+ @Override
+ public void addList(final int index, final ListType list) {
+ this.list.add(index, ((NBTListType)list).getTag());
+ }
+
+ @Override
+ public void addMap(final MapType map) {
+ this.list.add(((NBTMapType)map).getTag());
+ }
+
+ @Override
+ public void addMap(final int index, final MapType map) {
+ this.list.add(index, ((NBTMapType)map).getTag());
+ }
+
+ @Override
+ public void addString(final String string) {
+ this.list.add(StringTag.valueOf(string));
+ }
+
+ @Override
+ public void addString(final int index, final String string) {
+ this.list.add(index, StringTag.valueOf(string));
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java b/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java
new file mode 100644
index 0000000000000000000000000000000000000000..2558d9014e1daff6dd4a44ad85bbc0254c7de056
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java
@@ -0,0 +1,442 @@
+package ca.spottedleaf.dataconverter.types.nbt;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import ca.spottedleaf.dataconverter.types.Types;
+import net.minecraft.nbt.ByteArrayTag;
+import net.minecraft.nbt.ByteTag;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.IntArrayTag;
+import net.minecraft.nbt.ListTag;
+import net.minecraft.nbt.LongArrayTag;
+import net.minecraft.nbt.NumericTag;
+import net.minecraft.nbt.StringTag;
+import net.minecraft.nbt.StringTagVisitor;
+import net.minecraft.nbt.Tag;
+
+import java.util.Set;
+
+public final class NBTMapType implements MapType {
+
+ final CompoundTag map;
+
+ public NBTMapType() {
+ this.map = new CompoundTag();
+ }
+
+ public NBTMapType(final CompoundTag tag) {
+ this.map = tag;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || obj.getClass() != NBTMapType.class) {
+ return false;
+ }
+
+ return this.map.equals(((NBTMapType)obj).map);
+ }
+
+ @Override
+ public TypeUtil<Tag> getTypeUtil() {
+ return Types.NBT;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.map.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "NBTMapType{" +
+ "map=" + this.map +
+ '}';
+ }
+
+ @Override
+ public int size() {
+ return this.map.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return this.map.isEmpty();
+ }
+
+ @Override
+ public void clear() {
+ this.map.keySet().clear();
+ }
+
+ @Override
+ public Set<String> keys() {
+ return this.map.keySet();
+ }
+
+ public CompoundTag getTag() {
+ return this.map;
+ }
+
+ @Override
+ public MapType copy() {
+ return new NBTMapType(this.map.copy());
+ }
+
+ @Override
+ public boolean hasKey(final String key) {
+ return this.map.get(key) != null;
+ }
+
+ @Override
+ public boolean hasKey(final String key, final ObjectType type) {
+ final Tag tag = this.map.get(key);
+ if (tag == null) {
+ return false;
+ }
+
+ final ObjectType valueType = NBTListType.getType(tag.getId());
+
+ return valueType == type || (type == ObjectType.NUMBER && valueType.isNumber());
+ }
+
+ @Override
+ public void remove(final String key) {
+ this.map.remove(key);
+ }
+
+ @Override
+ public Object getGeneric(final String key) {
+ final Tag tag = this.map.get(key);
+ if (tag == null) {
+ return null;
+ }
+
+ switch (NBTListType.getType(tag.getId())) {
+ case BYTE:
+ case SHORT:
+ case INT:
+ case LONG:
+ case FLOAT:
+ case DOUBLE:
+ return ((NumericTag)tag).box();
+ case MAP:
+ return new NBTMapType((CompoundTag)tag);
+ case LIST:
+ return new NBTListType((ListTag)tag);
+ case STRING:
+ return ((StringTag)tag).value();
+ case BYTE_ARRAY:
+ return ((ByteArrayTag)tag).getAsByteArray();
+ // Note: No short array tag!
+ case INT_ARRAY:
+ return ((IntArrayTag)tag).getAsIntArray();
+ case LONG_ARRAY:
+ return ((LongArrayTag)tag).getAsLongArray();
+ }
+
+ throw new IllegalStateException("Unrecognized type " + tag);
+ }
+
+ @Override
+ public Number getNumber(final String key) {
+ return this.getNumber(key, null);
+ }
+
+ @Override
+ public Number getNumber(final String key, final Number dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numTag) {
+ return numTag.box();
+ }
+ return dfl;
+ }
+
+ @Override
+ public boolean getBoolean(final String key) {
+ return this.getByte(key) != 0;
+ }
+
+ @Override
+ public boolean getBoolean(final String key, final boolean dfl) {
+ return this.getByte(key, dfl ? (byte)1 : (byte)0) != 0;
+ }
+
+ @Override
+ public void setBoolean(final String key, final boolean val) {
+ this.setByte(key, val ? (byte)1 : (byte)0);
+ }
+
+ @Override
+ public byte getByte(final String key) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.byteValue();
+ }
+ return 0;
+ }
+
+ @Override
+ public byte getByte(final String key, final byte dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.byteValue();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setByte(final String key, final byte val) {
+ this.map.putByte(key, val);
+ }
+
+ @Override
+ public short getShort(final String key) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.shortValue();
+ }
+ return 0;
+ }
+
+ @Override
+ public short getShort(final String key, final short dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.shortValue();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setShort(final String key, final short val) {
+ this.map.putShort(key, val);
+ }
+
+ @Override
+ public int getInt(final String key) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.intValue();
+ }
+ return 0;
+ }
+
+ @Override
+ public int getInt(final String key, final int dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.intValue();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setInt(final String key, final int val) {
+ this.map.putInt(key, val);
+ }
+
+ @Override
+ public long getLong(final String key) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.longValue();
+ }
+ return 0;
+ }
+
+ @Override
+ public long getLong(final String key, final long dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.longValue();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setLong(final String key, final long val) {
+ this.map.putLong(key, val);
+ }
+
+ @Override
+ public float getFloat(final String key) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.floatValue();
+ }
+ return 0;
+ }
+
+ @Override
+ public float getFloat(final String key, final float dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.floatValue();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setFloat(final String key, final float val) {
+ this.map.putFloat(key, val);
+ }
+
+ @Override
+ public double getDouble(final String key) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.doubleValue();
+ }
+ return 0;
+ }
+
+ @Override
+ public double getDouble(final String key, final double dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag numericTag) {
+ return numericTag.doubleValue();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setDouble(final String key, final double val) {
+ this.map.putDouble(key, val);
+ }
+
+ @Override
+ public byte[] getBytes(final String key) {
+ return this.getBytes(key, null);
+ }
+
+ @Override
+ public byte[] getBytes(final String key, final byte[] dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof ByteArrayTag byteArrayTag) {
+ return byteArrayTag.getAsByteArray();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setBytes(final String key, final byte[] val) {
+ this.map.putByteArray(key, val);
+ }
+
+ @Override
+ public short[] getShorts(final String key) {
+ return this.getShorts(key, null);
+ }
+
+ @Override
+ public short[] getShorts(final String key, final short[] dfl) {
+ // NBT does not support short array
+ return dfl;
+ }
+
+ @Override
+ public void setShorts(final String key, final short[] val) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int[] getInts(final String key) {
+ return this.getInts(key, null);
+ }
+
+ @Override
+ public int[] getInts(final String key, final int[] dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof IntArrayTag intArrayTag) {
+ return intArrayTag.getAsIntArray();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setInts(final String key, final int[] val) {
+ this.map.putIntArray(key, val);
+ }
+
+ @Override
+ public long[] getLongs(final String key) {
+ return this.getLongs(key, null);
+ }
+
+ @Override
+ public long[] getLongs(final String key, final long[] dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof LongArrayTag longArrayTag) {
+ return longArrayTag.getAsLongArray();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setLongs(final String key, final long[] val) {
+ this.map.putLongArray(key, val);
+ }
+
+ @Override
+ public ListType getListUnchecked(final String key) {
+ return this.getListUnchecked(key, null);
+ }
+
+ @Override
+ public ListType getListUnchecked(final String key, final ListType dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof ListTag listTag) {
+ return new NBTListType(listTag);
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setList(final String key, final ListType val) {
+ this.map.put(key, ((NBTListType)val).getTag());
+ }
+
+ @Override
+ public MapType getMap(final String key) {
+ return this.getMap(key, null);
+ }
+
+ @Override
+ public MapType getMap(final String key, final MapType dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof CompoundTag compoundTag) {
+ return new NBTMapType(compoundTag);
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setMap(final String key, final MapType val) {
+ this.map.put(key, ((NBTMapType)val).getTag());
+ }
+
+ @Override
+ public String getString(final String key) {
+ return this.getString(key, null);
+ }
+
+ @Override
+ public String getString(final String key, final String dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof StringTag strTag) {
+ return strTag.value();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setString(final String key, final String val) {
+ this.map.putString(key, val);
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java b/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..61e98240a221a75780e311c0777a8c43c4297d65
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java
@@ -0,0 +1,128 @@
+package ca.spottedleaf.dataconverter.types.nbt;
+
+import ca.spottedleaf.dataconverter.minecraft.converters.helpers.CopyHelper;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import net.minecraft.nbt.ByteArrayTag;
+import net.minecraft.nbt.ByteTag;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.EndTag;
+import net.minecraft.nbt.IntArrayTag;
+import net.minecraft.nbt.IntTag;
+import net.minecraft.nbt.ListTag;
+import net.minecraft.nbt.LongArrayTag;
+import net.minecraft.nbt.LongTag;
+import net.minecraft.nbt.NumericTag;
+import net.minecraft.nbt.ShortTag;
+import net.minecraft.nbt.StringTag;
+import net.minecraft.nbt.Tag;
+
+public final class NBTTypeUtil implements TypeUtil<Tag> {
+
+ @Override
+ public ListType createEmptyList() {
+ return new NBTListType();
+ }
+
+ @Override
+ public MapType createEmptyMap() {
+ return new NBTMapType();
+ }
+
+ @Override
+ public Object convertTo(final Object valueGeneric, final TypeUtil<?> to) {
+ if (valueGeneric == null || valueGeneric instanceof String || valueGeneric instanceof Boolean) {
+ return valueGeneric;
+ }
+ if (valueGeneric instanceof Number number) {
+ if (CopyHelper.sanitizeNumber(number) == null) {
+ throw new IllegalStateException("Unknown type: " + number);
+ }
+ return number;
+ }
+ if (valueGeneric instanceof NBTListType listType) {
+ return convertNBT(to, listType.list);
+ }
+ if (valueGeneric instanceof NBTMapType mapType) {
+ return convertNBT(to, mapType.map);
+ }
+ throw new IllegalStateException("Unknown type: " + valueGeneric);
+ }
+
+ @Override
+ public Object convertFromBaseToGeneric(final Tag input, final TypeUtil<?> to) {
+ return convertNBTToGeneric(to, input);
+ }
+
+ @Override
+ public Object baseToGeneric(final Tag input) {
+ return switch (input) {
+ case CompoundTag ct -> new NBTMapType(ct);
+ case ListTag lt -> new NBTListType(lt);
+ case EndTag endTag -> null;
+ case StringTag st -> st.value();
+ case ByteArrayTag bt -> bt.getAsByteArray();
+ case IntArrayTag it -> it.getAsIntArray();
+ case LongArrayTag lt -> lt.getAsLongArray();
+ case NumericTag nt -> nt.box();
+ case null -> null;
+ default -> throw new IllegalStateException("Unknown tag: " + input);
+ };
+ }
+
+ @Override
+ public Tag genericToBase(final Object input) {
+ return switch (input) {
+ case null -> EndTag.INSTANCE;
+ case NBTMapType mapType -> mapType.map;
+ case NBTListType listType -> listType.list;
+ case String string -> StringTag.valueOf(string);
+ case Boolean bool -> ByteTag.valueOf(bool.booleanValue());
+ case Byte b -> ByteTag.valueOf(b.byteValue());
+ case Short s -> ShortTag.valueOf(s.shortValue());
+ case Integer i -> IntTag.valueOf(i.intValue());
+ case Long l -> LongTag.valueOf(l.longValue());
+ case byte[] bytes -> new ByteArrayTag(bytes);
+ case int[] ints -> new IntArrayTag(ints);
+ case long[] longs -> new LongArrayTag(longs);
+
+ default -> throw new IllegalStateException("Unrecognized type " + input);
+ };
+ }
+
+ private static Object convertNBTToGeneric(final TypeUtil<?> to, final Tag nbt) {
+ return switch (nbt) {
+ case CompoundTag ct -> convertNBT(to, ct);
+ case ListTag lt -> convertNBT(to, lt);
+ case EndTag endTag -> null;
+ case StringTag st -> st.value();
+ case ByteArrayTag bt -> bt.getAsByteArray();
+ case IntArrayTag it -> it.getAsIntArray();
+ case LongArrayTag lt -> lt.getAsLongArray();
+ case NumericTag nt -> nt.box();
+ case null -> null;
+ default -> throw new IllegalStateException("Unknown tag: " + nbt);
+ };
+ }
+
+ public static MapType convertNBT(final TypeUtil<?> to, final CompoundTag nbt) {
+ final MapType ret = to.createEmptyMap();
+
+ for (final String key : nbt.keySet()) {
+ ret.setGeneric(key, convertNBTToGeneric(to, nbt.get(key)));
+ }
+
+ return ret;
+ }
+
+ public static ListType convertNBT(final TypeUtil<?> to, final ListTag nbt) {
+ final ListType ret = to.createEmptyList();
+
+ for (int i = 0, len = nbt.size(); i < len; ++i) {
+ ret.addGeneric(convertNBTToGeneric(to, nbt.get(i)));
+ }
+
+ return ret;
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/util/Int2IntArraySortedMap.java b/ca/spottedleaf/dataconverter/util/Int2IntArraySortedMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..6596de3d9ebae583c252aa061f0cfdf8778ea1a5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/util/Int2IntArraySortedMap.java
@@ -0,0 +1,77 @@
+package ca.spottedleaf.dataconverter.util;
+
+import it.unimi.dsi.fastutil.ints.Int2IntFunction;
+
+import java.util.Arrays;
+
+public class Int2IntArraySortedMap {
+
+ protected int[] key;
+ protected int[] val;
+ protected int size;
+
+ public Int2IntArraySortedMap() {
+ this.key = new int[8];
+ this.val = new int[8];
+ }
+
+ public int put(final int key, final int value) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index >= 0) {
+ final int current = this.val[index];
+ this.val[index] = value;
+ return current;
+ }
+ final int insert = -(index + 1);
+ // shift entries down
+ if (this.size >= this.val.length) {
+ this.key = Arrays.copyOf(this.key, this.key.length * 2);
+ this.val = Arrays.copyOf(this.val, this.val.length * 2);
+ }
+ System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert);
+ System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert);
+ ++this.size;
+
+ this.key[insert] = key;
+ this.val[insert] = value;
+
+ return 0;
+ }
+
+ public int computeIfAbsent(final int key, final Int2IntFunction producer) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index >= 0) {
+ return this.val[index];
+ }
+ final int insert = -(index + 1);
+ // shift entries down
+ if (this.size >= this.val.length) {
+ this.key = Arrays.copyOf(this.key, this.key.length * 2);
+ this.val = Arrays.copyOf(this.val, this.val.length * 2);
+ }
+ System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert);
+ System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert);
+ ++this.size;
+
+ this.key[insert] = key;
+
+ return this.val[insert] = producer.apply(key);
+ }
+
+ public int get(final int key) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index < 0) {
+ return 0;
+ }
+ return this.val[index];
+ }
+
+ public int getFloor(final int key) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index < 0) {
+ final int insert = -(index + 1) - 1;
+ return insert < 0 ? 0 : this.val[insert];
+ }
+ return this.val[index];
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/util/Int2ObjectArraySortedMap.java b/ca/spottedleaf/dataconverter/util/Int2ObjectArraySortedMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..de9d632489609136c712a9adaee941fd38fad440
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/util/Int2ObjectArraySortedMap.java
@@ -0,0 +1,74 @@
+package ca.spottedleaf.dataconverter.util;
+
+import java.util.Arrays;
+import java.util.function.IntFunction;
+
+public class Int2ObjectArraySortedMap<V> {
+
+ protected int[] key;
+ protected V[] val;
+ protected int size;
+
+ public Int2ObjectArraySortedMap() {
+ this.key = new int[8];
+ this.val = (V[])new Object[8];
+ }
+
+ public V put(final int key, final V value) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index >= 0) {
+ final V current = this.val[index];
+ this.val[index] = value;
+ return current;
+ }
+ final int insert = -(index + 1);
+ // shift entries down
+ if (this.size >= this.val.length) {
+ this.key = Arrays.copyOf(this.key, this.key.length * 2);
+ this.val = Arrays.copyOf(this.val, this.val.length * 2);
+ }
+ System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert);
+ System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert);
+
+ this.key[insert] = key;
+ this.val[insert] = value;
+
+ return null;
+ }
+
+ public V computeIfAbsent(final int key, final IntFunction<V> producer) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index >= 0) {
+ return this.val[index];
+ }
+ final int insert = -(index + 1);
+ // shift entries down
+ if (this.size >= this.val.length) {
+ this.key = Arrays.copyOf(this.key, this.key.length * 2);
+ this.val = Arrays.copyOf(this.val, this.val.length * 2);
+ }
+ System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert);
+ System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert);
+
+ this.key[insert] = key;
+
+ return this.val[insert] = producer.apply(key);
+ }
+
+ public V get(final int key) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index < 0) {
+ return null;
+ }
+ return this.val[index];
+ }
+
+ public V getFloor(final int key) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index < 0) {
+ final int insert = -(index + 1);
+ return this.val[insert];
+ }
+ return this.val[index];
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/util/IntegerUtil.java b/ca/spottedleaf/dataconverter/util/IntegerUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4bbf38c812feeb30d2aa5f3fcf482bfcbed79d05
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/util/IntegerUtil.java
@@ -0,0 +1,239 @@
+package ca.spottedleaf.dataconverter.util;
+
+public final class IntegerUtil {
+ public static final int HIGH_BIT_U32 = Integer.MIN_VALUE;
+ public static final long HIGH_BIT_U64 = Long.MIN_VALUE;
+
+ public static int ceilLog2(final int value) {
+ return Integer.SIZE - Integer.numberOfLeadingZeros(value - 1); // see doc of numberOfLeadingZeros
+ }
+
+ public static long ceilLog2(final long value) {
+ return Long.SIZE - Long.numberOfLeadingZeros(value - 1); // see doc of numberOfLeadingZeros
+ }
+
+ public static int floorLog2(final int value) {
+ // xor is optimized subtract for 2^n -1
+ // note that (2^n -1) - k = (2^n -1) ^ k for k <= (2^n - 1)
+ return (Integer.SIZE - 1) ^ Integer.numberOfLeadingZeros(value); // see doc of numberOfLeadingZeros
+ }
+
+ public static int floorLog2(final long value) {
+ // xor is optimized subtract for 2^n -1
+ // note that (2^n -1) - k = (2^n -1) ^ k for k <= (2^n - 1)
+ return (Long.SIZE - 1) ^ Long.numberOfLeadingZeros(value); // see doc of numberOfLeadingZeros
+ }
+
+ public static int roundCeilLog2(final int value) {
+ // optimized variant of 1 << (32 - leading(val - 1))
+ // given
+ // 1 << n = HIGH_BIT_32 >>> (31 - n) for n [0, 32)
+ // 1 << (32 - leading(val - 1)) = HIGH_BIT_32 >>> (31 - (32 - leading(val - 1)))
+ // HIGH_BIT_32 >>> (31 - (32 - leading(val - 1)))
+ // HIGH_BIT_32 >>> (31 - 32 + leading(val - 1))
+ // HIGH_BIT_32 >>> (-1 + leading(val - 1))
+ return HIGH_BIT_U32 >>> (Integer.numberOfLeadingZeros(value - 1) - 1);
+ }
+
+ public static long roundCeilLog2(final long value) {
+ // see logic documented above
+ return HIGH_BIT_U64 >>> (Long.numberOfLeadingZeros(value - 1) - 1);
+ }
+
+ public static int roundFloorLog2(final int value) {
+ // optimized variant of 1 << (31 - leading(val))
+ // given
+ // 1 << n = HIGH_BIT_32 >>> (31 - n) for n [0, 32)
+ // 1 << (31 - leading(val)) = HIGH_BIT_32 >> (31 - (31 - leading(val)))
+ // HIGH_BIT_32 >> (31 - (31 - leading(val)))
+ // HIGH_BIT_32 >> (31 - 31 + leading(val))
+ return HIGH_BIT_U32 >>> Integer.numberOfLeadingZeros(value);
+ }
+
+ public static long roundFloorLog2(final long value) {
+ // see logic documented above
+ return HIGH_BIT_U64 >>> Long.numberOfLeadingZeros(value);
+ }
+
+ public static boolean isPowerOfTwo(final int n) {
+ // 2^n has one bit
+ // note: this rets true for 0 still
+ return IntegerUtil.getTrailingBit(n) == n;
+ }
+
+ public static boolean isPowerOfTwo(final long n) {
+ // 2^n has one bit
+ // note: this rets true for 0 still
+ return IntegerUtil.getTrailingBit(n) == n;
+ }
+
+ public static int getTrailingBit(final int n) {
+ return -n & n;
+ }
+
+ public static long getTrailingBit(final long n) {
+ return -n & n;
+ }
+
+ public static int trailingZeros(final int n) {
+ return Integer.numberOfTrailingZeros(n);
+ }
+
+ public static int trailingZeros(final long n) {
+ return Long.numberOfTrailingZeros(n);
+ }
+
+ // from hacker's delight (signed division magic value)
+ public static int getDivisorMultiple(final long numbers) {
+ return (int)(numbers >>> 32);
+ }
+
+ // from hacker's delight (signed division magic value)
+ public static int getDivisorShift(final long numbers) {
+ return (int)numbers;
+ }
+
+ public static long getDivisorNumbers(final int d) {
+ final int ad = branchlessAbs(d);
+
+ if (ad < 2) {
+ throw new IllegalArgumentException("|number| must be in [2, 2^31 -1], not: " + d);
+ }
+
+ final int two31 = 0x80000000;
+ final long mask = 0xFFFFFFFFL; // mask for enforcing unsigned behaviour
+
+ /*
+ Signed usage:
+ int number;
+ long magic = getDivisorNumbers(div);
+ long mul = magic >>> 32;
+ int sign = number >> 31;
+ int result = (int)(((long)number * mul) >>> magic) - sign;
+ */
+ /*
+ Unsigned usage:
+ int number;
+ long magic = getDivisorNumbers(div);
+ long mul = magic >>> 32;
+ int result = (int)(((long)number * mul) >>> magic);
+ */
+
+ int p = 31;
+
+ // all these variables are UNSIGNED!
+ int t = two31 + (d >>> 31);
+ int anc = t - 1 - (int)((t & mask)%ad);
+ int q1 = (int)((two31 & mask)/(anc & mask));
+ int r1 = two31 - q1*anc;
+ int q2 = (int)((two31 & mask)/(ad & mask));
+ int r2 = two31 - q2*ad;
+ int delta;
+
+ do {
+ p = p + 1;
+ q1 = 2*q1; // Update q1 = 2**p/|nc|.
+ r1 = 2*r1; // Update r1 = rem(2**p, |nc|).
+ if ((r1 & mask) >= (anc & mask)) {// (Must be an unsigned comparison here)
+ q1 = q1 + 1;
+ r1 = r1 - anc;
+ }
+ q2 = 2*q2; // Update q2 = 2**p/|d|.
+ r2 = 2*r2; // Update r2 = rem(2**p, |d|).
+ if ((r2 & mask) >= (ad & mask)) {// (Must be an unsigned comparison here)
+ q2 = q2 + 1;
+ r2 = r2 - ad;
+ }
+ delta = ad - r2;
+ } while ((q1 & mask) < (delta & mask) || (q1 == delta && r1 == 0));
+
+ int magicNum = q2 + 1;
+ if (d < 0) {
+ magicNum = -magicNum;
+ }
+ int shift = p;
+ return ((long)magicNum << 32) | shift;
+ }
+
+ public static int branchlessAbs(final int val) {
+ // -n = -1 ^ n + 1
+ final int mask = val >> (Integer.SIZE - 1); // -1 if < 0, 0 if >= 0
+ return (mask ^ val) - mask; // if val < 0, then (0 ^ val) - 0 else (-1 ^ val) + 1
+ }
+
+ public static long branchlessAbs(final long val) {
+ // -n = -1 ^ n + 1
+ final long mask = val >> (Long.SIZE - 1); // -1 if < 0, 0 if >= 0
+ return (mask ^ val) - mask; // if val < 0, then (0 ^ val) - 0 else (-1 ^ val) + 1
+ }
+
+ //https://github.com/skeeto/hash-prospector for hash functions
+
+ //score = ~590.47984224483832
+ public static int hash0(int x) {
+ x *= 0x36935555;
+ x ^= x >>> 16;
+ return x;
+ }
+
+ //score = ~310.01596637036749
+ public static int hash1(int x) {
+ x ^= x >>> 15;
+ x *= 0x356aaaad;
+ x ^= x >>> 17;
+ return x;
+ }
+
+ public static int hash2(int x) {
+ x ^= x >>> 16;
+ x *= 0x7feb352d;
+ x ^= x >>> 15;
+ x *= 0x846ca68b;
+ x ^= x >>> 16;
+ return x;
+ }
+
+ public static int hash3(int x) {
+ x ^= x >>> 17;
+ x *= 0xed5ad4bb;
+ x ^= x >>> 11;
+ x *= 0xac4c1b51;
+ x ^= x >>> 15;
+ x *= 0x31848bab;
+ x ^= x >>> 14;
+ return x;
+ }
+
+ //score = ~365.79959673201887
+ public static long hash1(long x) {
+ x ^= x >>> 27;
+ x *= 0xb24924b71d2d354bL;
+ x ^= x >>> 28;
+ return x;
+ }
+
+ //h2 hash
+ public static long hash2(long x) {
+ x ^= x >>> 32;
+ x *= 0xd6e8feb86659fd93L;
+ x ^= x >>> 32;
+ x *= 0xd6e8feb86659fd93L;
+ x ^= x >>> 32;
+ return x;
+ }
+
+ public static long hash3(long x) {
+ x ^= x >>> 45;
+ x *= 0xc161abe5704b6c79L;
+ x ^= x >>> 41;
+ x *= 0xe3e5389aedbc90f7L;
+ x ^= x >>> 56;
+ x *= 0x1f9aba75a52db073L;
+ x ^= x >>> 53;
+ return x;
+ }
+
+ private IntegerUtil() {
+ throw new RuntimeException();
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/util/Long2IntArraySortedMap.java b/ca/spottedleaf/dataconverter/util/Long2IntArraySortedMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..94705bb141b550589faa9a0408402d8636c61907
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/util/Long2IntArraySortedMap.java
@@ -0,0 +1,76 @@
+package ca.spottedleaf.dataconverter.util;
+
+import it.unimi.dsi.fastutil.longs.Long2IntFunction;
+import java.util.Arrays;
+
+public class Long2IntArraySortedMap {
+
+ protected long[] key;
+ protected int[] val;
+ protected int size;
+
+ public Long2IntArraySortedMap() {
+ this.key = new long[8];
+ this.val = new int[8];
+ }
+
+ public int put(final long key, final int value) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index >= 0) {
+ final int current = this.val[index];
+ this.val[index] = value;
+ return current;
+ }
+ final int insert = -(index + 1);
+ // shift entries down
+ if (this.size >= this.val.length) {
+ this.key = Arrays.copyOf(this.key, this.key.length * 2);
+ this.val = Arrays.copyOf(this.val, this.val.length * 2);
+ }
+ System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert);
+ System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert);
+ ++this.size;
+
+ this.key[insert] = key;
+ this.val[insert] = value;
+
+ return 0;
+ }
+
+ public int computeIfAbsent(final long key, final Long2IntFunction producer) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index >= 0) {
+ return this.val[index];
+ }
+ final int insert = -(index + 1);
+ // shift entries down
+ if (this.size >= this.val.length) {
+ this.key = Arrays.copyOf(this.key, this.key.length * 2);
+ this.val = Arrays.copyOf(this.val, this.val.length * 2);
+ }
+ System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert);
+ System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert);
+ ++this.size;
+
+ this.key[insert] = key;
+
+ return this.val[insert] = producer.apply(key);
+ }
+
+ public int get(final long key) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index < 0) {
+ return 0;
+ }
+ return this.val[index];
+ }
+
+ public int getFloor(final long key) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index < 0) {
+ final int insert = -(index + 1) - 1;
+ return insert < 0 ? 0 : this.val[insert];
+ }
+ return this.val[index];
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/util/Long2ObjectArraySortedMap.java b/ca/spottedleaf/dataconverter/util/Long2ObjectArraySortedMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f634c8825589a23f46ad7b54354475c9a95bd1b
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/util/Long2ObjectArraySortedMap.java
@@ -0,0 +1,76 @@
+package ca.spottedleaf.dataconverter.util;
+
+import java.util.Arrays;
+import java.util.function.LongFunction;
+
+public class Long2ObjectArraySortedMap<V> {
+
+ protected long[] key;
+ protected V[] val;
+ protected int size;
+
+ public Long2ObjectArraySortedMap() {
+ this.key = new long[8];
+ this.val = (V[])new Object[8];
+ }
+
+ public V put(final long key, final V value) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index >= 0) {
+ final V current = this.val[index];
+ this.val[index] = value;
+ return current;
+ }
+ final int insert = -(index + 1);
+ // shift entries down
+ if (this.size >= this.val.length) {
+ this.key = Arrays.copyOf(this.key, this.key.length * 2);
+ this.val = Arrays.copyOf(this.val, this.val.length * 2);
+ }
+ System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert);
+ System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert);
+ ++this.size;
+
+ this.key[insert] = key;
+ this.val[insert] = value;
+
+ return null;
+ }
+
+ public V computeIfAbsent(final long key, final LongFunction<V> producer) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index >= 0) {
+ return this.val[index];
+ }
+ final int insert = -(index + 1);
+ // shift entries down
+ if (this.size >= this.val.length) {
+ this.key = Arrays.copyOf(this.key, this.key.length * 2);
+ this.val = Arrays.copyOf(this.val, this.val.length * 2);
+ }
+ System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert);
+ System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert);
+ ++this.size;
+
+ this.key[insert] = key;
+
+ return this.val[insert] = producer.apply(key);
+ }
+
+ public V get(final long key) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index < 0) {
+ return null;
+ }
+ return this.val[index];
+ }
+
+ public V getFloor(final long key) {
+ final int index = Arrays.binarySearch(this.key, 0, this.size, key);
+ if (index < 0) {
+ final int insert = -(index + 1) - 1;
+ return insert < 0 ? null : this.val[insert];
+ }
+ return this.val[index];
+ }
+}
diff --git a/ca/spottedleaf/dataconverter/util/NamespaceUtil.java b/ca/spottedleaf/dataconverter/util/NamespaceUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..b028017b9c44821a8a313a04e0b10f5d0610edd5
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/util/NamespaceUtil.java
@@ -0,0 +1,39 @@
+package ca.spottedleaf.dataconverter.util;
+
+import ca.spottedleaf.dataconverter.types.MapType;
+import net.minecraft.resources.ResourceLocation;
+
+public final class NamespaceUtil {
+
+ private NamespaceUtil() {}
+
+ public static void enforceForPath(final MapType data, final String path) {
+ if (data == null) {
+ return;
+ }
+
+ final String id = data.getString(path);
+ if (id != null) {
+ final String replace = NamespaceUtil.correctNamespaceOrNull(id);
+ if (replace != null) {
+ data.setString(path, replace);
+ }
+ }
+ }
+
+ public static String correctNamespace(final String value) {
+ if (value == null) {
+ return null;
+ }
+ final ResourceLocation resourceLocation = ResourceLocation.tryParse(value);
+ return resourceLocation != null ? resourceLocation.toString() : value;
+ }
+
+ public static String correctNamespaceOrNull(final String value) {
+ if (value == null) {
+ return null;
+ }
+ final String correct = correctNamespace(value);
+ return correct.equals(value) ? null : correct;
+ }
+}
diff --git a/ca/spottedleaf/moonrise/paper/PaperHooks.java b/ca/spottedleaf/moonrise/paper/PaperHooks.java
index e4f0653c575c33b1ef8160b6c88e29ee9fb44508..b6a34796d33f1593301c3a67a013fa7e812cb329 100644
--- a/ca/spottedleaf/moonrise/paper/PaperHooks.java
+++ b/ca/spottedleaf/moonrise/paper/PaperHooks.java
@@ -211,6 +211,43 @@ public final class PaperHooks extends BaseChunkSystemHooks implements PlatformHo
@Override
public CompoundTag convertNBT(final DSL.TypeReference type, final DataFixer dataFixer, final CompoundTag nbt,
final int fromVersion, final int toVersion) {
+ // Paper start - optimise data conversion
+ if (type == net.minecraft.util.datafix.fixes.References.PLAYER) {
+ return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.PLAYER, nbt, fromVersion, toVersion
+ );
+ }
+ if (type == net.minecraft.util.datafix.fixes.References.CHUNK) {
+ return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, nbt, fromVersion, toVersion
+ );
+ }
+ if (type == net.minecraft.util.datafix.fixes.References.STRUCTURE) {
+ return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.STRUCTURE, nbt, fromVersion, toVersion
+ );
+ }
+ if (type == net.minecraft.util.datafix.fixes.References.POI_CHUNK) {
+ return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.POI_CHUNK, nbt, fromVersion, toVersion
+ );
+ }
+ if (type == net.minecraft.util.datafix.fixes.References.ENTITY_CHUNK) {
+ return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY_CHUNK, nbt, fromVersion, toVersion
+ );
+ }
+ if (type == net.minecraft.util.datafix.fixes.References.ITEM_STACK) {
+ return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ITEM_STACK, nbt, fromVersion, toVersion
+ );
+ }
+ if (type == net.minecraft.util.datafix.fixes.References.ENTITY || type == net.minecraft.util.datafix.fixes.References.ENTITY_TREE) {
+ return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY, nbt, fromVersion, toVersion
+ );
+ }
+ // Paper end - optimise data conversion
return (CompoundTag)dataFixer.update(
type, new Dynamic<>(NbtOps.INSTANCE, nbt), fromVersion, toVersion
).getValue();
diff --git a/net/minecraft/data/structures/StructureUpdater.java b/net/minecraft/data/structures/StructureUpdater.java
index 6536dc08c80170f5679acedd65cd2b9f6ad3fb3a..294cd15a796ad25823c8ccf98fbfae46ddac2c26 100644
--- a/net/minecraft/data/structures/StructureUpdater.java
+++ b/net/minecraft/data/structures/StructureUpdater.java
@@ -27,7 +27,7 @@ public class StructureUpdater implements SnbtToNbt.Filter {
LOGGER.warn("SNBT Too old, do not forget to update: {} < {}: {}", dataVersion, 4420, structureLocationPath);
}
- CompoundTag compoundTag = DataFixTypes.STRUCTURE.updateToCurrentVersion(DataFixers.getDataFixer(), tag, dataVersion);
+ CompoundTag compoundTag = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.STRUCTURE, tag, dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); // Paper
structureTemplate.load(BuiltInRegistries.BLOCK, compoundTag);
return structureTemplate.save(new CompoundTag());
}
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
index 2d597e50dcd957bd566c4da384fac5f36b5362f7..75aba65cbe1a943f21c7464ff9465e64f63e8e5b 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -305,6 +305,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation
public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system
AtomicReference<S> atomicReference = new AtomicReference<>();
Thread thread = new ca.spottedleaf.moonrise.common.util.TickThread(() -> atomicReference.get().runServer(), "Server thread");
thread.setUncaughtExceptionHandler((thread1, exception) -> LOGGER.error("Uncaught exception in server thread", exception));
diff --git a/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/net/minecraft/world/level/chunk/storage/ChunkStorage.java
index 8c1417c659ea0e079e99b9bfa79e1cf6ba9b712b..a8a32edea080f32fd25c9e009d4efa416a51a4cf 100644
--- a/net/minecraft/world/level/chunk/storage/ChunkStorage.java
+++ b/net/minecraft/world/level/chunk/storage/ChunkStorage.java
@@ -54,7 +54,7 @@ public class ChunkStorage implements AutoCloseable {
} else {
try {
// CraftBukkit start
- if (version < 1466) {
+ if (false && version < 1466) { // Paper - no longer needed, data converter system / DFU handles it now
CompoundTag level = chunkData.getCompoundOrEmpty("Level");
if (level.getBooleanOr("TerrainPopulated", false) && !level.getBooleanOr("LightPopulated", false)) {
// Light is purged updating to 1.14+. We need to set light populated to true so the converter recognizes the chunk as being "full"
@@ -63,7 +63,7 @@ public class ChunkStorage implements AutoCloseable {
}
// CraftBukkit end
if (version < 1493) {
- chunkData = DataFixTypes.CHUNK.update(this.fixerUpper, chunkData, version, 1493);
+ chunkData = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, chunkData, version, 1493); // Paper - replace chunk converter
if (chunkData.getCompound("Level").flatMap(compoundTag -> compoundTag.getBoolean("hasLegacyStructureData")).orElse(false)) {
LegacyStructureDataHandler legacyStructureHandler = this.getLegacyStructureHandler(levelKey, storage);
chunkData = legacyStructureHandler.updateFromLegacy(chunkData);
@@ -80,7 +80,7 @@ public class ChunkStorage implements AutoCloseable {
// Spigot end
injectDatafixingContext(chunkData, levelKey, chunkGeneratorKey);
- chunkData = DataFixTypes.CHUNK.updateToCurrentVersion(this.fixerUpper, chunkData, Math.max(1493, version));
+ chunkData = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, chunkData, Math.max(1493, version), ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); // Paper - replace chunk converter
// Spigot start
if (stopBelowZero) {
chunkData.putString("Status", net.minecraft.core.registries.BuiltInRegistries.CHUNK_STATUS.getKey(net.minecraft.world.level.chunk.status.ChunkStatus.SPAWN).toString());
diff --git a/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java b/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java
index 6be673172548c1382c7402ec4e1ec6ef51f702d3..49be43ac896d60587511a97445c53c10c587a341 100644
--- a/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java
+++ b/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java
@@ -32,13 +32,32 @@ public class SimpleRegionStorage implements AutoCloseable {
return this.worker.store(chunkPos, data);
}
+ // Paper start - rewrite data conversion system
+ private ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType getDataConverterType() {
+ if (this.dataFixType == DataFixTypes.ENTITY_CHUNK) {
+ return ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY_CHUNK;
+ } else if (this.dataFixType == DataFixTypes.POI_CHUNK) {
+ return ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.POI_CHUNK;
+ } else {
+ throw new UnsupportedOperationException("For " + this.dataFixType.name());
+ }
+ }
+ // Paper end - rewrite data conversion system
+
public CompoundTag upgradeChunkTag(CompoundTag tag, int version) {
- int dataVersion = NbtUtils.getDataVersion(tag, version);
- return this.dataFixType.updateToCurrentVersion(this.fixerUpper, tag, dataVersion);
+ // Paper start - rewrite data conversion system
+ final int dataVer = NbtUtils.getDataVersion(tag, version);
+ final CompoundTag ret = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(this.getDataConverterType(), tag, dataVer, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion());
+ NbtUtils.addCurrentDataVersion(ret); // Fix MC-299110
+ return ret;
+ // Paper end - rewrite data conversion system
}
public Dynamic<Tag> upgradeChunkTag(Dynamic<Tag> tag, int version) {
- return this.dataFixType.updateToCurrentVersion(this.fixerUpper, tag, version);
+ // Paper start - rewrite data conversion system
+ final CompoundTag converted = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(this.getDataConverterType(), (CompoundTag)tag.getValue(), version, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion());
+ return new Dynamic<>(tag.getOps(), converted);
+ // Paper end - rewrite data conversion system
}
public CompletableFuture<Void> synchronize(boolean flushStorage) {
diff --git a/net/minecraft/world/level/levelgen/structure/StructureCheck.java b/net/minecraft/world/level/levelgen/structure/StructureCheck.java
index 6a5451440751ad017324e3fec8cfd8efb118511b..4a3a05335e21008eb349e9ab221b54234d9ac200 100644
--- a/net/minecraft/world/level/levelgen/structure/StructureCheck.java
+++ b/net/minecraft/world/level/levelgen/structure/StructureCheck.java
@@ -152,7 +152,7 @@ public class StructureCheck {
CompoundTag compoundTag1;
try {
- compoundTag1 = DataFixTypes.CHUNK.updateToCurrentVersion(this.fixerUpper, compoundTag, version);
+ compoundTag1 = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, compoundTag, version, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); // Paper - replace chunk converter
} catch (Exception var12) {
LOGGER.warn("Failed to partially datafix chunk {}", chunkPos, var12);
return StructureCheckResult.CHUNK_LOAD_NEEDED;
diff --git a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java
index 7bb5a1102524cfe850859482346b1dd2af2d8868..c748e9b29173bed20f14de11d52e719b19d3469e 100644
--- a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java
+++ b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java
@@ -243,7 +243,7 @@ public class StructureTemplateManager {
public StructureTemplate readStructure(CompoundTag nbt) {
StructureTemplate structureTemplate = new StructureTemplate();
int dataVersion = NbtUtils.getDataVersion(nbt, 500);
- structureTemplate.load(this.blockLookup, DataFixTypes.STRUCTURE.updateToCurrentVersion(this.fixerUpper, nbt, dataVersion));
+ structureTemplate.load(this.blockLookup, ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.STRUCTURE, nbt, dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion())); // Paper - rewrite data conversion system
return structureTemplate;
}
diff --git a/net/minecraft/world/level/storage/LevelStorageSource.java b/net/minecraft/world/level/storage/LevelStorageSource.java
index d0512d2e9b241fbea2cb8248c750aa55c41fbb9d..3b40822ea6ec9783fe3cb8eaba069a8d626d8382 100644
--- a/net/minecraft/world/level/storage/LevelStorageSource.java
+++ b/net/minecraft/world/level/storage/LevelStorageSource.java
@@ -227,7 +227,7 @@ public class LevelStorageSource {
CompoundTag compoundOrEmpty = levelDataTagRaw.getCompoundOrEmpty("Data");
int dataVersion = NbtUtils.getDataVersion(compoundOrEmpty, -1);
Dynamic<?> dynamic = DataFixTypes.LEVEL.updateToCurrentVersion(dataFixer, new Dynamic<>(NbtOps.INSTANCE, compoundOrEmpty), dataVersion);
- dynamic = dynamic.update("Player", dynamic1 -> DataFixTypes.PLAYER.updateToCurrentVersion(dataFixer, dynamic1, dataVersion));
+ dynamic = dynamic.update("Player", dynamic1 -> new Dynamic(dynamic1.getOps(), ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.PLAYER, (net.minecraft.nbt.CompoundTag)dynamic1.getValue(), dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()))); // Paper - replace data conversion system
return dynamic.update("WorldGenSettings", dynamic1 -> DataFixTypes.WORLD_GEN_SETTINGS.updateToCurrentVersion(dataFixer, dynamic1, dataVersion));
}
diff --git a/net/minecraft/world/level/storage/PlayerDataStorage.java b/net/minecraft/world/level/storage/PlayerDataStorage.java
index 232a561be430d0be7964eb15a873f8dc5ac1bcd8..fe44d8d17d2622b3d6021c11579af85ef96737bb 100644
--- a/net/minecraft/world/level/storage/PlayerDataStorage.java
+++ b/net/minecraft/world/level/storage/PlayerDataStorage.java
@@ -117,7 +117,7 @@ public class PlayerDataStorage {
return optional.or(() -> this.load(name, uuid, ".dat_old")).map(compoundTag -> { // CraftBukkit
int dataVersion = NbtUtils.getDataVersion(compoundTag, -1);
- compoundTag = DataFixTypes.PLAYER.updateToCurrentVersion(this.fixerUpper, compoundTag, dataVersion);
+ compoundTag = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.PLAYER, compoundTag, dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); // Paper - rewrite data conversion system
return compoundTag; // CraftBukkit - handled above
});
}