0
0
mirror of https://github.com/PaperMC/Paper.git synced 2024-11-22 04:56:29 +00:00
Paper/patches/server/1037-Rewrite-dataconverter-system.patch
Spottedleaf 8c5b837e05 Rework async chunk api implementation
Firstly, the old methods all routed to the CompletableFuture method.
However, the CF method could not guarantee that if the caller
was off-main that the future would be "completed" on-main. Since
the callback methods used the CF one, this meant that the callback
methods did not guarantee that the callbacks were to be called on
the main thread.

Now, all methods route to getChunkAtAsync(x, z, gen, urgent, cb)
so that the methods with the callback are guaranteed to invoke
the callback on the main thread. The CF behavior remains unchanged;
it may still appear to complete on main if invoked off-main.

Secondly, remove the scheduleOnMain invocation in the async
chunk completion. This unnecessarily delays the callback
by 1 tick.

Thirdly, add getChunksAtAsync(minX, minZ, maxX, maxZ, ...) which
will load chunks within an area. This method is provided as a helper
as keeping all chunks loaded within an area can be complicated to
implement for plugins (due to the lacking ticket API), and is
already implemented internally anyways.

Fourthly, remove the ticket addition that occured with getChunkAt
and getChunkAtAsync. The ticket addition may delay the unloading
of the chunk unnecessarily. It also fixes a very rare timing bug
where the future/callback would be completed after the chunk
unloads.
2024-11-18 23:00:59 -08:00

30408 lines
1.9 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/src/main/java/ca/spottedleaf/dataconverter/converters/DataConverter.java b/src/main/java/ca/spottedleaf/dataconverter/converters/DataConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..1863c606be715683d53863a0c9293525d199c9cf
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/converters/datatypes/DataHook.java b/src/main/java/ca/spottedleaf/dataconverter/converters/datatypes/DataHook.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b92c5c66ad3a5198873f98287a5ced71c231d09
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java b/src/main/java/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java
new file mode 100644
index 0000000000000000000000000000000000000000..b56a7f9ace3b947fed49101b6e9936721fb99ea5
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java
@@ -0,0 +1,7 @@
+package ca.spottedleaf.dataconverter.converters.datatypes;
+
+public abstract class DataType<T, R> {
+
+ public abstract R convert(final T data, final long fromVersion, final long toVersion);
+
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java b/src/main/java/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca55b3f7e7208e629e88d4c7bfa9517384a26fef
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java
@@ -0,0 +1,9 @@
+package ca.spottedleaf.dataconverter.converters.datatypes;
+
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public interface DataWalker<T> {
+
+ public T walk(final T data, final long fromVersion, final long toVersion);
+
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..a27d3d41109271834b6c37fa22d4b80d9e4b88c8
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java
@@ -0,0 +1,79 @@
+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, int fromVersion, final int toVersion) {
+ Object ret = data;
+
+ long currentVersion = DataConverter.encodeVersions(fromVersion < V99.VERSION ? V99.VERSION : fromVersion, Integer.MAX_VALUE);
+ final long nextVersion = DataConverter.encodeVersions(toVersion, Integer.MAX_VALUE);
+
+ 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(nextVersion, breakpoint - 1));
+ if (converted != null) {
+ ret = converted;
+ }
+
+ currentVersion = Math.min(nextVersion, breakpoint - 1);
+
+ if (currentVersion == nextVersion) {
+ break;
+ }
+ }
+
+ if (currentVersion != nextVersion) {
+ final Object converted = type.convert((T)ret, currentVersion, nextVersion);
+ if (converted != null) {
+ ret = converted;
+ }
+ }
+
+ return (R)ret;
+ }
+
+ private MCDataConverter() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java
new file mode 100644
index 0000000000000000000000000000000000000000..056801570c6756a4b484633d79080aed740832a8
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java
@@ -0,0 +1,440 @@
+package ca.spottedleaf.dataconverter.minecraft;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+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,
+ 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,
+ // All up to 1.21.3
+ };
+ 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);
+
+ // 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);
+ }
+
+ 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);
+ }
+
+ if (VERSION_NAMES.containsKey(value) && value != MCVersions.V15W33B) { // Mojang registered 15w33a and 15w33b under the same id.
+ 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 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCVersions.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCVersions.java
new file mode 100644
index 0000000000000000000000000000000000000000..aaa45b3f97b4e67ca04ad9739d3f0197bec46671
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCVersions.java
@@ -0,0 +1,558 @@
+package ca.spottedleaf.dataconverter.minecraft;
+
+@SuppressWarnings("unused")
+public final class MCVersions {
+
+ /* https://minecraft.wiki/wiki/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;
+
+ private MCVersions() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae3aed21c1fccb688e9a1665e2d317a77508d157
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameKeys(data, renamer);
+ return null;
+ }
+ });
+ }
+
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterCriteriaRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterCriteriaRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2a4d16e6a2f9d71dbfa692922671581c2bec136
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> advancement = data.getMap(this.path);
+ if (advancement == null) {
+ return null;
+ }
+
+ final MapType<String> criteria = advancement.getMap("criteria");
+ if (criteria == null) {
+ return null;
+ }
+
+ RenameHelper.renameKeys(criteria, this.conversion);
+
+ return null;
+ }
+
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..f227c0565a0c475fcb06991b485507d50bbd2ad0
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String>, MapType<String>> entityConverter = new DataConverter<>(version, versionStep) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractOldAttributesRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractOldAttributesRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b871c78e77015d0216a0ecc61aa05689ccfab10
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> entityConverter = new DataConverter<>(version, versionStep) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/blockname/ConverterAbstractBlockRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/blockname/ConverterAbstractBlockRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b47879a7c2e8c21fae43bf5247585c716d75565
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterAddBlendingData.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterAddBlendingData.java
new file mode 100644
index 0000000000000000000000000000000000000000..d4cd5362e77eb71cb8eb45ffcc73185e01be1157
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> createBlendingData(final int height, final int minY) {
+ final MapType<String> ret = Types.NBT.createEmptyMap();
+
+ ret.setInt("min_section", minY >> 4);
+ ret.setInt("max_section", (minY + height) >> 4);
+
+ return ret;
+ }
+
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ data.remove("blending_data");
+ final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterFlattenChunk.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterFlattenChunk.java
new file mode 100644
index 0000000000000000000000000000000000000000..300c2d14818b1e0cfe7341aba573ec75d0581b26
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> PUMPKIN = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:pumpkin'}");
+ static final MapType<String> SNOWY_PODZOL = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:podzol',Properties:{snowy:'true'}}");
+ static final MapType<String> SNOWY_GRASS = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:grass_block',Properties:{snowy:'true'}}");
+ static final MapType<String> SNOWY_MYCELIUM = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:mycelium',Properties:{snowy:'true'}}");
+ static final MapType<String> UPPER_SUNFLOWER = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:sunflower',Properties:{half:'upper'}}");
+ static final MapType<String> UPPER_LILAC = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:lilac',Properties:{half:'upper'}}");
+ static final MapType<String> UPPER_TALL_GRASS = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:tall_grass',Properties:{half:'upper'}}");
+ static final MapType<String> UPPER_LARGE_FERN = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:large_fern',Properties:{half:'upper'}}");
+ static final MapType<String> UPPER_ROSE_BUSH = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:rose_bush',Properties:{half:'upper'}}");
+ static final MapType<String> UPPER_PEONY = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:peony',Properties:{half:'upper'}}");
+
+ static final Map<String, MapType<String>> 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<String>> 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<String>> 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<String>> 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<String>> 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<String>> 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<String>> 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<String>> 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<String>> 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<String>> 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<String> AIR = Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(0));
+
+ public ConverterFlattenChunk() {
+ super(MCVersions.V17W47A, 1);
+ }
+
+ static String getName(final MapType<String> blockState) {
+ return blockState.getString("Name");
+ }
+
+ static String getProperty(final MapType<String> blockState, final String propertyName) {
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> level;
+ final int blockX;
+ final int blockZ;
+ final Int2ObjectLinkedOpenHashMap<MapType<String>> tileEntities = new Int2ObjectLinkedOpenHashMap<>(16);
+
+ public UpgradeChunk(final MapType<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> tile = this.getBlockEntity(position);
+
+ if (tile == null) {
+ continue;
+ }
+
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> blockState = this.getBlock(position);
+ if (!"upper".equals(getProperty(blockState, "half"))) {
+ continue;
+ }
+
+ final MapType<String> 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<String> tile = this.getBlockEntity(position);
+
+ if (tile == null) {
+ continue;
+ }
+
+ final MapType<String> 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<String> update = BANNER_BLOCK_MAP.get(state);
+ if (update != null) {
+ this.setBlock(position, update);
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ private MapType<String> getBlockEntity(final int index) {
+ return this.tileEntities.get(index);
+ }
+
+ private MapType<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String>> {
+
+ final ListType paletteStates = Types.NBT.createEmptyList();
+
+ private int find(final MapType<String> k) {
+ if (((k) == (null)))
+ return containsNullKey ? n : -(n + 1);
+ MapType<String> curr;
+ final Object[] key = this.key;
+ int pos;
+ // The starting point.
+ if (((curr = (MapType<String>)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<String>)key[pos = (pos + 1) & mask]) == (null)))
+ return -(pos + 1);
+ if (((k) == (curr)))
+ return pos;
+ }
+ }
+
+ private void insert(final int pos, final MapType<String> 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<String>[] byId = new MapType[4];
+ private MapType<String> last = null;
+
+ public int getOrCreateId(final MapType<String> 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<String> 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<String> 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<String> section) {
+ this.section = section;
+ this.y = section.getInt("Y");
+ this.hasData = section.hasKey("Blocks", ObjectType.BYTE_ARRAY);
+ }
+
+ public MapType<String> getBlock(final int index) {
+ if (index >= 0 && index <= 4095) {
+ final MapType<String> state = this.palette.byId[this.buffer[index]];
+ return state == null ? AIR : state;
+ } else {
+ return AIR;
+ }
+ }
+
+ public void setBlock(final int index, final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterRenameStatus.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterRenameStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..084c67a46bc5ec7f5a4bef3216805a87b32c83d0
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/custom/V3818_Commands.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/custom/V3818_Commands.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd190605a2c3d8631f85a74a634f7951eec6f0b1
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/custom/V3818_Commands.java
@@ -0,0 +1,304 @@
+package ca.spottedleaf.dataconverter.minecraft.converters.custom;
+
+import ca.spottedleaf.dataconverter.converters.DataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCDataConverter;
+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.CommandArgumentUpgrader;
+import com.google.common.base.Suppliers;
+import com.google.gson.JsonArray;
+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 com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.logging.LogUtils;
+import com.mojang.serialization.Dynamic;
+import com.mojang.serialization.JsonOps;
+import net.minecraft.SharedConstants;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.NbtOps;
+import net.minecraft.nbt.Tag;
+import net.minecraft.nbt.TagParser;
+import net.minecraft.util.GsonHelper;
+import org.slf4j.Logger;
+import java.util.Iterator;
+import java.util.function.Supplier;
+
+public final class V3818_Commands {
+
+ private static final int VERSION = MCVersions.V24W07A + 1;
+
+ private static final boolean DISABLE_COMMAND_CONVERTER = Boolean.getBoolean("Paper.DisableCommandConverter");
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ public static String toCommandFormat(final CompoundTag components) {
+ final StringBuilder ret = new StringBuilder();
+ ret.append('[');
+ for (final Iterator<String> iterator = components.getAllKeys().iterator(); iterator.hasNext();) {
+ final String key = iterator.next();
+ ret.append(key);
+ ret.append('=');
+ ret.append(components.get(key).toString());
+ if (iterator.hasNext()) {
+ ret.append(',');
+ }
+ }
+ ret.append(']');
+
+ return ret.toString();
+ }
+
+ public static JsonElement convertToJson(final Tag tag) {
+ // We don't have conversion utilities, but DFU does...
+
+ return new Dynamic<>(NbtOps.INSTANCE, tag).convert(JsonOps.INSTANCE).getValue();
+ }
+
+ public static void walkComponent(final JsonElement primitive) {
+ if (!(primitive instanceof JsonObject root)) {
+ if (primitive instanceof JsonArray array) {
+ for (final JsonElement component : array) {
+ walkComponent(component);
+ }
+ }
+ return;
+ }
+
+ final JsonElement clickEventElement = root.get("clickEvent");
+ if (clickEventElement instanceof JsonObject clickEvent) {
+ final JsonElement actionElement = clickEvent.get("action");
+ final JsonElement cmdElement = clickEvent.get("value");
+ if (actionElement instanceof JsonPrimitive action && cmdElement instanceof JsonPrimitive cmd) {
+ final String actionString = action.getAsString();
+ final String cmdString = cmd.getAsString();
+
+ if ((actionString.equals("suggest_command") && cmdString.startsWith("/")) || actionString.equals("run_command")) {
+ try {
+ final Object res = MCDataConverter.convert(
+ MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, cmdString, MCVersions.V1_20_4, SharedConstants.getCurrentVersion().getDataVersion().getVersion()
+ );
+ if (res instanceof String newCmd) {
+ clickEvent.addProperty("value", newCmd);
+ }
+ } catch (final Exception ex) {
+ LOGGER.error("Failed to convert command '" + cmdString + "'", ex);
+ }
+ }
+ }
+ }
+
+ final JsonElement hoverEventElement = root.get("hoverEvent");
+ if (hoverEventElement instanceof JsonObject hoverEvent) {
+ final JsonElement showText = hoverEvent.get("action");
+ if (showText instanceof JsonPrimitive showTextPrimitive && showTextPrimitive.getAsString().equals("show_item")) {
+ final JsonElement contentsElement = hoverEvent.get("contents");
+ if (contentsElement instanceof JsonObject contents) {
+ final JsonElement idElement = contents.get("id");
+ final JsonElement tagElement = contents.get("tag");
+
+ if (idElement instanceof JsonPrimitive idPrimitive) {
+ final CompoundTag itemNBT = new CompoundTag();
+ itemNBT.putString("id", idPrimitive.getAsString());
+ itemNBT.putInt("Count", 1);
+
+ if (tagElement instanceof JsonPrimitive tagPrimitive) {
+ try {
+ final CompoundTag tag = TagParser.parseTag(tagPrimitive.getAsString());
+ itemNBT.put("tag", tag);
+ } catch (final CommandSyntaxException ignore) {}
+ }
+
+ final CompoundTag converted = MCDataConverter.convertTag(
+ MCTypeRegistry.ITEM_STACK, itemNBT, MCVersions.V1_20_4,
+ SharedConstants.getCurrentVersion().getDataVersion().getVersion()
+ );
+
+ contents.remove("tag");
+
+ contents.addProperty("id", converted.getString("id"));
+
+ if (converted.contains("components", Tag.TAG_COMPOUND)) {
+ contents.add("components", convertToJson(converted.getCompound("components")));
+ }
+ }
+ }
+ final JsonElement valueElement = hoverEvent.get("value");
+ if (valueElement instanceof JsonPrimitive valuePrimitive) {
+ try {
+ final CompoundTag itemNBT = TagParser.parseTag(valuePrimitive.getAsString());
+ if (itemNBT.contains("id", Tag.TAG_STRING)) {
+ final boolean explicitCount = itemNBT.contains("Count", Tag.TAG_ANY_NUMERIC);
+ if (!explicitCount) {
+ itemNBT.putInt("Count", 1);
+ }
+ final CompoundTag converted = MCDataConverter.convertTag(
+ MCTypeRegistry.ITEM_STACK, itemNBT, MCVersions.V1_20_4,
+ SharedConstants.getCurrentVersion().getDataVersion().getVersion()
+ );
+
+ hoverEvent.remove("value");
+
+ final JsonObject contents = new JsonObject();
+ hoverEvent.add("contents", contents);
+
+ contents.addProperty("id", converted.getString("id"));
+ if (explicitCount) {
+ contents.addProperty("count", converted.getInt("count"));
+ }
+
+ if (converted.contains("components", Tag.TAG_COMPOUND)) {
+ contents.add("components", convertToJson(converted.getCompound("components")));
+ }
+ }
+ } catch (final CommandSyntaxException ignore) {}
+ }
+ }
+ }
+
+ final JsonElement extra = root.get("extra");
+ if (extra instanceof JsonArray array) {
+ for (final JsonElement component : array) {
+ walkComponent(component);
+ }
+ }
+ }
+
+ private static String walkComponent(final String json) {
+ if (json == null || json.isEmpty()) {
+ return json;
+ }
+
+ try {
+ final JsonElement element = JsonParser.parseString(json);
+ walkComponent(element);
+ return GsonHelper.toStableString(element);
+ } catch (final JsonParseException ex) {
+ return json;
+ } catch (final Exception ex) {
+ LOGGER.error("Failed to convert text component '" + json + "'", ex);
+ return json;
+ }
+ }
+
+ // this is AFTER all the converters for subversion 5, so these run AFTER them
+ public static void register_5() {
+ if (DISABLE_COMMAND_CONVERTER) {
+ return;
+ }
+ // Command is already registered in walker for command blocks
+ MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND.addConverter(new DataConverter<>(VERSION, 5) {
+ private static final Supplier<CommandArgumentUpgrader> COMMAND_UPGRADER = Suppliers.memoize(() ->
+ CommandArgumentUpgrader.upgrader_1_20_4_to_1_20_5(999));
+
+ @Override
+ public Object convert(final Object data, final long sourceVersion, final long toVersion) {
+ if (!(data instanceof String cmd)) {
+ return null;
+ }
+ // We use startsWith("/") because we aren't supporting WorldEdit style commands,
+ // and passing the context of whether the use supports leading slash would be high effort low return
+ try {
+ return COMMAND_UPGRADER.get().upgradeCommandArguments(cmd, cmd.startsWith("/"));
+ } catch (final Exception ex) {
+ LOGGER.error("Failed to convert command '" + cmd + "'", ex);
+ return null;
+ }
+ }
+ });
+
+ // command is not registered in any walkers for books/signs, and we don't want to do that as we would parse
+ // the json every walk. instead, we create a one time converter to avoid the additional cost of parsing the json
+ // for future updates
+
+ // books
+ // note: at this stage, item is converted to components, so we can use the data components type
+ MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION, 5) {
+ private static void walkPath(final MapType<String> data, final String path) {
+ final String str = data.getString(path);
+ if (str == null) {
+ return;
+ }
+
+ final String newStr = walkComponent(str);
+ if (newStr != null) {
+ data.setString(path, newStr);
+ }
+ }
+
+ private static void walkBookContent(final MapType<String> data, final String path) {
+ if (data == null) {
+ return;
+ }
+
+ final MapType<String> content = data.getMap(path);
+ if (content == null) {
+ return;
+ }
+
+ final ListType pages = content.getList("pages", ObjectType.MAP);
+ if (pages == null) {
+ return;
+ }
+
+ for (int i = 0, len = pages.size(); i < len; ++i) {
+ final MapType<String> text = pages.getMap(i);
+
+ walkPath(text, "raw");
+ walkPath(text, "filtered");
+ }
+ }
+
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ walkBookContent(data, "minecraft:written_book_content");
+ return null;
+ }
+ });
+
+ // signs
+
+ final DataConverter<MapType<String>, MapType<String>> signTileConverter = new DataConverter<>(VERSION, 5) {
+ private static void walkText(final MapType<String> data, final String path) {
+ if (data == null) {
+ return;
+ }
+
+ final MapType<String> text = data.getMap(path);
+ if (text == null) {
+ return;
+ }
+
+ final ListType messages = text.getList("messages", ObjectType.STRING);
+ if (messages != null) {
+ for (int i = 0, len = Math.min(4, messages.size()); i < len; ++i) {
+ messages.setString(i, walkComponent(messages.getString(i)));
+ }
+ }
+
+ final ListType filteredMessages = text.getList("filtered_messages", ObjectType.STRING);
+
+ if (filteredMessages != null) {
+ for (int i = 0, len = Math.min(4, filteredMessages.size()); i < len; ++i) {
+ filteredMessages.setString(i, walkComponent(filteredMessages.getString(i)));
+ }
+ }
+ }
+
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ walkText(data, "front_text");
+ walkText(data, "back_text");
+ return null;
+ }
+ };
+
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", signTileConverter);
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:hanging_sign", signTileConverter);
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterAbstractEntityRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterAbstractEntityRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..6684915d6c0c44328a9296dc3ceb530e69482083
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityToVariant.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityToVariant.java
new file mode 100644
index 0000000000000000000000000000000000000000..985af815e3c23ad7c8b774eac46a7202d3020234
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityVariantRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityVariantRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed5dcf6f8160742c07e23e98c85409209350a7d4
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterFlattenEntity.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterFlattenEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..afad2d92f78d4727ff4440ad2778f018d5a2a609
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/AddFlagIfAbsent.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/AddFlagIfAbsent.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ab607f946782cc483535564e86fa9753dd7897a
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (!data.hasKey(this.path)) {
+ data.setBoolean(this.path, this.dfl);
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/ConverterAbstractStringValueTypeRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/ConverterAbstractStringValueTypeRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc79670f47aaa413ea3e96ef6a32e14099ad8a58
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperBlockFlatteningV1450.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperBlockFlatteningV1450.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f4f4cb6037c2a46ffcf427f5812164bbb98b8b7
--- /dev/null
+++ b/src/main/java/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<String>[] FLATTENED_BY_ID = new MapType[4096];
+ protected static final MapType<String>[] BLOCK_DEFAULTS = new MapType[4096];
+
+ private static final Object2IntOpenHashMap<MapType<String>> ID_BY_OLD_NBT = new Object2IntOpenHashMap<MapType<String>>(64, 0.7f) {
+ @Override
+ public int put(final MapType<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_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<String>, MapType<String>> IDENTITY_ENSURE = new HashMap<>();
+
+ public static MapType<String> parseTag(final String blockstate) {
+ try {
+ final MapType<String> ret = new NBTMapType(TagParser.parseTag(blockstate.replace('\'', '"')));
+
+ synchronized (IDENTITY_ENSURE) {
+ final MapType<String> 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<String> 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<String> 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<String> flattenNBT(final MapType<String> old) {
+ final int id = ID_BY_OLD_NBT.getInt(old);
+ final MapType<String> 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<String> ret = getNBTForIdRaw(id);
+ return ret == null ? old : ret.getString("Name");
+ }
+
+ public static String getNameForId(final int block) {
+ final MapType<String> nbt = getNBTForIdRaw(block);
+ return nbt == null ? "minecraft:air" : nbt.getString("Name");
+ }
+
+ protected static MapType<String> getNBTForIdRaw(final int block) {
+ return block >= 0 && block < FLATTENED_BY_ID.length ? FLATTENED_BY_ID[block] : null;
+ }
+
+ public static MapType<String> getNBTForId(final int block) {
+ MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperItemNameV102.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperItemNameV102.java
new file mode 100644
index 0000000000000000000000000000000000000000..86f6aa3e3fa886976809f350fc5eb16f6a026ed9
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperSpawnEggNameV105.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperSpawnEggNameV105.java
new file mode 100644
index 0000000000000000000000000000000000000000..bcc586cb68148fd960dd685eecce853169a92ed5
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..28dcc6f1425a46c6c76dd16a67aeab0ec72d1d6a
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java
@@ -0,0 +1,106 @@
+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<String> 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 void renameSingle(final MapType<String> data, final String fromKey, final String toKey) {
+ if (data == null) {
+ return;
+ }
+
+ final Object value = data.getGeneric(fromKey);
+ if (value != null) {
+ data.remove(fromKey);
+ data.setGeneric(toKey, value);
+ }
+ }
+
+ public static void renameString(final MapType<String> 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<String> data, final String listPath, final String mapPath,
+ final Function<String, String> renamer) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getList(listPath, ObjectType.MAP);
+ if (list == null) {
+ return;
+ }
+
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ RenameHelper.renameString(list.getMap(i), mapPath, renamer);
+ }
+ }
+
+ private RenameHelper() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemname/ConverterAbstractItemRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemname/ConverterAbstractItemRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..94569f0ccff0d3a09eafd4ba73572d9db0a0ac5b
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..06596b56a1f89900e5f23f7f4a12bd1d5d02b7c8
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenItemStack.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenItemStack.java
new file mode 100644
index 0000000000000000000000000000000000000000..21176b8b96be6cb93d3dc1a74ae9f53f1ad4740c
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> 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<String> tag = data.getMap("tag");
+ if (tag == null) {
+ tag = Types.NBT.createEmptyMap();
+ data.setMap("tag", tag);
+ }
+ tag.setInt("Damage", damage);
+ }
+
+ return null;
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenSpawnEgg.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenSpawnEgg.java
new file mode 100644
index 0000000000000000000000000000000000000000..4fa31e40b0a6f571a853299b4e242de921ccbda0
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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: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:ender_dragon", "minecraft:ender_dragon_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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java
new file mode 100644
index 0000000000000000000000000000000000000000..2d29d89cc45866822189a62bffbe1a8fe57c477b
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java
@@ -0,0 +1,1245 @@
+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<String> 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<String> 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<String> 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<String> 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<String> item = items.getMap(i);
+ final int slot = (int)item.getByte("Slot", (byte)0) & 0xFF;
+ item.remove("Slot");
+
+ final MapType<String> 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<String> newEnchants = type.createEmptyMap();
+ transientItem.componentSetMap(componentKey, newEnchants);
+
+ newEnchants.setMap("levels", type.createEmptyMap());
+ newEnchants.setBoolean("show_in_tooltip", false);
+ }
+ } else {
+ final MapType<String> newEnchantments = type.createEmptyMap();
+
+ for (int i = 0, len = enchantments.size(); i < len; ++i) {
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> src, final String srcKey, final MapType<String> 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<String> convertAttribute(final Object inputGeneric, final TypeUtil type) {
+ final MapType<String> input = inputGeneric instanceof MapType<?> casted ? (MapType<String>)casted : null;
+
+ final MapType<String> 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<String> 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<String> newDecorations = type.createEmptyMap();
+
+ for (int i = 0, len = decorations.size(); i < len; ++i) {
+ final Object decorationGeneric = decorations.getGeneric(i);
+
+ final MapType<String> decoration = decorationGeneric instanceof MapType<?> casted ? (MapType<String>)casted : null;
+
+ // note: getForcedString mirrors DFU converting to string for key
+ final String id = decoration == null ? "" : decoration.getForcedString("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<String> 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<String> 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<String> makeFilteredText(final String raw, final String filtered, final TypeUtil type) {
+ final MapType<String> 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<String> 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<String> 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<String> 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));
+
+ item.migrateTagTo("author", bookContent, "author");
+ item.migrateTagTo("resolved", bookContent, "resolved");
+ item.migrateTagTo("generation", bookContent, "generation");
+ }
+
+ private static void convertMobBucket(final TransientItemStack item, final TypeUtil type) {
+ final MapType<String> 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<String> lodestoneTracker = type.createEmptyMap();
+ item.componentSetMap("minecraft:lodestone_tracker", lodestoneTracker);
+
+ if (lodestonePos != null && lodestoneDim != null) {
+ final MapType<String> 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<String> input = (MapType<String>)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<String> newFireworks = type.createEmptyMap();
+ item.componentSetMap("minecraft:fireworks", newFireworks);
+
+ newFireworks.setList("explosions", type.createEmptyList());
+ newFireworks.setByte("flight_duration", (byte)0);
+
+ return;
+ }
+
+ final MapType<String> fireworks = (MapType<String>)fireworksGeneric;
+
+ final MapType<String> 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<String> explosion = (MapType<String>)explosionGeneric;
+
+ final MapType<String> 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<String> 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<String> property = propertyValues.getGeneric(i) instanceof MapType<?> casted ? (MapType<String>)casted : null;
+
+ final String value = property == null ? "" : property.getString("Value", "");
+ final String signature = property == null ? null : property.getString("Signature");
+
+ final MapType<String> 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<String> convertProfile(final Object inputGeneric, final TypeUtil type) {
+ final MapType<String> ret = type.createEmptyMap();
+
+ if (inputGeneric instanceof String name) {
+ if (!isValidPlayerName(name)) {
+ return ret;
+ }
+
+ ret.setString("name", name);
+
+ return ret;
+ }
+
+ final MapType<String> input = inputGeneric instanceof MapType<?> casted ? (MapType<String>)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<String> 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<String> convertItem(final MapType<String> 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<String> blockStateProperties = item.tagRemoveMap("BlockStateTag");
+ if (blockStateProperties != null) {
+ item.componentSetMap("minecraft:block_state", blockStateProperties);
+ convertBlockStateProperties(blockStateProperties);
+ }
+
+ item.tagMigrateToComponent("EntityTag", "minecraft:entity_data");
+
+ final MapType<String> 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<String> 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<String>)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<String> components;
+ private final MapType<String> tag;
+ private final MapType<String> root;
+
+ public TransientItemStack(final MapType<String> root) {
+ this.id = root.getString("id");
+ this.count = root.getInt("Count");
+
+ final TypeUtil type = root.getTypeUtil();
+
+ this.components = type.createEmptyMap();
+
+ final MapType<String> rootCopy = root.copy();
+
+ final MapType<String> 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<String> 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<String> tagRemoveMap(final String key) {
+ final MapType<String> 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<String> value) {
+ this.components.setMap(key, value);
+ }
+
+ public void componentSetGeneric(final String key, final Object value) {
+ this.components.setGeneric(key, value);
+ }
+
+ public MapType<String> serialize() {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/leveldat/ConverterRemoveFeatureFlag.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/leveldat/ConverterRemoveFeatureFlag.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c537b661b7a28193add3267ec2d639add49423b
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/options/ConverterAbstractOptionsRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/options/ConverterAbstractOptionsRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..769dd8447976b66dcfc36283ede4ae16f1e4206d
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameKeys(data, renamer);
+ return null;
+ }
+ });
+ }
+
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/particle/ConverterParticleToNBT.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/particle/ConverterParticleToNBT.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cf90187ea8bc54b06cebd54ae2582ca66d91132
--- /dev/null
+++ b/src/main/java/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.parseTag(flat);
+ } catch (final Exception ex) {
+ LOGGER.warn("Failed to parse nbt: " + flat, ex);
+ return null;
+ }
+ }
+
+ private static void convertItem(final MapType<String> nbt, final String data) {
+ final MapType<String> 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<String> parseProperties(final String input, final TypeUtil type) {
+ final MapType<String> 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<String> nbt, final String data) {
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> convert(final String flat, final TypeUtil type) {
+ final String[] split = flat.split(" ", 2);
+ final String name = NamespaceUtil.correctNamespace(split[0]);
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterAbstractPOIRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterAbstractPOIRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..57e210bf2bb189b15a32899011c4800b19668a5e
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> sections = data.getMap("Sections");
+ if (sections == null) {
+ return null;
+ }
+
+ for (final String key : sections.keys()) {
+ final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterPoiDelete.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterPoiDelete.java
new file mode 100644
index 0000000000000000000000000000000000000000..36aa9c3eedb3f2e2f577efed3622fed74268bce1
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> sections = data.getMap("Sections");
+ if (sections == null) {
+ return null;
+ }
+
+ for (final String key : sections.keys()) {
+ final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/recipe/ConverterAbstractRecipeRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/recipe/ConverterAbstractRecipeRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f35cbbd78a629712f9ae3cd5d180269f015a11d
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterAbstractStatsRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterAbstractStatsRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1985c85aa9193699d7d20e6f4f11b6e9744ee70
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> stats = data.getMap("stats");
+
+ if (stats == null) {
+ return null;
+ }
+
+ final MapType<String> custom = stats.getMap("minecraft:custom");
+ if (custom == null) {
+ return null;
+ }
+
+ RenameHelper.renameKeys(custom, renamer);
+
+ return null;
+ }
+ });
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterFlattenStats.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterFlattenStats.java
new file mode 100644
index 0000000000000000000000000000000000000000..891be75bf5c4af56e839c88b26f0a828554ae5c4
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> makeStatsConverter() {
+ return new DataConverter<>(VERSION, VERSION_STEP) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String>, MapType<String>> makeObjectiveConverter() {
+ return new DataConverter<>(VERSION, VERSION_STEP) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> criteriaType = data.getMap("CriteriaType");
+ if (criteriaType != null) {
+ if ("_special".equals(criteriaType.getString("type"))) {
+ convertCriteriaName(criteriaType, "id");
+ }
+ }
+
+ return null;
+ }
+
+ private void convertCriteriaName(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/tileentity/ConverterAbstractTileEntityRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/tileentity/ConverterAbstractTileEntityRename.java
new file mode 100644
index 0000000000000000000000000000000000000000..ab05dda0cc2083418443d0dee23ccc0a6f754ea0
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfa750bdaef7d7b6dadbc5665c1461f7e6df08ca
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java
@@ -0,0 +1,128 @@
+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());
+ this.structureConverters.add(converter);
+ 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java
new file mode 100644
index 0000000000000000000000000000000000000000..b093a9eeeea3f7c1c220485b7144d22c6fd504a0
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java
@@ -0,0 +1,166 @@
+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<String>>>>> walkersById = new HashMap<>();
+
+ public IDDataType(final String name) {
+ super(name);
+ }
+
+ public void addConverterForId(final String id, final DataConverter<MapType<String>, MapType<String>> converter) {
+ this.addStructureConverter(new DataConverter<>(converter.getToVersion(), converter.getVersionStep()) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (!id.equals(data.getString("id"))) {
+ return null;
+ }
+ return converter.convert(data, sourceVersion, toVersion);
+ }
+ });
+ }
+
+ public void addWalker(final int minVersion, final String id, final DataWalker<MapType<String>> walker) {
+ this.addWalker(minVersion, 0, id, walker);
+ }
+
+ public void addWalker(final int minVersion, final int versionStep, final String id, final DataWalker<MapType<String>> 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<String>>>> walkersForId = this.walkersById.get(fromId);
+ if (walkersForId == null) {
+ return;
+ }
+
+ final List<DataWalker<MapType<String>>> nearest = walkersForId.getFloor(version);
+
+ if (nearest == null) {
+ return;
+ }
+
+ for (final DataWalker<MapType<String>> walker : nearest) {
+ this.addWalker(minVersion, versionStep, toId, walker);
+ }
+ }
+
+ @Override
+ public MapType<String> convert(MapType<String> data, final long fromVersion, final long toVersion) {
+ MapType<String> ret = null;
+
+ final List<DataConverter<MapType<String>, MapType<String>>> converters = this.structureConverters;
+ for (int i = 0, len = converters.size(); i < len; ++i) {
+ final DataConverter<MapType<String>, MapType<String>> converter = converters.get(i);
+ final long converterVersion = converter.getEncodedVersion();
+
+ if (converterVersion <= fromVersion) {
+ continue;
+ }
+
+ if (converterVersion > toVersion) {
+ break;
+ }
+
+ List<DataHook<MapType<String>, MapType<String>>> hooks = this.structureHooks.getFloor(converterVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final MapType<String> replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final MapType<String> 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<String> postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+ }
+
+ final List<DataHook<MapType<String>, MapType<String>>> hooks = this.structureHooks.getFloor(toVersion);
+
+ // run pre hooks
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final MapType<String> replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ // run all walkers
+
+ final List<DataWalker<MapType<String>>> walkers = this.structureWalkers.getFloor(toVersion);
+ if (walkers != null) {
+ for (int i = 0, len = walkers.size(); i < len; ++i) {
+ final MapType<String> replace = walkers.get(i).walk(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final Long2ObjectArraySortedMap<List<DataWalker<MapType<String>>>> walkersByVersion = this.walkersById.get(data.getString("id"));
+ if (walkersByVersion != null) {
+ final List<DataWalker<MapType<String>>> walkersForId = walkersByVersion.getFloor(toVersion);
+ if (walkersForId != null) {
+ for (int i = 0, len = walkersForId.size(); i < len; ++i) {
+ final MapType<String> 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<String> postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+
+ return ret;
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java
new file mode 100644
index 0000000000000000000000000000000000000000..075574f33476882ddc6787e3b8bac8643a414eb0
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java
@@ -0,0 +1,129 @@
+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<String>, MapType<String>> {
+
+ public final String name;
+
+ protected final ArrayList<DataConverter<MapType<String>, MapType<String>>> structureConverters = new ArrayList<>();
+ protected final Long2ObjectArraySortedMap<List<DataWalker<MapType<String>>>> structureWalkers = new Long2ObjectArraySortedMap<>();
+ protected final Long2ObjectArraySortedMap<List<DataHook<MapType<String>, MapType<String>>>> structureHooks = new Long2ObjectArraySortedMap<>();
+
+ public MCDataType(final String name) {
+ this.name = name;
+ }
+
+ public void addStructureConverter(final DataConverter<MapType<String>, MapType<String>> converter) {
+ MCVersionRegistry.checkVersion(converter.getEncodedVersion());
+ this.structureConverters.add(converter);
+ this.structureConverters.sort(DataConverter.LOWEST_VERSION_COMPARATOR);
+ }
+
+ public void addStructureWalker(final int minVersion, final DataWalker<MapType<String>> walker) {
+ this.addStructureWalker(minVersion, 0, walker);
+ }
+
+ public void addStructureWalker(final int minVersion, final int versionStep, final DataWalker<MapType<String>> 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<String>, MapType<String>> hook) {
+ this.addStructureHook(minVersion, 0, hook);
+ }
+
+ public void addStructureHook(final int minVersion, final int versionStep, final DataHook<MapType<String>, MapType<String>> hook) {
+ this.structureHooks.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> {
+ return new ArrayList<>();
+ }).add(hook);
+ }
+
+ @Override
+ public MapType<String> convert(MapType<String> data, final long fromVersion, final long toVersion) {
+ MapType<String> ret = null;
+
+ final List<DataConverter<MapType<String>, MapType<String>>> converters = this.structureConverters;
+ for (int i = 0, len = converters.size(); i < len; ++i) {
+ final DataConverter<MapType<String>, MapType<String>> converter = converters.get(i);
+ final long converterVersion = converter.getEncodedVersion();
+
+ if (converterVersion <= fromVersion) {
+ continue;
+ }
+
+ if (converterVersion > toVersion) {
+ break;
+ }
+
+ List<DataHook<MapType<String>, MapType<String>>> hooks = this.structureHooks.getFloor(converterVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final MapType<String> replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final MapType<String> 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<String> postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+ }
+
+ final List<DataHook<MapType<String>, MapType<String>>> hooks = this.structureHooks.getFloor(toVersion);
+
+ if (hooks != null) {
+ for (int k = 0, klen = hooks.size(); k < klen; ++k) {
+ final MapType<String> replace = hooks.get(k).preHook(data, fromVersion, toVersion);
+ if (replace != null) {
+ ret = data = replace;
+ }
+ }
+ }
+
+ final List<DataWalker<MapType<String>>> walkers = this.structureWalkers.getFloor(toVersion);
+ if (walkers != null) {
+ for (int i = 0, len = walkers.size(); i < len; ++i) {
+ final MapType<String> 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<String> postReplace = hooks.get(k).postHook(data, fromVersion, toVersion);
+ if (postReplace != null) {
+ ret = data = postReplace;
+ }
+ }
+ }
+
+ return ret;
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java
new file mode 100644
index 0000000000000000000000000000000000000000..d4d41add3566a0e377fa41eb6d40004b05e2cbbc
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java
@@ -0,0 +1,325 @@
+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.getClassLogger();
+
+ public static final MCDataType LEVEL = new MCDataType("Level");
+ 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");
+
+ 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_FORCED_CHUNKS = new MCDataType("SavedData/Chunks");
+ public static final MCDataType SAVED_DATA_MAP_INDEX = new MCDataType("SavedData/IdCounts");
+
+ public static final MCValueType DATACONVERTER_CUSTOM_TYPE_COMMAND = new MCValueType("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");
+ }
+
+ 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();
+ 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 registers a simple tile entity
+ 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();
+ }
+
+ private MCTypeRegistry() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java
new file mode 100644
index 0000000000000000000000000000000000000000..13c1381261909ef672fbeb665907f01f2d5c1ced
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java
@@ -0,0 +1,86 @@
+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());
+ this.converters.add(converter);
+ 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookEnforceNamespacedID.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookEnforceNamespacedID.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7dced8a47ebdd262ae815ff9bc453312343ce49
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ private final String path;
+
+ public DataHookEnforceNamespacedID() {
+ this("id");
+ }
+
+ public DataHookEnforceNamespacedID(final String path) {
+ this.path = path;
+ }
+
+ @Override
+ public MapType<String> preHook(final MapType<String> data, final long fromVersion, final long toVersion) {
+ NamespaceUtil.enforceForPath(data, this.path);
+ return null;
+ }
+
+ @Override
+ public MapType<String> postHook(final MapType<String> data, final long fromVersion, final long toVersion) {
+ return null;
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookValueTypeEnforceNamespaced.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookValueTypeEnforceNamespaced.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f88487e7db589070512fafef1eb243ae29a379a
--- /dev/null
+++ b/src/main/java/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) {
+ return NamespaceUtil.correctNamespaceOrNull((String)data);
+ }
+ return null;
+ }
+
+ @Override
+ public Object postHook(final Object data, final long fromVersion, final long toVersion) {
+ return null;
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..17ded002b5546de8be4a5238c20ccfda460a98bb
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V100.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V100.java
new file mode 100644
index 0000000000000000000000000000000000000000..91b1d0be9d697a4fa8bc5b448b329df1f5deabc4
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V100.java
@@ -0,0 +1,161 @@
+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;
+
+ static void registerEquipment(final int version, final String id) {
+ registerEquipment(version, 0, id);
+ }
+
+ private static final DataWalkerItemLists EQUIPMENT_ITEM_LISTS = new DataWalkerItemLists("ArmorItems", "HandItems");
+ private static final DataWalkerItems EQUIPMENT_ITEMS = new DataWalkerItems("body_armor_item");
+
+ static void registerEquipment(final int version, final int versionStep, final String id) {
+ MCTypeRegistry.ENTITY.addWalker(version, versionStep, id, EQUIPMENT_ITEM_LISTS);
+ MCTypeRegistry.ENTITY.addWalker(version, versionStep, id, EQUIPMENT_ITEMS);
+ }
+
+ private static void registerMob(final String id) {
+ registerEquipment(VERSION, 0, id);
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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;
+ }
+ });
+
+ registerMob("ArmorStand");
+ registerMob("Creeper");
+ registerMob("Skeleton");
+ registerMob("Spider");
+ registerMob("Giant");
+ registerMob("Zombie");
+ registerMob("Slime");
+ registerMob("Ghast");
+ registerMob("PigZombie");
+ registerMob("Enderman");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Enderman", new DataWalkerBlockNames("carried"));
+ registerMob("CaveSpider");
+ registerMob("Silverfish");
+ registerMob("Blaze");
+ registerMob("LavaSlime");
+ registerMob("EnderDragon");
+ registerMob("WitherBoss");
+ registerMob("Bat");
+ registerMob("Witch");
+ registerMob("Endermite");
+ registerMob("Guardian");
+ registerMob("Pig");
+ registerMob("Sheep");
+ registerMob("Cow");
+ registerMob("Chicken");
+ registerMob("Squid");
+ registerMob("Wolf");
+ registerMob("MushroomCow");
+ registerMob("SnowMan");
+ registerMob("Ozelot");
+ registerMob("VillagerGolem");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "EntityHorse", new DataWalkerItemLists("Items", "ArmorItems", "HandItems"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "EntityHorse", new DataWalkerItems("ArmorItem", "SaddleItem"));
+ registerMob("Rabbit");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Villager", (final MapType<String> 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);
+
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "ArmorItems", fromVersion, toVersion);
+ WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "HandItems", fromVersion, toVersion);
+
+ return null;
+ });
+ registerMob("Shulker");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "AreaEffectCloud", new DataWalkerTypePaths<>(MCTypeRegistry.PARTICLE, "Particle"));
+
+ MCTypeRegistry.STRUCTURE.addStructureWalker(VERSION, (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ final ListType entities = data.getList("entities", ObjectType.MAP);
+ if (entities != null) {
+ for (int i = 0, len = entities.size(); i < len; ++i) {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, entities.getMap(i), "nbt", fromVersion, toVersion);
+ }
+ }
+
+ final ListType blocks = data.getList("blocks", ObjectType.MAP);
+ if (blocks != null) {
+ for (int i = 0, len = blocks.size(); i < len; ++i) {
+ WalkerUtils.convert(MCTypeRegistry.TILE_ENTITY, blocks.getMap(i), "nbt", fromVersion, toVersion);
+ }
+ }
+
+ WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, data, "palette", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ private V100() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V101.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V101.java
new file mode 100644
index 0000000000000000000000000000000000000000..32d54d5960088b547b3ca09bff28b0752dddd77c
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V101.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.MapType;
+
+public final class V101 {
+
+ private static final int VERSION = MCVersions.V15W32A + 1;
+
+ private static void updateLine(final MapType<String> data, final String path) {
+ final String textString = data.getString(path);
+
+ if (textString == null) {
+ return;
+ }
+
+ data.setString(path, ComponentUtils.convertFromLenient(textString));
+ }
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("Sign", new DataConverter<>(VERSION) {
+
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ data.setBoolean("CanPickUpLoot", true);
+ return null;
+ }
+ });
+ }
+
+ private V101() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V102.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V102.java
new file mode 100644
index 0000000000000000000000000000000000000000..00bb3cff8f3d220d65a18f9b82b4b5361588b109
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final short damage = data.getShort("Damage");
+ if (damage != 0) {
+ data.setShort("Damage", (short)0);
+ }
+ MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f35484ed524dbf09cf9e8b1bb999fc98ec0bb0f
--- /dev/null
+++ b/src/main/java/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<String> 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<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V105.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V105.java
new file mode 100644
index 0000000000000000000000000000000000000000..189b682da7eacea118610e466e8648675fccf776
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V106.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V106.java
new file mode 100644
index 0000000000000000000000000000000000000000..fa9b11b46f0fbcaabcaed02a7fc3f5af3337ec27
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> 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<String> spawn = spawnPotentials.getMap(i);
+ final String spawnType = spawn.getString("Type");
+ if (spawnType == null) {
+ continue;
+ }
+ spawn.remove("Type");
+
+ MapType<String> 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<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V107.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V107.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9d288c41c40d96ac7c6b605babc436d6a5796f3
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V108.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V108.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba9487bc35bedfd7261d4a4fd9476de070f65f33
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V109.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V109.java
new file mode 100644
index 0000000000000000000000000000000000000000..5df0c8da6415a4651e5678a170bc8ff32dd66337
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V110.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V110.java
new file mode 100644
index 0000000000000000000000000000000000000000..b089fc93b88c5a7b4bb1eb0e105120b5393de1b1
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (!data.getBoolean("Saddle") || data.hasKey("SaddleItem", ObjectType.MAP)) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V111.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V111.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c69cf9b419049dc5338abb408fa3f0390e4e353
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1125.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1125.java
new file mode 100644
index 0000000000000000000000000000000000000000..41ceef54e202420616ad57e9f9c200457c7d2848
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> 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<String> convert(final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V113.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V113.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b7d02eac9e121c45b557b664e156327d182c015
--- /dev/null
+++ b/src/main/java/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<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ checkList(data, "HandDropChances", 2);
+ checkList(data, "ArmorDropChances", 4);
+ return null;
+ }
+ });
+ }
+
+ private V113() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1344.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1344.java
new file mode 100644
index 0000000000000000000000000000000000000000..b735165f9b296730b77339875255aa982e18a40a
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V135.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V135.java
new file mode 100644
index 0000000000000000000000000000000000000000..b003819eb395039dca8141179b57632e90db1d4d
--- /dev/null
+++ b/src/main/java/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<String> convert(MapType<String> data, final long sourceVersion, final long toVersion) {
+ MapType<String> ret = null;
+ while (data.hasKey("Riding", ObjectType.MAP)) {
+ final MapType<String> 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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> 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<String> data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Passengers", fromVersion, toVersion);
+
+ return null;
+ });
+
+ }
+
+ private V135() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V143.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V143.java
new file mode 100644
index 0000000000000000000000000000000000000000..90889dddd8a510fe69c47413f5fe3ed4a756fedb
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1446.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1446.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e198bef171c92d53725d338bb793b1e269f2997
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1450.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1450.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf6f57bc84785622aea35dc70872db6d4d9516a1
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> ret = HelperBlockFlatteningV1450.flattenNBT(data);
+ return ret == data ? null : ret.copy(); // copy to avoid problems with later state datafixers
+ }
+ });
+ }
+
+ private V1450() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f6a43d858645baeb3c69959479b6835dd7bd7a8
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java
@@ -0,0 +1,513 @@
+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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> 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<String> 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<String> 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ MapType<String> 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"));
+ V100.registerEquipment(VERSION, 3, "minecraft:enderman");
+ 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: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<String> data, final long fromVersion, final long toVersion) -> {
+ MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ return null;
+ });
+ 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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<String> 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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<String> 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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> 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<String> preHook(final MapType<String> 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<String> criteriaType = Types.NBT.createEmptyMap();
+ data.setMap("CriteriaType", criteriaType);
+
+ criteriaType.setString("type", type);
+ criteriaType.setString("id", id);
+ }
+
+ return null;
+ }
+
+ @Override
+ public MapType<String> postHook(final MapType<String> data, final long fromVersion, final long toVersion) {
+ // repack
+ final MapType<String> 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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> 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<String> 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<String> convert(final MapType<String> 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<String> 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<String> data, final String path) {
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> recipe = recipes.getMap(i);
+
+ convertPumpkin(recipe, "buy");
+ convertPumpkin(recipe, "buyB");
+ convertPumpkin(recipe, "sell");
+ }
+ }
+ }
+ return null;
+ }
+ });
+
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureWalker(VERSION, 7, (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ final ListType list = data.getList("Children", ObjectType.MAP);
+ if (list == null) {
+ return null;
+ }
+
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType<String> 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);
+ }
+
+ return null;
+ });
+ }
+
+ private V1451() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1456.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1456.java
new file mode 100644
index 0000000000000000000000000000000000000000..47682ffbc10805a4cba73dca43198e52c0ce63df
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ data.setByte("Facing", direction2dTo3d(data.getByte("Facing")));
+ return null;
+ }
+ });
+ }
+
+ private V1456() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java
new file mode 100644
index 0000000000000000000000000000000000000000..95822caa64d6c8a780bb120bedd2728355d26b84
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java
@@ -0,0 +1,87 @@
+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 V1458 {
+
+ private static final int VERSION = MCVersions.V17W50A + 1;
+
+ public static MapType<String> updateCustomName(final MapType<String> data) {
+ final String customName = data.getString("CustomName", "");
+
+ if (customName.isEmpty()) {
+ data.remove("CustomName");
+ } else {
+ data.setString("CustomName", ComponentUtils.createPlainTextComponent(customName));
+ }
+
+ return null;
+ }
+
+ public static void register() {
+ // From CB
+ MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ return updateCustomName(data);
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if ("minecraft:command_block".equals(data.getString("id"))) {
+ return null;
+ }
+
+ return updateCustomName(data);
+ }
+ });
+
+ }
+
+ private V1458() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1460.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1460.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf64be7255b02461d218a821ac9b36ba5bc83b13
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1466.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1466.java
new file mode 100644
index 0000000000000000000000000000000000000000..d870aaca4ff623c71604f889c2e667bfe50fe696
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V147.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V147.java
new file mode 100644
index 0000000000000000000000000000000000000000..af9c6ee26580eb10bf8426f5b61c26df63a910a6
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (data.getBoolean("Silent") && !data.getBoolean("Marker")) {
+ data.remove("Silent");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V147() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java
new file mode 100644
index 0000000000000000000000000000000000000000..2bf1baee2321b3cb584ab6355f43263d6c8ec0be
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java
@@ -0,0 +1,31 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:turtle");
+ registerMob("minecraft:cod_mob");
+ registerMob("minecraft:tropical_fish");
+ registerMob("minecraft:salmon_mob");
+ registerMob("minecraft:puffer_fish");
+ registerMob("minecraft:phantom");
+ registerMob("minecraft:dolphin");
+ registerMob("minecraft:drowned");
+
+ 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1474.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1474.java
new file mode 100644
index 0000000000000000000000000000000000000000..99f0f34cc14639ed8ed73b847f74cdc607607af8
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1475.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1475.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ae50eea847671f3995688901c79caf520440d7a
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1480.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1480.java
new file mode 100644
index 0000000000000000000000000000000000000000..7180c1168bffb9fe70d18fe7414a5372518413a8
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1483.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1483.java
new file mode 100644
index 0000000000000000000000000000000000000000..56d9babebba8b8ba6be07ea413e9c04ffea84023
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1484.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1484.java
new file mode 100644
index 0000000000000000000000000000000000000000..cdbb9379f66aa6edc05c5e6cb2bdeae97f1ea38b
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> level = data.getMap("Level");
+
+ if (level == null) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1486.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1486.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9e42da41064ea293a71dbf2d681a857b2e1812e
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1487.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1487.java
new file mode 100644
index 0000000000000000000000000000000000000000..884049818efdf273443fb3d1c2d7250564fbdbf7
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1488.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1488.java
new file mode 100644
index 0000000000000000000000000000000000000000..907a5e2a26ee046e292508e1f06d5f26d10af8c1
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1488.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.converters.blockname.ConverterAbstractBlockRename;
+import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename;
+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;
+
+public final class V1488 {
+
+ private static final int VERSION = MCVersions.V18W19B + 3;
+
+ private static boolean isIglooPiece(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ return V1458.updateCustomName(data);
+ }
+ });
+
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:commandblock_minecart", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ return V1458.updateCustomName(data);
+ }
+ });
+
+ MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> child = children.getMap(i);
+ if (isIglooPiece(child)) {
+ children.remove(i);
+ continue;
+ }
+ ++i;
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1488() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1490.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1490.java
new file mode 100644
index 0000000000000000000000000000000000000000..1e99de15732bdd283835a9531f76e29ddab91f46
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1492.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1492.java
new file mode 100644
index 0000000000000000000000000000000000000000..1259216b43434d0f7c7be10a081fd05057c253cf
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1494.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1494.java
new file mode 100644
index 0000000000000000000000000000000000000000..b72fe109aa8c60425c00aad234d60a1c70dda60b
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> enchant = storedEnchants.getMap(i);
+ enchant.setString("id", ENCH_ID_TO_NAME.getOrDefault(enchant.getInt("id"), "null"));
+ }
+ }
+
+
+ return null;
+ }
+ });
+ }
+
+ private V1494() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1496.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1496.java
new file mode 100644
index 0000000000000000000000000000000000000000..10349a70b865b19cca471a16548fd49910a2b0e7
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> 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<String> section) {
+ this.palette = section.getList("Palette", ObjectType.MAP);
+ this.sectionY = section.getInt("Y");
+ this.readStorage(section);
+ }
+
+ protected void readStorage(final MapType<String> 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<String> 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<String> 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<String> blockState = this.palette.getMap(i);
+ final String name = blockState.getString("Name", "");
+ if (LEAVES_TO_ID.containsKey(name)) {
+ final MapType<String> 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<String> makeNewLeafTag(final String name, final boolean notDecayable, final int distance) {
+ final MapType<String> properties = Types.NBT.createEmptyMap();
+ final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1500.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1500.java
new file mode 100644
index 0000000000000000000000000000000000000000..fae8cf61c9900544cdecd223f72e1311c8a1cfb1
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ data.setBoolean("keepPacked", true);
+ return null;
+ }
+ });
+ }
+
+ private V1500() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1501.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1501.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbfb51b74c54a9a479de49ecb295854fc69aef64
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1502.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1502.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd07718649f0e2ca66f1ec3b0aba81611333ba09
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce87995961605c80f24371c9c64706ae76e3edea
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java
@@ -0,0 +1,219 @@
+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.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.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<String> convert(final MapType<String> 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.setMap("generatorOptions", JsonTypeUtil.convertJsonToNBT(new JsonMapType(GsonHelper.parse(generatorOptions, true), false)));
+ }
+ return null;
+ }
+ });
+ }
+
+ private static MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1510.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1510.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfc9d1e89983c73e06ce3c8a22c29f49af4a935c
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1514.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1514.java
new file mode 100644
index 0000000000000000000000000000000000000000..6bcc0de5987db4d9ac28fabefbb58c28f2065d96
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1515.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1515.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2093732e06ddccdd8a34bbfcaee6ede3aae96d0
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1624.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1624.java
new file mode 100644
index 0000000000000000000000000000000000000000..f198495e1bad7a1cb84f41c1ea96b1d0e7943c9e
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> section) {
+ super(section);
+ }
+
+ @Override
+ protected boolean initSkippable() {
+ this.chestIds = new IntOpenHashSet();
+
+ for (int i = 0; i < this.palette.size(); ++i) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V165.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V165.java
new file mode 100644
index 0000000000000000000000000000000000000000..810a838edeea95bb5d0b4b351e65417b762fc45c
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V165.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.minecraft.util.ComponentUtils;
+import ca.spottedleaf.dataconverter.types.ObjectType;
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f65def5a0f48af268183d9c3b74937924b47b75
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java
@@ -0,0 +1,36 @@
+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()
+ );
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ ConverterAbstractItemRename.register(VERSION, RENAMED_ITEM_IDS::get);
+
+ registerMob("minecraft:panda");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:pillager", new DataWalkerItemLists("Inventory"));
+ V100.registerEquipment(VERSION, "minecraft:pillager");
+ }
+
+ private V1800() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e1a3af9fb261e585542495f189f898eaa6d9263
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java
@@ -0,0 +1,18 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:illager_beast");
+ }
+
+ private V1801() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1802.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1802.java
new file mode 100644
index 0000000000000000000000000000000000000000..aeae0c62efa1e189fe4b0da585c8a2a101bb5ede
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1803.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1803.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad12a97fe28b6f05973f0927245c944dcf184c46
--- /dev/null
+++ b/src/main/java/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 {
+
+ private static final int VERSION = MCVersions.V1_13_2 + 172;
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> tag = data.getMap("tag");
+
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1904.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1904.java
new file mode 100644
index 0000000000000000000000000000000000000000..2066f320d774319bec84007ca7ed137eb78d91d1
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1904.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.minecraft.walkers.itemstack.DataWalkerItemLists;
+import ca.spottedleaf.dataconverter.types.MapType;
+
+public final class V1904 {
+
+ private static final int VERSION = MCVersions.V18W43C + 1;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:ocelot", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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");
+ }
+
+ private V1904() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1905.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1905.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4bd2c65fe5a4b4d3e430e5c7eee79435afac4ee
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbf3215a781555d048077565851884eeb48402b1
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java
@@ -0,0 +1,20 @@
+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 V1906 {
+
+ private static final int VERSION = MCVersions.V18W43C + 3;
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:barrel", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:smoker", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:blast_furnace", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:lectern", new DataWalkerItems("Book"));
+ }
+
+ private V1906() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1909.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1909.java
new file mode 100644
index 0000000000000000000000000000000000000000..ede4d0bfc0fe0e4a3a6fb906037a4c964baac6e6
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1911.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1911.java
new file mode 100644
index 0000000000000000000000000000000000000000..02204cd67dc614e95f2ab95ed413ce62baec296f
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1914.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1914.java
new file mode 100644
index 0000000000000000000000000000000000000000..a965a5941e3624db725a4f101405357df11598c8
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1917.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1917.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8b5f5818ed4e839b62777a5d5e9baf70b12a6f0
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (data.getInt("CatType") == 9) {
+ data.setInt("CatType", 10);
+ }
+ return null;
+ }
+ });
+ }
+
+ private V1917() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1918.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1918.java
new file mode 100644
index 0000000000000000000000000000000000000000..f97f21e12af1e02aacc1591a88b5da3d7e3f4cfa
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> converter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1920.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1920.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe2d58caf2371f1c430dea209210357f36392a96
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ final MapType<String> structures = level.getMap("Structures");
+ if (structures == null) {
+ return null;
+ }
+
+ final MapType<String> starts = structures.getMap("Starts");
+ if (starts != null) {
+ final MapType<String> village = starts.getMap("New_Village");
+ if (village != null) {
+ starts.remove("New_Village");
+ starts.setMap("Village", village);
+ } else {
+ starts.remove("Village");
+ }
+ }
+
+ final MapType<String> references = structures.getMap("References");
+ if (references != null) {
+ final MapType<String> 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1925.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1925.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f2db47a58baf1851abb9269b13fb08d4740081a
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1925.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;
+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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> data = root.getMap("data");
+ if (data == null) {
+ final MapType<String> ret = Types.NBT.createEmptyMap();
+ ret.setMap("data", root);
+
+ return ret;
+ }
+ return null;
+ }
+ });
+ }
+
+ private V1925() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1f7cd60d3fb1d7d3de92091681932607b452d25
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java
@@ -0,0 +1,33 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ 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");
+ }
+
+ private V1928() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc377819db8182b466b92aba9a9c0d2c483f941d
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java
@@ -0,0 +1,34 @@
+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<String> 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;
+ });
+ V100.registerEquipment(VERSION, "minecraft:wandering_trader");
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trader_llama", (final MapType<String> 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;
+ });
+ V100.registerEquipment(VERSION, "minecraft:trader_llama");
+ }
+
+ private V1929() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ae698a80e81a1648bb90149d9f0effdec8e777c
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java
@@ -0,0 +1,19 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V1931 {
+
+ private static final int VERSION = MCVersions.V19W06A;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:fox");
+ }
+
+ private V1931() {}
+
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1936.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1936.java
new file mode 100644
index 0000000000000000000000000000000000000000..ddebd1ea2eec5e469d4857503965084d78afce19
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1946.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1946.java
new file mode 100644
index 0000000000000000000000000000000000000000..70d3ab9fe12fab7282edc18938faa94a34d3decb
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> section = Types.NBT.createEmptyMap();
+ section.setGeneric("Records", records);
+ sections.setMap(key, section); // integer keys convert to string in DFU (at least for NBT ops)
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1946() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1948.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1948.java
new file mode 100644
index 0000000000000000000000000000000000000000..19b0a1197cdf5988f21ba332883b65df646ff0c1
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1953.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1953.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7887c54c85dd7a198aa5c1597c02b2d6887bf71
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1955.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1955.java
new file mode 100644
index 0000000000000000000000000000000000000000..8654f8c7f759720e1e1dd8ae94656699f151c407
--- /dev/null
+++ b/src/main/java/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<String> data, final int level) {
+ MapType<String> 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<String> data, final int level) {
+ data.setInt("Xp", getMinXpPerLevel(level));
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> villagerData = data.getMap("VillagerData");
+ int level = villagerData == null ? 0 : villagerData.getInt("level");
+ if (level == 0 || level == 1) {
+ // count recipes
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final Number xp = data.getNumber("Xp");
+ if (xp == null) {
+ final int level;
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1961.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1961.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b1b9b55e2491bd98efddfb28e2aa1074140a1c2
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> level = data.getMap("Level");
+ if (level == null) {
+ return null;
+ }
+
+ level.remove("isLightOn");
+
+ return null;
+ }
+ });
+ }
+
+ private V1961() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1963.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1963.java
new file mode 100644
index 0000000000000000000000000000000000000000..023d8b9aa7d95c674847d9c5dbe0061adcbdc4d3
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> gossip = gossips.getMap(i);
+ if ("golem".equals(gossip.getString("Type"))) {
+ gossips.remove(i);
+ continue;
+ }
+
+ ++i;
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V1963() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java
new file mode 100644
index 0000000000000000000000000000000000000000..cec032b20e834a8c6c8901e6fb2d127d7c80b353
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java
@@ -0,0 +1,51 @@
+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"
+ )
+ );
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ ConverterAbstractRecipeRename.register(VERSION, RECIPE_RENAMES::get);
+ ConverterAbstractAdvancementsRename.register(VERSION, ADVANCEMENT_RENAMES::get);
+
+ registerMob("minecraft:bee");
+ registerMob("minecraft:bee_stinger");
+ 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2202.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2202.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9a23cf055353ee49f07263ea01161de2c035138
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2209.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2209.java
new file mode 100644
index 0000000000000000000000000000000000000000..7439d0e948f144d93a1fa7b57c2b478a54835d6d
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2211.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2211.java
new file mode 100644
index 0000000000000000000000000000000000000000..20904d3e18b317a2f7e5d6063fcf94dda27b5768
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2218.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2218.java
new file mode 100644
index 0000000000000000000000000000000000000000..8297fe9ab7007399847f3e7ac84519f0dec08576
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> sections = data.getMap("Sections");
+ if (sections == null) {
+ return null;
+ }
+
+ for (final String key : sections.keys()) {
+ final MapType<String> section = sections.getMap(key);
+
+ section.remove("Valid");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2218() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2501.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2501.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2be8817fe733ae30729952a2aae13d2396b8111
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2501.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.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.convertKeys(MCTypeRegistry.RECIPE, data, "RecipesUsed", fromVersion, toVersion);
+
+ return null;
+ });
+ }
+
+ public static void register() {
+ final DataConverter<MapType<String>, MapType<String>> converter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final int recipesUsedSize = data.getInt("RecipesUsedSize");
+ data.remove("RecipesUsedSize");
+
+ if (recipesUsedSize <= 0) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java
new file mode 100644
index 0000000000000000000000000000000000000000..540ae9aab0acdfbd3800db0468c52e973cb8d93f
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java
@@ -0,0 +1,18 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:hoglin");
+ }
+
+ private V2502() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2503.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2503.java
new file mode 100644
index 0000000000000000000000000000000000000000..994960d0e67ed0af48d33e9a3db5d1757d85eac5
--- /dev/null
+++ b/src/main/java/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<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (!WALL_BLOCKS.contains(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2505.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2505.java
new file mode 100644
index 0000000000000000000000000000000000000000..9342d9efeb1980c7cb67bf0620d12bd9f71165ee
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2505.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.MapType;
+import ca.spottedleaf.dataconverter.types.Types;
+
+public final class V2505 {
+
+ private static final int VERSION = MCVersions.V20W06A + 1;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> brain = data.getMap("Brain");
+ if (brain == null) {
+ return null;
+ }
+
+ final MapType<String> memories = brain.getMap("memories");
+ if (memories == null) {
+ return null;
+ }
+
+ for (final String key : memories.keys()) {
+ final Object value = memories.getGeneric(key);
+
+ final MapType<String> wrapped = Types.NBT.createEmptyMap();
+ wrapped.setGeneric("value", value);
+
+ memories.setMap(key, wrapped);
+ }
+
+ return null;
+ }
+ });
+
+ registerMob("minecraft:piglin");
+ }
+
+ private V2505() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2508.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2508.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9e9d88e4cca15d2d4fdcbc0dbcae4c35c02284a
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java
new file mode 100644
index 0000000000000000000000000000000000000000..b948564d01726d9891a0733896b3e5cec937bd6d
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java
@@ -0,0 +1,33 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ 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");
+ }
+
+ private V2509() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java
new file mode 100644
index 0000000000000000000000000000000000000000..a640878469c7ea155cde1cca728b15f2a4bacd73
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java
@@ -0,0 +1,97 @@
+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<String> 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<String>, MapType<String>> throwableConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String>, MapType<String>> potionConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> potion = data.getMap("Potion");
+ data.remove("Potion");
+
+ data.setMap("Item", potion == null ? Types.NBT.createEmptyMap() : potion);
+
+ return null;
+ }
+ };
+ final DataConverter<MapType<String>, MapType<String>> llamaSpitConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String>, MapType<String>> arrowConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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 migrates the potion item but does not change the schema.
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerItems("Item"));
+ }
+
+ private V2511() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2514.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2514.java
new file mode 100644
index 0000000000000000000000000000000000000000..dcd2b1689bbd845238c86cea9dae0c5153d01499
--- /dev/null
+++ b/src/main/java/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<String> 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<String> 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<String> 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<String> 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<String> 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<String> data) {
+ final MapType<String> brain = data.getMap("Brain");
+ if (brain == null) {
+ return;
+ }
+
+ final MapType<String> memories = brain.getMap("memories");
+ if (memories == null) {
+ return;
+ }
+
+ final MapType<String> angryAt = memories.getMap("minecraft:angry_at");
+
+ replaceUUIDString(angryAt, "value", "value");
+ }
+
+ private static void updateEvokerFangs(final MapType<String> data) {
+ replaceUUIDLeastMost(data, "OwnerUUID", "Owner");
+ }
+
+ private static void updateZombieVillager(final MapType<String> data) {
+ replaceUUIDLeastMost(data, "ConversionPlayer", "ConversionPlayer");
+ }
+
+ private static void updateAreaEffectCloud(final MapType<String> data) {
+ replaceUUIDLeastMost(data, "OwnerUUID", "Owner");
+ }
+
+ private static void updateShulkerBullet(final MapType<String> data) {
+ replaceUUIDMLTag(data, "Owner", "Owner");
+ replaceUUIDMLTag(data, "Target", "Target");
+ }
+
+ private static void updateItem(final MapType<String> data) {
+ replaceUUIDMLTag(data, "Owner", "Owner");
+ replaceUUIDMLTag(data, "Thrower", "Thrower");
+ }
+
+ private static void updateFox(final MapType<String> 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<String> uuid = trustedUUIDS.getMap(i);
+ final int[] newUUID = createUUIDFromLongs(uuid, "M", "L");
+ if (newUUID != null) {
+ newUUIDs.addIntArray(newUUID);
+ }
+ }
+ }
+
+ private static void updateHurtBy(final MapType<String> data) {
+ replaceUUIDString(data, "HurtBy", "HurtBy");
+ }
+
+ private static void updateAnimalOwner(final MapType<String> data) {
+ updateAnimal(data);
+
+ replaceUUIDString(data, "OwnerUUID", "Owner");
+ }
+
+ private static void updateAnimal(final MapType<String> data) {
+ updateMob(data);
+
+ replaceUUIDLeastMost(data, "LoveCause", "LoveCause");
+ }
+
+ private static void updateMob(final MapType<String> data) {
+ updateLivingEntity(data);
+
+ final MapType<String> leash = data.getMap("Leash");
+ if (leash == null) {
+ return;
+ }
+
+ replaceUUIDLeastMost(leash, "UUID", "UUID");
+ }
+
+ private static void updateLivingEntity(final MapType<String> 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<String> 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<String> data) {
+ final Object ownerUUID = data.getGeneric("OwnerUUID");
+ if (ownerUUID != null) {
+ data.remove("OwnerUUID");
+ data.setGeneric("Owner", ownerUUID);
+ }
+ }
+
+ private static void updateEntityUUID(final MapType<String> data) {
+ replaceUUIDLeastMost(data, "UUID", "UUID");
+ }
+
+ public static void register() {
+ // Entity UUID fixes
+
+ MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateEntityUUID(data);
+ return null;
+ }
+ });
+
+ final DataConverter<MapType<String>, MapType<String>> animalOwnerConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateAnimalOwner(data);
+ return null;
+ }
+ };
+ final DataConverter<MapType<String>, MapType<String>> animalConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateAnimal(data);
+ return null;
+ }
+ };
+ final DataConverter<MapType<String>, MapType<String>> mobConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateMob(data);
+ return null;
+ }
+ };
+ final DataConverter<MapType<String>, MapType<String>> livingEntityConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateLivingEntity(data);
+ return null;
+ }
+ };
+ final DataConverter<MapType<String>, MapType<String>> projectileConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateHurtBy(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombified_piglin", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateHurtBy(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:fox", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateFox(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:item", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateItem(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker_bullet", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateShulkerBullet(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateAreaEffectCloud(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateZombieVillager(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:evoker_fangs", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateEvokerFangs(data);
+ return null;
+ }
+ });
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:piglin", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ updateLivingEntity(data);
+ updateEntityUUID(data);
+
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ replaceUUIDString(data, "WanderingTraderId", "WanderingTraderId");
+
+ final MapType<String> dimensionData = data.getMap("DimensionData");
+ if (dimensionData != null) {
+ for (final String key : dimensionData.keys()) {
+ final MapType<String> dimension = dimensionData.getMap(key);
+
+ final MapType<String> dragonFight = dimension.getMap("DragonFight");
+ if (dragonFight == null) {
+ continue;
+ }
+
+ replaceUUIDLeastMost(dragonFight, "DragonUUID", "Dragon");
+ }
+ }
+
+ final MapType<String> customBossEvents = data.getMap("CustomBossEvents");
+ if (customBossEvents != null) {
+ for (final String key : customBossEvents.keys()) {
+ final MapType<String> 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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> tag) {
+ replaceUUIDString(tag.getMap("SkullOwner"), "Id", "Id");
+ }
+
+ private V2514() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2516.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2516.java
new file mode 100644
index 0000000000000000000000000000000000000000..99f65d84ffaa75db3d2b4568c92d85d3ef20b77f
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> gossipUUIDConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2518.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2518.java
new file mode 100644
index 0000000000000000000000000000000000000000..35eccf43fd7e31071a9d64883212cddf021ae861
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:jigsaw".equals(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java
new file mode 100644
index 0000000000000000000000000000000000000000..7cb7106037b18c0cf8ddff1f9ba25d4f987a6326
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2519 {
+
+ private static final int VERSION = MCVersions.V20W12A + 4;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:strider");
+ }
+
+ private V2519() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a4d47d78596e2275745673f31f772f0252f2cda
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2522 {
+
+ private static final int VERSION = MCVersions.V20W13B + 1;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:zoglin");
+ }
+
+ private V2522() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2523.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2523.java
new file mode 100644
index 0000000000000000000000000000000000000000..7777d83d63dc177f0bac72290ed2e5c3cbd028be
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2527.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2527.java
new file mode 100644
index 0000000000000000000000000000000000000000..157f4b1673f7b71942949d979890b30a5f9e2ca3
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2528.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2528.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7197d098b3d6269d3a4fd9be0432d85f0504dfd
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2529.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2529.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e54a4ee0c14109609d8d8f1bc6c0c5dabf4fb07
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (data.getBoolean("NoGravity")) {
+ data.setBoolean("NoGravity", false);
+ }
+ return null;
+ }
+ });
+ }
+
+ private V2529() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2531.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2531.java
new file mode 100644
index 0000000000000000000000000000000000000000..9306ab25feae6315e48aeeb71de960bdf62bcf76
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:redstone_wire".equals(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2533.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2533.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8d493674380d53398c853899da76024c9d84984
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2535.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2535.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0f6135fff38100c1955d64ee3f4ff984308e503
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2538.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2538.java
new file mode 100644
index 0000000000000000000000000000000000000000..99d1df6362b290fdaa65385168ff6588647a8056
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2550.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2550.java
new file mode 100644
index 0000000000000000000000000000000000000000..f64f2c2d6051b7e7024a0ebc42c1dd8dc6434cf9
--- /dev/null
+++ b/src/main/java/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<String> serialize() {
+ final MapType<String> 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<String> convert(final MapType<String> 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<String> generator;
+ boolean caves = false;
+
+ if ("customized".equals(generatorName) || generatorName == null) {
+ generator = defaultOverworld(seed);
+ } else {
+ switch (generatorName) {
+ case "flat": {
+ final MapType<String> generatorOptions = data.getMap("generatorOptions");
+
+ final MapType<String> structures = fixFlatStructures(generatorOptions);
+ final MapType<String> 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<String> 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<String> generatorOptions = data.getMap("generatorOptions");
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> noise(final long seed, final String worldType, final MapType<String> biomeSource) {
+ final MapType<String> 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<String> vanillaBiomeSource(final long seed, final boolean default11Gen, final boolean largeBiomes) {
+ final MapType<String> 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<String> fixFlatStructures(final MapType<String> 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<String> oldStructures = generatorOptions == null ? null : generatorOptions.getMap("structures");
+ if (oldStructures != null) {
+ for (final String structureName : oldStructures.keys()) {
+ final MapType<String> 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<String> ret = Types.NBT.createEmptyMap();
+ final MapType<String> 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<String> 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<String> vanillaLevels(final long seed, final MapType<String> generator, final boolean caves) {
+ final MapType<String> ret = Types.NBT.createEmptyMap();
+
+ final MapType<String> overworld = Types.NBT.createEmptyMap();
+ final MapType<String> nether = Types.NBT.createEmptyMap();
+ final MapType<String> 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<String> 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<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2551.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2551.java
new file mode 100644
index 0000000000000000000000000000000000000000..9cfecd222ef41fdb4f31517a0821d7532386285f
--- /dev/null
+++ b/src/main/java/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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> dimensions = data.getMap("dimensions");
+
+ if (dimensions == null) {
+ return null;
+ }
+
+ for (final String dimension : dimensions.keys()) {
+ final MapType<String> dimensionData = dimensions.getMap(dimension);
+ if (dimensionData == null) {
+ continue;
+ }
+
+ final MapType<String> 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<String> 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<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2552.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2552.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e6c7dc40d509cf424976831382425ab7eceb024
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2553.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2553.java
new file mode 100644
index 0000000000000000000000000000000000000000..f019774923bf08fc0f7dc7cafd5fb66fdd7427f8
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2558.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2558.java
new file mode 100644
index 0000000000000000000000000000000000000000..137a530c1b979e7257b77f405885aa9f4d376c11
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ MapType<String> 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<String> recreateSettings(final MapType<String> data) {
+ final long seed = data.getLong("seed");
+
+ return V2550.vanillaLevels(seed, V2550.defaultOverworld(seed), false);
+ }
+
+ private V2558() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java
new file mode 100644
index 0000000000000000000000000000000000000000..e50fbc38dbf9198c0c652b506e50780eca368bb0
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java
@@ -0,0 +1,18 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:piglin_brute");
+ }
+
+ private V2568() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java
new file mode 100644
index 0000000000000000000000000000000000000000..140bfff947e540452f3794eda2f1e2122f8d3f27
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java
@@ -0,0 +1,18 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:goat");
+ }
+
+ private V2671() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2679.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2679.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ec79da7e8871d6beca05a25c70d8c6811531faa
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (!"minecraft:cauldron".equals(data.getString("Name"))) {
+ return null;
+ }
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2680.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2680.java
new file mode 100644
index 0000000000000000000000000000000000000000..87cbe1c717635908a30c57028346a1abeb21e6a6
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2684.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2684.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c996642f561d2471a506a34f5efe6dae5cd1fb3
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f1685cb0e1427e88dc5c970b0cb58aae0393396
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V2686 {
+
+ private static final int VERSION = MCVersions.V20W49A + 1;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:axolotl");
+ }
+
+ private V2686() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2688.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2688.java
new file mode 100644
index 0000000000000000000000000000000000000000..15a7bf7b7ea883d7a3cee9183b92e12838efd690
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2688.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;
+import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems;
+
+public final class V2688 {
+
+ private static final int VERSION = MCVersions.V20W51A + 1;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:glow_squid");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:glow_item_frame", new DataWalkerItems("Item"));
+ }
+
+ private V2688() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2690.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2690.java
new file mode 100644
index 0000000000000000000000000000000000000000..39ffcec6e78229dd62abfd42c1ac64c3ccccc6dc
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2691.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2691.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb87bcedfc2ed8d19b266e925beca0f54b50a0ab
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2693.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2693.java
new file mode 100644
index 0000000000000000000000000000000000000000..a242e8e9a7a7c80c00ec0d64542b3d7dc3103e24
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2696.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2696.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce568002e54924e001c12271f0bde7183bc23c61
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2700.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2700.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6a2f29b20aa6d7cd431fc63c2d8ed70dc9a2ab8
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2701.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2701.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc1604f48a9f15721e709f2e128210085520c15e
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> 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<String> 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<String> 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<String>)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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2702.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2702.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc89ca8a01c2589c807be2a7560bcc6051417379
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> arrowConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c5fc48f39c08249a61199c7f72dddee65fd98af
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java
@@ -0,0 +1,22 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new AddFlagIfAbsent(VERSION, "has_increased_height_already", true));
+
+ registerMob("minecraft:marker"); // ?????????????
+ }
+
+ private V2707() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2710.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2710.java
new file mode 100644
index 0000000000000000000000000000000000000000..0967c8c794869a972c1283cab6b3f3cef1d77aec
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2717.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2717.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0d6b2f6b00e0bfce205efa889de1765ef22793a
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2825.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2825.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd00c9398791967be6dd10f7183c61902431b27a
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2831.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2831.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b692e4866d99c89705289ad1f386f467382b1c7
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2831.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.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<String> root, final long fromVersion, final long toVersion) -> {
+ final ListType spawnPotentials = root.getList("SpawnPotentials", ObjectType.MAP);
+ if (spawnPotentials != null) {
+ for (int i = 0, len = spawnPotentials.size(); i < len; ++i) {
+ final MapType<String> spawnPotential = spawnPotentials.getMap(i);
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, spawnPotential.getMap("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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> spawnData = root.getMap("SpawnData");
+ if (spawnData != null) {
+ final MapType<String> 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<String> spawnPotential = spawnPotentials.getMap(i);
+
+ // new format of weighted list (SpawnPotentials):
+ // root.data -> data
+ // root.weight -> weight
+
+ final MapType<String> entity = spawnPotential.getMap("Entity");
+ final int weight = spawnPotential.getInt("Weight", 1);
+ spawnPotential.remove("Entity");
+ spawnPotential.remove("Weight");
+ spawnPotential.setInt("weight", weight);
+
+ final MapType<String> data = Types.NBT.createEmptyMap();
+ spawnPotential.setMap("data", data);
+
+ data.setMap("entity", entity);
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2831() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java
new file mode 100644
index 0000000000000000000000000000000000000000..21d1617d222d0b82b1c5222a0ef1a1fa9da02ab8
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java
@@ -0,0 +1,929 @@
+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<String> data) {
+ // See https://github.com/CaffeineMC/lithium-fabric/issues/279
+ final MapType<String> 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<String> 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<String> convert(final MapType<String> 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<String> dimensions = data.getMap("dimensions");
+ if (dimensions == null) {
+ // wat
+ return null;
+ }
+
+ // only care about overworld
+ final MapType<String> overworld = dimensions.getMap("minecraft:overworld");
+ if (overworld == null) {
+ // wat
+ return null;
+ }
+
+ final MapType<String> generator = overworld.getMap("generator");
+ if (generator == null) {
+ // wat
+ return null;
+ }
+
+ final String type = generator.getString("type", "");
+ switch (type) {
+ case "minecraft:noise": {
+ final MapType<String> 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<String> 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<String> 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<String> convert(final MapType<String> 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<String> level = data.getMap("Level");
+
+ if (level == null) {
+ return null;
+ }
+
+ final MapType<String> 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<String>[] newBiomes = createBiomeSections(level, isOverworld, minSection, isAlreadyExtended);
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> dimensions = data.getMap("dimensions");
+
+ if (dimensions == null) {
+ return null;
+ }
+
+ for (final String dimension : dimensions.keys()) {
+ final MapType<String> dimensionData = dimensions.getMap(dimension);
+ if (dimensionData == null) {
+ continue;
+ }
+
+ final MapType<String> 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<String> 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<String> 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<String> 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.
+
+ 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;
+ });
+
+ MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> getEmptyBlockPalette() {
+ final MapType<String> 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<String> upgradeData, final int shift) {
+ if (upgradeData == null) {
+ return;
+ }
+
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> 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<String> level, final int newSize, final int offset) {
+ final MapType<String> 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<String> 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<String> level) {
+ final MapType<String> 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<String>[] createBiomeSections(final MapType<String> level, final boolean wantExtendedHeight,
+ final int minSection, final MutableBoolean isAlreadyExtended) {
+ final MapType<String>[] 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<String> bottomCopy = createBiomeSection(biomes, 0, 15); // just want the biomes at y = 0
+ final MapType<String> 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<String> 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<String> wrapPalette(final ListType palette) {
+ return wrapPalette(palette, null);
+ }
+
+ private static MapType<String> wrapPalette(final ListType palette, final long[] blockStates) {
+ final MapType<String> ret = Types.NBT.createEmptyMap();
+ ret.setList("palette", palette);
+ if (blockStates != null) {
+ ret.setLongs("data", blockStates);
+ }
+
+ return ret;
+ }
+
+ private static MapType<String> 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<String> createEmptyLayer() {
+ final MapType<String> ret = Types.NBT.createEmptyMap();
+ ret.setInt("height", 64);
+ ret.setString("block", "minecraft:air");
+
+ return ret;
+ }
+
+ private V2832() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2833.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2833.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c58b3b53d8526cbde6cf1e8c90cabdaceaf2a03
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> dimensions = data.getMap("dimensions");
+
+ for (final String dimensionKey : dimensions.keys()) {
+ final MapType<String> dimension = dimensions.getMap(dimensionKey);
+ if (!dimension.hasKey("type")) {
+ throw new IllegalStateException("Unable load old custom worlds.");
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2833() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2838.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2838.java
new file mode 100644
index 0000000000000000000000000000000000000000..356963228d884a0a74e6d7c9922b4ced627bbfb0
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2841.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2841.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd8117a101d308e59251f927feb0692a6b22f547
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> section = sections.getMap(i);
+
+ final int sectionY = section.getInt("Y");
+ if (sectionY < minSection && section.hasKey("biomes")) {
+ minSection = sectionY;
+ }
+
+ final MapType<String> 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<String> 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<String> 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<String> 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<String> blockState) {
+ return blockState == null ? "minecraft:air" : blockState.getString("Name", "minecraft:air");
+ }
+
+ private static String getLiquidId(final MapType<String> blockState) {
+ if (blockState == null) {
+ return "minecraft:empty";
+ }
+
+ final String name = blockState.getString("Name");
+ if (ALWAYS_WATERLOGGED.contains(name)) {
+ return "minecraft:water";
+ }
+
+ final MapType<String> 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<String> getState(final int x, final int y, final int z) {
+ final int index = x | (z << 4) | (y << 8);
+ return this.getState(index);
+ }
+
+ public MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2842.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2842.java
new file mode 100644
index 0000000000000000000000000000000000000000..03b3d8e2b97a346a45e6c57cb07474baa3bb6096
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java
new file mode 100644
index 0000000000000000000000000000000000000000..28a7596b62f8a918f342e2d06eda050a7f2bad0b
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java
@@ -0,0 +1,111 @@
+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<String> 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<String> 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<String> upgradeData = chunkRoot.getMap("UpgradeData");
+ if (upgradeData == null) {
+ chunkRoot.setMap("UpgradeData", upgradeData = Types.NBT.createEmptyMap());
+ }
+ upgradeData.setList(intoKey, outOfBounds);
+ }
+ }
+
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> 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 MapType<String> upgradeData = data.getMap("UpgradeData");
+ if (upgradeData != null) {
+ // 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.
+ final ListType neighbourBlockTicks = upgradeData.getList("neighbor_block_ticks", ObjectType.MAP);
+ if (neighbourBlockTicks != null) {
+ for (int i = 0, len = neighbourBlockTicks.size(); i < len; ++i) {
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, neighbourBlockTicks.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<String> 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 V2843() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2846.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2846.java
new file mode 100644
index 0000000000000000000000000000000000000000..e32224267d53d82ba15942141a5cb7a19eb380f2
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2852.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2852.java
new file mode 100644
index 0000000000000000000000000000000000000000..224ee1d9a3ba68e5a617c2c0846be47feef0bed1
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> dimensions = data.getMap("dimensions");
+
+ for (final String dimensionKey : dimensions.keys()) {
+ final MapType<String> dimension = dimensions.getMap(dimensionKey);
+ if (!dimension.hasKey("type")) {
+ throw new IllegalStateException("Unable load old custom worlds.");
+ }
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2852() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2967.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2967.java
new file mode 100644
index 0000000000000000000000000000000000000000..eddfdecffcaf5e4cd7e5c3a79864816ffbaacae1
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> dimensions = data.getMap("dimensions");
+
+ if (dimensions == null) {
+ return null;
+ }
+
+ for (final String dimension : dimensions.keys()) {
+ final MapType<String> dimensionData = dimensions.getMap(dimension);
+ if (dimensionData == null) {
+ continue;
+ }
+
+ final MapType<String> generator = dimensionData.getMap("generator");
+ if (generator == null) {
+ continue;
+ }
+
+ final MapType<String> settings = generator.getMap("settings");
+ if (settings == null) {
+ continue;
+ }
+
+ final MapType<String> structures = settings.getMap("structures");
+ if (structures == null) {
+ continue;
+ }
+
+ for (final String structureKey : structures.keys()) {
+ structures.getMap(structureKey).setString("type", "minecraft:random_spread");
+ }
+
+ final MapType<String> stronghold = structures.getMap("stronghold");
+ stronghold.setString("type", "minecraft:concentric_rings");
+ structures.setMap("minecraft:stronghold", stronghold.copy());
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V2967() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2970.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2970.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce083fca547170bb1e1014e868beaf535e940fc3
--- /dev/null
+++ b/src/main/java/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<String> 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<String> section = sections.getMap(i);
+
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> structures = data.getMap("structures");
+ if (structures == null || structures.isEmpty()) {
+ return null;
+ }
+
+ final Object2IntOpenHashMap<String> biomeCounts = countBiomes(data);
+
+ final MapType<String> starts = structures.getMap("starts");
+ final MapType<String> references = structures.getMap("References");
+
+ if (starts != null) {
+ final MapType<String> newStarts = data.getTypeUtil().createEmptyMap();
+ structures.setMap("starts", newStarts);
+
+ for (final String key : starts.keys()) {
+ final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3077.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3077.java
new file mode 100644
index 0000000000000000000000000000000000000000..06fe7dd2580cd8eaad9e0c7de8d0e27287d1b0a9
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> section = sections.getMap(i);
+ section.remove("BlockLight");
+ section.remove("SkyLight");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3077() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java
new file mode 100644
index 0000000000000000000000000000000000000000..a0e89f59c75f6d34480f4b8c4f8fa013dddc5d52
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java
@@ -0,0 +1,23 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:frog");
+ registerMob("minecraft:tadpole");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:sculk_shrieker", new GameEventListenerWalker());
+ }
+
+ private V3078() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3081.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3081.java
new file mode 100644
index 0000000000000000000000000000000000000000..fb108cb7f50755b52f537a888ca155aa9db39b3a
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3081.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.game_event.GameEventListenerWalker;
+
+public final class V3081 {
+
+ private static final int VERSION = MCVersions.V22W11A + 1;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:warden");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:warden", new GameEventListenerWalker());
+ }
+
+ private V3081() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3082.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3082.java
new file mode 100644
index 0000000000000000000000000000000000000000..79768b25a32a5333f8cb6ec6e8c422478a6891df
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6e70ff4a28446fd8c4c663e0e44791ec4e5ac0a
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java
@@ -0,0 +1,23 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:allay");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:allay", new DataWalkerItemLists("Inventory"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:allay", new GameEventListenerWalker());
+ }
+
+ private V3083() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3084.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3084.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a096226995e89285054b4ab35ed3e14ae4da694
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3086.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3086.java
new file mode 100644
index 0000000000000000000000000000000000000000..f06412a417ba12111c9e8f30b747ed3ad6dcbcb6
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3087.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3087.java
new file mode 100644
index 0000000000000000000000000000000000000000..b296229502491b54f6352ee1f9db0023296b36ec
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3088.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3088.java
new file mode 100644
index 0000000000000000000000000000000000000000..2752dfd1a7ff896e2ed736846980da5adde6e657
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3090.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3090.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1cfe038364e12d542d93c3108887173b2e05262
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "Motive", "variant");
+ RenameHelper.renameSingle(data, "Facing", "facing");
+ return null;
+ }
+ });
+ }
+
+ private V3090() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3093.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3093.java
new file mode 100644
index 0000000000000000000000000000000000000000..d0677d68b393da9b151c7b2add2fbbd8608e315f
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ data.setBoolean("HasLeftHorn", true);
+ data.setBoolean("HasRightHorn", true);
+ return null;
+ }
+ });
+ }
+
+ private V3093() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3094.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3094.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b9ef34db7dbae8574c4bb3d474592e7991441d5
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3097.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3097.java
new file mode 100644
index 0000000000000000000000000000000000000000..c70d6dc72d1d913904b71640fe3476c644449ee2
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> removeFilteredBookText = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3108.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3108.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a1ef2e55a1f9cd6381a2c6fdc04f81ee190ba81
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3201.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3201.java
new file mode 100644
index 0000000000000000000000000000000000000000..04b84c8466d4fa8f2ad21aae2de44273c05495b6
--- /dev/null
+++ b/src/main/java/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<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ fixList(data, "resourcePacks");
+ fixList(data, "incompatibleResourcePacks");
+ return null;
+ }
+ });
+ }
+
+ private V3201() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java
new file mode 100644
index 0000000000000000000000000000000000000000..db9eb946638447445649f4576b3698c0774e44bb
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java
@@ -0,0 +1,20 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:camel");
+ }
+
+ private V3203() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3204.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3204.java
new file mode 100644
index 0000000000000000000000000000000000000000..87053c0c1de258770e7630830307ab484915aad8
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3209.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3209.java
new file mode 100644
index 0000000000000000000000000000000000000000..85270a36c5f75b1c6be49e461b302c3339c95750
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3214.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3214.java
new file mode 100644
index 0000000000000000000000000000000000000000..0096664e25dca8d690c6154324f97efdb1ada723
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3319.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3319.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a4a1f690f568b8977e9b2caaf7fba15cb3307a5
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ data.setBoolean("onboardAccessibility", false);
+ return null;
+ }
+ });
+ }
+
+ private V3319() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3322.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3322.java
new file mode 100644
index 0000000000000000000000000000000000000000..53827b9b8999e7b284f3df0f41c98dbbc7d69c1c
--- /dev/null
+++ b/src/main/java/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<String> 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<String> data = effects.getMap(i);
+ final MapType<String> 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<String>, MapType<String>> entityEffectFix = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3325.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3325.java
new file mode 100644
index 0000000000000000000000000000000000000000..2120a5928446f2597fb261d5d6e91c3c9700cb22
--- /dev/null
+++ b/src/main/java/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"));
+ // text_display is a simple entity
+ }
+
+ private V3325() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a8d3f6fd18d941e5b0b18fc5208b7fe1f9fd724
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java
@@ -0,0 +1,20 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:sniffer");
+ }
+
+ private V3326() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3327.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3327.java
new file mode 100644
index 0000000000000000000000000000000000000000..7051d4f01b6f43f3d435d21d65b83ba702ffda41
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3328.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3328.java
new file mode 100644
index 0000000000000000000000000000000000000000..75a3cbc8e6749abd4bceff710d2f7c3ca6df9d70
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java
new file mode 100644
index 0000000000000000000000000000000000000000..30c23572a5989f0bd6bff6e424ee59c84bc8d8f1
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java
@@ -0,0 +1,47 @@
+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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c09f745e5200393cf4ecdcb5b42466c2e2d94d9
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java
@@ -0,0 +1,96 @@
+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;
+
+public final class V3439 {
+
+ private static final int VERSION = MCVersions.V1_19_4 + 102;
+
+ public static void register() {
+ final DataConverter<MapType<String>, MapType<String>> signTileUpdater = new DataConverter<>(VERSION) {
+ private static final String DEFAULT_COLOR = "black";
+
+ private static ListType migrateToList(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ // front text
+ final MapType<String> 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<String> 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);
+ }
+
+ private V3439() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java
new file mode 100644
index 0000000000000000000000000000000000000000..914df7885582a1fde398e755dbfaf00e19ce16b3
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java
@@ -0,0 +1,29 @@
+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.LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(
+ Arrays.asList(
+ "minecraft:update_1_20"
+ )
+ )));
+ }
+
+ private V3440() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3441.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3441.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cf41561b4a229ba4d60540f85ba0a8946bb9753
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3447.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3447.java
new file mode 100644
index 0000000000000000000000000000000000000000..5db4a5222bf80f01c128d97ec849b89003837beb
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3448.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3448.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f447d59677be4630b53e948419a0ae2a3414315
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "shards", "sherds");
+ return null;
+ }
+ });
+ }
+
+ private V3448() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3450.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3450.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e7f34a40280a7704c4a4d1c03a7dda8e030aff5
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3451.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3451.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea97d596bfb4b9c6b9b7d0534604e042a775ea78
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> section = sections.getMap(i);
+
+ section.remove("BlockLight");
+ section.remove("SkyLight");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3451() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3459.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3459.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8a1fcd9e67b151a360e11089289154a14dde27c
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (data.hasKey("DragonFight")) {
+ return null;
+ }
+
+ final MapType<String> dimensionData = data.getMap("DimensionData");
+ if (dimensionData == null) {
+ return null;
+ }
+
+ final MapType<String> endData = dimensionData.getMap("1");
+ if (endData != null) {
+ final MapType<String> dragonFight = endData.<String>getMap("DragonFight", endData.getTypeUtil().createEmptyMap()).copy();
+ V3807.flattenBlockPos(dragonFight, "ExitPortalLocation");
+ data.setMap("DragonFight", dragonFight);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V3459() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3564.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3564.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c64ec5b9bdcc279bc1b86e6bb0b877003b213cb
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3564.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.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<String>, MapType<String>> 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<String> 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<String> convert(final MapType<String> 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);
+ MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:hanging_sign", converter);
+ }
+
+ private V3564() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3565.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3565.java
new file mode 100644
index 0000000000000000000000000000000000000000..685021e87236c5b7ce5ee0b5422d7bf856ea6652
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> oldData = root.getMap("data");
+ if (oldData == null) {
+ return null;
+ }
+
+ final MapType<String> newData = root.getTypeUtil().createEmptyMap();
+ root.setMap("data", newData);
+
+ newData.setMap("sequences", oldData);
+
+ return null;
+ }
+ });
+ }
+
+ private V3565() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3566.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3566.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5b91dc5eb4e9206cbb4489ce14195d7517ef4e0
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+ RenameHelper.renameKeys(data.getMap("DisplaySlots"), SLOT_RENAMES::get);
+
+ return null;
+ }
+ });
+ }
+
+ private V3566() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3568.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3568.java
new file mode 100644
index 0000000000000000000000000000000000000000..39b4bd2d0bb36ef242467e89010ef5fc1490de9b
--- /dev/null
+++ b/src/main/java/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<String> 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<String> 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<String> 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<String> 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<String> 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<String> from, final MapType<String> into) {
+ removeAndSet(into, "EffectId", "id", readLegacyEffect(from, "EffectId"));
+ removeAndSet(into, "EffectDuration", "duration", from.getGeneric("EffectDuration"));
+ }
+
+ public static void register() {
+ final DataConverter<MapType<String>, MapType<String>> beaconConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ convertLegacyEffect(data, "Primary", "primary_effect");
+ convertLegacyEffect(data, "Secondary", "secondary_effect");
+
+ return null;
+ }
+ };
+
+ final DataConverter<MapType<String>, MapType<String>> mooshroomConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String>, MapType<String>> arrowConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ convertMobEffectList(data, "CustomPotionEffects", "custom_potion_effects");
+ return null;
+ }
+ };
+ final DataConverter<MapType<String>, MapType<String>> areaEffectCloudConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ convertMobEffectList(data, "Effects", "effects");
+ return null;
+ }
+ };
+ final DataConverter<MapType<String>, MapType<String>> livingEntityConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ convertMobEffectList(data, "ActiveEffects", "active_effects");
+ return null;
+ }
+ };
+
+ final DataConverter<MapType<String>, MapType<String>> itemConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final String id = root.getString("id");
+
+ final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3682.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3682.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9e3eb71b268f7bc1940f0199fddfa1ac27401b8
--- /dev/null
+++ b/src/main/java/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() {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:crafter", new DataWalkerItemLists("Items"));
+ }
+
+ private V3682() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3683.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3683.java
new file mode 100644
index 0000000000000000000000000000000000000000..855a95b4ef686fa9d2cefdef5664290528e4dc60
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ RenameHelper.renameSingle(data, "Fuse", "fuse");
+
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3685.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3685.java
new file mode 100644
index 0000000000000000000000000000000000000000..603467a7a2b6da93181a0a32eedb30d1614b0069
--- /dev/null
+++ b/src/main/java/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<String> arrow) {
+ return "minecraft:empty".equals(arrow.getString("Potion", "minecraft:empty")) ? "minecraft:arrow" : "minecraft:tipped_arrow";
+ }
+
+ private static MapType<String> createItem(final TypeUtil util, final String id, final int count) {
+ final MapType<String> 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java
new file mode 100644
index 0000000000000000000000000000000000000000..ccda8d0f7c0a284fd4f91622dc33b832b4a95c45
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java
@@ -0,0 +1,37 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:breeze");
+ // 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<String> data, final long fromVersion, final long toVersion) -> {
+ final ListType spawnPotentials = data.getList("spawn_potentials", ObjectType.MAP);
+ if (spawnPotentials != null) {
+ for (int i = 0, len = spawnPotentials.size(); i < len; ++i) {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, spawnPotentials.getMap(i).getMap("data"), "entity", fromVersion, toVersion);
+ }
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("spawn_data"), "entity", fromVersion, toVersion);
+ return null;
+ });
+ }
+
+ private V3689() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3692.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3692.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fc62f9cadb990790420376d5c80b14775b71a48
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3799.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3799.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c34d445825e8b49249af852b1f2f09c8b5a2574
--- /dev/null
+++ b/src/main/java/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");
+ }
+
+ private V3799() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3800.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3800.java
new file mode 100644
index 0000000000000000000000000000000000000000..a40397feb5962bd5f4a44cc85bb359f5f99ff03a
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3803.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3803.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ff5e2f1a386d75b6d0d6fc3160f2241bf74b262
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3807.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3807.java
new file mode 100644
index 0000000000000000000000000000000000000000..a76916cdb7cf91b8ba5461524472b3e455f02885
--- /dev/null
+++ b/src/main/java/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<String> data, final String path) {
+ if (data == null) {
+ return;
+ }
+
+ final MapType<String> 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<String> 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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java
new file mode 100644
index 0000000000000000000000000000000000000000..78a10f89218eb0edf121f88978b4fe13e1b1bf44
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java
@@ -0,0 +1,82 @@
+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<String>, MapType<String>> {
+ 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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"));
+ V100.registerEquipment(VERSION, "minecraft:horse");
+
+ // 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"));
+ V100.registerEquipment(VERSION, 1, "minecraft:llama");
+
+ // 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"));
+ V100.registerEquipment(VERSION, 2, "minecraft:trader_llama");
+ }
+
+ private V3808() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3809.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3809.java
new file mode 100644
index 0000000000000000000000000000000000000000..c45a1a77adbb5dc5ba8c3dae0bb480450520c731
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> slotConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3812.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3812.java
new file mode 100644
index 0000000000000000000000000000000000000000..f0c0748b003648e5fe06d0b6dd1b21948ac0e54a
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java
new file mode 100644
index 0000000000000000000000000000000000000000..920d7734d883d74e8334102b22cabce24a79db7e
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java
@@ -0,0 +1,131 @@
+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;
+
+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<String>, MapType<String>> {
+ 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<String> convert(final MapType<String> 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<String> convert(final MapType<String> root, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> 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<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> tag = data.getMap("tag");
+
+ if (tag == null) {
+ return null;
+ }
+
+ V3807.flattenBlockPos(tag, "LodestonePos");
+
+ return null;
+ }
+ });
+ }
+
+ private V3813() {}
+
+ private static record RenamePair(String from, String to) {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3814.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3814.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4cc52620afb728533efe988bf2066ffc947f2d6
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3816.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3816.java
new file mode 100644
index 0000000000000000000000000000000000000000..f50b81d931a1908d405bb72e0679983a742d5223
--- /dev/null
+++ b/src/main/java/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");
+ }
+
+ private V3816() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1a4659538c8f678319ddc7d61b400051c8a4953
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java
@@ -0,0 +1,340 @@
+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.custom.V3818_Commands;
+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<String> convert(final MapType<String> 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<String> 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<String> convert(final MapType<String> 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<String> 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<String> 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<String> convert(final MapType<String> 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<String> 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<String> convert(final MapType<String> 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<String> item = data.getMap("item");
+ if (item == null) {
+ return null;
+ }
+
+ final MapType<String> 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
+ MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, 3, new DataWalker<>() {
+ private static void walkBlockPredicates(final MapType<String> 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<String> walk(final MapType<String> 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<String> 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<String> 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);
+
+ return null;
+ }
+ });
+
+ // Step 4
+ MCTypeRegistry.PARTICLE.addStructureConverter(new DataConverter<>(VERSION, 4) {
+ @Override
+ public MapType<String> 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<String> root = (MapType<String>)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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ return ConverterItemStackToDataComponents.convertItem(data);
+ }
+ });
+
+ MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, 5, (final MapType<String> 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;
+ });
+
+ // Custom converter for converting commands inside signs, books, command blocks
+ V3818_Commands.register_5();
+
+ // Step 6
+ MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION, 6) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3820.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3820.java
new file mode 100644
index 0000000000000000000000000000000000000000..c45dda60ed8da6802181f7f169a5b97f591b00ee
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3820.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.converters.itemstack.ConverterItemStackToDataComponents;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+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<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> components = data.getMap("components");
+
+ if (components == null) {
+ return null;
+ }
+
+ final MapType<String> 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<String> target = oldTarget.getTypeUtil().createEmptyMap();
+ oldTarget.setMap("target", target);
+
+ target.setGeneric("pos", pos);
+ target.setGeneric("dimension", dim);
+
+ return null;
+ }
+ });
+ }
+
+ private V3820() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3825.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3825.java
new file mode 100644
index 0000000000000000000000000000000000000000..26e27331223bc5671db49bb730a754597815b8cc
--- /dev/null
+++ b/src/main/java/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<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> convert(final MapType<String> 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<String> 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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> normalConfig = data.getMap("normal_config");
+ if (normalConfig != null) {
+ WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, normalConfig, "spawn_potentials", "data", "entity", fromVersion, toVersion);
+ }
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3828.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3828.java
new file mode 100644
index 0000000000000000000000000000000000000000..f752bb2fca2e4cd438c0540460912d4bc2c6f25e
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3833.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3833.java
new file mode 100644
index 0000000000000000000000000000000000000000..f097881401855137f5d4ac25ba1468e635a702b5
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3938.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3938.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a6d144c2f074403bde8a62377ca6986c0c12a84
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3939.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3939.java
new file mode 100644
index 0000000000000000000000000000000000000000..632c8008484e844d962405c6ef8fb9f09fc6c977
--- /dev/null
+++ b/src/main/java/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.LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(
+ Arrays.asList(
+ "minecraft:update_1_21"
+ )
+ )));
+ }
+
+ private V3939() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3943.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3943.java
new file mode 100644
index 0000000000000000000000000000000000000000..1cd426cf78d62d428406caa319cc5c8649e7f36c
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3945.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3945.java
new file mode 100644
index 0000000000000000000000000000000000000000..74c13c46390e4533a9eb2c8ae5d9846db55efa94
--- /dev/null
+++ b/src/main/java/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<String>> ret = new LinkedHashMap<>();
+
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType<String> 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<String> 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<String> modifier : ret.values()) {
+ retList.addMap(modifier);
+ }
+
+ return retList;
+ }
+
+ public static void register() {
+ MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ final MapType<String> 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<String>, MapType<String>> entityConverter = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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<String> 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<String> 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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4054.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4054.java
new file mode 100644
index 0000000000000000000000000000000000000000..d65e05285ef238aa8c6d660aa42fcd69e07d9430
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ convertComponents(data.getMap("components"));
+ return null;
+ }
+ });
+ }
+
+ private static void convertComponents(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4055.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4055.java
new file mode 100644
index 0000000000000000000000000000000000000000..45b141a651d954554fcca68f36c0b3344328d902
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4057.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4057.java
new file mode 100644
index 0000000000000000000000000000000000000000..b0949ac2035662ba1c943b4bfab2f19e985e6864
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java
new file mode 100644
index 0000000000000000000000000000000000000000..0047a20dab2ffd6b39a8bcb8ed9f3878f20e31c2
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java
@@ -0,0 +1,128 @@
+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
+ MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, new DataWalker<>() {
+ private static void walkBlockPredicates(final MapType<String> 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<String> walk(final MapType<String> 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<String> 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<String> 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<String> 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);
+ }
+
+ return null;
+ }
+ });
+
+ MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> oldEffect = oldEffects.getMap(i);
+
+ final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4061.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4061.java
new file mode 100644
index 0000000000000000000000000000000000000000..630263a61b5db4207c1a5051e3e2249ab3dd3957
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>>, 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<String> 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.parseTag(sNBT);
+ } catch (final CommandSyntaxException ex) {
+ throw new IllegalArgumentException("Failed to parse NBT: " + sNBT, ex);
+ }
+ }
+
+ private static CompoundTag removeDefaults(final CompoundTag config) {
+ if (config.getInt("spawn_range") == 4) {
+ config.remove("spawn_range");
+ }
+
+ if (config.getFloat("total_mobs") == 6.0F) {
+ config.remove("total_mobs");
+ }
+
+ if (config.getFloat("simultaneous_mobs") == 2.0F) {
+ config.remove("simultaneous_mobs");
+ }
+
+ if (config.getFloat("total_mobs_added_per_player") == 2.0F) {
+ config.remove("total_mobs_added_per_player");
+ }
+
+ if (config.getFloat("simultaneous_mobs_added_per_player") == 1.0F) {
+ config.remove("simultaneous_mobs_added_per_player");
+ }
+
+ if (config.getInt("ticks_between_spawn") == 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> normalConfig = data.getMap("normal_config");
+ final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4064.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4064.java
new file mode 100644
index 0000000000000000000000000000000000000000..85eb8f37f89faed8b366c1d1c850b028bfcb2164
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ if (components.hasKey("minecraft:fire_resistant")) {
+ components.remove("minecraft:fire_resistant");
+
+ final MapType<String> damageResistant = components.getTypeUtil().createEmptyMap();
+ components.setMap("minecraft:damage_resistant", damageResistant);
+
+ damageResistant.setString("types", "#minecraft:is_fire");
+ }
+
+ return null;
+ }
+ });
+ }
+
+ private V4064() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4067.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4067.java
new file mode 100644
index 0000000000000000000000000000000000000000..855c5a99951996ffe4eabb24a69321043cce41d7
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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<String> components = data.getMap("components");
+ if (components == null) {
+ return null;
+ }
+
+ final MapType<String> 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<String> convert(final MapType<String> 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.LEVEL.addStructureConverter(
+ new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(Arrays.asList("minecraft:bundle")))
+ );
+ }
+
+ private V4067() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4068.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4068.java
new file mode 100644
index 0000000000000000000000000000000000000000..3de9862f083e6a2a687b42eef36746aa846cc745
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4068.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;
+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<String> 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();
+
+ final MapType<String> newLock = typeUtil.createEmptyMap();
+ root.remove(srcPath);
+ root.setMap(dstPath, newLock);
+
+ if (lockGeneric instanceof String lock) {
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ convertLock(data, "Lock", "lock");
+ return null;
+ }
+ });
+ }
+
+ private V4068() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4070.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4070.java
new file mode 100644
index 0000000000000000000000000000000000000000..b85673d792d4b1c317d312ba607a0d30c2f57ea9
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b0855353f40e8ce54b86305152aa35af9154c6f
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java
@@ -0,0 +1,21 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V4071 {
+
+ private static final int VERSION = MCVersions.V24W39A + 2;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, 0, id);
+ }
+
+ public static void register() {
+ registerMob("minecraft:creaking");
+ registerMob("minecraft:creaking_transient");
+
+ // minecraft:creaking_heart is a simple tile entity? not sure what the difference is between remainder and optional
+ }
+
+ private V4071() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4081.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V4081.java
new file mode 100644
index 0000000000000000000000000000000000000000..22eae4d39c3887ef4991fd21856c32c43c543f88
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V501.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V501.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7a4d6446b7765ac485af82df660aafab05955bf
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V501.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+
+public final class V501 {
+
+ private static final int VERSION = MCVersions.V16W20A;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ registerMob("PolarBear");
+ }
+
+ private V501() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V502.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V502.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f88b435378305a3a66e1e54b85afd9b019513ee
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V505.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V505.java
new file mode 100644
index 0000000000000000000000000000000000000000..3faf2c3265600141003355771f38a7879e0f769a
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ data.setString("useVbo", "true");
+ return null;
+ }
+ });
+ }
+
+ private V505() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V700.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V700.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b65108c6a1ac469bb8f81a933b6475f3ea9f63f
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V700.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 V700 {
+
+ private static final int VERSION = MCVersions.V1_10_2 + 188;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("Guardian", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ if (data.getBoolean("Elder")) {
+ data.setString("id", "ElderGuardian");
+ }
+ data.remove("Elder");
+ return null;
+ }
+ });
+
+ registerMob("ElderGuardian");
+ }
+
+ private V700() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V701.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V701.java
new file mode 100644
index 0000000000000000000000000000000000000000..55f00e218f04e1e095ccc7d62282d87d7eb8f8c7
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V701.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 V701 {
+
+ private static final int VERSION = MCVersions.V1_10_2 + 189;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("Skeleton", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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");
+ registerMob("Stray");
+ }
+
+ private V701() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V702.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V702.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0d74b4822be60c637f26b2ef1e172fdf9e89d01
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V702.java
@@ -0,0 +1,56 @@
+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;
+
+ private static void registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ public static void register() {
+ MCTypeRegistry.ENTITY.addConverterForId("Zombie", new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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;
+ }
+ });
+
+ registerMob("ZombieVillager");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "ZombieVillager", (final MapType<String> root, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, root.getMap("Offers"), "Recipes", fromVersion, toVersion);
+ return null;
+ });
+ registerMob( "Husk");
+ }
+
+ private V702() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V703.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V703.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc593df4a09d6cb93196d8cfb34ebac43e61ebbe
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V703.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.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<String> convert(final MapType<String> 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"));
+ V100.registerEquipment(VERSION, "Horse");
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Donkey", new DataWalkerItems("SaddleItem"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Donkey", new DataWalkerItemLists("Items"));
+ V100.registerEquipment(VERSION, "Donkey");
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Mule", new DataWalkerItems("SaddleItem"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Mule", new DataWalkerItemLists("Items"));
+ V100.registerEquipment(VERSION, "Mule");
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "ZombieHorse", new DataWalkerItems("SaddleItem"));
+ V100.registerEquipment(VERSION, "ZombieHorse");
+
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "SkeletonHorse", new DataWalkerItems("SaddleItem"));
+ V100.registerEquipment(VERSION, "SkeletonHorse");
+ }
+
+ private V703() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V704.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V704.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6777f58d7d4722cabd30fa495cee054f58b3e48
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V704.java
@@ -0,0 +1,440 @@
+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.HashMap;
+import java.util.Map;
+
+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 long k1, final String v1) {
+ final Long2ObjectArraySortedMap<String> ret = new Long2ObjectArraySortedMap<>();
+
+ ret.put(k1, v1);
+
+ return ret;
+ }
+
+ private static Long2ObjectArraySortedMap<String> makeDouble(final long k1, final String v1,
+ final long k2, final String v2) {
+ final Long2ObjectArraySortedMap<String> ret = new Long2ObjectArraySortedMap<>();
+
+ ret.put(k1, v1);
+ ret.put(k2, 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");
+ }
+
+ private static void registerInventory(final String id) {
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, id, new DataWalkerItemLists("Items"));
+ }
+
+ public static void register() {
+ MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> 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;
+ }
+ });
+
+
+ MCTypeRegistry.TILE_ENTITY.addStructureWalker(VERSION, (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.DATA_COMPONENTS, data, "components", fromVersion, toVersion);
+ return null;
+ });
+ registerInventory( "minecraft:furnace");
+ registerInventory( "minecraft:chest");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:jukebox", new DataWalkerItems("RecordItem"));
+ registerInventory("minecraft:dispenser");
+ registerInventory("minecraft:dropper");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:mob_spawner", (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ return null;
+ });
+ registerInventory("minecraft:brewing_stand");
+ registerInventory("minecraft:hopper");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:flower_pot", new DataWalkerItemNames("Item"));
+ MCTypeRegistry.TILE_ENTITY.addWalker(
+ VERSION, "minecraft:command_block",
+ new DataWalkerTypePaths<>(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, "Command")
+ );
+
+ MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, data, "id", fromVersion, toVersion);
+
+ final MapType<String> tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ // 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);
+
+ MapType<String> entityTag = tag.getMap("EntityTag");
+ if (entityTag != null) {
+ final String itemId = data.getString("id");
+ 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<String> replace = MCTypeRegistry.ENTITY.convert(entityTag, fromVersion, toVersion);
+
+ if (replace != null) {
+ entityTag = replace;
+ tag.setMap("EntityTag", entityTag);
+ }
+ }
+
+ MapType<String> blockEntityTag = tag.getMap("BlockEntityTag");
+ if (blockEntityTag != null) {
+ final String itemId = data.getString("id");
+ final String entityId;
+ if ("minecraft:suspicious_sand".equals(itemId) && fromVersion < V3438.VERSION) {
+ // 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V705.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V705.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0efac6a303d4c9623e03acdf07f89c2cacc9f04
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V705.java
@@ -0,0 +1,221 @@
+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 registerMob(final String id) {
+ V100.registerEquipment(VERSION, id);
+ }
+
+ 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");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:arrow", new DataWalkerBlockNames("inTile"));
+ registerMob("minecraft:bat");
+ registerMob("minecraft:blaze");
+ registerMob("minecraft:cave_spider");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:chest_minecart", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:chest_minecart", new DataWalkerItemLists("Items"));
+ registerMob("minecraft:chicken");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:commandblock_minecart", new DataWalkerBlockNames("DisplayTile"));
+ registerMob("minecraft:cow");
+ registerMob("minecraft:creeper");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:donkey", new DataWalkerItemLists("Items"));
+ V100.registerEquipment(VERSION, "minecraft:donkey");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:donkey", new DataWalkerItems("SaddleItem"));
+ registerThrowableProjectile("minecraft:egg");
+ registerMob("minecraft:elder_guardian");
+ registerMob("minecraft:ender_dragon");
+ V100.registerEquipment(VERSION, "minecraft:enderman");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:enderman", new DataWalkerBlockNames("carried"));
+ registerMob("minecraft:endermite");
+ 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");
+ registerMob("minecraft:giant");
+ registerMob("minecraft:guardian");
+ 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"));
+ V100.registerEquipment(VERSION, "minecraft:horse");
+ registerMob("minecraft:husk");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:item", new DataWalkerItems("Item"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:item_frame", new DataWalkerItems("Item"));
+ registerMob("minecraft:magma_cube");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:minecart", new DataWalkerBlockNames("DisplayTile"));
+ registerMob("minecraft:mooshroom");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:mule", new DataWalkerItemLists("Items"));
+ V100.registerEquipment(VERSION, "minecraft:mule");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:mule", new DataWalkerItems("SaddleItem"));
+ registerMob("minecraft:ocelot");
+ registerMob("minecraft:pig");
+ registerMob("minecraft:polar_bear");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerItems("Potion"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerBlockNames("inTile"));
+ registerMob("minecraft:rabbit");
+ registerMob("minecraft:sheep");
+ registerMob("minecraft:shulker");
+ registerMob("minecraft:silverfish");
+ registerMob("minecraft:skeleton");
+ V100.registerEquipment(VERSION, "minecraft:skeleton_horse");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:skeleton_horse", new DataWalkerItems("SaddleItem"));
+ registerMob("minecraft:slime");
+ registerThrowableProjectile("minecraft:small_fireball");
+ registerThrowableProjectile("minecraft:snowball");
+ registerMob("minecraft:snowman");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spawner_minecart", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spawner_minecart", (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ return null;
+ });
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spectral_arrow", new DataWalkerBlockNames("inTile"));
+ registerMob("minecraft:spider");
+ registerMob("minecraft:squid");
+ registerMob("minecraft:stray");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:tnt_minecart", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:villager", (final MapType<String> 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;
+ });
+ V100.registerEquipment(VERSION, "minecraft:villager");
+ registerMob("minecraft:villager_golem");
+ registerMob("minecraft:witch");
+ registerMob("minecraft:wither");
+ registerMob("minecraft:wither_skeleton");
+ registerThrowableProjectile("minecraft:wither_skull");
+ registerMob("minecraft:wolf");
+ registerThrowableProjectile("minecraft:xp_bottle");
+ registerMob("minecraft:zombie");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:zombie_horse", new DataWalkerItems("SaddleItem"));
+ V100.registerEquipment(VERSION, "minecraft:zombie_horse");
+ registerMob("minecraft:zombie_pigman");
+ registerMob("minecraft:zombie_villager");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:zombie_villager", (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion);
+
+ return null;
+ });
+ registerMob("minecraft:evocation_illager");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:llama", new DataWalkerItemLists("Items"));
+ V100.registerEquipment(VERSION, "minecraft:llama");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:llama", new DataWalkerItems("SaddleItem", "DecorItem"));
+ registerMob("minecraft:vex");
+ registerMob("minecraft:vindication_illager");
+ // 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V804.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V804.java
new file mode 100644
index 0000000000000000000000000000000000000000..81a2006d5e2059df0979c6380a16255767bcd89a
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType<String> 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<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V806.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V806.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4ebe856d03d9837214e9a1c93f1b1e79aa7bb08
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> potionWaterUpdater = new DataConverter<>(VERSION) {
+ @Override
+ public MapType<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V808.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V808.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6b6038255e16bd15873bb7fe596b721fcec365e
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V813.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V813.java
new file mode 100644
index 0000000000000000000000000000000000000000..68810919e168f36de160033aa659060487d94bd8
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ final MapType<String> tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ final MapType<String> 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<String> convert(final MapType<String> data, final long sourceVersion, final long toVersion) {
+ data.remove("Color");
+ return null;
+ }
+ });
+ }
+
+ private V813() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V816.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V816.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc9fba23654262b1489e4f8056a7f4b222ab1179
--- /dev/null
+++ b/src/main/java/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<String> convert(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V820.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V820.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d59cb380e625bb2658216d4a6cb8faebdd147c5
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V99.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V99.java
new file mode 100644
index 0000000000000000000000000000000000000000..f0e26849e28ce7ce362927ec81b281e51bd1e591
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V99.java
@@ -0,0 +1,363 @@
+package ca.spottedleaf.dataconverter.minecraft.versions;
+
+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 registerMob(final String id) {
+ MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItemLists("Equipment"));
+ }
+
+ 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"));
+ }
+
+ public static void register() {
+ // entities
+ MCTypeRegistry.ENTITY.addStructureWalker(VERSION, (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "Riding", fromVersion, toVersion);
+
+ return null;
+ });
+ 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<String> data, final long fromVersion, final long toVersion) -> {
+ MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ return null;
+ }); // 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<String> data, final long fromVersion, final long toVersion) -> {
+ MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ return null;
+ });
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartHopper", new DataWalkerBlockNames("DisplayTile"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartHopper", new DataWalkerItemLists("Items"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartCommandBlock", new DataWalkerBlockNames("DisplayTile"));
+ registerMob("ArmorStand");
+ registerMob("Creeper");
+ registerMob("Skeleton");
+ registerMob("Spider");
+ registerMob("Giant");
+ registerMob("Zombie");
+ registerMob("Slime");
+ registerMob("Ghast");
+ registerMob("PigZombie");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Enderman", new DataWalkerBlockNames("carried"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Enderman", new DataWalkerItemLists("Equipment"));
+ registerMob("CaveSpider");
+ registerMob("Silverfish");
+ registerMob("Blaze");
+ registerMob("LavaSlime");
+ registerMob("EnderDragon");
+ registerMob("WitherBoss");
+ registerMob("Bat");
+ registerMob("Witch");
+ registerMob("Endermite");
+ registerMob("Guardian");
+ registerMob("Pig");
+ registerMob("Sheep");
+ registerMob("Cow");
+ registerMob("Chicken");
+ registerMob("Squid");
+ registerMob("Wolf");
+ registerMob("MushroomCow");
+ registerMob("SnowMan");
+ registerMob("Ozelot");
+ registerMob("VillagerGolem");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "EntityHorse", new DataWalkerItemLists("Items", "Equipment"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "EntityHorse", new DataWalkerItems("ArmorItem", "SaddleItem"));
+ registerMob("Rabbit");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Villager", new DataWalkerItemLists("Inventory", "Equipment"));
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "Villager", (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion);
+
+ return null;
+ });
+ registerMob("Shulker");
+ MCTypeRegistry.ENTITY.addWalker(VERSION, "AreaEffectCloud", new DataWalkerTypePaths<>(MCTypeRegistry.PARTICLE, "Particle"));
+
+ // tile entities
+ MCTypeRegistry.TILE_ENTITY.addStructureWalker(VERSION, (final MapType<String> 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");
+ MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "MobSpawner", (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion);
+ return null;
+ });
+ registerInventory("Cauldron");
+ registerInventory("Hopper");
+ // 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"));
+ MCTypeRegistry.TILE_ENTITY.addWalker(
+ VERSION, "Control",
+ new DataWalkerTypePaths<>(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, "Command")
+ );
+
+ // rest
+
+ MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, data, "id", fromVersion, toVersion);
+
+ final MapType<String> tag = data.getMap("tag");
+ if (tag == null) {
+ return null;
+ }
+
+ // 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);
+
+ MapType<String> entityTag = tag.getMap("EntityTag");
+ if (entityTag != null) {
+ String itemId = getStringId(data.getString("id"));
+ 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<String> replace = MCTypeRegistry.ENTITY.convert(entityTag, fromVersion, toVersion);
+
+ if (replace != null) {
+ entityTag = replace;
+ tag.setMap("EntityTag", entityTag);
+ }
+ if (removeId) {
+ entityTag.remove("id");
+ }
+ }
+
+ MapType<String> blockEntityTag = tag.getMap("BlockEntityTag");
+ if (blockEntityTag != null) {
+ final String itemId = getStringId(data.getString("id"));
+ 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<String> 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<String> data, final long fromVersion, final long toVersion) -> {
+ final MapType<String> 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<String> tileTick = tileTicks.getMap(i);
+ WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion);
+ }
+ }
+
+ return null;
+ });
+
+ MCTypeRegistry.ENTITY_CHUNK.addStructureWalker(VERSION, (final MapType<String> data, final long fromVersion, final long toVersion) -> {
+ WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Entities", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.SAVED_DATA_SCOREBOARD.addStructureWalker(VERSION, (final MapType<String> root, final long fromVersion, final long toVersion) -> {
+ final MapType<String> 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);
+
+ return null;
+ });
+ MCTypeRegistry.SAVED_DATA_STRUCTURE_FEATURE_INDICES.addStructureWalker(VERSION, (final MapType<String> root, final long fromVersion, final long toVersion) -> {
+ final MapType<String> data = root.getMap("data");
+ if (data == null) {
+ return null;
+ }
+
+ WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data, "Features", fromVersion, toVersion);
+
+ return null;
+ });
+
+ MCTypeRegistry.VILLAGER_TRADE.addStructureWalker(VERSION, (final MapType<String> 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;
+ });
+
+ // 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) {
+ return (String)id;
+ } else if (id instanceof Number) {
+ return HelperItemNameV102.getNameFromId(((Number)id).intValue());
+ } else {
+ return null;
+ }
+ }
+
+ private V99() {}
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/block_name/DataWalkerBlockNames.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/block_name/DataWalkerBlockNames.java
new file mode 100644
index 0000000000000000000000000000000000000000..930e014858ef635ebe25f7f92dc81ba0eaac50a8
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java
new file mode 100644
index 0000000000000000000000000000000000000000..64fc063748d4839d787a773d2c7258dcffc6bc21
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java
@@ -0,0 +1,26 @@
+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<String>> {
+
+ @Override
+ public MapType<String> walk(final MapType<String> data, final long fromVersion, final long toVersion) {
+ final MapType<String> listener = data.getMap("listener");
+ if (listener == null) {
+ return null;
+ }
+
+ final MapType<String> event = listener.getMap("event");
+ if (event == null) {
+ return null;
+ }
+
+ WalkerUtils.convert(MCTypeRegistry.GAME_EVENT_NAME, event, "game_event", fromVersion, toVersion);
+
+ return null;
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerListPaths.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerListPaths.java
new file mode 100644
index 0000000000000000000000000000000000000000..20c8efdb746c9d3b9d87bf991dc44e11e1ea697c
--- /dev/null
+++ b/src/main/java/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<String>> {
+
+ 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<String> walk(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerTypePaths.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerTypePaths.java
new file mode 100644
index 0000000000000000000000000000000000000000..4205546d7b2c4a07d23a017004989875b7beb3c6
--- /dev/null
+++ b/src/main/java/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<String>> {
+
+ 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<String> walk(final MapType<String> 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/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..4feedd9e48c3a85bd75b9c0a3b09c91fa9532a93
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java
@@ -0,0 +1,183 @@
+package ca.spottedleaf.dataconverter.minecraft.walkers.generic;
+
+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<String> data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final MapType<String> map = data.getMap(path);
+ if (map != null) {
+ final MapType<String> replace = type.convert(map, fromVersion, toVersion);
+ if (replace != null) {
+ data.setMap(path, replace);
+ }
+ }
+ }
+
+ public static void convertList(final MCDataType type, final MapType<String> data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getList(path, ObjectType.MAP);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ final MapType<String> replace = type.convert(list.getMap(i), fromVersion, toVersion);
+ if (replace != null) {
+ list.setMap(i, replace);
+ }
+ }
+ }
+ }
+
+ public static void convertListPath(final MCDataType type, final MapType<String> data, final String listPath, final String elementPath,
+ final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getList(listPath, ObjectType.MAP);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ WalkerUtils.convert(type, list.getMap(i), elementPath, fromVersion, toVersion);
+ }
+ }
+ }
+
+ public static void convertListPath(final MCDataType type, final MapType<String> data, final String listPath, final String elementPath1,
+ final String elementPath2, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getList(listPath, ObjectType.MAP);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ WalkerUtils.convert(type, list.getMap(i).getMap(elementPath1), elementPath2, fromVersion, toVersion);
+ }
+ }
+ }
+
+ public static void convert(final MCValueType type, final MapType<String> 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 MCValueType 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 MCValueType type, final MapType<String> 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 MCValueType type, final MapType<String> data, final String listPath, final String elementPath,
+ final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getList(listPath, ObjectType.MAP);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ WalkerUtils.convert(type, list.getMap(i), elementPath, fromVersion, toVersion);
+ }
+ }
+ }
+
+ public static void convertListPath(final MCValueType type, final MapType<String> data, final String listPath, final String elementPath1,
+ final String elementPath2, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final ListType list = data.getList(listPath, ObjectType.MAP);
+ if (list != null) {
+ for (int i = 0, len = list.size(); i < len; ++i) {
+ WalkerUtils.convert(type, list.getMap(i).getMap(elementPath1), elementPath2, fromVersion, toVersion);
+ }
+ }
+ }
+
+ public static void convertKeys(final MCValueType type, final MapType<String> data, final String path, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ final MapType<String> map = data.getMap(path);
+ if (map != null) {
+ convertKeys(type, map, fromVersion, toVersion);
+ }
+ }
+
+ public static void convertKeys(final MCValueType type, final MapType<String> 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<String> 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<String> data, final long fromVersion, final long toVersion) {
+ if (data == null) {
+ return;
+ }
+
+ for (final String key : data.keys()) {
+ final MapType<String> value = data.getMap(key);
+ if (value != null) {
+ final MapType<String> replace = type.convert(value, fromVersion, toVersion);
+ if (replace != null) {
+ // no CME, key is in map already
+ data.setMap(key, replace);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/item_name/DataWalkerItemNames.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/item_name/DataWalkerItemNames.java
new file mode 100644
index 0000000000000000000000000000000000000000..14e291efd864d97dcf83db01c09b9daaae1949bd
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItemLists.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItemLists.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b4402c3cc4e68e9c591e8bbb4a2542d8e2214d4
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ public DataWalkerItemLists(final String... paths) {
+ super(MCTypeRegistry.ITEM_STACK, paths);
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItems.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItems.java
new file mode 100644
index 0000000000000000000000000000000000000000..04770e8378ac8784895cdfe400a47b0b601c2187
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ public DataWalkerItems(final String... paths) {
+ super(MCTypeRegistry.ITEM_STACK, paths);
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/tile_entity/DataWalkerTileEntities.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/walkers/tile_entity/DataWalkerTileEntities.java
new file mode 100644
index 0000000000000000000000000000000000000000..d9cc21bf41cb4b377752b684f8e59818cd620103
--- /dev/null
+++ b/src/main/java/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<String>, MapType<String>> {
+
+ public DataWalkerTileEntities(final String... paths) {
+ super(MCTypeRegistry.TILE_ENTITY, paths);
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/types/ListType.java b/src/main/java/ca/spottedleaf/dataconverter/types/ListType.java
new file mode 100644
index 0000000000000000000000000000000000000000..19f7e95f754e8385bbe60fd2fb7fc95b6a4ebd7c
--- /dev/null
+++ b/src/main/java/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 NONE if no type has been assigned. if NONE, then this list is also empty. It is not true on the other hand that an empty list has no type.
+ public ObjectType getType();
+
+ public int size();
+
+ public void remove(final int index);
+
+ public default Object getGeneric(final int index) {
+ switch (this.getType()) {
+ case NONE:
+ throw new IllegalStateException("List is empty and has no type");
+ case BYTE:
+ return Byte.valueOf(this.getByte(index));
+ case SHORT:
+ return Short.valueOf(this.getShort(index));
+ case INT:
+ return Integer.valueOf(this.getInt(index));
+ case LONG:
+ return Long.valueOf(this.getLong(index));
+ case FLOAT:
+ return Float.valueOf(this.getFloat(index));
+ case DOUBLE:
+ return Double.valueOf(this.getDouble(index));
+ case NUMBER:
+ return this.getNumber(index);
+ case BYTE_ARRAY:
+ return this.getBytes(index);
+ case SHORT_ARRAY:
+ return this.getShorts(index);
+ case INT_ARRAY:
+ return this.getInts(index);
+ case LONG_ARRAY:
+ return this.getLongs(index);
+ case LIST:
+ return this.getList(index);
+ case MAP:
+ return this.getMap(index);
+ case STRING:
+ return this.getString(index);
+ default:
+ throw new UnsupportedOperationException(this.getType().name());
+ }
+ }
+
+ public default void setGeneric(final int index, final Object to) {
+ if (to instanceof Number) {
+ if (to instanceof Byte) {
+ this.setByte(index, ((Byte)to).byteValue());
+ return;
+ } else if (to instanceof Short) {
+ this.setShort(index, ((Short)to).shortValue());
+ return;
+ } else if (to instanceof Integer) {
+ this.setInt(index, ((Integer)to).intValue());
+ return;
+ } else if (to instanceof Long) {
+ this.setLong(index, ((Long)to).longValue());
+ return;
+ } else if (to instanceof Float) {
+ this.setFloat(index, ((Float)to).floatValue());
+ return;
+ } else if (to instanceof Double) {
+ this.setDouble(index, ((Double)to).doubleValue());
+ return;
+ } // else fall through to throw
+ } else if (to instanceof MapType) {
+ this.setMap(index, (MapType<?>)to);
+ return;
+ } else if (to instanceof ListType) {
+ this.setList(index, (ListType)to);
+ return;
+ } else if (to instanceof String) {
+ this.setString(index, (String)to);
+ return;
+ } else if (to.getClass().isArray()) {
+ if (to instanceof byte[]) {
+ this.setBytes(index, (byte[])to);
+ return;
+ } else if (to instanceof short[]) {
+ this.setShorts(index, (short[])to);
+ return;
+ } else if (to instanceof int[]) {
+ this.setInts(index, (int[])to);
+ return;
+ } else if (to instanceof long[]) {
+ this.setLongs(index, (long[])to);
+ 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.
+
+ public Number getNumber(final int index);
+
+ // if the value at index is a Number but not a byte, then returns the number casted to byte. If the value at the index is not a number, then throws
+ public byte getByte(final int index);
+
+ 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. If the value at the index is not a number, then throws
+ public short getShort(final int index);
+
+ 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. If the value at the index is not a number, then throws
+ public int getInt(final int index);
+
+ 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. If the value at the index is not a number, then throws
+ public long getLong(final int index);
+
+ 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. If the value at the index is not a number, then throws
+ public float getFloat(final int index);
+
+ 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. If the value at the index is not a number, then throws
+ public double getDouble(final int index);
+
+ public void setDouble(final int index, final double to);
+
+ public byte[] getBytes(final int index);
+
+ public void setBytes(final int index, final byte[] to);
+
+ public short[] getShorts(final int index);
+
+ public void setShorts(final int index, final short[] to);
+
+ public int[] getInts(final int index);
+
+ public void setInts(final int index, final int[] to);
+
+ public long[] getLongs(final int index);
+
+ public void setLongs(final int index, final long[] to);
+
+ public ListType getList(final int index);
+
+ public void setList(final int index, final ListType list);
+
+ public <T> MapType<T> getMap(final int index);
+
+ public void setMap(final int index, final MapType<?> to);
+
+ public String getString(final int index);
+
+ public void setString(final int index, final String to);
+
+ public default void addGeneric(final Object to) {
+ if (to instanceof Number) {
+ if (to instanceof Byte) {
+ this.addByte(((Byte)to).byteValue());
+ return;
+ } else if (to instanceof Short) {
+ this.addShort(((Short)to).shortValue());
+ return;
+ } else if (to instanceof Integer) {
+ this.addInt(((Integer)to).intValue());
+ return;
+ } else if (to instanceof Long) {
+ this.addLong(((Long)to).longValue());
+ return;
+ } else if (to instanceof Float) {
+ this.addFloat(((Float)to).floatValue());
+ return;
+ } else if (to instanceof Double) {
+ this.addDouble(((Double)to).doubleValue());
+ return;
+ } // else fall through to throw
+ } else if (to instanceof MapType) {
+ this.addMap((MapType<?>)to);
+ return;
+ } else if (to instanceof ListType) {
+ this.addList((ListType)to);
+ return;
+ } else if (to instanceof String) {
+ this.addString((String)to);
+ return;
+ } else if (to.getClass().isArray()) {
+ if (to instanceof byte[]) {
+ this.addByteArray((byte[])to);
+ return;
+ } else if (to instanceof short[]) {
+ this.addShortArray((short[])to);
+ return;
+ } else if (to instanceof int[]) {
+ this.addIntArray((int[])to);
+ return;
+ } else if (to instanceof long[]) {
+ this.addLongArray((long[])to);
+ 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/src/main/java/ca/spottedleaf/dataconverter/types/MapType.java b/src/main/java/ca/spottedleaf/dataconverter/types/MapType.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8dad91ad3b8692448134c4f12cf9853dc06fccc
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/MapType.java
@@ -0,0 +1,223 @@
+package ca.spottedleaf.dataconverter.types;
+
+import java.util.Set;
+
+public interface MapType<K> {
+
+ 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<K> keys();
+
+ // Provides a deep copy of this map
+ public MapType<K> copy();
+
+ public boolean hasKey(final K key);
+
+ public boolean hasKey(final K key, final ObjectType type);
+
+ public void remove(final K key);
+
+ public Object getGeneric(final K 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 K key);
+
+ public Number getNumber(final K key, final Number dfl);
+
+ public boolean getBoolean(final K key);
+
+ public boolean getBoolean(final K key, final boolean dfl);
+
+ public void setBoolean(final K 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 K 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 K key, final byte dfl);
+
+ public void setByte(final K 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 K 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 K key, final short dfl);
+
+ public void setShort(final K 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 K 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 K key, final int dfl);
+
+ public void setInt(final K 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 K 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 K key, final long dfl);
+
+ public void setLong(final K 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 K 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 K key, final float dfl);
+
+ public void setFloat(final K 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 K 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 K key, final double dfl);
+
+ public void setDouble(final K key, final double val);
+
+ public byte[] getBytes(final K key);
+
+ public byte[] getBytes(final K key, final byte[] dfl);
+
+ public void setBytes(final K key, final byte[] val);
+
+ public short[] getShorts(final K key);
+
+ public short[] getShorts(final K key, final short[] dfl);
+
+ public void setShorts(final K key, final short[] val);
+
+ public int[] getInts(final K key);
+
+ public int[] getInts(final K key, final int[] dfl);
+
+ public void setInts(final K key, final int[] val);
+
+ public long[] getLongs(final K key);
+
+ public long[] getLongs(final K key, final long[] dfl);
+
+ public void setLongs(final K key, final long[] val);
+
+ public ListType getListUnchecked(final K key);
+
+ public ListType getListUnchecked(final K key, final ListType dfl);
+
+ public default ListType getList(final K key, final ObjectType type) {
+ return this.getList(key, type, null);
+ }
+
+ public default ListType getOrCreateList(final K 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 K key, final ObjectType type, final ListType dfl) {
+ final ListType ret = this.getListUnchecked(key, null);
+ final ObjectType retType;
+ if (ret != null && ((retType = ret.getType()) == type || retType == ObjectType.UNDEFINED)) {
+ return ret;
+ } else {
+ return dfl;
+ }
+ }
+
+ public void setList(final K key, final ListType val);
+
+ public <T> MapType<T> getMap(final K key);
+
+ public default <T> MapType<T> getOrCreateMap(final K key) {
+ MapType<T> ret = this.getMap(key);
+ if (ret == null) {
+ this.setMap(key, ret = this.getTypeUtil().createEmptyMap());
+ }
+
+ return ret;
+ }
+
+ public <T> MapType<T> getMap(final K key, final MapType<T> dfl);
+
+ public void setMap(final K key, final MapType<?> val);
+
+ public String getString(final K key);
+
+ public String getString(final K key, final String dfl);
+
+ public String getForcedString(final K key);
+
+ public String getForcedString(final K key, final String dfl);
+
+ public void setString(final K key, final String val);
+
+ public default void setGeneric(final K key, final Object value) {
+ if (value instanceof Boolean) {
+ this.setBoolean(key, ((Boolean)value).booleanValue());
+ } else if (value instanceof Number) {
+ if (value instanceof Byte) {
+ this.setByte(key, ((Byte)value).byteValue());
+ return;
+ } else if (value instanceof Short) {
+ this.setShort(key, ((Short)value).shortValue());
+ return;
+ } else if (value instanceof Integer) {
+ this.setInt(key, ((Integer)value).intValue());
+ return;
+ } else if (value instanceof Long) {
+ this.setLong(key, ((Long)value).longValue());
+ return;
+ } else if (value instanceof Float) {
+ this.setFloat(key, ((Float)value).floatValue());
+ return;
+ } else if (value instanceof Double) {
+ this.setDouble(key, ((Double)value).doubleValue());
+ return;
+ } // else fall through to throw
+ } else if (value instanceof MapType) {
+ this.setMap(key, (MapType<?>)value);
+ return;
+ } else if (value instanceof ListType) {
+ this.setList(key, (ListType)value);
+ return;
+ } else if (value instanceof String) {
+ this.setString(key, (String)value);
+ return;
+ } else if (value.getClass().isArray()) {
+ if (value instanceof byte[]) {
+ this.setBytes(key, (byte[])value);
+ return;
+ } else if (value instanceof short[]) {
+ this.setShorts(key, (short[])value);
+ return;
+ } else if (value instanceof int[]) {
+ this.setInts(key, (int[])value);
+ return;
+ } else if (value instanceof long[]) {
+ this.setLongs(key, (long[])value);
+ return;
+ } // else fall through to throw
+ }
+
+ throw new IllegalArgumentException("Object " + value + " is not a valid type!");
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/types/ObjectType.java b/src/main/java/ca/spottedleaf/dataconverter/types/ObjectType.java
new file mode 100644
index 0000000000000000000000000000000000000000..1aab91233ddb98c3af5d424bac120891f1ee16c7
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/ObjectType.java
@@ -0,0 +1,72 @@
+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);
+
+ 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/src/main/java/ca/spottedleaf/dataconverter/types/TypeUtil.java b/src/main/java/ca/spottedleaf/dataconverter/types/TypeUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..156a2ea46f8f88a02e88b50d7bb7be82ecd41919
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/TypeUtil.java
@@ -0,0 +1,9 @@
+package ca.spottedleaf.dataconverter.types;
+
+public interface TypeUtil {
+
+ public ListType createEmptyList();
+
+ public <K> MapType<K> createEmptyMap();
+
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/types/Types.java b/src/main/java/ca/spottedleaf/dataconverter/types/Types.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ab9e3b579f20c9a189518496c522155630a36c4
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/Types.java
@@ -0,0 +1,15 @@
+package ca.spottedleaf.dataconverter.types;
+
+import ca.spottedleaf.dataconverter.types.json.JsonTypeCompressedUtil;
+import ca.spottedleaf.dataconverter.types.json.JsonTypeUtil;
+import ca.spottedleaf.dataconverter.types.nbt.NBTTypeUtil;
+
+public interface Types {
+
+ public static final TypeUtil NBT = new NBTTypeUtil();
+
+ public static final TypeUtil JSON = new JsonTypeUtil();
+
+ // why does this exist
+ public static final TypeUtil JSON_COMPRESSED = new JsonTypeCompressedUtil();
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonListType.java b/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonListType.java
new file mode 100644
index 0000000000000000000000000000000000000000..f6f57cb3a215876976b5eecae810b8b20925f2e2
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonListType.java
@@ -0,0 +1,415 @@
+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 {
+
+ protected final JsonArray array;
+ protected 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 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(JsonTypeUtil.copyJson(this.array), this.compressed);
+ }
+
+ @Override
+ public ObjectType getType() {
+ return ObjectType.UNDEFINED;
+ }
+
+ @Override
+ public int size() {
+ return this.array.size();
+ }
+
+ @Override
+ public void remove(final int index) {
+ this.array.remove(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 byte getByte(final int index) {
+ final Number number = this.getNumber(index);
+
+ return number == null ? 0 : 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 ? 0 : 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 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 ? 0 : 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 : 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 : 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 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 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 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 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 void setList(final int index, final ListType list) {
+ this.array.set(index, ((JsonListType)list).array);
+ }
+
+ @Override
+ public MapType<String> 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 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 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/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonMapType.java b/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonMapType.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6ad4623894454675f4be52ecdb4655d6623b385
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonMapType.java
@@ -0,0 +1,474 @@
+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<String> {
+
+ protected final JsonObject map;
+ protected 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 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<String> copy() {
+ return new JsonMapType(JsonTypeUtil.copyJson(this.map), 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;
+ }
+
+ @Override
+ public String getForcedString(final String key) {
+ return this.getForcedString(key, null);
+ }
+
+ @Override
+ 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/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonTypeCompressedUtil.java b/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonTypeCompressedUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c3093b66b847b5248bde923243fce78842bf67f
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonTypeCompressedUtil.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.types.json;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+
+public final class JsonTypeCompressedUtil implements TypeUtil {
+
+ @Override
+ public ListType createEmptyList() {
+ return new JsonListType(true);
+ }
+
+ @Override
+ public MapType<String> createEmptyMap() {
+ return new JsonMapType(true);
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java b/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..9410ae68395a09c7710bdbb2ccc6acf6633cad23
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java
@@ -0,0 +1,81 @@
+package ca.spottedleaf.dataconverter.types.json;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+import ca.spottedleaf.dataconverter.types.nbt.NBTListType;
+import ca.spottedleaf.dataconverter.types.nbt.NBTMapType;
+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 com.google.gson.internal.Streams;
+import com.google.gson.stream.JsonReader;
+import java.io.StringReader;
+import java.util.Map;
+
+public final class JsonTypeUtil implements TypeUtil {
+
+ @Override
+ public ListType createEmptyList() {
+ return new JsonListType(false);
+ }
+
+ @Override
+ public MapType<String> createEmptyMap() {
+ return new JsonMapType(false);
+ }
+
+ public static <T extends JsonElement> T copyJson(final T from) {
+ // This is stupidly inefficient. However, deepCopy() is not exposed in this gson version.
+ final String out = from.toString();
+
+ return (T)Streams.parse(new JsonReader(new StringReader(out)));
+ }
+
+ private static Object convertToGenericNBT(final JsonElement element, final boolean compressed) {
+ if (element instanceof JsonObject) {
+ return convertJsonToNBT(new JsonMapType((JsonObject)element, compressed));
+ } else if (element instanceof JsonArray) {
+ return convertJsonToNBT(new JsonListType((JsonArray)element, compressed));
+ } else if (element instanceof JsonNull) {
+ return null;
+ } else {
+ final JsonPrimitive primitive = (JsonPrimitive)element;
+ if (primitive.isBoolean()) {
+ return primitive.getAsBoolean() ? Byte.valueOf((byte)1) : Byte.valueOf((byte)0);
+ } else if (primitive.isNumber()) {
+ return primitive.getAsNumber();
+ } else if (primitive.isString()) {
+ return primitive.getAsString();
+ }
+ }
+
+ throw new IllegalStateException("Unrecognized type " + element);
+ }
+
+ public static NBTMapType convertJsonToNBT(final JsonMapType json) {
+ final NBTMapType ret = new NBTMapType();
+ for (final Map.Entry<String, JsonElement> entry : json.map.entrySet()) {
+ final Object obj = convertToGenericNBT(entry.getValue(), json.compressed);
+ if (obj == null) {
+ continue;
+ }
+
+ ret.setGeneric(entry.getKey(), obj);
+ }
+
+ return ret;
+ }
+
+ public static NBTListType convertJsonToNBT(final JsonListType json) {
+ final NBTListType ret = new NBTListType();
+
+ for (int i = 0, len = json.size(); i < len; ++i) {
+ ret.addGeneric(convertToGenericNBT(json.array.get(i), json.compressed));
+ }
+
+ return ret;
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java b/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf4e9ea17222cfa8f7cee9e46775302c9c2e6328
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java
@@ -0,0 +1,440 @@
+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 {
+
+ private final ListTag list;
+
+ public NBTListType() {
+ this.list = new ListTag();
+ }
+
+ public NBTListType(final ListTag tag) {
+ this.list = tag;
+ }
+
+ @Override
+ public TypeUtil 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());
+ }
+
+ protected static ObjectType getType(final byte id) {
+ switch (id) {
+ case 0: // END
+ return ObjectType.NONE;
+ case 1: // BYTE
+ return ObjectType.BYTE;
+ case 2: // SHORT
+ return ObjectType.SHORT;
+ case 3: // INT
+ return ObjectType.INT;
+ case 4: // LONG
+ return ObjectType.LONG;
+ case 5: // FLOAT
+ return ObjectType.FLOAT;
+ case 6: // DOUBLE
+ return ObjectType.DOUBLE;
+ case 7: // BYTE_ARRAY
+ return ObjectType.BYTE_ARRAY;
+ case 8: // STRING
+ return ObjectType.STRING;
+ case 9: // LIST
+ return ObjectType.LIST;
+ case 10: // COMPOUND
+ return ObjectType.MAP;
+ case 11: // INT_ARRAY
+ return ObjectType.INT_ARRAY;
+ case 12: // LONG_ARRAY
+ return ObjectType.LONG_ARRAY;
+ default:
+ throw new IllegalStateException("Unknown type: " + id);
+ }
+ }
+
+ @Override
+ public ObjectType getType() {
+ return getType(this.list.getElementType());
+ }
+
+ @Override
+ public int size() {
+ return this.list.size();
+ }
+
+ @Override
+ public void remove(final int index) {
+ this.list.remove(index);
+ }
+
+ @Override
+ public Number getNumber(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag)) {
+ throw new IllegalStateException();
+ }
+ return ((NumericTag)tag).getAsNumber();
+ }
+
+ @Override
+ public byte getByte(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof NumericTag)) {
+ throw new IllegalStateException();
+ }
+ return ((NumericTag)tag).getAsByte();
+ }
+
+ @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)) {
+ throw new IllegalStateException();
+ }
+ return ((NumericTag)tag).getAsShort();
+ }
+
+ @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)) {
+ throw new IllegalStateException();
+ }
+ return ((NumericTag)tag).getAsInt();
+ }
+
+ @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)) {
+ throw new IllegalStateException();
+ }
+ return ((NumericTag)tag).getAsLong();
+ }
+
+ @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)) {
+ throw new IllegalStateException();
+ }
+ return ((NumericTag)tag).getAsFloat();
+ }
+
+ @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)) {
+ throw new IllegalStateException();
+ }
+ return ((NumericTag)tag).getAsDouble();
+ }
+
+ @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)) {
+ throw new IllegalStateException();
+ }
+ return ((ByteArrayTag)tag).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 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)) {
+ throw new IllegalStateException();
+ }
+ return ((IntArrayTag)tag).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)) {
+ throw new IllegalStateException();
+ }
+ return ((LongArrayTag)tag).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)) {
+ throw new IllegalStateException();
+ }
+ return new NBTListType((ListTag)tag);
+ }
+
+ @Override
+ public void setList(final int index, final ListType list) {
+ this.list.set(index, ((NBTListType)list).getTag());
+ }
+
+ @Override
+ public MapType<String> getMap(final int index) {
+ final Tag tag = this.list.get(index); // does bound checking for us
+ if (!(tag instanceof CompoundTag)) {
+ throw new IllegalStateException();
+ }
+ return new NBTMapType((CompoundTag)tag);
+ }
+
+ @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)) {
+ throw new IllegalStateException();
+ }
+ return ((StringTag)tag).getAsString();
+ }
+
+ @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/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java b/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java
new file mode 100644
index 0000000000000000000000000000000000000000..01b6796c6ac168a82f41cf4fddbd32a1c8a86484
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java
@@ -0,0 +1,454 @@
+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.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.Tag;
+
+import java.util.Set;
+
+public final class NBTMapType implements MapType<String> {
+
+ private 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 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.getAllKeys().clear();
+ }
+
+ @Override
+ public Set<String> keys() {
+ return this.map.getAllKeys();
+ }
+
+ public CompoundTag getTag() {
+ return this.map;
+ }
+
+ @Override
+ public MapType<String> 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).getAsNumber();
+ case MAP:
+ return new NBTMapType((CompoundTag)tag);
+ case LIST:
+ return new NBTListType((ListTag)tag);
+ case STRING:
+ return ((StringTag)tag).getAsString();
+ 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) {
+ return ((NumericTag)tag).getAsNumber();
+ }
+ 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) {
+ return ((NumericTag)tag).getAsByte();
+ }
+ return 0;
+ }
+
+ @Override
+ public byte getByte(final String key, final byte dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag) {
+ return ((NumericTag)tag).getAsByte();
+ }
+ 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) {
+ return ((NumericTag)tag).getAsShort();
+ }
+ return 0;
+ }
+
+ @Override
+ public short getShort(final String key, final short dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag) {
+ return ((NumericTag)tag).getAsShort();
+ }
+ 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) {
+ return ((NumericTag)tag).getAsInt();
+ }
+ return 0;
+ }
+
+ @Override
+ public int getInt(final String key, final int dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag) {
+ return ((NumericTag)tag).getAsInt();
+ }
+ 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) {
+ return ((NumericTag)tag).getAsLong();
+ }
+ return 0;
+ }
+
+ @Override
+ public long getLong(final String key, final long dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag) {
+ return ((NumericTag)tag).getAsLong();
+ }
+ 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) {
+ return ((NumericTag)tag).getAsFloat();
+ }
+ return 0;
+ }
+
+ @Override
+ public float getFloat(final String key, final float dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag) {
+ return ((NumericTag)tag).getAsFloat();
+ }
+ 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) {
+ return ((NumericTag)tag).getAsDouble();
+ }
+ return 0;
+ }
+
+ @Override
+ public double getDouble(final String key, final double dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof NumericTag) {
+ return ((NumericTag)tag).getAsDouble();
+ }
+ 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) {
+ return ((ByteArrayTag)tag).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) {
+ return ((IntArrayTag)tag).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) {
+ return ((LongArrayTag)tag).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) {
+ return new NBTListType((ListTag)tag);
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setList(final String key, final ListType val) {
+ this.map.put(key, ((NBTListType)val).getTag());
+ }
+
+ @Override
+ public MapType<String> getMap(final String key) {
+ return this.getMap(key, null);
+ }
+
+ @Override
+ public MapType<String> getMap(final String key, final MapType dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag instanceof CompoundTag) {
+ return new NBTMapType((CompoundTag)tag);
+ }
+ 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) {
+ return ((StringTag)tag).getAsString();
+ }
+ return dfl;
+ }
+
+ @Override
+ public String getForcedString(final String key) {
+ return this.getForcedString(key, null);
+ }
+
+ @Override
+ public String getForcedString(final String key, final String dfl) {
+ final Tag tag = this.map.get(key);
+ if (tag != null) {
+ return tag.getAsString();
+ }
+ return dfl;
+ }
+
+ @Override
+ public void setString(final String key, final String val) {
+ this.map.putString(key, val);
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java b/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..62c0f4073aff301bf5b3187e0d4446fd8d0ac475
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java
@@ -0,0 +1,18 @@
+package ca.spottedleaf.dataconverter.types.nbt;
+
+import ca.spottedleaf.dataconverter.types.ListType;
+import ca.spottedleaf.dataconverter.types.MapType;
+import ca.spottedleaf.dataconverter.types.TypeUtil;
+
+public final class NBTTypeUtil implements TypeUtil {
+
+ @Override
+ public ListType createEmptyList() {
+ return new NBTListType();
+ }
+
+ @Override
+ public MapType<String> createEmptyMap() {
+ return new NBTMapType();
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/util/CommandArgumentUpgrader.java b/src/main/java/ca/spottedleaf/dataconverter/util/CommandArgumentUpgrader.java
new file mode 100644
index 0000000000000000000000000000000000000000..40da70d5cf584a9730f9fe81c355cf8513fba475
--- /dev/null
+++ b/src/main/java/ca/spottedleaf/dataconverter/util/CommandArgumentUpgrader.java
@@ -0,0 +1,592 @@
+package ca.spottedleaf.dataconverter.util;
+
+import ca.spottedleaf.dataconverter.minecraft.MCDataConverter;
+import ca.spottedleaf.dataconverter.minecraft.MCVersions;
+import ca.spottedleaf.dataconverter.minecraft.converters.custom.V3818_Commands;
+import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.internal.Streams;
+import com.google.gson.stream.JsonReader;
+import com.mojang.brigadier.Command;
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.LiteralMessage;
+import com.mojang.brigadier.ParseResults;
+import com.mojang.brigadier.StringReader;
+import com.mojang.brigadier.arguments.ArgumentType;
+import com.mojang.brigadier.context.CommandContextBuilder;
+import com.mojang.brigadier.context.ParsedArgument;
+import com.mojang.brigadier.context.StringRange;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
+import com.mojang.brigadier.tree.ArgumentCommandNode;
+import com.mojang.brigadier.tree.CommandNode;
+import com.mojang.brigadier.tree.LiteralCommandNode;
+import com.mojang.serialization.Lifecycle;
+import it.unimi.dsi.fastutil.Pair;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Stream;
+import net.minecraft.SharedConstants;
+import net.minecraft.Util;
+import net.minecraft.commands.CommandBuildContext;
+import net.minecraft.commands.CommandSource;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.commands.arguments.ComponentArgument;
+import net.minecraft.commands.arguments.CompoundTagArgument;
+import net.minecraft.commands.arguments.ResourceLocationArgument;
+import net.minecraft.commands.arguments.blocks.BlockStateArgument;
+import net.minecraft.commands.arguments.coordinates.Vec3Argument;
+import net.minecraft.commands.arguments.item.ItemArgument;
+import net.minecraft.core.Holder;
+import net.minecraft.core.HolderLookup;
+import net.minecraft.core.HolderSet;
+import net.minecraft.core.Registry;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.Tag;
+import net.minecraft.nbt.TagParser;
+import net.minecraft.network.chat.CommonComponents;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.commands.ExecuteCommand;
+import net.minecraft.server.commands.ReturnCommand;
+import net.minecraft.tags.TagKey;
+import net.minecraft.util.GsonHelper;
+import net.minecraft.world.phys.Vec2;
+import net.minecraft.world.phys.Vec3;
+import org.jetbrains.annotations.Nullable;
+
+public final class CommandArgumentUpgrader {
+ private final CommandDispatcher<CommandSourceStack> dispatcher;
+ private final CommandBuildContext context;
+ private final CommandSourceStack source;
+ private final Map<Class<?>, BiFunction<ArgumentType<?>, CommandBuildContext, ArgumentType<?>>> replacements;
+
+ public static CommandArgumentUpgrader upgrader_1_20_4_to_1_20_5(final int functionPermissionLevel) {
+ return new CommandArgumentUpgrader(functionPermissionLevel, builder -> {
+ builder.registerReplacement(ItemArgument.class, (argument, ctx) -> new ItemParser_1_20_4());
+ builder.registerReplacement(ComponentArgument.class, (argument, ctx) -> new ComponentParser_1_20_4());
+ builder.registerReplacement(BlockStateArgument.class, (argument, ctx) -> new BlockStateParser_1_20_4());
+ builder.registerExtraCommand(CommandArgumentUpgrader::registerSummon_1_20_4_to_1_20_5);
+ });
+ }
+
+ public CommandArgumentUpgrader(
+ final int functionPermissionLevel,
+ final Consumer<ReplacementsBuilder> consumer
+ ) {
+ this(
+ new Commands(Commands.CommandSelection.DEDICATED, makeDummyCommandBuildContext()).getDispatcher(),
+ functionPermissionLevel,
+ consumer
+ );
+ }
+
+ private CommandArgumentUpgrader(
+ final CommandDispatcher<CommandSourceStack> dispatcher,
+ final int functionPermissionLevel,
+ final Consumer<ReplacementsBuilder> consumer
+ ) {
+ final ReplacementsBuilder builder = new ReplacementsBuilder();
+ consumer.accept(builder);
+ this.replacements = Map.copyOf(builder.replacements);
+
+ final CommandBuildContext context = makeDummyCommandBuildContext();
+ this.dispatcher = new CommandDispatcher<>();
+ this.context = context;
+ final List<CommandNode<CommandSourceStack>> aliases = new ArrayList<>();
+ for (final CommandNode<CommandSourceStack> child : dispatcher.getRoot().getChildren()) {
+ final CopyResult result = this.copyCommand(this.dispatcher.getRoot(), child, null);
+ if (result.replaced()) {
+ this.dispatcher.getRoot().addChild(result.root);
+ }
+ aliases.addAll(result.aliases);
+ }
+ aliases.forEach(redirectNode -> {
+ final CommandNode<CommandSourceStack> toNode = this.dispatcher.getRoot()
+ .getChild(redirectNode.getRedirect().getName());
+ if (toNode != null) {
+ this.dispatcher.getRoot().addChild(
+ new LiteralCommandNode<>(
+ redirectNode.getName(),
+ null,
+ toNode.getRequirement(),
+ toNode,
+ redirectNode.getRedirectModifier(),
+ redirectNode.isFork()
+ )
+ );
+ }
+ });
+ for (final Consumer<CommandDispatcher<CommandSourceStack>> extra : builder.extra) {
+ extra.accept(this.dispatcher);
+ }
+ ExecuteCommand.register(this.dispatcher, context);
+ ReturnCommand.register(this.dispatcher);
+ // This looks weird, but it's what vanilla does when loading functions for datapacks
+ this.source = new CommandSourceStack(
+ CommandSource.NULL,
+ Vec3.ZERO,
+ Vec2.ZERO,
+ null,
+ functionPermissionLevel,
+ "",
+ CommonComponents.EMPTY,
+ null,
+ null
+ );
+ }
+
+ public static final class ReplacementsBuilder {
+ private final Map<Class<?>, BiFunction<ArgumentType<?>, CommandBuildContext, ArgumentType<?>>> replacements =
+ new HashMap<>();
+ private final List<Consumer<CommandDispatcher<CommandSourceStack>>> extra = new ArrayList<>();
+
+ private ReplacementsBuilder() {
+ }
+
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ public <A extends ArgumentType<?>> void registerReplacement(
+ final Class<A> type,
+ final BiFunction<A, CommandBuildContext, ? extends ArgumentType<UpgradedArgument>> upgrader
+ ) {
+ this.replacements.put(type, (BiFunction) upgrader);
+ }
+
+ public void registerExtraCommand(final Consumer<CommandDispatcher<CommandSourceStack>> consumer) {
+ this.extra.add(consumer);
+ }
+ }
+
+ public interface UpgradableArgument {
+ String upgrade(int index, List<Pair<String, ParsedArgument<CommandSourceStack, ?>>> arguments);
+ }
+
+ public record UpgradedArgument(String upgraded) {}
+
+ private static final class ItemParser_1_20_4 implements ArgumentType<UpgradedArgument> {
+ @Override
+ public UpgradedArgument parse(final StringReader reader) throws CommandSyntaxException {
+ final ResourceLocation id = ResourceLocation.read(reader);
+
+ final CompoundTag itemNBT = new CompoundTag();
+ itemNBT.putString("id", id.toString());
+ itemNBT.putInt("Count", 1);
+
+ if (reader.canRead() && reader.peek() == '{') {
+ itemNBT.put("tag", new TagParser(reader).readStruct());
+ }
+
+ final CompoundTag converted = MCDataConverter.convertTag(
+ MCTypeRegistry.ITEM_STACK, itemNBT, MCVersions.V1_20_4, SharedConstants.getCurrentVersion().getDataVersion().getVersion()
+ );
+
+ final String newId = converted.getString("id");
+
+ if (converted.contains("components", Tag.TAG_COMPOUND)) {
+ return new UpgradedArgument(newId + V3818_Commands.toCommandFormat(converted.getCompound("components")));
+ } else {
+ return new UpgradedArgument(newId);
+ }
+ }
+ }
+
+ private static final class ComponentParser_1_20_4 implements ArgumentType<UpgradedArgument> {
+ private static final Field JSON_READER_POS = Util.make(() -> {
+ try {
+ final Field field = JsonReader.class.getDeclaredField("pos");
+ field.setAccessible(true);
+ return field;
+ } catch (final NoSuchFieldException var1) {
+ throw new IllegalStateException("Couldn't get field 'pos' for JsonReader", var1);
+ }
+ });
+
+ private static final Field JSON_READER_LINESTART = Util.make(() -> {
+ try {
+ final Field field = JsonReader.class.getDeclaredField("lineStart");
+ field.setAccessible(true);
+ return field;
+ } catch (final NoSuchFieldException var1) {
+ throw new IllegalStateException("Couldn't get field 'lineStart' for JsonReader", var1);
+ }
+ });
+
+ @Override
+ public UpgradedArgument parse(final StringReader reader) throws CommandSyntaxException {
+ final JsonElement element;
+ try {
+ element = parseJson(reader);
+ } catch (final Exception e) {
+ throw new SimpleCommandExceptionType(new LiteralMessage(e.getMessage())).createWithContext(reader);
+ }
+ V3818_Commands.walkComponent(element);
+ return new UpgradedArgument(GsonHelper.toStableString(element));
+ }
+
+ public static JsonElement parseJson(final StringReader stringReader) {
+ final JsonReader jsonReader = new JsonReader(new java.io.StringReader(stringReader.getRemaining()));
+ jsonReader.setLenient(false);
+
+ final JsonElement jsonElement;
+ try {
+ jsonElement = Streams.parse(jsonReader);
+ } catch (final StackOverflowError var9) {
+ throw new JsonParseException(var9);
+ } finally {
+ stringReader.setCursor(stringReader.getCursor() + getPos(jsonReader));
+ }
+ return jsonElement;
+ }
+
+ private static int getPos(final JsonReader jsonReader) {
+ try {
+ return JSON_READER_POS.getInt(jsonReader) - JSON_READER_LINESTART.getInt(jsonReader);
+ } catch (IllegalAccessException var2) {
+ throw new IllegalStateException("Couldn't read position of JsonReader", var2);
+ }
+ }
+ }
+
+ private static class BlockStateParser_1_20_4 implements ArgumentType<UpgradedArgument> {
+ @Override
+ public UpgradedArgument parse(final StringReader reader) throws CommandSyntaxException {
+ String block = ResourceLocation.read(reader).toString();
+
+ StringBuilder properties = new StringBuilder();
+ if (reader.canRead() && reader.peek() == '[') {
+ char c;
+ do {
+ c = reader.read();
+ properties.append(c);
+ } while (reader.canRead() && c != ']');
+ }
+
+ if (!reader.canRead() || reader.peek() != '{') {
+ return new UpgradedArgument(block + properties);
+ }
+
+ CompoundTag tag = new TagParser(reader).readStruct();
+ boolean missId = !tag.contains("id", Tag.TAG_STRING);
+ if (missId) { // Data converter can't upgrade tile entities without it
+ tag.putString("id", CommandArgumentUpgrader.blockToTileEntity(block));
+ }
+ tag = MCDataConverter.convertTag(
+ MCTypeRegistry.TILE_ENTITY, tag, MCVersions.V1_20_4, SharedConstants.getCurrentVersion().getDataVersion().getVersion()
+ );
+ if (missId) {
+ tag.remove("id");
+ }
+
+ return new UpgradedArgument(block + properties + tag);
+ }
+ }
+
+ private static String blockToTileEntity(String block) {
+ return switch (block) {
+ case "minecraft:acacia_sign", "minecraft:jungle_wall_sign", "minecraft:oak_sign",
+ "minecraft:cherry_sign", "minecraft:birch_wall_sign", "minecraft:dark_oak_sign",
+ "minecraft:mangrove_wall_sign", "minecraft:cherry_wall_sign", "minecraft:jungle_sign",
+ "minecraft:mangrove_sign", "minecraft:spruce_wall_sign", "minecraft:crimson_sign",
+ "minecraft:oak_wall_sign", "minecraft:crimson_wall_sign", "minecraft:bamboo_sign",
+ "minecraft:warped_wall_sign", "minecraft:bamboo_wall_sign", "minecraft:acacia_wall_sign",
+ "minecraft:spruce_sign", "minecraft:warped_sign", "minecraft:dark_oak_wall_sign",
+ "minecraft:birch_sign"
+ -> "minecraft:sign";
+ case "minecraft:acacia_hanging_sign", "minecraft:crimson_wall_hanging_sign",
+ "minecraft:jungle_wall_hanging_sign", "minecraft:dark_oak_wall_hanging_sign",
+ "minecraft:crimson_hanging_sign", "minecraft:bamboo_wall_hanging_sign",
+ "minecraft:bamboo_hanging_sign", "minecraft:oak_wall_hanging_sign",
+ "minecraft:cherry_wall_hanging_sign", "minecraft:warped_wall_hanging_sign",
+ "minecraft:birch_hanging_sign", "minecraft:mangrove_hanging_sign",
+ "minecraft:birch_wall_hanging_sign", "minecraft:jungle_hanging_sign",
+ "minecraft:cherry_hanging_sign", "minecraft:spruce_hanging_sign",
+ "minecraft:warped_hanging_sign", "minecraft:mangrove_wall_hanging_sign",
+ "minecraft:spruce_wall_hanging_sign", "minecraft:dark_oak_hanging_sign",
+ "minecraft:oak_hanging_sign", "minecraft:acacia_wall_hanging_sign"
+ -> "minecraft:hanging_sign";
+ case "minecraft:spawner" -> "minecraft:mob_spawner";
+ case "minecraft:moving_piston" -> "minecraft:piston";
+ case "minecraft:skeleton_skull" , "minecraft:skeleton_wall_skull", "minecraft:player_wall_head",
+ "minecraft:creeper_wall_head", "minecraft:zombie_head", "minecraft:wither_skeleton_skull",
+ "minecraft:creeper_head", "minecraft:wither_skeleton_wall_skull", "minecraft:dragon_head",
+ "minecraft:piglin_wall_head", "minecraft:dragon_wall_head", "minecraft:player_head",
+ "minecraft:zombie_wall_head", "minecraft:piglin_head"
+ -> "minecraft:skull";
+ case "minecraft:black_banner", "minecraft:orange_wall_banner", "minecraft:gray_wall_banner",
+ "minecraft:magenta_banner", "minecraft:red_banner", "minecraft:brown_wall_banner",
+ "minecraft:pink_banner", "minecraft:light_blue_banner", "minecraft:cyan_wall_banner",
+ "minecraft:purple_banner", "minecraft:brown_banner", "minecraft:light_gray_wall_banner",
+ "minecraft:black_wall_banner", "minecraft:gray_banner", "minecraft:yellow_wall_banner",
+ "minecraft:light_gray_banner", "minecraft:red_wall_banner", "minecraft:light_blue_wall_banner",
+ "minecraft:pink_wall_banner", "minecraft:white_banner", "minecraft:green_wall_banner",
+ "minecraft:white_wall_banner", "minecraft:magenta_wall_banner", "minecraft:green_banner",
+ "minecraft:orange_banner", "minecraft:blue_wall_banner", "minecraft:cyan_banner",
+ "minecraft:purple_wall_banner", "minecraft:lime_wall_banner", "minecraft:yellow_banner",
+ "minecraft:lime_banner", "minecraft:blue_banner"
+ -> "minecraft:banner";
+ case "minecraft:repeating_command_block", "minecraft:chain_command_block"
+ -> "minecraft:command_block";
+ case "minecraft:brown_shulker_box", "minecraft:light_blue_shulker_box", "minecraft:white_shulker_box",
+ "minecraft:green_shulker_box", "minecraft:black_shulker_box", "minecraft:lime_shulker_box",
+ "minecraft:pink_shulker_box", "minecraft:light_gray_shulker_box", "minecraft:magenta_shulker_box",
+ "minecraft:orange_shulker_box", "minecraft:purple_shulker_box", "minecraft:cyan_shulker_box",
+ "minecraft:yellow_shulker_box", "minecraft:red_shulker_box", "minecraft:blue_shulker_box",
+ "minecraft:gray_shulker_box"
+ -> "minecraft:shulker_box";
+ case "minecraft:purple_bed", "minecraft:light_blue_bed", "minecraft:yellow_bed",
+ "minecraft:orange_bed", "minecraft:light_gray_bed", "minecraft:red_bed",
+ "minecraft:gray_bed", "minecraft:brown_bed", "minecraft:cyan_bed", "minecraft:magenta_bed",
+ "minecraft:green_bed", "minecraft:white_bed", "minecraft:black_bed", "minecraft:blue_bed",
+ "minecraft:pink_bed", "minecraft:lime_bed"
+ -> "minecraft:bed";
+ case "minecraft:soul_campfire" -> "minecraft:campfire";
+ case "minecraft:bee_nest" -> "minecraft:beehive";
+ case "minecraft:suspicious_sand", "minecraft:suspicious_gravel" -> "minecraft:brushable_block";
+ default -> block;
+ };
+ }
+
+ // important: leadingSlash should not just be the result of a startsWith on command,
+ // it should reflect whether the command use is in a place that will skip a leading slash when parsing
+ public String upgradeCommandArguments(final String command, final boolean leadingSlash) {
+ final StringReader reader = new StringReader(command);
+ if (leadingSlash && reader.peek() == '/') {
+ reader.skip();
+ }
+ final ParseResults<CommandSourceStack> parseResult = this.dispatcher.parse(reader, this.source);
+ if (!parseResult.getExceptions().isEmpty()) {
+ return command;
+ }
+ final Map<StringRange, String> replacements = new LinkedHashMap<>();
+ final List<Pair<String, ParsedArgument<CommandSourceStack, ?>>> mergedArguments = new ArrayList<>();
+ addArguments(mergedArguments, parseResult.getContext());
+ for (int i = 0; i < mergedArguments.size(); i++) {
+ final Pair<String, ParsedArgument<CommandSourceStack, ?>> pair = mergedArguments.get(i);
+ if (pair.value().getResult() instanceof UpgradedArgument upgraded) {
+ replacements.put(pair.value().getRange(), upgraded.upgraded());
+ } else if (pair.value().getResult() instanceof UpgradableArgument upgradable) {
+ replacements.put(pair.value().getRange(), upgradable.upgrade(i, mergedArguments));
+ }
+ }
+ String upgradedCommand = command;
+ while (!replacements.isEmpty()) {
+ final Map.Entry<StringRange, String> next = replacements.entrySet().iterator().next();
+ replacements.remove(next.getKey());
+ upgradedCommand = upgradedCommand.substring(0, next.getKey().getStart()) + next.getValue() + upgradedCommand.substring(next.getKey().getEnd());
+ // Update the offsets for the remaining replacements
+ final int diff = next.getValue().length() - next.getKey().getLength();
+ final Map<StringRange, String> replacementsCopy = new LinkedHashMap<>(replacements);
+ replacements.clear();
+ replacementsCopy.forEach((range, value) -> {
+ replacements.put(new StringRange(range.getStart() + diff, range.getEnd() + diff), value);
+ });
+ }
+ return upgradedCommand;
+ }
+
+ public String upgradeSingleArgument(
+ final Function<CommandBuildContext, ? extends ArgumentType<?>> argumentFactory,
+ final String input
+ ) {
+ final ArgumentType<?> argument = argumentFactory.apply(this.context);
+ final ArgumentType<?> replaced = this.replaceArgumentType(this.context, argument);
+ if (argument == replaced) {
+ return input;
+ }
+ try {
+ final UpgradedArgument parsed = (UpgradedArgument) replaced.parse(new StringReader(input));
+ return parsed.upgraded();
+ } catch (final CommandSyntaxException e) {
+ return input;
+ }
+ }
+
+ private static void addArguments(
+ final List<Pair<String, ParsedArgument<CommandSourceStack, ?>>> mergedArguments,
+ final @Nullable CommandContextBuilder<CommandSourceStack> context
+ ) {
+ if (context == null) {
+ return;
+ }
+ context.getArguments().forEach((name, argument) -> mergedArguments.add(Pair.of(name, argument)));
+ addArguments(mergedArguments, context.getChild());
+ }
+
+ private ArgumentType<?> replaceArgumentType(final CommandBuildContext ctx, final ArgumentType<?> type) {
+ final BiFunction<ArgumentType<?>, CommandBuildContext, ArgumentType<?>> upgrader =
+ this.replacements.get(type.getClass());
+ if (upgrader != null) {
+ return upgrader.apply(type, ctx);
+ }
+ return type;
+ }
+
+ record CopyResult(
+ CommandNode<CommandSourceStack> root,
+ boolean replaced,
+ List<CommandNode<CommandSourceStack>> aliases
+ ) {
+ CopyResult replacedResult() {
+ if (this.replaced) {
+ return this;
+ }
+ return new CopyResult(this.root, true, new ArrayList<>(this.aliases));
+ }
+ }
+
+ private CopyResult copyCommand(
+ final CommandNode<CommandSourceStack> parent,
+ final CommandNode<CommandSourceStack> node,
+ @Nullable CopyResult result
+ ) {
+ final CommandNode<CommandSourceStack> copy;
+ final boolean replaced;
+ if (node instanceof LiteralCommandNode<?> literal) {
+ if (node.getName().equals("execute") || node.getName().equals("return")) {
+ return new CopyResult(parent, false, new ArrayList<>());
+ }
+ if (node.getRedirect() != null) {
+ if (result != null) {
+ throw new IllegalStateException("Cannot handle non-root redirects");
+ }
+ final List<CommandNode<CommandSourceStack>> aliases = new ArrayList<>();
+ aliases.add(node);
+ return new CopyResult(parent, false, aliases);
+ }
+ copy = new LiteralCommandNode<>(
+ literal.getLiteral(),
+ node.getCommand(),
+ node.getRequirement(),
+ null,
+ node.getRedirectModifier(),
+ node.isFork()
+ );
+ replaced = false;
+ } else if (node instanceof ArgumentCommandNode<?, ?>) {
+ final ArgumentCommandNode<CommandSourceStack, ?> argument =
+ (ArgumentCommandNode<CommandSourceStack, ?>) node;
+ final ArgumentType<?> replacedType = this.replaceArgumentType(this.context, argument.getType());
+ replaced = replacedType != argument.getType();
+ copy = new ArgumentCommandNode<>(
+ node.getName(),
+ replacedType,
+ node.getCommand(),
+ node.getRequirement(),
+ null,
+ node.getRedirectModifier(),
+ node.isFork(),
+ argument.getCustomSuggestions()
+ );
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ if (result == null) {
+ result = new CopyResult(copy, false, new ArrayList<>());
+ }
+ if (replaced) {
+ result = result.replacedResult();
+ }
+ for (final CommandNode<CommandSourceStack> child : node.getChildren()) {
+ result = this.copyCommand(copy, child, result);
+ }
+ if (parent != this.dispatcher.getRoot()) {
+ parent.addChild(copy);
+ }
+ return result;
+ }
+
+ public static void registerSummon_1_20_4_to_1_20_5(final CommandDispatcher<CommandSourceStack> dispatcher) {
+ dispatcher.register(
+ Commands.literal("summon")
+ .then(Commands.argument("entity", ResourceLocationArgument.id())
+ .executes(commandContext -> Command.SINGLE_SUCCESS)
+ .then(Commands.argument("pos", Vec3Argument.vec3())
+ .executes(commandContext -> Command.SINGLE_SUCCESS)
+ .then(Commands.argument("nbt", new ArgumentType<UpgradableArgument>() {
+ @Override
+ public UpgradableArgument parse(final StringReader reader) throws CommandSyntaxException {
+ final CompoundTag tag = CompoundTagArgument.compoundTag().parse(reader);
+
+ return (index, args) -> {
+ final CompoundTag tagCopy = tag.copy();
+
+ final Pair<String, ParsedArgument<CommandSourceStack, ?>> entityTypePair =
+ args.get(index - 2);
+ final ResourceLocation entityType =
+ (ResourceLocation) entityTypePair.value().getResult();
+
+ tagCopy.putString("id", entityType.toString());
+ final CompoundTag convertedTag = MCDataConverter.convertTag(
+ MCTypeRegistry.ENTITY,
+ tagCopy,
+ MCVersions.V1_20_4, SharedConstants.getCurrentVersion().getDataVersion().getVersion()
+ );
+ convertedTag.remove("id");
+
+ return convertedTag.toString();
+ };
+ }
+ })
+ .executes(commandContext -> Command.SINGLE_SUCCESS))))
+ );
+ }
+
+ private static CommandBuildContext makeDummyCommandBuildContext() {
+ return Commands.createValidationContext(
+ new HolderLookup.Provider() {
+
+ @Override
+ public Stream<ResourceKey<? extends Registry<?>>> listRegistryKeys() {
+ return Stream.of();
+ }
+
+ @Override
+ public <T> Optional<HolderLookup.RegistryLookup<T>> lookup(
+ final ResourceKey<? extends Registry<? extends T>> registryRef
+ ) {
+ return Optional.of(new HolderLookup.RegistryLookup<T>() {
+ @Override
+ public ResourceKey<? extends Registry<? extends T>> key() {
+ return registryRef;
+ }
+
+ @Override
+ public Lifecycle registryLifecycle() {
+ return Lifecycle.stable();
+ }
+
+ @Override
+ public Stream<Holder.Reference<T>> listElements() {
+ return Stream.of();
+ }
+
+ @Override
+ public Stream<HolderSet.Named<T>> listTags() {
+ return Stream.of();
+ }
+
+ @Override
+ public Optional<Holder.Reference<T>> get(final ResourceKey<T> key) {
+ return Optional.of(Holder.Reference.createStandAlone(this, key));
+ }
+
+ @Override
+ public Optional<HolderSet.Named<T>> get(final TagKey<T> tag) {
+ return Optional.of(HolderSet.emptyNamed(this, tag));
+ }
+ });
+ }
+ }
+ );
+ }
+}
diff --git a/src/main/java/ca/spottedleaf/dataconverter/util/Int2IntArraySortedMap.java b/src/main/java/ca/spottedleaf/dataconverter/util/Int2IntArraySortedMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..6596de3d9ebae583c252aa061f0cfdf8778ea1a5
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/util/Int2ObjectArraySortedMap.java b/src/main/java/ca/spottedleaf/dataconverter/util/Int2ObjectArraySortedMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..de9d632489609136c712a9adaee941fd38fad440
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/util/IntegerUtil.java b/src/main/java/ca/spottedleaf/dataconverter/util/IntegerUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4bbf38c812feeb30d2aa5f3fcf482bfcbed79d05
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/util/Long2IntArraySortedMap.java b/src/main/java/ca/spottedleaf/dataconverter/util/Long2IntArraySortedMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..94705bb141b550589faa9a0408402d8636c61907
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/util/Long2ObjectArraySortedMap.java b/src/main/java/ca/spottedleaf/dataconverter/util/Long2ObjectArraySortedMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f634c8825589a23f46ad7b54354475c9a95bd1b
--- /dev/null
+++ b/src/main/java/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/src/main/java/ca/spottedleaf/dataconverter/util/NamespaceUtil.java b/src/main/java/ca/spottedleaf/dataconverter/util/NamespaceUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..5a6536377c9c1e1753e930ff2a6bb98ea57055c7
--- /dev/null
+++ b/src/main/java/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<String> 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/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java b/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java
index 1aa6be257ce594d7a69fdff008cd29014a04fd75..c8f2457ab3b28f2c3a6b500bcea40261669c24a4 100644
--- a/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java
+++ b/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java
@@ -172,6 +172,43 @@ public final class PaperHooks implements PlatformHooks {
@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/src/main/java/net/minecraft/data/structures/StructureUpdater.java b/src/main/java/net/minecraft/data/structures/StructureUpdater.java
index 967cae22838fc23c3404777fd5f9d0b63885eb90..6e7c06008b392846acb84f2b061118a597680627 100644
--- a/src/main/java/net/minecraft/data/structures/StructureUpdater.java
+++ b/src/main/java/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: {} < {}: {}", i, 4053, name);
}
- CompoundTag compoundTag = DataFixTypes.STRUCTURE.updateToCurrentVersion(DataFixers.getDataFixer(), nbt, i);
+ CompoundTag compoundTag = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.STRUCTURE, nbt, i, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion()); // Paper
structureTemplate.load(BuiltInRegistries.BLOCK, compoundTag);
return structureTemplate.save(new CompoundTag());
}
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
index 7d5e2e6e96ea9017334dddade54a9dcb37518642..092f7b6bba4e1291f76c2c09155f33803e93eb04 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
@@ -86,7 +86,7 @@ public class ChunkStorage implements AutoCloseable {
} else {
try {
// CraftBukkit start
- if (i < 1466) {
+ if (false && i < 1466) { // Paper - no longer needed, data converter system / DFU handles it now
CompoundTag level = nbttagcompound.getCompound("Level");
if (level.getBoolean("TerrainPopulated") && !level.getBoolean("LightPopulated")) {
ServerChunkCache cps = (generatoraccess == null) ? null : ((ServerLevel) generatoraccess).getChunkSource();
@@ -98,7 +98,7 @@ public class ChunkStorage implements AutoCloseable {
// CraftBukkit end
if (i < 1493) {
- nbttagcompound = DataFixTypes.CHUNK.update(this.fixerUpper, nbttagcompound, i, 1493);
+ nbttagcompound = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, nbttagcompound, i, 1493); // Paper - replace chunk converter
if (nbttagcompound.getCompound("Level").getBoolean("hasLegacyStructureData")) {
LegacyStructureDataHandler persistentstructurelegacy = this.getLegacyStructureHandler(resourcekey, supplier);
@@ -116,7 +116,7 @@ public class ChunkStorage implements AutoCloseable {
// Spigot end
ChunkStorage.injectDatafixingContext(nbttagcompound, resourcekey, optional);
- nbttagcompound = DataFixTypes.CHUNK.updateToCurrentVersion(this.fixerUpper, nbttagcompound, Math.max(1493, i));
+ nbttagcompound = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, nbttagcompound, Math.max(1493, i), SharedConstants.getCurrentVersion().getDataVersion().getVersion()); // Paper - replace chunk converter
// Spigot start
if (stopBelowZero) {
nbttagcompound.putString("Status", net.minecraft.core.registries.BuiltInRegistries.CHUNK_STATUS.getKey(ChunkStatus.SPAWN).toString());
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java
index e0e843f4f69013379ed70cb63d9b4f72163b828b..578d270d5b7efb9ac8f5dde539170f6021e2b786 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java
@@ -32,13 +32,30 @@ public class SimpleRegionStorage implements AutoCloseable {
return this.worker.store(pos, nbt);
}
+ // 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 nbt, int oldVersion) {
- int i = NbtUtils.getDataVersion(nbt, oldVersion);
- return this.dataFixType.updateToCurrentVersion(this.fixerUpper, nbt, i);
+ // Paper start - rewrite data conversion system
+ final int dataVer = NbtUtils.getDataVersion(nbt, oldVersion);
+ return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(this.getDataConverterType(), nbt, dataVer, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion());
+ // Paper end - rewrite data conversion system
}
public Dynamic<Tag> upgradeChunkTag(Dynamic<Tag> nbt, int oldVersion) {
- return this.dataFixType.updateToCurrentVersion(this.fixerUpper, nbt, oldVersion);
+ // Paper start - rewrite data conversion system
+ final CompoundTag converted = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(this.getDataConverterType(), (CompoundTag)nbt.getValue(), oldVersion, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion());
+ return new Dynamic<>(net.minecraft.nbt.NbtOps.INSTANCE, converted);
+ // Paper end - rewrite data conversion system
}
public CompletableFuture<Void> synchronize(boolean sync) {
diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java b/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java
index 5f354b333a39b873915bedd57b647355ae5bdf56..c3586281c9594769593a6027ea0a78f7c76c0262 100644
--- a/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java
+++ b/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java
@@ -151,7 +151,7 @@ public class StructureCheck {
CompoundTag compoundTag2;
try {
- compoundTag2 = DataFixTypes.CHUNK.updateToCurrentVersion(this.fixerUpper, compoundTag, i);
+ compoundTag2 = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, compoundTag, i, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion()); // Paper - replace chunk converter
} catch (Exception var12) {
LOGGER.warn("Failed to partially datafix chunk {}", pos, var12);
return StructureCheckResult.CHUNK_LOAD_NEEDED;
diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java b/src/main/java/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java
index 05a76f9d18638f10218161450470f07524b723ac..3ab22c384bb8a7772d389977a61d0e28975fdb79 100644
--- a/src/main/java/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java
+++ b/src/main/java/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java
@@ -245,7 +245,7 @@ public class StructureTemplateManager {
public StructureTemplate readStructure(CompoundTag nbt) {
StructureTemplate structureTemplate = new StructureTemplate();
int i = NbtUtils.getDataVersion(nbt, 500);
- structureTemplate.load(this.blockLookup, DataFixTypes.STRUCTURE.updateToCurrentVersion(this.fixerUpper, nbt, i));
+ structureTemplate.load(this.blockLookup, ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.STRUCTURE, nbt, i, SharedConstants.getCurrentVersion().getDataVersion().getVersion())); // Paper
return structureTemplate;
}
diff --git a/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java b/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java
index 79397b3c76e4b9d2ee03dfa16c2daf4f71ae8b4d..cdca5ae69991cc068bfbc0686b5defb3604a5440 100644
--- a/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java
+++ b/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java
@@ -277,12 +277,21 @@ public class LevelStorageSource {
static Dynamic<?> readLevelDataTagFixed(Path path, DataFixer dataFixer) throws IOException {
CompoundTag nbttagcompound = LevelStorageSource.readLevelDataTagRaw(path);
CompoundTag nbttagcompound1 = nbttagcompound.getCompound("Data");
- int i = NbtUtils.getDataVersion(nbttagcompound1, -1);
+ int i = NbtUtils.getDataVersion(nbttagcompound1, -1); final int version = i; // Paper - obfuscation helpers
Dynamic<?> dynamic = DataFixTypes.LEVEL.updateToCurrentVersion(dataFixer, new Dynamic(NbtOps.INSTANCE, nbttagcompound1), i);
+ // Paper start - replace data conversion system
dynamic = dynamic.update("Player", (dynamic1) -> {
- return DataFixTypes.PLAYER.updateToCurrentVersion(dataFixer, dynamic1, i);
+ return new Dynamic<>(
+ NbtOps.INSTANCE,
+ ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.PLAYER,
+ (net.minecraft.nbt.CompoundTag)dynamic1.getValue(),
+ version, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion()
+ )
+ );
});
+ // Paper end - replace data conversion system
dynamic = dynamic.update("WorldGenSettings", (dynamic1) -> {
return DataFixTypes.WORLD_GEN_SETTINGS.updateToCurrentVersion(dataFixer, dynamic1, i);
});
diff --git a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
index b54a3741cd3ba615c83c98985cb4b3c4c586ed7a..b148cf247acdd36f856d0495cde4cc5ad32b5a2f 100644
--- a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
+++ b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
@@ -137,7 +137,7 @@ public class PlayerDataStorage {
}).map((nbttagcompound) -> {
int i = NbtUtils.getDataVersion(nbttagcompound, -1);
- nbttagcompound = DataFixTypes.PLAYER.updateToCurrentVersion(this.fixerUpper, nbttagcompound, i);
+ nbttagcompound = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.PLAYER, nbttagcompound, i, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion()); // Paper - rewrite data conversion system
// entityhuman.load(nbttagcompound); // CraftBukkit - handled above
return nbttagcompound;
});
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index 29d5fa49730d2161bb1b024995a533a08c57939b..83020837e29ee627b1081daddb4bdee147b95af3 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -523,7 +523,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
net.minecraft.nbt.CompoundTag compound = deserializeNbtFromBytes(data);
final int dataVersion = compound.getInt("DataVersion");
- compound = (net.minecraft.nbt.CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(NbtOps.INSTANCE, compound), dataVersion, this.getDataVersion()).getValue();
+ compound = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ITEM_STACK, compound, dataVersion, this.getDataVersion()); // Paper - replace data conversion system
return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.parse(MinecraftServer.getServer().registryAccess(), compound).orElseThrow());
}
@@ -577,7 +577,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
net.minecraft.nbt.CompoundTag compound = deserializeNbtFromBytes(data);
int dataVersion = compound.getInt("DataVersion");
- compound = (net.minecraft.nbt.CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ENTITY, new Dynamic<>(NbtOps.INSTANCE, compound), dataVersion, this.getDataVersion()).getValue();
+ compound = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY, compound, dataVersion, this.getDataVersion());
if (!preserveUUID) {
// Generate a new UUID so we don't have to worry about deserializing the same entity twice
compound.remove("UUID");