Files
paper-mc/paper-server/patches/features/0015-Rewrite-dataconverter-system.patch
Spottedleaf 21fb54246e Do not write fall_distance tag unless it already existed before
It looks like BaseSpawner will not run natural spawn finalization
unless the entire data tag only contains the ID.

This only fixes converting old data, we need a fix for already
converted data.
2025-07-15 17:09:06 -07:00

32681 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..7b5803c8f8bf0b201f6862768cf6d6b6fa103b1e
--- /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.7
+ };
+ 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..7a46f8fbc90f65a2bf849d2bec5709145b8e6458
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/MCVersions.java
@@ -0,0 +1,600 @@
+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;
+ public static final int V1_21_7_RC1 = 4436;
+ public static final int V1_21_7_RC2 = 4437;
+ public static final int V1_21_7 = 4438;
+
+ 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..44e74a97debbb36deb50a1f726ee25cc5272ab09
--- /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); // Fix MC-299285
+ 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..b0a1766502493fa2d2ce746c47c883d270144293
--- /dev/null
+++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4303.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 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) {
+ if (!data.hasKey("FallDistance")) {
+ return null;
+ }
+ 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 8a18b0d926f80bab09a478b9d34ec914e5f76795..3527c39f3f95832d52aeda6205bbbb7161ecaf66 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 914af3dbbc875f7f672618e1a7a0bf8f10945eba..5b40a63955b61fa53bd9096b34de3adb036d0f35 100644
--- a/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java
+++ b/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java
@@ -32,14 +32,29 @@ 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);
- CompoundTag compoundTag = this.dataFixType.updateToCurrentVersion(this.fixerUpper, tag, dataVersion);
+ CompoundTag compoundTag = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(this.getDataConverterType(), tag, dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion());; // Paper start - rewrite data conversion system
return NbtUtils.addCurrentDataVersion(compoundTag);
}
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
});
}