From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf 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 { + + public static final Comparator> 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 { + + 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 { + + 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 { + + 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 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 R convert(final DataType 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..1f9835a20fb12021c0c791ebde2b0ee84d0306b4 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java @@ -0,0 +1,425 @@ +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 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 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 + // All up to 1.20.6 + }; + Arrays.sort(converterVersions); + + DATACONVERTER_VERSIONS_MAJOR.addAll(DATACONVERTER_VERSIONS_LIST = new IntArrayList(converterVersions)); + + // add sub versions + registerSubVersion(MCVersions.V16W38A + 1, 1); + + registerSubVersion(MCVersions.V17W47A, 1); + registerSubVersion(MCVersions.V17W47A, 2); + registerSubVersion(MCVersions.V17W47A, 3); + registerSubVersion(MCVersions.V17W47A, 4); + registerSubVersion(MCVersions.V17W47A, 5); + registerSubVersion(MCVersions.V17W47A, 6); + registerSubVersion(MCVersions.V17W47A, 7); + + registerSubVersion(MCVersions.V24W04A + 1, 1); + registerSubVersion(MCVersions.V24W04A + 2, 1); + registerSubVersion(MCVersions.V24W04A + 2, 2); + + registerSubVersion(MCVersions.V24W07A + 1, 1); + registerSubVersion(MCVersions.V24W07A + 1, 2); + registerSubVersion(MCVersions.V24W07A + 1, 4); + registerSubVersion(MCVersions.V24W07A + 1, 5); + registerSubVersion(MCVersions.V24W07A + 1, 6); + + // 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); + } + + 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..93acc54f3acdc7d4f2ef10bf712f2588f7e1416d --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/MCVersions.java @@ -0,0 +1,527 @@ +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; + + 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 renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int subVersion, final Function renamer) { + MCTypeRegistry.ADVANCEMENTS.addStructureConverter(new DataConverter<>(version, subVersion) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameKeys(data, renamer); + return null; + } + }); + } + +} diff --git a/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> { + + public final String path; + public final Function conversion; + + public ConverterCriteriaRename(final int toVersion, final String path, final Function conversion) { + super(toVersion); + this.path = path; + this.conversion = conversion; + } + + public ConverterCriteriaRename(final int toVersion, final int versionStep, final String path, final Function conversion) { + super(toVersion, versionStep); + this.path = path; + this.conversion = conversion; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType advancement = data.getMap(this.path); + if (advancement == null) { + return null; + } + + final MapType criteria = advancement.getMap("criteria"); + if (criteria == null) { + return null; + } + + RenameHelper.renameKeys(criteria, this.conversion); + + return null; + } + +} diff --git a/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..c465036923656e8c974cc447bb57169b1a882e88 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.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 ConverterAbstractAttributesRename { + + public static void register(final int version, final Function renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int versionStep, final Function renamer) { + final DataConverter, MapType> entityConverter = new DataConverter<>(version, versionStep) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType attributes = data.getList("Attributes", ObjectType.MAP); + + if (attributes == null) { + return null; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + RenameHelper.renameString(attributes.getMap(i), "Name", renamer); + } + + return null; + } + }; + + MCTypeRegistry.ENTITY.addStructureConverter(entityConverter); + MCTypeRegistry.PLAYER.addStructureConverter(entityConverter); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(version, versionStep) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType attributes = data.getList("AttributeModifiers", ObjectType.MAP); + + if (attributes == null) { + return null; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + RenameHelper.renameString(attributes.getMap(i), "AttributeName", renamer); + } + + return null; + } + }); + } + + private ConverterAbstractAttributesRename() {} +} 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 renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int subVersion, final Function renamer) { + ConverterAbstractStringValueTypeRename.register(version, subVersion, MCTypeRegistry.BLOCK_NAME, renamer); + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(version, subVersion) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String name = data.getString("Name"); + if (name != null) { + final String converted = renamer.apply(name); + if (converted != null) { + data.setString("Name", converted); + } + } + return null; + } + }); + MCTypeRegistry.FLAT_BLOCK_STATE.addConverter(new DataConverter<>(version, subVersion) { + @Override + public Object convert(final Object data, final long sourceVersion, final long toVersion) { + if (!(data instanceof String string)) { + return null; + } + + if (string.isEmpty()) { + return null; + } + + final int nbtStart1 = string.indexOf('['); + final int nbtStart2 = string.indexOf('{'); + int stateNameEnd = string.length(); + if (nbtStart1 > 0) { + stateNameEnd = nbtStart1; + } + + if (nbtStart2 > 0) { + stateNameEnd = Math.min(stateNameEnd, nbtStart2); + } + + final String blockStateName = string.substring(0, stateNameEnd); + final String converted = renamer.apply(blockStateName); + if (converted == null) { + return null; + } + + return converted.concat(string.substring(stateNameEnd)); + } + }); + } +} diff --git a/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> { + + private static final Set STATUSES_TO_SKIP_BLENDING = new HashSet<>( + Arrays.asList( + "minecraft:empty", + "minecraft:structure_starts", + "minecraft:structure_references", + "minecraft:biomes" + ) + ); + + public ConverterAddBlendingData(final int toVersion) { + super(toVersion); + } + + public ConverterAddBlendingData(final int toVersion, final int versionStep) { + super(toVersion, versionStep); + } + + private static MapType createBlendingData(final int height, final int minY) { + final MapType ret = Types.NBT.createEmptyMap(); + + ret.setInt("min_section", minY >> 4); + ret.setInt("max_section", (minY + height) >> 4); + + return ret; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.remove("blending_data"); + final MapType context = data.getMap("__context"); + if (!"minecraft:overworld".equals(context == null ? null : context.getString("dimension"))) { + return null; + } + + final String status = NamespaceUtil.correctNamespace(data.getString("Status")); + if (status == null) { + return null; + } + + final MapType belowZeroRetrogen = data.getMap("below_zero_retrogen"); + + if (!STATUSES_TO_SKIP_BLENDING.contains(status)) { + data.setMap("blending_data", createBlendingData(384, -64)); + } else if (belowZeroRetrogen != null) { + final String realStatus = NamespaceUtil.correctNamespace(belowZeroRetrogen.getString("target_status", "empty")); + if (!STATUSES_TO_SKIP_BLENDING.contains(realStatus)) { + data.setMap("blending_data", createBlendingData(256, 0)); + } + } + + return null; + } +} diff --git a/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> { + + private static final Logger LOGGER = LogUtils.getLogger(); + + static final BitSet VIRTUAL_SET = new BitSet(256); + static final BitSet IDS_NEEDING_FIX_SET = new BitSet(256); + + static { + IDS_NEEDING_FIX_SET.set(2); + IDS_NEEDING_FIX_SET.set(3); + IDS_NEEDING_FIX_SET.set(110); + IDS_NEEDING_FIX_SET.set(140); + IDS_NEEDING_FIX_SET.set(144); + IDS_NEEDING_FIX_SET.set(25); + IDS_NEEDING_FIX_SET.set(86); + IDS_NEEDING_FIX_SET.set(26); + IDS_NEEDING_FIX_SET.set(176); + IDS_NEEDING_FIX_SET.set(177); + IDS_NEEDING_FIX_SET.set(175); + IDS_NEEDING_FIX_SET.set(64); + IDS_NEEDING_FIX_SET.set(71); + IDS_NEEDING_FIX_SET.set(193); + IDS_NEEDING_FIX_SET.set(194); + IDS_NEEDING_FIX_SET.set(195); + IDS_NEEDING_FIX_SET.set(196); + IDS_NEEDING_FIX_SET.set(197); + + VIRTUAL_SET.set(54); + VIRTUAL_SET.set(146); + VIRTUAL_SET.set(25); + VIRTUAL_SET.set(26); + VIRTUAL_SET.set(51); + VIRTUAL_SET.set(53); + VIRTUAL_SET.set(67); + VIRTUAL_SET.set(108); + VIRTUAL_SET.set(109); + VIRTUAL_SET.set(114); + VIRTUAL_SET.set(128); + VIRTUAL_SET.set(134); + VIRTUAL_SET.set(135); + VIRTUAL_SET.set(136); + VIRTUAL_SET.set(156); + VIRTUAL_SET.set(163); + VIRTUAL_SET.set(164); + VIRTUAL_SET.set(180); + VIRTUAL_SET.set(203); + VIRTUAL_SET.set(55); + VIRTUAL_SET.set(85); + VIRTUAL_SET.set(113); + VIRTUAL_SET.set(188); + VIRTUAL_SET.set(189); + VIRTUAL_SET.set(190); + VIRTUAL_SET.set(191); + VIRTUAL_SET.set(192); + VIRTUAL_SET.set(93); + VIRTUAL_SET.set(94); + VIRTUAL_SET.set(101); + VIRTUAL_SET.set(102); + VIRTUAL_SET.set(160); + VIRTUAL_SET.set(106); + VIRTUAL_SET.set(107); + VIRTUAL_SET.set(183); + VIRTUAL_SET.set(184); + VIRTUAL_SET.set(185); + VIRTUAL_SET.set(186); + VIRTUAL_SET.set(187); + VIRTUAL_SET.set(132); + VIRTUAL_SET.set(139); + VIRTUAL_SET.set(199); + } + + static final boolean[] VIRTUAL = toBooleanArray(VIRTUAL_SET); + static final boolean[] IDS_NEEDING_FIX = toBooleanArray(IDS_NEEDING_FIX_SET); + + private static boolean[] toBooleanArray(final BitSet set) { + final boolean[] ret = new boolean[4096]; + for (int i = 0; i < 4096; ++i) { + ret[i] = set.get(i); + } + + return ret; + } + + static final MapType PUMPKIN = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:pumpkin'}"); + static final MapType SNOWY_PODZOL = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:podzol',Properties:{snowy:'true'}}"); + static final MapType SNOWY_GRASS = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:grass_block',Properties:{snowy:'true'}}"); + static final MapType SNOWY_MYCELIUM = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:mycelium',Properties:{snowy:'true'}}"); + static final MapType UPPER_SUNFLOWER = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:sunflower',Properties:{half:'upper'}}"); + static final MapType UPPER_LILAC = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:lilac',Properties:{half:'upper'}}"); + static final MapType UPPER_TALL_GRASS = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:tall_grass',Properties:{half:'upper'}}"); + static final MapType UPPER_LARGE_FERN = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:large_fern',Properties:{half:'upper'}}"); + static final MapType UPPER_ROSE_BUSH = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:rose_bush',Properties:{half:'upper'}}"); + static final MapType UPPER_PEONY = HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:peony',Properties:{half:'upper'}}"); + + static final Map> 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> 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> 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> 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> 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> 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 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> BED_BLOCK_MAP = new HashMap<>(); + + static { + for (final Int2ObjectMap.Entry 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> 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> BANNER_BLOCK_MAP = new HashMap<>(); + + static { + for (final Int2ObjectMap.Entry 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> into, final int colourId, final String colourName) { + for(int rotation = 0; rotation < 16; ++rotation) { + into.put("" + rotation + "_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_banner',Properties:{rotation:'" + rotation + "'}}")); + } + + into.put("north_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_wall_banner',Properties:{facing:'north'}}")); + into.put("south_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_wall_banner',Properties:{facing:'south'}}")); + into.put("west_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_wall_banner',Properties:{facing:'west'}}")); + into.put("east_" + colourId, HelperBlockFlatteningV1450.parseTag("{Name:'minecraft:" + colourName + "_wall_banner',Properties:{facing:'east'}}")); + } + + static final MapType AIR = Objects.requireNonNull(HelperBlockFlatteningV1450.getNBTForId(0)); + + public ConverterFlattenChunk() { + super(MCVersions.V17W47A, 1); + } + + static String getName(final MapType blockState) { + return blockState.getString("Name"); + } + + static String getProperty(final MapType blockState, final String propertyName) { + final MapType properties = blockState.getMap("Properties"); + if (properties == null) { + return ""; + } + + return properties.getString(propertyName, ""); + } + + static int getSideMask(final boolean noLeft, final boolean noRight, final boolean noBack, final boolean noForward) { + if (noBack) { + if (noRight) { + return 2; + } else if (noLeft) { + return 128; + } else { + return 1; + } + } else if (noForward) { + if (noLeft) { + return 32; + } else if (noRight) { + return 8; + } else { + return 16; + } + } else if (noRight) { + return 4; + } else if (noLeft) { + return 64; + } else { + return 0; + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + if (!level.hasKey("Sections", ObjectType.LIST)) { + return null; + } + + data.setMap("Level", new UpgradeChunk(level).writeBackToLevel()); + + return null; + } + + static enum Direction { + DOWN(AxisDirection.NEGATIVE, Axis.Y), + UP(AxisDirection.POSITIVE, Axis.Y), + NORTH(AxisDirection.NEGATIVE, Axis.Z), + SOUTH(AxisDirection.POSITIVE, Axis.Z), + WEST(AxisDirection.NEGATIVE, Axis.X), + EAST(AxisDirection.POSITIVE, Axis.X); + + private final Axis axis; + private final AxisDirection axisDirection; + + private Direction(final AxisDirection axisDirection, final Axis axis) { + this.axis = axis; + this.axisDirection = axisDirection; + } + + public AxisDirection getAxisDirection() { + return this.axisDirection; + } + + public Axis getAxis() { + return this.axis; + } + + public static enum AxisDirection { + POSITIVE(1), + NEGATIVE(-1); + + private final int step; + + private AxisDirection(final int step) { + this.step = step; + } + + public int getStep() { + return this.step; + } + } + + public static enum Axis { + X, Y, Z; + } + } + + static class DataLayer { + private final byte[] data; + + public DataLayer() { + this.data = new byte[2048]; + } + + public DataLayer(final byte[] data) { + this.data = data; + if (data.length != 2048) { + throw new IllegalArgumentException("ChunkNibbleArrays should be 2048 bytes not: " + data.length); + } + } + + public static DataLayer getOrNull(final byte[] data) { + return data == null ? null : new DataLayer(data); + } + + public static DataLayer getOrCreate(final byte[] data) { + return data == null ? new DataLayer() : new DataLayer(data); + } + + public int get(final int index) { + final byte value = this.data[index >>> 1]; + + // if we are an even index, we want lower 4 bits + // if we are an odd index, we want upper 4 bits + return ((value >>> ((index & 1) << 2)) & 0xF); + } + + public int get(final int x, final int y, final int z) { + final int index = y << 8 | z << 4 | x; + final byte value = this.data[index >>> 1]; + + // if we are an even index, we want lower 4 bits + // if we are an odd index, we want upper 4 bits + return ((value >>> ((index & 1) << 2)) & 0xF); + } + } + + static final class UpgradeChunk { + int sides; + + final Section[] sections = new Section[16]; + final MapType level; + final int blockX; + final int blockZ; + final Int2ObjectLinkedOpenHashMap> tileEntities = new Int2ObjectLinkedOpenHashMap<>(16); + + public UpgradeChunk(final MapType level) { + this.level = level; + this.blockX = level.getInt("xPos") << 4; + this.blockZ = level.getInt("zPos") << 4; + + final ListType tileEntities = level.getList("TileEntities", ObjectType.MAP); + if (tileEntities != null) { + for (int i = 0, len = tileEntities.size(); i < len; ++i) { + final MapType tileEntity = tileEntities.getMap(i); + + final int x = (tileEntity.getInt("x") - this.blockX) & 15; + final int y = tileEntity.getInt("y"); + final int z = (tileEntity.getInt("z") - this.blockZ) & 15; + final int index = (y << 8) | (z << 4) | x; + if (this.tileEntities.put(index, tileEntity) != null) { + LOGGER.warn("In chunk: {}x{} found a duplicate block entity at position (ConverterFlattenChunk): [{}, {}, {}]", this.blockX, this.blockZ, x, y, z); + } + } + } + + final boolean convertedFromAlphaFormat = level.getBoolean("convertedFromAlphaFormat"); + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType sectionData = sections.getMap(i); + final Section section = new Section(sectionData); + + if (section.y < 0 || section.y > 15) { + LOGGER.warn("In chunk: {}x{} found an invalid chunk section y (ConverterFlattenChunk): {}", this.blockX, this.blockZ, section.y); + continue; + } + + if (this.sections[section.y] != null) { + LOGGER.warn("In chunk: {}x{} found a duplicate chunk section (ConverterFlattenChunk): {}", this.blockX, this.blockZ, section.y); + } + + this.sides = section.upgrade(this.sides); + this.sections[section.y] = section; + } + } + + for (final Section section : this.sections) { + if (section == null) { + continue; + } + + final int yIndex = section.y << (8 + 4); + + for (final Iterator> iterator = section.toFix.int2ObjectEntrySet().fastIterator(); iterator.hasNext();) { + final Int2ObjectMap.Entry fixEntry = iterator.next(); + final IntIterator positionIterator = fixEntry.getValue().iterator(); + switch (fixEntry.getIntKey()) { + case 2: { // grass block + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType blockState = this.getBlock(position); + if (!"minecraft:grass_block".equals(getName(blockState))) { + continue; + } + + final String blockAbove = getName(getBlock(relative(position, Direction.UP))); + if ("minecraft:snow".equals(blockAbove) || "minecraft:snow_layer".equals(blockAbove)) { + this.setBlock(position, SNOWY_GRASS); + } + } + break; + } + case 3: { // dirt + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType blockState = this.getBlock(position); + if (!"minecraft:podzol".equals(getName(blockState))) { + continue; + } + + final String blockAbove = getName(getBlock(relative(position, Direction.UP))); + if ("minecraft:snow".equals(blockAbove) || "minecraft:snow_layer".equals(blockAbove)) { + this.setBlock(position, SNOWY_PODZOL); + } + } + break; + } + case 25: { // note block + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType tile = this.removeBlockEntity(position); + if (tile != null) { + final String state = Boolean.toString(tile.getBoolean("powered")) + (byte) Math.min(Math.max(tile.getInt("note"), 0), 24); + this.setBlock(position, NOTE_BLOCK_MAP.getOrDefault(state, NOTE_BLOCK_MAP.get("false0"))); + } + } + break; + } + case 26: { // bed + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType tile = this.getBlockEntity(position); + + if (tile == null) { + continue; + } + + final MapType blockState = this.getBlock(position); + + final int colour = tile.getInt("color"); + if (colour != 14 && colour >= 0 && colour < 16) { + final String state = getProperty(blockState, "facing") + getProperty(blockState, "occupied") + getProperty(blockState, "part") + colour; + + final MapType update = BED_BLOCK_MAP.get(state); + if (update != null) { + this.setBlock(position, update); + } + } + } + break; + } + case 64: // oak door + case 71: // iron door + case 193: // spruce door + case 194: // birch door + case 195: // jungle door + case 196: // acacia door + case 197: { // dark oak door + // aka the door updater + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType blockState = this.getBlock(position); + if (!getName(blockState).endsWith("_door")) { + continue; + } + + if (!"lower".equals(getProperty(blockState, "half"))) { + continue; + } + + final int positionAbove = relative(position, Direction.UP); + final MapType blockStateAbove = this.getBlock(positionAbove); + + final String name = getName(blockState); + if (name.equals(getName(blockStateAbove))) { + final String facingBelow = getProperty(blockState, "facing"); + final String openBelow = getProperty(blockState, "open"); + final String hingeAbove = convertedFromAlphaFormat ? "left" : getProperty(blockStateAbove, "hinge"); + final String poweredAbove = convertedFromAlphaFormat ? "false" : getProperty(blockStateAbove, "powered"); + + this.setBlock(position, DOOR_MAP.get(name + facingBelow + "lower" + hingeAbove + openBelow + poweredAbove)); + this.setBlock(positionAbove, DOOR_MAP.get(name + facingBelow + "upper" + hingeAbove + openBelow + poweredAbove)); + } + } + break; + } + case 86: { // pumpkin + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType blockState = this.getBlock(position); + + // I guess this is some terrible hack to convert carved pumpkins from world gen into + // regular pumpkins? + + if ("minecraft:carved_pumpkin".equals(getName(blockState))) { + final String downName = getName(this.getBlock(relative(position, Direction.DOWN))); + if ("minecraft:grass_block".equals(downName) || "minecraft:dirt".equals(downName)) { + this.setBlock(position, PUMPKIN); + } + } + } + break; + } + case 110: { // mycelium + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType blockState = this.getBlock(position); + if ("minecraft:mycelium".equals(getName(blockState))) { + final String nameAbove = getName(this.getBlock(relative(position, Direction.UP))); + if ("minecraft:snow".equals(nameAbove) || "minecraft:snow_layer".equals(nameAbove)) { + this.setBlock(position, SNOWY_MYCELIUM); + } + } + } + break; + } + case 140: { // flower pot + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType tile = this.removeBlockEntity(position); + if (tile == null) { + continue; + } + + final String item; + if (tile.hasKey("Item", ObjectType.NUMBER)) { + // the item name converter should have migrated to number, however no legacy converter + // ever did this. so we can get data with versions above v102 (old worlds, converted prior to DFU) + // that didn't convert. so just do it here. + item = HelperItemNameV102.getNameFromId(tile.getInt("Item")); + } else { + item = tile.getString("Item", ""); + } + + final String state = item + tile.getInt("Data"); + this.setBlock(position, FLOWER_POT_MAP.getOrDefault(state, FLOWER_POT_MAP.get("minecraft:air0"))); + } + break; + } + case 144: { // mob head + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType tile = this.getBlockEntity(position); + if (tile == null) { + continue; + } + + final String typeString = Integer.toString(tile.getInt("SkullType")); + final String facing = getProperty(this.getBlock(position), "facing"); + final String state; + if (!"up".equals(facing) && !"down".equals(facing)) { + state = typeString + facing; + } else { + state = typeString + tile.getInt("Rot"); + } + + tile.remove("SkullType"); + tile.remove("facing"); + tile.remove("Rot"); + + this.setBlock(position, SKULL_MAP.getOrDefault(state, SKULL_MAP.get("0north"))); + } + break; + } + case 175: { // sunflower + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType blockState = this.getBlock(position); + if (!"upper".equals(getProperty(blockState, "half"))) { + continue; + } + + final MapType blockStateBelow = this.getBlock(relative(position, Direction.DOWN)); + final String nameBelow = getName(blockStateBelow); + switch (nameBelow) { + case "minecraft:sunflower": + this.setBlock(position, UPPER_SUNFLOWER); + break; + case "minecraft:lilac": + this.setBlock(position, UPPER_LILAC); + break; + case "minecraft:tall_grass": + this.setBlock(position, UPPER_TALL_GRASS); + break; + case "minecraft:large_fern": + this.setBlock(position, UPPER_LARGE_FERN); + break; + case "minecraft:rose_bush": + this.setBlock(position, UPPER_ROSE_BUSH); + break; + case "minecraft:peony": + this.setBlock(position, UPPER_PEONY); + break; + } + } + break; + } + case 176: // free standing banner + case 177: { // wall mounted banner + while (positionIterator.hasNext()) { + final int position = positionIterator.nextInt() | yIndex; + final MapType tile = this.getBlockEntity(position); + + if (tile == null) { + continue; + } + + final MapType blockState = this.getBlock(position); + + final int base = tile.getInt("Base"); + if (base != 15 && base >= 0 && base < 16) { + final String state = getProperty(blockState, fixEntry.getIntKey() == 176 ? "rotation" : "facing") + "_" + base; + final MapType update = BANNER_BLOCK_MAP.get(state); + if (update != null) { + this.setBlock(position, update); + } + } + } + break; + } + } + } + } + } + + private MapType getBlockEntity(final int index) { + return this.tileEntities.get(index); + } + + private MapType removeBlockEntity(final int index) { + return this.tileEntities.remove(index); + } + + public static int relative(final int index, final Direction direction) { + switch (direction.getAxis()) { + case X: + int j = (index & 15) + direction.getAxisDirection().getStep(); + return j >= 0 && j <= 15 ? index & -16 | j : -1; + case Y: + int k = (index >> 8) + direction.getAxisDirection().getStep(); + return k >= 0 && k <= 255 ? index & 255 | k << 8 : -1; + case Z: + int l = (index >> 4 & 15) + direction.getAxisDirection().getStep(); + return l >= 0 && l <= 15 ? index & -241 | l << 4 : -1; + default: + return -1; + } + } + + private void setBlock(final int index, final MapType blockState) { + if (index >= 0 && index <= 65535) { + final Section section = this.getSection(index); + if (section != null) { + section.setBlock(index & 4095, blockState); + } + } + } + + private Section getSection(final int index) { + final int y = index >> 12; + return y < this.sections.length ? this.sections[y] : null; + } + + public MapType getBlock(int i) { + if (i >= 0 && i <= 65535) { + final Section section = this.getSection(i); + return section == null ? AIR : section.getBlock(i & 4095); + } else { + return AIR; + } + } + + public MapType writeBackToLevel() { + if (this.tileEntities.isEmpty()) { + this.level.remove("TileEntities"); + } else { + final ListType tileEntities = Types.NBT.createEmptyList(); + this.tileEntities.values().forEach(tileEntities::addMap); + this.level.setList("TileEntities", tileEntities); + } + + final MapType indices = Types.NBT.createEmptyMap(); + final ListType sections = Types.NBT.createEmptyList(); + for (final Section section : this.sections) { + if (section == null) { + continue; + } + + sections.addMap(section.writeBackToSection()); + indices.setInts(Integer.toString(section.y), Arrays.copyOf(section.update.elements(), section.update.size())); + } + + this.level.setList("Sections", sections); + + final MapType upgradeData = Types.NBT.createEmptyMap(); + upgradeData.setByte("Sides", (byte)this.sides); + upgradeData.setMap("Indices", indices); + + this.level.setMap("UpgradeData", upgradeData); + + return this.level; + } + } + + static class Section { + final Palette palette = new Palette(); + + static final class Palette extends Reference2IntOpenHashMap> { + + final ListType paletteStates = Types.NBT.createEmptyList(); + + private int find(final MapType k) { + if (((k) == (null))) + return containsNullKey ? n : -(n + 1); + MapType curr; + final Object[] key = this.key; + int pos; + // The starting point. + if (((curr = (MapType)key[pos = (it.unimi.dsi.fastutil.HashCommon.mix(System.identityHashCode(k))) & mask]) == (null))) + return -(pos + 1); + if (((k) == (curr))) + return pos; + // There's always an unused entry. + while (true) { + if (((curr = (MapType)key[pos = (pos + 1) & mask]) == (null))) + return -(pos + 1); + if (((k) == (curr))) + return pos; + } + } + + private void insert(final int pos, final MapType k, final int v) { + if (pos == n) + containsNullKey = true; + ((Object[])key)[pos] = k; + value[pos] = v; + if (size++ >= maxFill) + rehash(arraySize(size + 1, f)); + } + + private MapType[] byId = new MapType[4]; + private MapType last = null; + + public int getOrCreateId(final MapType k) { + if (k == this.last) { + return this.size - 1; + } + final int pos = find(k); + if (pos >= 0) { + return this.value[pos]; + } + + final int insert = this.size; + MapType inPalette = k; + + if ("%%FILTER_ME%%".equals(getName(k))) { + inPalette = AIR; + } + + if (insert >= this.byId.length) { + this.byId = Arrays.copyOf(this.byId, this.byId.length * 2); + this.byId[insert] = k; + } else { + this.byId[insert] = k; + } + this.paletteStates.addMap(inPalette); + + this.last = k; + + this.insert(-pos - 1, k, insert); + + return insert; + } + + } + + final MapType section; + final boolean hasData; + final Int2ObjectLinkedOpenHashMap toFix = new Int2ObjectLinkedOpenHashMap<>(); + final IntArrayList update = new IntArrayList(); + final int y; + final int[] buffer = new int[4096]; + + public Section(final MapType section) { + this.section = section; + this.y = section.getInt("Y"); + this.hasData = section.hasKey("Blocks", ObjectType.BYTE_ARRAY); + } + + public MapType getBlock(final int index) { + if (index >= 0 && index <= 4095) { + final MapType state = this.palette.byId[this.buffer[index]]; + return state == null ? AIR : state; + } else { + return AIR; + } + } + + public void setBlock(final int index, final MapType blockState) { + this.buffer[index] = this.palette.getOrCreateId(blockState); + } + + public int upgrade(int sides) { + if (!this.hasData) { + return sides; + } + + final byte[] blocks = this.section.getBytes("Blocks"); + final DataLayer data = DataLayer.getOrNull(this.section.getBytes("Data")); + final DataLayer add = DataLayer.getOrNull(this.section.getBytes("Add")); + + this.palette.getOrCreateId(AIR); + + for (int index = 0; index < 4096; ++index) { + final int x = index & 15; + final int z = index >> 4 & 15; + + int blockStateId = (blocks[index] & 255) << 4; + if (data != null) { + blockStateId |= data.get(index); + } + if (add != null) { + blockStateId |= add.get(index) << 12; + } + if (IDS_NEEDING_FIX[blockStateId >>> 4]) { + this.addFix(blockStateId >>> 4, index); + } + + if (VIRTUAL[blockStateId >>> 4]) { + final int additionalSides = getSideMask(x == 0, x == 15, z == 0, z == 15); + if (additionalSides == 0) { + this.update.add(index); + } else { + sides |= additionalSides; + } + } + + this.setBlock(index, HelperBlockFlatteningV1450.getNBTForId(blockStateId)); + } + + return sides; + } + + private void addFix(final int block, final int index) { + this.toFix.computeIfAbsent(block, (final int keyInMap) -> { + return new IntArrayList(); + }).add(index); + } + + // Note: modifies the current section and returns it. + public MapType writeBackToSection() { + if (!this.hasData) { + return this.section; + } + + this.section.setList("Palette", this.palette.paletteStates.copy()); // deep copy to ensure palette compound tags are NOT shared + + final int bitSize = Math.max(4, DataFixUtils.ceillog2(this.palette.size())); + final PackedBitStorage packedIds = new PackedBitStorage(bitSize, 4096); + + for(int index = 0; index < this.buffer.length; ++index) { + packedIds.set(index, this.buffer[index]); + } + + this.section.setLongs("BlockStates", packedIds.getRaw()); + + this.section.remove("Blocks"); + this.section.remove("Data"); + this.section.remove("Add"); + + return this.section; + } + } +} diff --git a/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> { + + private final Function renamer; + + public ConverterRenameStatus(final int toVersion, final Function renamer) { + this(toVersion, 0, renamer); + } + + public ConverterRenameStatus(final int toVersion, final int versionStep, final Function renamer) { + super(toVersion, versionStep); + this.renamer = renamer; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // Note: DFU technically enforces namespace due to how they wrote their converter, so we will do the same. + NamespaceUtil.enforceForPath(data, "Status"); + RenameHelper.renameString(data, "Status", this.renamer); + + NamespaceUtil.enforceForPath(data.getMap("below_zero_retrogen"), "target_status"); + RenameHelper.renameString(data.getMap("below_zero_retrogen"), "target_status", this.renamer); + return null; + } +} diff --git a/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 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 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 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 data, final String path) { + if (data == null) { + return; + } + + final MapType 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 text = pages.getMap(i); + + walkPath(text, "raw"); + walkPath(text, "filtered"); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + walkBookContent(data, "minecraft:written_book_content"); + return null; + } + }); + + // signs + + final DataConverter, MapType> signTileConverter = new DataConverter<>(VERSION, 5) { + private static void walkText(final MapType data, final String path) { + if (data == null) { + return; + } + + final MapType 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 convert(final MapType 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 renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int subVersion, final Function renamer) { + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(version, subVersion) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + if (id == null) { + return null; + } + + final String converted = renamer.apply(id); + + if (converted != null) { + data.setString("id", converted); + } + + return null; + } + }); + ConverterAbstractStringValueTypeRename.register(version, subVersion, MCTypeRegistry.ENTITY_NAME, renamer); + } + +} diff --git a/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> { + + public final String path; + public final IntFunction conversion; + + public ConverterEntityToVariant(final int toVersion, final String path, final IntFunction conversion) { + super(toVersion); + this.path = path; + this.conversion = conversion; + } + + public ConverterEntityToVariant(final int toVersion, final int versionStep, final String path, final IntFunction conversion) { + super(toVersion, versionStep); + this.path = path; + this.conversion = conversion; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number value = data.getNumber(this.path); + if (value == null) { + // nothing to do, DFU does the same + return null; + } + + final String converted = this.conversion.apply(value.intValue()); + + if (converted == null) { + throw new NullPointerException("Conversion " + this.conversion + " cannot return null value!"); + } + + // DFU doesn't appear to remove the old field, so why should we? + + data.setString("variant", converted); + + return null; + } +} diff --git a/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> { + + private final Function renamer; + + public ConverterEntityVariantRename(final int toVersion, final Function renamer) { + super(toVersion); + this.renamer = renamer; + } + + public ConverterEntityVariantRename(final int toVersion, final int versionStep, final Function renamer) { + super(toVersion, versionStep); + this.renamer = renamer; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String variant = data.getString("variant"); + + if (variant == null) { + return null; + } + + final String rename = this.renamer.apply(variant); + + if (rename != null) { + data.setString("variant", rename); + } + + return null; + } +} diff --git a/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> { + + private static final Map BLOCK_NAME_TO_ID = new HashMap<>(); + static { + BLOCK_NAME_TO_ID.put("minecraft:air", 0); + BLOCK_NAME_TO_ID.put("minecraft:stone", 1); + BLOCK_NAME_TO_ID.put("minecraft:grass", 2); + BLOCK_NAME_TO_ID.put("minecraft:dirt", 3); + BLOCK_NAME_TO_ID.put("minecraft:cobblestone", 4); + BLOCK_NAME_TO_ID.put("minecraft:planks", 5); + BLOCK_NAME_TO_ID.put("minecraft:sapling", 6); + BLOCK_NAME_TO_ID.put("minecraft:bedrock", 7); + BLOCK_NAME_TO_ID.put("minecraft:flowing_water", 8); + BLOCK_NAME_TO_ID.put("minecraft:water", 9); + BLOCK_NAME_TO_ID.put("minecraft:flowing_lava", 10); + BLOCK_NAME_TO_ID.put("minecraft:lava", 11); + BLOCK_NAME_TO_ID.put("minecraft:sand", 12); + BLOCK_NAME_TO_ID.put("minecraft:gravel", 13); + BLOCK_NAME_TO_ID.put("minecraft:gold_ore", 14); + BLOCK_NAME_TO_ID.put("minecraft:iron_ore", 15); + BLOCK_NAME_TO_ID.put("minecraft:coal_ore", 16); + BLOCK_NAME_TO_ID.put("minecraft:log", 17); + BLOCK_NAME_TO_ID.put("minecraft:leaves", 18); + BLOCK_NAME_TO_ID.put("minecraft:sponge", 19); + BLOCK_NAME_TO_ID.put("minecraft:glass", 20); + BLOCK_NAME_TO_ID.put("minecraft:lapis_ore", 21); + BLOCK_NAME_TO_ID.put("minecraft:lapis_block", 22); + BLOCK_NAME_TO_ID.put("minecraft:dispenser", 23); + BLOCK_NAME_TO_ID.put("minecraft:sandstone", 24); + BLOCK_NAME_TO_ID.put("minecraft:noteblock", 25); + BLOCK_NAME_TO_ID.put("minecraft:bed", 26); + BLOCK_NAME_TO_ID.put("minecraft:golden_rail", 27); + BLOCK_NAME_TO_ID.put("minecraft:detector_rail", 28); + BLOCK_NAME_TO_ID.put("minecraft:sticky_piston", 29); + BLOCK_NAME_TO_ID.put("minecraft:web", 30); + BLOCK_NAME_TO_ID.put("minecraft:tallgrass", 31); + BLOCK_NAME_TO_ID.put("minecraft:deadbush", 32); + BLOCK_NAME_TO_ID.put("minecraft:piston", 33); + BLOCK_NAME_TO_ID.put("minecraft:piston_head", 34); + BLOCK_NAME_TO_ID.put("minecraft:wool", 35); + BLOCK_NAME_TO_ID.put("minecraft:piston_extension", 36); + BLOCK_NAME_TO_ID.put("minecraft:yellow_flower", 37); + BLOCK_NAME_TO_ID.put("minecraft:red_flower", 38); + BLOCK_NAME_TO_ID.put("minecraft:brown_mushroom", 39); + BLOCK_NAME_TO_ID.put("minecraft:red_mushroom", 40); + BLOCK_NAME_TO_ID.put("minecraft:gold_block", 41); + BLOCK_NAME_TO_ID.put("minecraft:iron_block", 42); + BLOCK_NAME_TO_ID.put("minecraft:double_stone_slab", 43); + BLOCK_NAME_TO_ID.put("minecraft:stone_slab", 44); + BLOCK_NAME_TO_ID.put("minecraft:brick_block", 45); + BLOCK_NAME_TO_ID.put("minecraft:tnt", 46); + BLOCK_NAME_TO_ID.put("minecraft:bookshelf", 47); + BLOCK_NAME_TO_ID.put("minecraft:mossy_cobblestone", 48); + BLOCK_NAME_TO_ID.put("minecraft:obsidian", 49); + BLOCK_NAME_TO_ID.put("minecraft:torch", 50); + BLOCK_NAME_TO_ID.put("minecraft:fire", 51); + BLOCK_NAME_TO_ID.put("minecraft:mob_spawner", 52); + BLOCK_NAME_TO_ID.put("minecraft:oak_stairs", 53); + BLOCK_NAME_TO_ID.put("minecraft:chest", 54); + BLOCK_NAME_TO_ID.put("minecraft:redstone_wire", 55); + BLOCK_NAME_TO_ID.put("minecraft:diamond_ore", 56); + BLOCK_NAME_TO_ID.put("minecraft:diamond_block", 57); + BLOCK_NAME_TO_ID.put("minecraft:crafting_table", 58); + BLOCK_NAME_TO_ID.put("minecraft:wheat", 59); + BLOCK_NAME_TO_ID.put("minecraft:farmland", 60); + BLOCK_NAME_TO_ID.put("minecraft:furnace", 61); + BLOCK_NAME_TO_ID.put("minecraft:lit_furnace", 62); + BLOCK_NAME_TO_ID.put("minecraft:standing_sign", 63); + BLOCK_NAME_TO_ID.put("minecraft:wooden_door", 64); + BLOCK_NAME_TO_ID.put("minecraft:ladder", 65); + BLOCK_NAME_TO_ID.put("minecraft:rail", 66); + BLOCK_NAME_TO_ID.put("minecraft:stone_stairs", 67); + BLOCK_NAME_TO_ID.put("minecraft:wall_sign", 68); + BLOCK_NAME_TO_ID.put("minecraft:lever", 69); + BLOCK_NAME_TO_ID.put("minecraft:stone_pressure_plate", 70); + BLOCK_NAME_TO_ID.put("minecraft:iron_door", 71); + BLOCK_NAME_TO_ID.put("minecraft:wooden_pressure_plate", 72); + BLOCK_NAME_TO_ID.put("minecraft:redstone_ore", 73); + BLOCK_NAME_TO_ID.put("minecraft:lit_redstone_ore", 74); + BLOCK_NAME_TO_ID.put("minecraft:unlit_redstone_torch", 75); + BLOCK_NAME_TO_ID.put("minecraft:redstone_torch", 76); + BLOCK_NAME_TO_ID.put("minecraft:stone_button", 77); + BLOCK_NAME_TO_ID.put("minecraft:snow_layer", 78); + BLOCK_NAME_TO_ID.put("minecraft:ice", 79); + BLOCK_NAME_TO_ID.put("minecraft:snow", 80); + BLOCK_NAME_TO_ID.put("minecraft:cactus", 81); + BLOCK_NAME_TO_ID.put("minecraft:clay", 82); + BLOCK_NAME_TO_ID.put("minecraft:reeds", 83); + BLOCK_NAME_TO_ID.put("minecraft:jukebox", 84); + BLOCK_NAME_TO_ID.put("minecraft:fence", 85); + BLOCK_NAME_TO_ID.put("minecraft:pumpkin", 86); + BLOCK_NAME_TO_ID.put("minecraft:netherrack", 87); + BLOCK_NAME_TO_ID.put("minecraft:soul_sand", 88); + BLOCK_NAME_TO_ID.put("minecraft:glowstone", 89); + BLOCK_NAME_TO_ID.put("minecraft:portal", 90); + BLOCK_NAME_TO_ID.put("minecraft:lit_pumpkin", 91); + BLOCK_NAME_TO_ID.put("minecraft:cake", 92); + BLOCK_NAME_TO_ID.put("minecraft:unpowered_repeater", 93); + BLOCK_NAME_TO_ID.put("minecraft:powered_repeater", 94); + BLOCK_NAME_TO_ID.put("minecraft:stained_glass", 95); + BLOCK_NAME_TO_ID.put("minecraft:trapdoor", 96); + BLOCK_NAME_TO_ID.put("minecraft:monster_egg", 97); + BLOCK_NAME_TO_ID.put("minecraft:stonebrick", 98); + BLOCK_NAME_TO_ID.put("minecraft:brown_mushroom_block", 99); + BLOCK_NAME_TO_ID.put("minecraft:red_mushroom_block", 100); + BLOCK_NAME_TO_ID.put("minecraft:iron_bars", 101); + BLOCK_NAME_TO_ID.put("minecraft:glass_pane", 102); + BLOCK_NAME_TO_ID.put("minecraft:melon_block", 103); + BLOCK_NAME_TO_ID.put("minecraft:pumpkin_stem", 104); + BLOCK_NAME_TO_ID.put("minecraft:melon_stem", 105); + BLOCK_NAME_TO_ID.put("minecraft:vine", 106); + BLOCK_NAME_TO_ID.put("minecraft:fence_gate", 107); + BLOCK_NAME_TO_ID.put("minecraft:brick_stairs", 108); + BLOCK_NAME_TO_ID.put("minecraft:stone_brick_stairs", 109); + BLOCK_NAME_TO_ID.put("minecraft:mycelium", 110); + BLOCK_NAME_TO_ID.put("minecraft:waterlily", 111); + BLOCK_NAME_TO_ID.put("minecraft:nether_brick", 112); + BLOCK_NAME_TO_ID.put("minecraft:nether_brick_fence", 113); + BLOCK_NAME_TO_ID.put("minecraft:nether_brick_stairs", 114); + BLOCK_NAME_TO_ID.put("minecraft:nether_wart", 115); + BLOCK_NAME_TO_ID.put("minecraft:enchanting_table", 116); + BLOCK_NAME_TO_ID.put("minecraft:brewing_stand", 117); + BLOCK_NAME_TO_ID.put("minecraft:cauldron", 118); + BLOCK_NAME_TO_ID.put("minecraft:end_portal", 119); + BLOCK_NAME_TO_ID.put("minecraft:end_portal_frame", 120); + BLOCK_NAME_TO_ID.put("minecraft:end_stone", 121); + BLOCK_NAME_TO_ID.put("minecraft:dragon_egg", 122); + BLOCK_NAME_TO_ID.put("minecraft:redstone_lamp", 123); + BLOCK_NAME_TO_ID.put("minecraft:lit_redstone_lamp", 124); + BLOCK_NAME_TO_ID.put("minecraft:double_wooden_slab", 125); + BLOCK_NAME_TO_ID.put("minecraft:wooden_slab", 126); + BLOCK_NAME_TO_ID.put("minecraft:cocoa", 127); + BLOCK_NAME_TO_ID.put("minecraft:sandstone_stairs", 128); + BLOCK_NAME_TO_ID.put("minecraft:emerald_ore", 129); + BLOCK_NAME_TO_ID.put("minecraft:ender_chest", 130); + BLOCK_NAME_TO_ID.put("minecraft:tripwire_hook", 131); + BLOCK_NAME_TO_ID.put("minecraft:tripwire", 132); + BLOCK_NAME_TO_ID.put("minecraft:emerald_block", 133); + BLOCK_NAME_TO_ID.put("minecraft:spruce_stairs", 134); + BLOCK_NAME_TO_ID.put("minecraft:birch_stairs", 135); + BLOCK_NAME_TO_ID.put("minecraft:jungle_stairs", 136); + BLOCK_NAME_TO_ID.put("minecraft:command_block", 137); + BLOCK_NAME_TO_ID.put("minecraft:beacon", 138); + BLOCK_NAME_TO_ID.put("minecraft:cobblestone_wall", 139); + BLOCK_NAME_TO_ID.put("minecraft:flower_pot", 140); + BLOCK_NAME_TO_ID.put("minecraft:carrots", 141); + BLOCK_NAME_TO_ID.put("minecraft:potatoes", 142); + BLOCK_NAME_TO_ID.put("minecraft:wooden_button", 143); + BLOCK_NAME_TO_ID.put("minecraft:skull", 144); + BLOCK_NAME_TO_ID.put("minecraft:anvil", 145); + BLOCK_NAME_TO_ID.put("minecraft:trapped_chest", 146); + BLOCK_NAME_TO_ID.put("minecraft:light_weighted_pressure_plate", 147); + BLOCK_NAME_TO_ID.put("minecraft:heavy_weighted_pressure_plate", 148); + BLOCK_NAME_TO_ID.put("minecraft:unpowered_comparator", 149); + BLOCK_NAME_TO_ID.put("minecraft:powered_comparator", 150); + BLOCK_NAME_TO_ID.put("minecraft:daylight_detector", 151); + BLOCK_NAME_TO_ID.put("minecraft:redstone_block", 152); + BLOCK_NAME_TO_ID.put("minecraft:quartz_ore", 153); + BLOCK_NAME_TO_ID.put("minecraft:hopper", 154); + BLOCK_NAME_TO_ID.put("minecraft:quartz_block", 155); + BLOCK_NAME_TO_ID.put("minecraft:quartz_stairs", 156); + BLOCK_NAME_TO_ID.put("minecraft:activator_rail", 157); + BLOCK_NAME_TO_ID.put("minecraft:dropper", 158); + BLOCK_NAME_TO_ID.put("minecraft:stained_hardened_clay", 159); + BLOCK_NAME_TO_ID.put("minecraft:stained_glass_pane", 160); + BLOCK_NAME_TO_ID.put("minecraft:leaves2", 161); + BLOCK_NAME_TO_ID.put("minecraft:log2", 162); + BLOCK_NAME_TO_ID.put("minecraft:acacia_stairs", 163); + BLOCK_NAME_TO_ID.put("minecraft:dark_oak_stairs", 164); + BLOCK_NAME_TO_ID.put("minecraft:slime", 165); + BLOCK_NAME_TO_ID.put("minecraft:barrier", 166); + BLOCK_NAME_TO_ID.put("minecraft:iron_trapdoor", 167); + BLOCK_NAME_TO_ID.put("minecraft:prismarine", 168); + BLOCK_NAME_TO_ID.put("minecraft:sea_lantern", 169); + BLOCK_NAME_TO_ID.put("minecraft:hay_block", 170); + BLOCK_NAME_TO_ID.put("minecraft:carpet", 171); + BLOCK_NAME_TO_ID.put("minecraft:hardened_clay", 172); + BLOCK_NAME_TO_ID.put("minecraft:coal_block", 173); + BLOCK_NAME_TO_ID.put("minecraft:packed_ice", 174); + BLOCK_NAME_TO_ID.put("minecraft:double_plant", 175); + BLOCK_NAME_TO_ID.put("minecraft:standing_banner", 176); + BLOCK_NAME_TO_ID.put("minecraft:wall_banner", 177); + BLOCK_NAME_TO_ID.put("minecraft:daylight_detector_inverted", 178); + BLOCK_NAME_TO_ID.put("minecraft:red_sandstone", 179); + BLOCK_NAME_TO_ID.put("minecraft:red_sandstone_stairs", 180); + BLOCK_NAME_TO_ID.put("minecraft:double_stone_slab2", 181); + BLOCK_NAME_TO_ID.put("minecraft:stone_slab2", 182); + BLOCK_NAME_TO_ID.put("minecraft:spruce_fence_gate", 183); + BLOCK_NAME_TO_ID.put("minecraft:birch_fence_gate", 184); + BLOCK_NAME_TO_ID.put("minecraft:jungle_fence_gate", 185); + BLOCK_NAME_TO_ID.put("minecraft:dark_oak_fence_gate", 186); + BLOCK_NAME_TO_ID.put("minecraft:acacia_fence_gate", 187); + BLOCK_NAME_TO_ID.put("minecraft:spruce_fence", 188); + BLOCK_NAME_TO_ID.put("minecraft:birch_fence", 189); + BLOCK_NAME_TO_ID.put("minecraft:jungle_fence", 190); + BLOCK_NAME_TO_ID.put("minecraft:dark_oak_fence", 191); + BLOCK_NAME_TO_ID.put("minecraft:acacia_fence", 192); + BLOCK_NAME_TO_ID.put("minecraft:spruce_door", 193); + BLOCK_NAME_TO_ID.put("minecraft:birch_door", 194); + BLOCK_NAME_TO_ID.put("minecraft:jungle_door", 195); + BLOCK_NAME_TO_ID.put("minecraft:acacia_door", 196); + BLOCK_NAME_TO_ID.put("minecraft:dark_oak_door", 197); + BLOCK_NAME_TO_ID.put("minecraft:end_rod", 198); + BLOCK_NAME_TO_ID.put("minecraft:chorus_plant", 199); + BLOCK_NAME_TO_ID.put("minecraft:chorus_flower", 200); + BLOCK_NAME_TO_ID.put("minecraft:purpur_block", 201); + BLOCK_NAME_TO_ID.put("minecraft:purpur_pillar", 202); + BLOCK_NAME_TO_ID.put("minecraft:purpur_stairs", 203); + BLOCK_NAME_TO_ID.put("minecraft:purpur_double_slab", 204); + BLOCK_NAME_TO_ID.put("minecraft:purpur_slab", 205); + BLOCK_NAME_TO_ID.put("minecraft:end_bricks", 206); + BLOCK_NAME_TO_ID.put("minecraft:beetroots", 207); + BLOCK_NAME_TO_ID.put("minecraft:grass_path", 208); + BLOCK_NAME_TO_ID.put("minecraft:end_gateway", 209); + BLOCK_NAME_TO_ID.put("minecraft:repeating_command_block", 210); + BLOCK_NAME_TO_ID.put("minecraft:chain_command_block", 211); + BLOCK_NAME_TO_ID.put("minecraft:frosted_ice", 212); + BLOCK_NAME_TO_ID.put("minecraft:magma", 213); + BLOCK_NAME_TO_ID.put("minecraft:nether_wart_block", 214); + BLOCK_NAME_TO_ID.put("minecraft:red_nether_brick", 215); + BLOCK_NAME_TO_ID.put("minecraft:bone_block", 216); + BLOCK_NAME_TO_ID.put("minecraft:structure_void", 217); + BLOCK_NAME_TO_ID.put("minecraft:observer", 218); + BLOCK_NAME_TO_ID.put("minecraft:white_shulker_box", 219); + BLOCK_NAME_TO_ID.put("minecraft:orange_shulker_box", 220); + BLOCK_NAME_TO_ID.put("minecraft:magenta_shulker_box", 221); + BLOCK_NAME_TO_ID.put("minecraft:light_blue_shulker_box", 222); + BLOCK_NAME_TO_ID.put("minecraft:yellow_shulker_box", 223); + BLOCK_NAME_TO_ID.put("minecraft:lime_shulker_box", 224); + BLOCK_NAME_TO_ID.put("minecraft:pink_shulker_box", 225); + BLOCK_NAME_TO_ID.put("minecraft:gray_shulker_box", 226); + BLOCK_NAME_TO_ID.put("minecraft:silver_shulker_box", 227); + BLOCK_NAME_TO_ID.put("minecraft:cyan_shulker_box", 228); + BLOCK_NAME_TO_ID.put("minecraft:purple_shulker_box", 229); + BLOCK_NAME_TO_ID.put("minecraft:blue_shulker_box", 230); + BLOCK_NAME_TO_ID.put("minecraft:brown_shulker_box", 231); + BLOCK_NAME_TO_ID.put("minecraft:green_shulker_box", 232); + BLOCK_NAME_TO_ID.put("minecraft:red_shulker_box", 233); + BLOCK_NAME_TO_ID.put("minecraft:black_shulker_box", 234); + BLOCK_NAME_TO_ID.put("minecraft:white_glazed_terracotta", 235); + BLOCK_NAME_TO_ID.put("minecraft:orange_glazed_terracotta", 236); + BLOCK_NAME_TO_ID.put("minecraft:magenta_glazed_terracotta", 237); + BLOCK_NAME_TO_ID.put("minecraft:light_blue_glazed_terracotta", 238); + BLOCK_NAME_TO_ID.put("minecraft:yellow_glazed_terracotta", 239); + BLOCK_NAME_TO_ID.put("minecraft:lime_glazed_terracotta", 240); + BLOCK_NAME_TO_ID.put("minecraft:pink_glazed_terracotta", 241); + BLOCK_NAME_TO_ID.put("minecraft:gray_glazed_terracotta", 242); + BLOCK_NAME_TO_ID.put("minecraft:silver_glazed_terracotta", 243); + BLOCK_NAME_TO_ID.put("minecraft:cyan_glazed_terracotta", 244); + BLOCK_NAME_TO_ID.put("minecraft:purple_glazed_terracotta", 245); + BLOCK_NAME_TO_ID.put("minecraft:blue_glazed_terracotta", 246); + BLOCK_NAME_TO_ID.put("minecraft:brown_glazed_terracotta", 247); + BLOCK_NAME_TO_ID.put("minecraft:green_glazed_terracotta", 248); + BLOCK_NAME_TO_ID.put("minecraft:red_glazed_terracotta", 249); + BLOCK_NAME_TO_ID.put("minecraft:black_glazed_terracotta", 250); + BLOCK_NAME_TO_ID.put("minecraft:concrete", 251); + BLOCK_NAME_TO_ID.put("minecraft:concrete_powder", 252); + BLOCK_NAME_TO_ID.put("minecraft:structure_block", 255); + } + + protected static final int VERSION = MCVersions.V17W47A; + + protected final String[] paths; + + public ConverterFlattenEntity(final String... paths) { + super(VERSION, 3); + this.paths = paths; + } + + private static void register(final String id, final String... paths) { + MCTypeRegistry.ENTITY.addConverterForId(id, new ConverterFlattenEntity(paths)); + } + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:falling_block", new DataConverter<>(VERSION, 3) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int blockId; + if (data.hasKey("Block")) { + final Number id = data.getNumber("Block"); + if (id != null) { + blockId = id.intValue(); + } else { + blockId = getBlockId(data.getString("Block")); + } + } else { + final Number tileId = data.getNumber("TileID"); + if (tileId != null) { + blockId = tileId.intValue(); + } else { + blockId = data.getByte("Tile") & 255; + } + } + + final int blockData = data.getInt("Data") & 15; + + data.remove("Block"); // from type update + data.remove("Data"); + data.remove("TileID"); + data.remove("Tile"); + + // key is from type update + data.setMap("BlockState", HelperBlockFlatteningV1450.getNBTForId((blockId << 4) | blockData).copy()); // copy to avoid problems with later state datafixers + + return null; + } + }); + register("minecraft:enderman", "carried", "carriedData", "carriedBlockState"); + register("minecraft:arrow", "inTile", "inData", "inBlockState"); + register("minecraft:spectral_arrow", "inTile", "inData", "inBlockState"); + register("minecraft:egg", "inTile"); + register("minecraft:ender_pearl", "inTile"); + register("minecraft:fireball", "inTile"); + register("minecraft:potion", "inTile"); + register("minecraft:small_fireball", "inTile"); + register("minecraft:snowball", "inTile"); + register("minecraft:wither_skull", "inTile"); + register("minecraft:xp_bottle", "inTile"); + register("minecraft:commandblock_minecart", "DisplayTile", "DisplayData", "DisplayState"); + register("minecraft:minecart", "DisplayTile", "DisplayData", "DisplayState"); + register("minecraft:chest_minecart", "DisplayTile", "DisplayData", "DisplayState"); + register("minecraft:furnace_minecart", "DisplayTile", "DisplayData", "DisplayState"); + register("minecraft:tnt_minecart", "DisplayTile", "DisplayData", "DisplayState"); + register("minecraft:hopper_minecart", "DisplayTile", "DisplayData", "DisplayState"); + register("minecraft:spawner_minecart", "DisplayTile", "DisplayData", "DisplayState"); + } + + public static int getBlockId(final String block) { + final Integer ret = BLOCK_NAME_TO_ID.get(block); + return ret == null ? 0 : ret.intValue(); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (this.paths.length == 1) { + data.remove(this.paths[0]); + return null; + } + final String idPath = this.paths[0]; + final String dataPath = this.paths[1]; + final String outputStatePath = this.paths[2]; + + final int blockId; + if (data.hasKey(idPath, ObjectType.NUMBER)) { + blockId = data.getInt(idPath); + } else { + blockId = getBlockId(data.getString(idPath)); + } + + final int blockData = data.getInt(dataPath) & 15; + + data.remove(idPath); // from type update + data.remove(dataPath); + + data.setMap(outputStatePath, HelperBlockFlatteningV1450.getNBTForId((blockId << 4) | blockData).copy()); // copy to avoid problems with later state datafixers + + return null; + } +} diff --git a/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> { + + public final String path; + public final boolean dfl; + + public AddFlagIfAbsent(final int toVersion, final String path, final boolean dfl) { + super(toVersion); + this.path = path; + this.dfl = dfl; + } + + public AddFlagIfAbsent(final int toVersion, final int versionStep, final String path, final boolean dfl) { + super(toVersion, versionStep); + this.path = path; + this.dfl = dfl; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey(this.path)) { + data.setBoolean(this.path, this.dfl); + } + return null; + } +} diff --git a/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 renamer) { + register(version, 0, type, renamer); + } + public static void register(final int version, final int subVersion, final MCValueType type, final Function 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[] FLATTENED_BY_ID = new MapType[4096]; + protected static final MapType[] BLOCK_DEFAULTS = new MapType[4096]; + + private static final Object2IntOpenHashMap> ID_BY_OLD_NBT = new Object2IntOpenHashMap>(64, 0.7f) { + @Override + public int put(final MapType o, final int v) { + if (this.containsKey(o)) { + throw new RuntimeException("Already contains mapping for " + o); + } + + return super.put(o, v); + } + }; + static { + ID_BY_OLD_NBT.defaultReturnValue(-1); + } + + private static final Object2IntOpenHashMap ID_BY_OLD_NAME = new Object2IntOpenHashMap(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> IDENTITY_ENSURE = new HashMap<>(); + + public static MapType parseTag(final String blockstate) { + try { + final MapType ret = new NBTMapType(TagParser.parseTag(blockstate.replace('\'', '"'))); + + synchronized (IDENTITY_ENSURE) { + final MapType identity = IDENTITY_ENSURE.putIfAbsent(ret, ret); + + return identity == null ? ret : identity; + } + + } catch (final Exception ex) { + throw new RuntimeException("Exception parsing " + blockstate, ex); + } + } + + private static void register(final int id, final String flattened, final String... preFlattenings) { + final MapType flattenedNBT = parseTag(flattened); + if (FLATTENED_BY_ID[id] != null) { + throw new RuntimeException("Mapping already exists for id " + id); + } + FLATTENED_BY_ID[id] = flattenedNBT; + + // it's important that we register ids from smallest to largest, so that + // the default is going to be correct + final int block = id >> 4; + if (BLOCK_DEFAULTS[block] == null) { + BLOCK_DEFAULTS[block] = flattenedNBT; + } + + for (final String preFlattening : preFlattenings) { + final MapType preFlatteningNBT = parseTag(preFlattening); + final String name = preFlatteningNBT.getString("Name"); + if (name == null) { + throw new RuntimeException("Name does not exist for pre flattenings for id " + id); + } + + // putIfAbsent so we default to the lowest id, which is going to be the block default + ID_BY_OLD_NAME.putIfAbsent(name, id); + ID_BY_OLD_NBT.put(preFlatteningNBT, id); + } + } + + private static void finalizeMaps() { + for(int i = 0; i < FLATTENED_BY_ID.length; ++i) { + if (FLATTENED_BY_ID[i] == null) { + FLATTENED_BY_ID[i] = BLOCK_DEFAULTS[i >> 4]; + } + } + } + + public static MapType flattenNBT(final MapType old) { + final int id = ID_BY_OLD_NBT.getInt(old); + final MapType ret = getNBTForIdRaw(id); + + return ret == null ? old : ret; + } + + public static String getNewBlockName(final String old) { + final int id = ID_BY_OLD_NAME.getInt(old); + final MapType ret = getNBTForIdRaw(id); + return ret == null ? old : ret.getString("Name"); + } + + public static String getNameForId(final int block) { + final MapType nbt = getNBTForIdRaw(block); + return nbt == null ? "minecraft:air" : nbt.getString("Name"); + } + + protected static MapType getNBTForIdRaw(final int block) { + return block >= 0 && block < FLATTENED_BY_ID.length ? FLATTENED_BY_ID[block] : null; + } + + public static MapType getNBTForId(final int block) { + MapType ret = getNBTForIdRaw(block); + return ret == null ? FLATTENED_BY_ID[0] : ret; + } + + private HelperBlockFlatteningV1450() {} + + static { + ID_BY_OLD_NBT.defaultReturnValue(-1); + register(0, "{Name:'minecraft:air'}", "{Name:'minecraft:air'}"); + register(16, "{Name:'minecraft:stone'}", "{Name:'minecraft:stone',Properties:{variant:'stone'}}"); + register(17, "{Name:'minecraft:granite'}", "{Name:'minecraft:stone',Properties:{variant:'granite'}}"); + register(18, "{Name:'minecraft:polished_granite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_granite'}}"); + register(19, "{Name:'minecraft:diorite'}", "{Name:'minecraft:stone',Properties:{variant:'diorite'}}"); + register(20, "{Name:'minecraft:polished_diorite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_diorite'}}"); + register(21, "{Name:'minecraft:andesite'}", "{Name:'minecraft:stone',Properties:{variant:'andesite'}}"); + register(22, "{Name:'minecraft:polished_andesite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_andesite'}}"); + register(32, "{Name:'minecraft:grass_block',Properties:{snowy:'false'}}", "{Name:'minecraft:grass',Properties:{snowy:'false'}}", "{Name:'minecraft:grass',Properties:{snowy:'true'}}"); + register(48, "{Name:'minecraft:dirt'}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'dirt'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'dirt'}}"); + register(49, "{Name:'minecraft:coarse_dirt'}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'coarse_dirt'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'coarse_dirt'}}"); + register(50, "{Name:'minecraft:podzol',Properties:{snowy:'false'}}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'podzol'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'podzol'}}"); + register(64, "{Name:'minecraft:cobblestone'}", "{Name:'minecraft:cobblestone'}"); + register(80, "{Name:'minecraft:oak_planks'}", "{Name:'minecraft:planks',Properties:{variant:'oak'}}"); + register(81, "{Name:'minecraft:spruce_planks'}", "{Name:'minecraft:planks',Properties:{variant:'spruce'}}"); + register(82, "{Name:'minecraft:birch_planks'}", "{Name:'minecraft:planks',Properties:{variant:'birch'}}"); + register(83, "{Name:'minecraft:jungle_planks'}", "{Name:'minecraft:planks',Properties:{variant:'jungle'}}"); + register(84, "{Name:'minecraft:acacia_planks'}", "{Name:'minecraft:planks',Properties:{variant:'acacia'}}"); + register(85, "{Name:'minecraft:dark_oak_planks'}", "{Name:'minecraft:planks',Properties:{variant:'dark_oak'}}"); + register(96, "{Name:'minecraft:oak_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'oak'}}"); + register(97, "{Name:'minecraft:spruce_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'spruce'}}"); + register(98, "{Name:'minecraft:birch_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'birch'}}"); + register(99, "{Name:'minecraft:jungle_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'jungle'}}"); + register(100, "{Name:'minecraft:acacia_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'acacia'}}"); + register(101, "{Name:'minecraft:dark_oak_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'dark_oak'}}"); + register(104, "{Name:'minecraft:oak_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'oak'}}"); + register(105, "{Name:'minecraft:spruce_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'spruce'}}"); + register(106, "{Name:'minecraft:birch_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'birch'}}"); + register(107, "{Name:'minecraft:jungle_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'jungle'}}"); + register(108, "{Name:'minecraft:acacia_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'acacia'}}"); + register(109, "{Name:'minecraft:dark_oak_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'dark_oak'}}"); + register(112, "{Name:'minecraft:bedrock'}", "{Name:'minecraft:bedrock'}"); + register(128, "{Name:'minecraft:water',Properties:{level:'0'}}", "{Name:'minecraft:flowing_water',Properties:{level:'0'}}"); + register(129, "{Name:'minecraft:water',Properties:{level:'1'}}", "{Name:'minecraft:flowing_water',Properties:{level:'1'}}"); + register(130, "{Name:'minecraft:water',Properties:{level:'2'}}", "{Name:'minecraft:flowing_water',Properties:{level:'2'}}"); + register(131, "{Name:'minecraft:water',Properties:{level:'3'}}", "{Name:'minecraft:flowing_water',Properties:{level:'3'}}"); + register(132, "{Name:'minecraft:water',Properties:{level:'4'}}", "{Name:'minecraft:flowing_water',Properties:{level:'4'}}"); + register(133, "{Name:'minecraft:water',Properties:{level:'5'}}", "{Name:'minecraft:flowing_water',Properties:{level:'5'}}"); + register(134, "{Name:'minecraft:water',Properties:{level:'6'}}", "{Name:'minecraft:flowing_water',Properties:{level:'6'}}"); + register(135, "{Name:'minecraft:water',Properties:{level:'7'}}", "{Name:'minecraft:flowing_water',Properties:{level:'7'}}"); + register(136, "{Name:'minecraft:water',Properties:{level:'8'}}", "{Name:'minecraft:flowing_water',Properties:{level:'8'}}"); + register(137, "{Name:'minecraft:water',Properties:{level:'9'}}", "{Name:'minecraft:flowing_water',Properties:{level:'9'}}"); + register(138, "{Name:'minecraft:water',Properties:{level:'10'}}", "{Name:'minecraft:flowing_water',Properties:{level:'10'}}"); + register(139, "{Name:'minecraft:water',Properties:{level:'11'}}", "{Name:'minecraft:flowing_water',Properties:{level:'11'}}"); + register(140, "{Name:'minecraft:water',Properties:{level:'12'}}", "{Name:'minecraft:flowing_water',Properties:{level:'12'}}"); + register(141, "{Name:'minecraft:water',Properties:{level:'13'}}", "{Name:'minecraft:flowing_water',Properties:{level:'13'}}"); + register(142, "{Name:'minecraft:water',Properties:{level:'14'}}", "{Name:'minecraft:flowing_water',Properties:{level:'14'}}"); + register(143, "{Name:'minecraft:water',Properties:{level:'15'}}", "{Name:'minecraft:flowing_water',Properties:{level:'15'}}"); + register(144, "{Name:'minecraft:water',Properties:{level:'0'}}", "{Name:'minecraft:water',Properties:{level:'0'}}"); + register(145, "{Name:'minecraft:water',Properties:{level:'1'}}", "{Name:'minecraft:water',Properties:{level:'1'}}"); + register(146, "{Name:'minecraft:water',Properties:{level:'2'}}", "{Name:'minecraft:water',Properties:{level:'2'}}"); + register(147, "{Name:'minecraft:water',Properties:{level:'3'}}", "{Name:'minecraft:water',Properties:{level:'3'}}"); + register(148, "{Name:'minecraft:water',Properties:{level:'4'}}", "{Name:'minecraft:water',Properties:{level:'4'}}"); + register(149, "{Name:'minecraft:water',Properties:{level:'5'}}", "{Name:'minecraft:water',Properties:{level:'5'}}"); + register(150, "{Name:'minecraft:water',Properties:{level:'6'}}", "{Name:'minecraft:water',Properties:{level:'6'}}"); + register(151, "{Name:'minecraft:water',Properties:{level:'7'}}", "{Name:'minecraft:water',Properties:{level:'7'}}"); + register(152, "{Name:'minecraft:water',Properties:{level:'8'}}", "{Name:'minecraft:water',Properties:{level:'8'}}"); + register(153, "{Name:'minecraft:water',Properties:{level:'9'}}", "{Name:'minecraft:water',Properties:{level:'9'}}"); + register(154, "{Name:'minecraft:water',Properties:{level:'10'}}", "{Name:'minecraft:water',Properties:{level:'10'}}"); + register(155, "{Name:'minecraft:water',Properties:{level:'11'}}", "{Name:'minecraft:water',Properties:{level:'11'}}"); + register(156, "{Name:'minecraft:water',Properties:{level:'12'}}", "{Name:'minecraft:water',Properties:{level:'12'}}"); + register(157, "{Name:'minecraft:water',Properties:{level:'13'}}", "{Name:'minecraft:water',Properties:{level:'13'}}"); + register(158, "{Name:'minecraft:water',Properties:{level:'14'}}", "{Name:'minecraft:water',Properties:{level:'14'}}"); + register(159, "{Name:'minecraft:water',Properties:{level:'15'}}", "{Name:'minecraft:water',Properties:{level:'15'}}"); + register(160, "{Name:'minecraft:lava',Properties:{level:'0'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'0'}}"); + register(161, "{Name:'minecraft:lava',Properties:{level:'1'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'1'}}"); + register(162, "{Name:'minecraft:lava',Properties:{level:'2'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'2'}}"); + register(163, "{Name:'minecraft:lava',Properties:{level:'3'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'3'}}"); + register(164, "{Name:'minecraft:lava',Properties:{level:'4'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'4'}}"); + register(165, "{Name:'minecraft:lava',Properties:{level:'5'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'5'}}"); + register(166, "{Name:'minecraft:lava',Properties:{level:'6'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'6'}}"); + register(167, "{Name:'minecraft:lava',Properties:{level:'7'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'7'}}"); + register(168, "{Name:'minecraft:lava',Properties:{level:'8'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'8'}}"); + register(169, "{Name:'minecraft:lava',Properties:{level:'9'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'9'}}"); + register(170, "{Name:'minecraft:lava',Properties:{level:'10'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'10'}}"); + register(171, "{Name:'minecraft:lava',Properties:{level:'11'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'11'}}"); + register(172, "{Name:'minecraft:lava',Properties:{level:'12'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'12'}}"); + register(173, "{Name:'minecraft:lava',Properties:{level:'13'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'13'}}"); + register(174, "{Name:'minecraft:lava',Properties:{level:'14'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'14'}}"); + register(175, "{Name:'minecraft:lava',Properties:{level:'15'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'15'}}"); + register(176, "{Name:'minecraft:lava',Properties:{level:'0'}}", "{Name:'minecraft:lava',Properties:{level:'0'}}"); + register(177, "{Name:'minecraft:lava',Properties:{level:'1'}}", "{Name:'minecraft:lava',Properties:{level:'1'}}"); + register(178, "{Name:'minecraft:lava',Properties:{level:'2'}}", "{Name:'minecraft:lava',Properties:{level:'2'}}"); + register(179, "{Name:'minecraft:lava',Properties:{level:'3'}}", "{Name:'minecraft:lava',Properties:{level:'3'}}"); + register(180, "{Name:'minecraft:lava',Properties:{level:'4'}}", "{Name:'minecraft:lava',Properties:{level:'4'}}"); + register(181, "{Name:'minecraft:lava',Properties:{level:'5'}}", "{Name:'minecraft:lava',Properties:{level:'5'}}"); + register(182, "{Name:'minecraft:lava',Properties:{level:'6'}}", "{Name:'minecraft:lava',Properties:{level:'6'}}"); + register(183, "{Name:'minecraft:lava',Properties:{level:'7'}}", "{Name:'minecraft:lava',Properties:{level:'7'}}"); + register(184, "{Name:'minecraft:lava',Properties:{level:'8'}}", "{Name:'minecraft:lava',Properties:{level:'8'}}"); + register(185, "{Name:'minecraft:lava',Properties:{level:'9'}}", "{Name:'minecraft:lava',Properties:{level:'9'}}"); + register(186, "{Name:'minecraft:lava',Properties:{level:'10'}}", "{Name:'minecraft:lava',Properties:{level:'10'}}"); + register(187, "{Name:'minecraft:lava',Properties:{level:'11'}}", "{Name:'minecraft:lava',Properties:{level:'11'}}"); + register(188, "{Name:'minecraft:lava',Properties:{level:'12'}}", "{Name:'minecraft:lava',Properties:{level:'12'}}"); + register(189, "{Name:'minecraft:lava',Properties:{level:'13'}}", "{Name:'minecraft:lava',Properties:{level:'13'}}"); + register(190, "{Name:'minecraft:lava',Properties:{level:'14'}}", "{Name:'minecraft:lava',Properties:{level:'14'}}"); + register(191, "{Name:'minecraft:lava',Properties:{level:'15'}}", "{Name:'minecraft:lava',Properties:{level:'15'}}"); + register(192, "{Name:'minecraft:sand'}", "{Name:'minecraft:sand',Properties:{variant:'sand'}}"); + register(193, "{Name:'minecraft:red_sand'}", "{Name:'minecraft:sand',Properties:{variant:'red_sand'}}"); + register(208, "{Name:'minecraft:gravel'}", "{Name:'minecraft:gravel'}"); + register(224, "{Name:'minecraft:gold_ore'}", "{Name:'minecraft:gold_ore'}"); + register(240, "{Name:'minecraft:iron_ore'}", "{Name:'minecraft:iron_ore'}"); + register(256, "{Name:'minecraft:coal_ore'}", "{Name:'minecraft:coal_ore'}"); + register(272, "{Name:'minecraft:oak_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'oak'}}"); + register(273, "{Name:'minecraft:spruce_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'spruce'}}"); + register(274, "{Name:'minecraft:birch_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'birch'}}"); + register(275, "{Name:'minecraft:jungle_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'jungle'}}"); + register(276, "{Name:'minecraft:oak_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'oak'}}"); + register(277, "{Name:'minecraft:spruce_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'spruce'}}"); + register(278, "{Name:'minecraft:birch_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'birch'}}"); + register(279, "{Name:'minecraft:jungle_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'jungle'}}"); + register(280, "{Name:'minecraft:oak_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'oak'}}"); + register(281, "{Name:'minecraft:spruce_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'spruce'}}"); + register(282, "{Name:'minecraft:birch_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'birch'}}"); + register(283, "{Name:'minecraft:jungle_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'jungle'}}"); + register(284, "{Name:'minecraft:oak_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'oak'}}"); + register(285, "{Name:'minecraft:spruce_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'spruce'}}"); + register(286, "{Name:'minecraft:birch_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'birch'}}"); + register(287, "{Name:'minecraft:jungle_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'jungle'}}"); + register(288, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'oak'}}"); + register(289, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'spruce'}}"); + register(290, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'birch'}}"); + register(291, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'jungle'}}"); + register(292, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'oak'}}"); + register(293, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'spruce'}}"); + register(294, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'birch'}}"); + register(295, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'jungle'}}"); + register(296, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'oak'}}"); + register(297, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'spruce'}}"); + register(298, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'birch'}}"); + register(299, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'jungle'}}"); + register(300, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'oak'}}"); + register(301, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'spruce'}}"); + register(302, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'birch'}}"); + register(303, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'jungle'}}"); + register(304, "{Name:'minecraft:sponge'}", "{Name:'minecraft:sponge',Properties:{wet:'false'}}"); + register(305, "{Name:'minecraft:wet_sponge'}", "{Name:'minecraft:sponge',Properties:{wet:'true'}}"); + register(320, "{Name:'minecraft:glass'}", "{Name:'minecraft:glass'}"); + register(336, "{Name:'minecraft:lapis_ore'}", "{Name:'minecraft:lapis_ore'}"); + register(352, "{Name:'minecraft:lapis_block'}", "{Name:'minecraft:lapis_block'}"); + register(368, "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'false'}}"); + register(369, "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'false'}}"); + register(370, "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'false'}}"); + register(371, "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'false'}}"); + register(372, "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'false'}}"); + register(373, "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'false'}}"); + register(376, "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'true'}}"); + register(377, "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'true'}}"); + register(378, "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'true'}}"); + register(379, "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'true'}}"); + register(380, "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'true'}}"); + register(381, "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'true'}}"); + register(384, "{Name:'minecraft:sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'sandstone'}}"); + register(385, "{Name:'minecraft:chiseled_sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'chiseled_sandstone'}}"); + register(386, "{Name:'minecraft:cut_sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'smooth_sandstone'}}"); + register(400, "{Name:'minecraft:note_block'}", "{Name:'minecraft:noteblock'}"); + register(416, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'true',part:'foot'}}"); + register(417, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'true',part:'foot'}}"); + register(418, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'true',part:'foot'}}"); + register(419, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'true',part:'foot'}}"); + register(424, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'false',part:'head'}}"); + register(425, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'false',part:'head'}}"); + register(426, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'false',part:'head'}}"); + register(427, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'false',part:'head'}}"); + register(428, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'true',part:'head'}}"); + register(429, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'true',part:'head'}}"); + register(430, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'true',part:'head'}}"); + register(431, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'true',part:'head'}}"); + register(432, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'north_south'}}"); + register(433, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'east_west'}}"); + register(434, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_east'}}"); + register(435, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_west'}}"); + register(436, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_north'}}"); + register(437, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_south'}}"); + register(440, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'north_south'}}"); + register(441, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'east_west'}}"); + register(442, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_east'}}"); + register(443, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_west'}}"); + register(444, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_north'}}"); + register(445, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_south'}}"); + register(448, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'north_south'}}"); + register(449, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'east_west'}}"); + register(450, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_east'}}"); + register(451, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_west'}}"); + register(452, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_north'}}"); + register(453, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_south'}}"); + register(456, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'north_south'}}"); + register(457, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'east_west'}}"); + register(458, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_east'}}"); + register(459, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_west'}}"); + register(460, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_north'}}"); + register(461, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_south'}}"); + register(464, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'down'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'down'}}"); + register(465, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'up'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'up'}}"); + register(466, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'north'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'north'}}"); + register(467, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'south'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'south'}}"); + register(468, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'west'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'west'}}"); + register(469, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'east'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'east'}}"); + register(472, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'down'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'down'}}"); + register(473, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'up'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'up'}}"); + register(474, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'north'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'north'}}"); + register(475, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'south'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'south'}}"); + register(476, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'west'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'west'}}"); + register(477, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'east'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'east'}}"); + register(480, "{Name:'minecraft:cobweb'}", "{Name:'minecraft:web'}"); + register(496, "{Name:'minecraft:dead_bush'}", "{Name:'minecraft:tallgrass',Properties:{type:'dead_bush'}}"); + register(497, "{Name:'minecraft:grass'}", "{Name:'minecraft:tallgrass',Properties:{type:'tall_grass'}}"); + register(498, "{Name:'minecraft:fern'}", "{Name:'minecraft:tallgrass',Properties:{type:'fern'}}"); + register(512, "{Name:'minecraft:dead_bush'}", "{Name:'minecraft:deadbush'}"); + register(528, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'down'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'down'}}"); + register(529, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'up'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'up'}}"); + register(530, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'north'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'north'}}"); + register(531, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'south'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'south'}}"); + register(532, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'west'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'west'}}"); + register(533, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'east'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'east'}}"); + register(536, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'down'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'down'}}"); + register(537, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'up'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'up'}}"); + register(538, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'north'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'north'}}"); + register(539, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'south'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'south'}}"); + register(540, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'west'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'west'}}"); + register(541, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'east'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'east'}}"); + register(544, "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'true',type:'normal'}}"); + register(545, "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'true',type:'normal'}}"); + register(546, "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'true',type:'normal'}}"); + register(547, "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'true',type:'normal'}}"); + register(548, "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'true',type:'normal'}}"); + register(549, "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'true',type:'normal'}}"); + register(552, "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'true',type:'sticky'}}"); + register(553, "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'true',type:'sticky'}}"); + register(554, "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'true',type:'sticky'}}"); + register(555, "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'true',type:'sticky'}}"); + register(556, "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'true',type:'sticky'}}"); + register(557, "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'true',type:'sticky'}}"); + register(560, "{Name:'minecraft:white_wool'}", "{Name:'minecraft:wool',Properties:{color:'white'}}"); + register(561, "{Name:'minecraft:orange_wool'}", "{Name:'minecraft:wool',Properties:{color:'orange'}}"); + register(562, "{Name:'minecraft:magenta_wool'}", "{Name:'minecraft:wool',Properties:{color:'magenta'}}"); + register(563, "{Name:'minecraft:light_blue_wool'}", "{Name:'minecraft:wool',Properties:{color:'light_blue'}}"); + register(564, "{Name:'minecraft:yellow_wool'}", "{Name:'minecraft:wool',Properties:{color:'yellow'}}"); + register(565, "{Name:'minecraft:lime_wool'}", "{Name:'minecraft:wool',Properties:{color:'lime'}}"); + register(566, "{Name:'minecraft:pink_wool'}", "{Name:'minecraft:wool',Properties:{color:'pink'}}"); + register(567, "{Name:'minecraft:gray_wool'}", "{Name:'minecraft:wool',Properties:{color:'gray'}}"); + register(568, "{Name:'minecraft:light_gray_wool'}", "{Name:'minecraft:wool',Properties:{color:'silver'}}"); + register(569, "{Name:'minecraft:cyan_wool'}", "{Name:'minecraft:wool',Properties:{color:'cyan'}}"); + register(570, "{Name:'minecraft:purple_wool'}", "{Name:'minecraft:wool',Properties:{color:'purple'}}"); + register(571, "{Name:'minecraft:blue_wool'}", "{Name:'minecraft:wool',Properties:{color:'blue'}}"); + register(572, "{Name:'minecraft:brown_wool'}", "{Name:'minecraft:wool',Properties:{color:'brown'}}"); + register(573, "{Name:'minecraft:green_wool'}", "{Name:'minecraft:wool',Properties:{color:'green'}}"); + register(574, "{Name:'minecraft:red_wool'}", "{Name:'minecraft:wool',Properties:{color:'red'}}"); + register(575, "{Name:'minecraft:black_wool'}", "{Name:'minecraft:wool',Properties:{color:'black'}}"); + register(576, "{Name:'minecraft:moving_piston',Properties:{facing:'down',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'down',type:'normal'}}"); + register(577, "{Name:'minecraft:moving_piston',Properties:{facing:'up',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'up',type:'normal'}}"); + register(578, "{Name:'minecraft:moving_piston',Properties:{facing:'north',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'north',type:'normal'}}"); + register(579, "{Name:'minecraft:moving_piston',Properties:{facing:'south',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'south',type:'normal'}}"); + register(580, "{Name:'minecraft:moving_piston',Properties:{facing:'west',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'west',type:'normal'}}"); + register(581, "{Name:'minecraft:moving_piston',Properties:{facing:'east',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'east',type:'normal'}}"); + register(584, "{Name:'minecraft:moving_piston',Properties:{facing:'down',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'down',type:'sticky'}}"); + register(585, "{Name:'minecraft:moving_piston',Properties:{facing:'up',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'up',type:'sticky'}}"); + register(586, "{Name:'minecraft:moving_piston',Properties:{facing:'north',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'north',type:'sticky'}}"); + register(587, "{Name:'minecraft:moving_piston',Properties:{facing:'south',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'south',type:'sticky'}}"); + register(588, "{Name:'minecraft:moving_piston',Properties:{facing:'west',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'west',type:'sticky'}}"); + register(589, "{Name:'minecraft:moving_piston',Properties:{facing:'east',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'east',type:'sticky'}}"); + register(592, "{Name:'minecraft:dandelion'}", "{Name:'minecraft:yellow_flower',Properties:{type:'dandelion'}}"); + register(608, "{Name:'minecraft:poppy'}", "{Name:'minecraft:red_flower',Properties:{type:'poppy'}}"); + register(609, "{Name:'minecraft:blue_orchid'}", "{Name:'minecraft:red_flower',Properties:{type:'blue_orchid'}}"); + register(610, "{Name:'minecraft:allium'}", "{Name:'minecraft:red_flower',Properties:{type:'allium'}}"); + register(611, "{Name:'minecraft:azure_bluet'}", "{Name:'minecraft:red_flower',Properties:{type:'houstonia'}}"); + register(612, "{Name:'minecraft:red_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'red_tulip'}}"); + register(613, "{Name:'minecraft:orange_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'orange_tulip'}}"); + register(614, "{Name:'minecraft:white_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'white_tulip'}}"); + register(615, "{Name:'minecraft:pink_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'pink_tulip'}}"); + register(616, "{Name:'minecraft:oxeye_daisy'}", "{Name:'minecraft:red_flower',Properties:{type:'oxeye_daisy'}}"); + register(624, "{Name:'minecraft:brown_mushroom'}", "{Name:'minecraft:brown_mushroom'}"); + register(640, "{Name:'minecraft:red_mushroom'}", "{Name:'minecraft:red_mushroom'}"); + register(656, "{Name:'minecraft:gold_block'}", "{Name:'minecraft:gold_block'}"); + register(672, "{Name:'minecraft:iron_block'}", "{Name:'minecraft:iron_block'}"); + register(688, "{Name:'minecraft:stone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'stone'}}"); + register(689, "{Name:'minecraft:sandstone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'sandstone'}}"); + register(690, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'wood_old'}}"); + register(691, "{Name:'minecraft:cobblestone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'cobblestone'}}"); + register(692, "{Name:'minecraft:brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'brick'}}"); + register(693, "{Name:'minecraft:stone_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'stone_brick'}}"); + register(694, "{Name:'minecraft:nether_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'nether_brick'}}"); + register(695, "{Name:'minecraft:quartz_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'quartz'}}"); + register(696, "{Name:'minecraft:smooth_stone'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'stone'}}"); + register(697, "{Name:'minecraft:smooth_sandstone'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'sandstone'}}"); + register(698, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'wood_old'}}"); + register(699, "{Name:'minecraft:cobblestone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'cobblestone'}}"); + register(700, "{Name:'minecraft:brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'brick'}}"); + register(701, "{Name:'minecraft:stone_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'stone_brick'}}"); + register(702, "{Name:'minecraft:nether_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'nether_brick'}}"); + register(703, "{Name:'minecraft:smooth_quartz'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'quartz'}}"); + register(704, "{Name:'minecraft:stone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'stone'}}"); + register(705, "{Name:'minecraft:sandstone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'sandstone'}}"); + register(706, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'wood_old'}}"); + register(707, "{Name:'minecraft:cobblestone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'cobblestone'}}"); + register(708, "{Name:'minecraft:brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'brick'}}"); + register(709, "{Name:'minecraft:stone_brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'stone_brick'}}"); + register(710, "{Name:'minecraft:nether_brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'nether_brick'}}"); + register(711, "{Name:'minecraft:quartz_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'quartz'}}"); + register(712, "{Name:'minecraft:stone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'stone'}}"); + register(713, "{Name:'minecraft:sandstone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'sandstone'}}"); + register(714, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'wood_old'}}"); + register(715, "{Name:'minecraft:cobblestone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'cobblestone'}}"); + register(716, "{Name:'minecraft:brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'brick'}}"); + register(717, "{Name:'minecraft:stone_brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'stone_brick'}}"); + register(718, "{Name:'minecraft:nether_brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'nether_brick'}}"); + register(719, "{Name:'minecraft:quartz_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'quartz'}}"); + register(720, "{Name:'minecraft:bricks'}", "{Name:'minecraft:brick_block'}"); + register(736, "{Name:'minecraft:tnt',Properties:{unstable:'false'}}", "{Name:'minecraft:tnt',Properties:{explode:'false'}}"); + register(737, "{Name:'minecraft:tnt',Properties:{unstable:'true'}}", "{Name:'minecraft:tnt',Properties:{explode:'true'}}"); + register(752, "{Name:'minecraft:bookshelf'}", "{Name:'minecraft:bookshelf'}"); + register(768, "{Name:'minecraft:mossy_cobblestone'}", "{Name:'minecraft:mossy_cobblestone'}"); + register(784, "{Name:'minecraft:obsidian'}", "{Name:'minecraft:obsidian'}"); + register(801, "{Name:'minecraft:wall_torch',Properties:{facing:'east'}}", "{Name:'minecraft:torch',Properties:{facing:'east'}}"); + register(802, "{Name:'minecraft:wall_torch',Properties:{facing:'west'}}", "{Name:'minecraft:torch',Properties:{facing:'west'}}"); + register(803, "{Name:'minecraft:wall_torch',Properties:{facing:'south'}}", "{Name:'minecraft:torch',Properties:{facing:'south'}}"); + register(804, "{Name:'minecraft:wall_torch',Properties:{facing:'north'}}", "{Name:'minecraft:torch',Properties:{facing:'north'}}"); + register(805, "{Name:'minecraft:torch'}", "{Name:'minecraft:torch',Properties:{facing:'up'}}"); + register(816, "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(817, "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(818, "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(819, "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(820, "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(821, "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(822, "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(823, "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(824, "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(825, "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(826, "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(827, "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(828, "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(829, "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(830, "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(831, "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(832, "{Name:'minecraft:mob_spawner'}", "{Name:'minecraft:mob_spawner'}"); + register(848, "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(849, "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(850, "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(851, "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(852, "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(853, "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(854, "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(855, "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(866, "{Name:'minecraft:chest',Properties:{facing:'north',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'north'}}"); + register(867, "{Name:'minecraft:chest',Properties:{facing:'south',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'south'}}"); + register(868, "{Name:'minecraft:chest',Properties:{facing:'west',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'west'}}"); + register(869, "{Name:'minecraft:chest',Properties:{facing:'east',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'east'}}"); + register(880, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'up'}}"); + register(881, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'up'}}"); + register(882, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'up'}}"); + register(883, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'up'}}"); + register(884, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'up'}}"); + register(885, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'up'}}"); + register(886, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'up'}}"); + register(887, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'up'}}"); + register(888, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'up'}}"); + register(889, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'up'}}"); + register(890, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'up'}}"); + register(891, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'up'}}"); + register(892, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'up'}}"); + register(893, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'up'}}"); + register(894, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'up'}}"); + register(895, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'up'}}"); + register(896, "{Name:'minecraft:diamond_ore'}", "{Name:'minecraft:diamond_ore'}"); + register(912, "{Name:'minecraft:diamond_block'}", "{Name:'minecraft:diamond_block'}"); + register(928, "{Name:'minecraft:crafting_table'}", "{Name:'minecraft:crafting_table'}"); + register(944, "{Name:'minecraft:wheat',Properties:{age:'0'}}", "{Name:'minecraft:wheat',Properties:{age:'0'}}"); + register(945, "{Name:'minecraft:wheat',Properties:{age:'1'}}", "{Name:'minecraft:wheat',Properties:{age:'1'}}"); + register(946, "{Name:'minecraft:wheat',Properties:{age:'2'}}", "{Name:'minecraft:wheat',Properties:{age:'2'}}"); + register(947, "{Name:'minecraft:wheat',Properties:{age:'3'}}", "{Name:'minecraft:wheat',Properties:{age:'3'}}"); + register(948, "{Name:'minecraft:wheat',Properties:{age:'4'}}", "{Name:'minecraft:wheat',Properties:{age:'4'}}"); + register(949, "{Name:'minecraft:wheat',Properties:{age:'5'}}", "{Name:'minecraft:wheat',Properties:{age:'5'}}"); + register(950, "{Name:'minecraft:wheat',Properties:{age:'6'}}", "{Name:'minecraft:wheat',Properties:{age:'6'}}"); + register(951, "{Name:'minecraft:wheat',Properties:{age:'7'}}", "{Name:'minecraft:wheat',Properties:{age:'7'}}"); + register(960, "{Name:'minecraft:farmland',Properties:{moisture:'0'}}", "{Name:'minecraft:farmland',Properties:{moisture:'0'}}"); + register(961, "{Name:'minecraft:farmland',Properties:{moisture:'1'}}", "{Name:'minecraft:farmland',Properties:{moisture:'1'}}"); + register(962, "{Name:'minecraft:farmland',Properties:{moisture:'2'}}", "{Name:'minecraft:farmland',Properties:{moisture:'2'}}"); + register(963, "{Name:'minecraft:farmland',Properties:{moisture:'3'}}", "{Name:'minecraft:farmland',Properties:{moisture:'3'}}"); + register(964, "{Name:'minecraft:farmland',Properties:{moisture:'4'}}", "{Name:'minecraft:farmland',Properties:{moisture:'4'}}"); + register(965, "{Name:'minecraft:farmland',Properties:{moisture:'5'}}", "{Name:'minecraft:farmland',Properties:{moisture:'5'}}"); + register(966, "{Name:'minecraft:farmland',Properties:{moisture:'6'}}", "{Name:'minecraft:farmland',Properties:{moisture:'6'}}"); + register(967, "{Name:'minecraft:farmland',Properties:{moisture:'7'}}", "{Name:'minecraft:farmland',Properties:{moisture:'7'}}"); + register(978, "{Name:'minecraft:furnace',Properties:{facing:'north',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'north'}}"); + register(979, "{Name:'minecraft:furnace',Properties:{facing:'south',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'south'}}"); + register(980, "{Name:'minecraft:furnace',Properties:{facing:'west',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'west'}}"); + register(981, "{Name:'minecraft:furnace',Properties:{facing:'east',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'east'}}"); + register(994, "{Name:'minecraft:furnace',Properties:{facing:'north',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'north'}}"); + register(995, "{Name:'minecraft:furnace',Properties:{facing:'south',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'south'}}"); + register(996, "{Name:'minecraft:furnace',Properties:{facing:'west',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'west'}}"); + register(997, "{Name:'minecraft:furnace',Properties:{facing:'east',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'east'}}"); + register(1008, "{Name:'minecraft:sign',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'0'}}"); + register(1009, "{Name:'minecraft:sign',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'1'}}"); + register(1010, "{Name:'minecraft:sign',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'2'}}"); + register(1011, "{Name:'minecraft:sign',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'3'}}"); + register(1012, "{Name:'minecraft:sign',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'4'}}"); + register(1013, "{Name:'minecraft:sign',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'5'}}"); + register(1014, "{Name:'minecraft:sign',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'6'}}"); + register(1015, "{Name:'minecraft:sign',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'7'}}"); + register(1016, "{Name:'minecraft:sign',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'8'}}"); + register(1017, "{Name:'minecraft:sign',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'9'}}"); + register(1018, "{Name:'minecraft:sign',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'10'}}"); + register(1019, "{Name:'minecraft:sign',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'11'}}"); + register(1020, "{Name:'minecraft:sign',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'12'}}"); + register(1021, "{Name:'minecraft:sign',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'13'}}"); + register(1022, "{Name:'minecraft:sign',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'14'}}"); + register(1023, "{Name:'minecraft:sign',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'15'}}"); + register(1024, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1025, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1026, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1027, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1028, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1029, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1030, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1031, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1032, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1033, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(1034, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(1035, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(1036, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1037, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1038, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1039, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1042, "{Name:'minecraft:ladder',Properties:{facing:'north'}}", "{Name:'minecraft:ladder',Properties:{facing:'north'}}"); + register(1043, "{Name:'minecraft:ladder',Properties:{facing:'south'}}", "{Name:'minecraft:ladder',Properties:{facing:'south'}}"); + register(1044, "{Name:'minecraft:ladder',Properties:{facing:'west'}}", "{Name:'minecraft:ladder',Properties:{facing:'west'}}"); + register(1045, "{Name:'minecraft:ladder',Properties:{facing:'east'}}", "{Name:'minecraft:ladder',Properties:{facing:'east'}}"); + register(1056, "{Name:'minecraft:rail',Properties:{shape:'north_south'}}", "{Name:'minecraft:rail',Properties:{shape:'north_south'}}"); + register(1057, "{Name:'minecraft:rail',Properties:{shape:'east_west'}}", "{Name:'minecraft:rail',Properties:{shape:'east_west'}}"); + register(1058, "{Name:'minecraft:rail',Properties:{shape:'ascending_east'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_east'}}"); + register(1059, "{Name:'minecraft:rail',Properties:{shape:'ascending_west'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_west'}}"); + register(1060, "{Name:'minecraft:rail',Properties:{shape:'ascending_north'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_north'}}"); + register(1061, "{Name:'minecraft:rail',Properties:{shape:'ascending_south'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_south'}}"); + register(1062, "{Name:'minecraft:rail',Properties:{shape:'south_east'}}", "{Name:'minecraft:rail',Properties:{shape:'south_east'}}"); + register(1063, "{Name:'minecraft:rail',Properties:{shape:'south_west'}}", "{Name:'minecraft:rail',Properties:{shape:'south_west'}}"); + register(1064, "{Name:'minecraft:rail',Properties:{shape:'north_west'}}", "{Name:'minecraft:rail',Properties:{shape:'north_west'}}"); + register(1065, "{Name:'minecraft:rail',Properties:{shape:'north_east'}}", "{Name:'minecraft:rail',Properties:{shape:'north_east'}}"); + register(1072, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(1073, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(1074, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(1075, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(1076, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(1077, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(1078, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(1079, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(1090, "{Name:'minecraft:wall_sign',Properties:{facing:'north'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'north'}}"); + register(1091, "{Name:'minecraft:wall_sign',Properties:{facing:'south'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'south'}}"); + register(1092, "{Name:'minecraft:wall_sign',Properties:{facing:'west'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'west'}}"); + register(1093, "{Name:'minecraft:wall_sign',Properties:{facing:'east'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'east'}}"); + register(1104, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'down_x',powered:'false'}}"); + register(1105, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'east',powered:'false'}}"); + register(1106, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'west',powered:'false'}}"); + register(1107, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'south',powered:'false'}}"); + register(1108, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'north',powered:'false'}}"); + register(1109, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'up_z',powered:'false'}}"); + register(1110, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'up_x',powered:'false'}}"); + register(1111, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'down_z',powered:'false'}}"); + register(1112, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'down_x',powered:'true'}}"); + register(1113, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'east',powered:'true'}}"); + register(1114, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'west',powered:'true'}}"); + register(1115, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'south',powered:'true'}}"); + register(1116, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'north',powered:'true'}}"); + register(1117, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'up_z',powered:'true'}}"); + register(1118, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'up_x',powered:'true'}}"); + register(1119, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'down_z',powered:'true'}}"); + register(1120, "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'false'}}", "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'false'}}"); + register(1121, "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'true'}}", "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'true'}}"); + register(1136, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1137, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1138, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1139, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1140, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1141, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1142, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1143, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1144, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1145, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(1146, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(1147, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(1148, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1149, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1150, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1151, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1152, "{Name:'minecraft:oak_pressure_plate',Properties:{powered:'false'}}", "{Name:'minecraft:wooden_pressure_plate',Properties:{powered:'false'}}"); + register(1153, "{Name:'minecraft:oak_pressure_plate',Properties:{powered:'true'}}", "{Name:'minecraft:wooden_pressure_plate',Properties:{powered:'true'}}"); + register(1168, "{Name:'minecraft:redstone_ore',Properties:{lit:'false'}}", "{Name:'minecraft:redstone_ore'}"); + register(1184, "{Name:'minecraft:redstone_ore',Properties:{lit:'true'}}", "{Name:'minecraft:lit_redstone_ore'}"); + register(1201, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'east',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'east'}}"); + register(1202, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'west',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'west'}}"); + register(1203, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'south',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'south'}}"); + register(1204, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'north',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'north'}}"); + register(1205, "{Name:'minecraft:redstone_torch',Properties:{lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'up'}}"); + register(1217, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'east',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'east'}}"); + register(1218, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'west',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'west'}}"); + register(1219, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'south',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'south'}}"); + register(1220, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'north',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'north'}}"); + register(1221, "{Name:'minecraft:redstone_torch',Properties:{lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'up'}}"); + register(1232, "{Name:'minecraft:stone_button',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'down',powered:'false'}}"); + register(1233, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'east',powered:'false'}}"); + register(1234, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'west',powered:'false'}}"); + register(1235, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'south',powered:'false'}}"); + register(1236, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'north',powered:'false'}}"); + register(1237, "{Name:'minecraft:stone_button',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'up',powered:'false'}}"); + register(1240, "{Name:'minecraft:stone_button',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'down',powered:'true'}}"); + register(1241, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'east',powered:'true'}}"); + register(1242, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'west',powered:'true'}}"); + register(1243, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'south',powered:'true'}}"); + register(1244, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'north',powered:'true'}}"); + register(1245, "{Name:'minecraft:stone_button',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'up',powered:'true'}}"); + register(1248, "{Name:'minecraft:snow',Properties:{layers:'1'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'1'}}"); + register(1249, "{Name:'minecraft:snow',Properties:{layers:'2'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'2'}}"); + register(1250, "{Name:'minecraft:snow',Properties:{layers:'3'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'3'}}"); + register(1251, "{Name:'minecraft:snow',Properties:{layers:'4'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'4'}}"); + register(1252, "{Name:'minecraft:snow',Properties:{layers:'5'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'5'}}"); + register(1253, "{Name:'minecraft:snow',Properties:{layers:'6'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'6'}}"); + register(1254, "{Name:'minecraft:snow',Properties:{layers:'7'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'7'}}"); + register(1255, "{Name:'minecraft:snow',Properties:{layers:'8'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'8'}}"); + register(1264, "{Name:'minecraft:ice'}", "{Name:'minecraft:ice'}"); + register(1280, "{Name:'minecraft:snow_block'}", "{Name:'minecraft:snow'}"); + register(1296, "{Name:'minecraft:cactus',Properties:{age:'0'}}", "{Name:'minecraft:cactus',Properties:{age:'0'}}"); + register(1297, "{Name:'minecraft:cactus',Properties:{age:'1'}}", "{Name:'minecraft:cactus',Properties:{age:'1'}}"); + register(1298, "{Name:'minecraft:cactus',Properties:{age:'2'}}", "{Name:'minecraft:cactus',Properties:{age:'2'}}"); + register(1299, "{Name:'minecraft:cactus',Properties:{age:'3'}}", "{Name:'minecraft:cactus',Properties:{age:'3'}}"); + register(1300, "{Name:'minecraft:cactus',Properties:{age:'4'}}", "{Name:'minecraft:cactus',Properties:{age:'4'}}"); + register(1301, "{Name:'minecraft:cactus',Properties:{age:'5'}}", "{Name:'minecraft:cactus',Properties:{age:'5'}}"); + register(1302, "{Name:'minecraft:cactus',Properties:{age:'6'}}", "{Name:'minecraft:cactus',Properties:{age:'6'}}"); + register(1303, "{Name:'minecraft:cactus',Properties:{age:'7'}}", "{Name:'minecraft:cactus',Properties:{age:'7'}}"); + register(1304, "{Name:'minecraft:cactus',Properties:{age:'8'}}", "{Name:'minecraft:cactus',Properties:{age:'8'}}"); + register(1305, "{Name:'minecraft:cactus',Properties:{age:'9'}}", "{Name:'minecraft:cactus',Properties:{age:'9'}}"); + register(1306, "{Name:'minecraft:cactus',Properties:{age:'10'}}", "{Name:'minecraft:cactus',Properties:{age:'10'}}"); + register(1307, "{Name:'minecraft:cactus',Properties:{age:'11'}}", "{Name:'minecraft:cactus',Properties:{age:'11'}}"); + register(1308, "{Name:'minecraft:cactus',Properties:{age:'12'}}", "{Name:'minecraft:cactus',Properties:{age:'12'}}"); + register(1309, "{Name:'minecraft:cactus',Properties:{age:'13'}}", "{Name:'minecraft:cactus',Properties:{age:'13'}}"); + register(1310, "{Name:'minecraft:cactus',Properties:{age:'14'}}", "{Name:'minecraft:cactus',Properties:{age:'14'}}"); + register(1311, "{Name:'minecraft:cactus',Properties:{age:'15'}}", "{Name:'minecraft:cactus',Properties:{age:'15'}}"); + register(1312, "{Name:'minecraft:clay'}", "{Name:'minecraft:clay'}"); + register(1328, "{Name:'minecraft:sugar_cane',Properties:{age:'0'}}", "{Name:'minecraft:reeds',Properties:{age:'0'}}"); + register(1329, "{Name:'minecraft:sugar_cane',Properties:{age:'1'}}", "{Name:'minecraft:reeds',Properties:{age:'1'}}"); + register(1330, "{Name:'minecraft:sugar_cane',Properties:{age:'2'}}", "{Name:'minecraft:reeds',Properties:{age:'2'}}"); + register(1331, "{Name:'minecraft:sugar_cane',Properties:{age:'3'}}", "{Name:'minecraft:reeds',Properties:{age:'3'}}"); + register(1332, "{Name:'minecraft:sugar_cane',Properties:{age:'4'}}", "{Name:'minecraft:reeds',Properties:{age:'4'}}"); + register(1333, "{Name:'minecraft:sugar_cane',Properties:{age:'5'}}", "{Name:'minecraft:reeds',Properties:{age:'5'}}"); + register(1334, "{Name:'minecraft:sugar_cane',Properties:{age:'6'}}", "{Name:'minecraft:reeds',Properties:{age:'6'}}"); + register(1335, "{Name:'minecraft:sugar_cane',Properties:{age:'7'}}", "{Name:'minecraft:reeds',Properties:{age:'7'}}"); + register(1336, "{Name:'minecraft:sugar_cane',Properties:{age:'8'}}", "{Name:'minecraft:reeds',Properties:{age:'8'}}"); + register(1337, "{Name:'minecraft:sugar_cane',Properties:{age:'9'}}", "{Name:'minecraft:reeds',Properties:{age:'9'}}"); + register(1338, "{Name:'minecraft:sugar_cane',Properties:{age:'10'}}", "{Name:'minecraft:reeds',Properties:{age:'10'}}"); + register(1339, "{Name:'minecraft:sugar_cane',Properties:{age:'11'}}", "{Name:'minecraft:reeds',Properties:{age:'11'}}"); + register(1340, "{Name:'minecraft:sugar_cane',Properties:{age:'12'}}", "{Name:'minecraft:reeds',Properties:{age:'12'}}"); + register(1341, "{Name:'minecraft:sugar_cane',Properties:{age:'13'}}", "{Name:'minecraft:reeds',Properties:{age:'13'}}"); + register(1342, "{Name:'minecraft:sugar_cane',Properties:{age:'14'}}", "{Name:'minecraft:reeds',Properties:{age:'14'}}"); + register(1343, "{Name:'minecraft:sugar_cane',Properties:{age:'15'}}", "{Name:'minecraft:reeds',Properties:{age:'15'}}"); + register(1344, "{Name:'minecraft:jukebox',Properties:{has_record:'false'}}", "{Name:'minecraft:jukebox',Properties:{has_record:'false'}}"); + register(1345, "{Name:'minecraft:jukebox',Properties:{has_record:'true'}}", "{Name:'minecraft:jukebox',Properties:{has_record:'true'}}"); + register(1360, "{Name:'minecraft:oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(1376, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'south'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'south'}}"); + register(1377, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'west'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'west'}}"); + register(1378, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'north'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'north'}}"); + register(1379, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'east'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'east'}}"); + register(1392, "{Name:'minecraft:netherrack'}", "{Name:'minecraft:netherrack'}"); + register(1408, "{Name:'minecraft:soul_sand'}", "{Name:'minecraft:soul_sand'}"); + register(1424, "{Name:'minecraft:glowstone'}", "{Name:'minecraft:glowstone'}"); + register(1441, "{Name:'minecraft:portal',Properties:{axis:'x'}}", "{Name:'minecraft:portal',Properties:{axis:'x'}}"); + register(1442, "{Name:'minecraft:portal',Properties:{axis:'z'}}", "{Name:'minecraft:portal',Properties:{axis:'z'}}"); + register(1456, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'south'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'south'}}"); + register(1457, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'west'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'west'}}"); + register(1458, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'north'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'north'}}"); + register(1459, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'east'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'east'}}"); + register(1472, "{Name:'minecraft:cake',Properties:{bites:'0'}}", "{Name:'minecraft:cake',Properties:{bites:'0'}}"); + register(1473, "{Name:'minecraft:cake',Properties:{bites:'1'}}", "{Name:'minecraft:cake',Properties:{bites:'1'}}"); + register(1474, "{Name:'minecraft:cake',Properties:{bites:'2'}}", "{Name:'minecraft:cake',Properties:{bites:'2'}}"); + register(1475, "{Name:'minecraft:cake',Properties:{bites:'3'}}", "{Name:'minecraft:cake',Properties:{bites:'3'}}"); + register(1476, "{Name:'minecraft:cake',Properties:{bites:'4'}}", "{Name:'minecraft:cake',Properties:{bites:'4'}}"); + register(1477, "{Name:'minecraft:cake',Properties:{bites:'5'}}", "{Name:'minecraft:cake',Properties:{bites:'5'}}"); + register(1478, "{Name:'minecraft:cake',Properties:{bites:'6'}}", "{Name:'minecraft:cake',Properties:{bites:'6'}}"); + register(1488, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'south',locked:'true'}}"); + register(1489, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'west',locked:'true'}}"); + register(1490, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'north',locked:'true'}}"); + register(1491, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'east',locked:'true'}}"); + register(1492, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'south',locked:'true'}}"); + register(1493, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'west',locked:'true'}}"); + register(1494, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'north',locked:'true'}}"); + register(1495, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'east',locked:'true'}}"); + register(1496, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'south',locked:'true'}}"); + register(1497, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'west',locked:'true'}}"); + register(1498, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'north',locked:'true'}}"); + register(1499, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'east',locked:'true'}}"); + register(1500, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'south',locked:'true'}}"); + register(1501, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'west',locked:'true'}}"); + register(1502, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'north',locked:'true'}}"); + register(1503, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'east',locked:'true'}}"); + register(1504, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'south',locked:'true'}}"); + register(1505, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'west',locked:'true'}}"); + register(1506, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'north',locked:'true'}}"); + register(1507, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'east',locked:'true'}}"); + register(1508, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'south',locked:'true'}}"); + register(1509, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'west',locked:'true'}}"); + register(1510, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'north',locked:'true'}}"); + register(1511, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'east',locked:'true'}}"); + register(1512, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'south',locked:'true'}}"); + register(1513, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'west',locked:'true'}}"); + register(1514, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'north',locked:'true'}}"); + register(1515, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'east',locked:'true'}}"); + register(1516, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'south',locked:'true'}}"); + register(1517, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'west',locked:'true'}}"); + register(1518, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'north',locked:'true'}}"); + register(1519, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'east',locked:'true'}}"); + register(1520, "{Name:'minecraft:white_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'white'}}"); + register(1521, "{Name:'minecraft:orange_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'orange'}}"); + register(1522, "{Name:'minecraft:magenta_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'magenta'}}"); + register(1523, "{Name:'minecraft:light_blue_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'light_blue'}}"); + register(1524, "{Name:'minecraft:yellow_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'yellow'}}"); + register(1525, "{Name:'minecraft:lime_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'lime'}}"); + register(1526, "{Name:'minecraft:pink_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'pink'}}"); + register(1527, "{Name:'minecraft:gray_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'gray'}}"); + register(1528, "{Name:'minecraft:light_gray_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'silver'}}"); + register(1529, "{Name:'minecraft:cyan_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'cyan'}}"); + register(1530, "{Name:'minecraft:purple_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'purple'}}"); + register(1531, "{Name:'minecraft:blue_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'blue'}}"); + register(1532, "{Name:'minecraft:brown_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'brown'}}"); + register(1533, "{Name:'minecraft:green_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'green'}}"); + register(1534, "{Name:'minecraft:red_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'red'}}"); + register(1535, "{Name:'minecraft:black_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'black'}}"); + register(1536, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}"); + register(1537, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}"); + register(1538, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}"); + register(1539, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}"); + register(1540, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}"); + register(1541, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}"); + register(1542, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}"); + register(1543, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}"); + register(1544, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'top',open:'false'}}"); + register(1545, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'top',open:'false'}}"); + register(1546, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'top',open:'false'}}"); + register(1547, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'top',open:'false'}}"); + register(1548, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'top',open:'true'}}"); + register(1549, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'top',open:'true'}}"); + register(1550, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'top',open:'true'}}"); + register(1551, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'top',open:'true'}}"); + register(1552, "{Name:'minecraft:infested_stone'}", "{Name:'minecraft:monster_egg',Properties:{variant:'stone'}}"); + register(1553, "{Name:'minecraft:infested_cobblestone'}", "{Name:'minecraft:monster_egg',Properties:{variant:'cobblestone'}}"); + register(1554, "{Name:'minecraft:infested_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'stone_brick'}}"); + register(1555, "{Name:'minecraft:infested_mossy_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'mossy_brick'}}"); + register(1556, "{Name:'minecraft:infested_cracked_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'cracked_brick'}}"); + register(1557, "{Name:'minecraft:infested_chiseled_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'chiseled_brick'}}"); + register(1568, "{Name:'minecraft:stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'stonebrick'}}"); + register(1569, "{Name:'minecraft:mossy_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'mossy_stonebrick'}}"); + register(1570, "{Name:'minecraft:cracked_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'cracked_stonebrick'}}"); + register(1571, "{Name:'minecraft:chiseled_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'chiseled_stonebrick'}}"); + register(1584, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_inside'}}"); + register(1585, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north_west'}}"); + register(1586, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north'}}"); + register(1587, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north_east'}}"); + register(1588, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'west'}}"); + register(1589, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'center'}}"); + register(1590, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'east'}}"); + register(1591, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south_west'}}"); + register(1592, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south'}}"); + register(1593, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'true',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south_east'}}"); + register(1594, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'false',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'stem'}}"); + register(1595, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1596, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1597, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1598, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_outside'}}"); + register(1599, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_stem'}}"); + register(1600, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_inside'}}"); + register(1601, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north_west'}}"); + register(1602, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north'}}"); + register(1603, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north_east'}}"); + register(1604, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'west'}}"); + register(1605, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'center'}}"); + register(1606, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'east'}}"); + register(1607, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south_west'}}"); + register(1608, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south'}}"); + register(1609, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'true',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south_east'}}"); + register(1610, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'false',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'stem'}}"); + register(1611, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1612, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1613, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1614, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_outside'}}"); + register(1615, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_stem'}}"); + register(1616, "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(1632, "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(1648, "{Name:'minecraft:melon_block'}", "{Name:'minecraft:melon_block'}"); + register(1664, "{Name:'minecraft:pumpkin_stem',Properties:{age:'0'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'west'}}"); + register(1665, "{Name:'minecraft:pumpkin_stem',Properties:{age:'1'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'west'}}"); + register(1666, "{Name:'minecraft:pumpkin_stem',Properties:{age:'2'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'west'}}"); + register(1667, "{Name:'minecraft:pumpkin_stem',Properties:{age:'3'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'west'}}"); + register(1668, "{Name:'minecraft:pumpkin_stem',Properties:{age:'4'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'west'}}"); + register(1669, "{Name:'minecraft:pumpkin_stem',Properties:{age:'5'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'west'}}"); + register(1670, "{Name:'minecraft:pumpkin_stem',Properties:{age:'6'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'west'}}"); + register(1671, "{Name:'minecraft:pumpkin_stem',Properties:{age:'7'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'west'}}"); + register(1680, "{Name:'minecraft:melon_stem',Properties:{age:'0'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'west'}}"); + register(1681, "{Name:'minecraft:melon_stem',Properties:{age:'1'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'west'}}"); + register(1682, "{Name:'minecraft:melon_stem',Properties:{age:'2'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'west'}}"); + register(1683, "{Name:'minecraft:melon_stem',Properties:{age:'3'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'west'}}"); + register(1684, "{Name:'minecraft:melon_stem',Properties:{age:'4'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'west'}}"); + register(1685, "{Name:'minecraft:melon_stem',Properties:{age:'5'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'west'}}"); + register(1686, "{Name:'minecraft:melon_stem',Properties:{age:'6'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'west'}}"); + register(1687, "{Name:'minecraft:melon_stem',Properties:{age:'7'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'west'}}"); + register(1696, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'false'}}"); + register(1697, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'false'}}"); + register(1698, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'true'}}"); + register(1699, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'true'}}"); + register(1700, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'false'}}"); + register(1701, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'false'}}"); + register(1702, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'true'}}"); + register(1703, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'true'}}"); + register(1704, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'false'}}"); + register(1705, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'false'}}"); + register(1706, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'true'}}"); + register(1707, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'true'}}"); + register(1708, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'false'}}"); + register(1709, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'false'}}"); + register(1710, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'true'}}"); + register(1711, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(1712, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(1713, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(1714, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(1715, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(1716, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(1717, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(1718, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(1719, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(1720, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(1721, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(1722, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(1723, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(1724, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(1725, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(1726, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(1727, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(1728, "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(1729, "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(1730, "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(1731, "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(1732, "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(1733, "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(1734, "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(1735, "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(1744, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(1745, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(1746, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(1747, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(1748, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(1749, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(1750, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(1751, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(1760, "{Name:'minecraft:mycelium',Properties:{snowy:'false'}}", "{Name:'minecraft:mycelium',Properties:{snowy:'false'}}", "{Name:'minecraft:mycelium',Properties:{snowy:'true'}}"); + register(1776, "{Name:'minecraft:lily_pad'}", "{Name:'minecraft:waterlily'}"); + register(1792, "{Name:'minecraft:nether_bricks'}", "{Name:'minecraft:nether_brick'}"); + register(1808, "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(1824, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(1825, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(1826, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(1827, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(1828, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(1829, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(1830, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(1831, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(1840, "{Name:'minecraft:nether_wart',Properties:{age:'0'}}", "{Name:'minecraft:nether_wart',Properties:{age:'0'}}"); + register(1841, "{Name:'minecraft:nether_wart',Properties:{age:'1'}}", "{Name:'minecraft:nether_wart',Properties:{age:'1'}}"); + register(1842, "{Name:'minecraft:nether_wart',Properties:{age:'2'}}", "{Name:'minecraft:nether_wart',Properties:{age:'2'}}"); + register(1843, "{Name:'minecraft:nether_wart',Properties:{age:'3'}}", "{Name:'minecraft:nether_wart',Properties:{age:'3'}}"); + register(1856, "{Name:'minecraft:enchanting_table'}", "{Name:'minecraft:enchanting_table'}"); + register(1872, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'false'}}"); + register(1873, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'false'}}"); + register(1874, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'false'}}"); + register(1875, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'false'}}"); + register(1876, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'true'}}"); + register(1877, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'true'}}"); + register(1878, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'true'}}"); + register(1879, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'true'}}"); + register(1888, "{Name:'minecraft:cauldron',Properties:{level:'0'}}", "{Name:'minecraft:cauldron',Properties:{level:'0'}}"); + register(1889, "{Name:'minecraft:cauldron',Properties:{level:'1'}}", "{Name:'minecraft:cauldron',Properties:{level:'1'}}"); + register(1890, "{Name:'minecraft:cauldron',Properties:{level:'2'}}", "{Name:'minecraft:cauldron',Properties:{level:'2'}}"); + register(1891, "{Name:'minecraft:cauldron',Properties:{level:'3'}}", "{Name:'minecraft:cauldron',Properties:{level:'3'}}"); + register(1904, "{Name:'minecraft:end_portal'}", "{Name:'minecraft:end_portal'}"); + register(1920, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'south'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'south'}}"); + register(1921, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'west'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'west'}}"); + register(1922, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'north'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'north'}}"); + register(1923, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'east'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'east'}}"); + register(1924, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'south'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'south'}}"); + register(1925, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'west'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'west'}}"); + register(1926, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'north'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'north'}}"); + register(1927, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'east'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'east'}}"); + register(1936, "{Name:'minecraft:end_stone'}", "{Name:'minecraft:end_stone'}"); + register(1952, "{Name:'minecraft:dragon_egg'}", "{Name:'minecraft:dragon_egg'}"); + register(1968, "{Name:'minecraft:redstone_lamp',Properties:{lit:'false'}}", "{Name:'minecraft:redstone_lamp'}"); + register(1984, "{Name:'minecraft:redstone_lamp',Properties:{lit:'true'}}", "{Name:'minecraft:lit_redstone_lamp'}"); + register(2000, "{Name:'minecraft:oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'oak'}}"); + register(2001, "{Name:'minecraft:spruce_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'spruce'}}"); + register(2002, "{Name:'minecraft:birch_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'birch'}}"); + register(2003, "{Name:'minecraft:jungle_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'jungle'}}"); + register(2004, "{Name:'minecraft:acacia_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'acacia'}}"); + register(2005, "{Name:'minecraft:dark_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'dark_oak'}}"); + register(2016, "{Name:'minecraft:oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'oak'}}"); + register(2017, "{Name:'minecraft:spruce_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'spruce'}}"); + register(2018, "{Name:'minecraft:birch_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'birch'}}"); + register(2019, "{Name:'minecraft:jungle_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'jungle'}}"); + register(2020, "{Name:'minecraft:acacia_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'acacia'}}"); + register(2021, "{Name:'minecraft:dark_oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'dark_oak'}}"); + register(2024, "{Name:'minecraft:oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'oak'}}"); + register(2025, "{Name:'minecraft:spruce_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'spruce'}}"); + register(2026, "{Name:'minecraft:birch_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'birch'}}"); + register(2027, "{Name:'minecraft:jungle_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'jungle'}}"); + register(2028, "{Name:'minecraft:acacia_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'acacia'}}"); + register(2029, "{Name:'minecraft:dark_oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'dark_oak'}}"); + register(2032, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'south'}}"); + register(2033, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'west'}}"); + register(2034, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'north'}}"); + register(2035, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'east'}}"); + register(2036, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'south'}}"); + register(2037, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'west'}}"); + register(2038, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'north'}}"); + register(2039, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'east'}}"); + register(2040, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'south'}}"); + register(2041, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'west'}}"); + register(2042, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'north'}}"); + register(2043, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'east'}}"); + register(2048, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2049, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2050, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2051, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2052, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2053, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2054, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2055, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2064, "{Name:'minecraft:emerald_ore'}", "{Name:'minecraft:emerald_ore'}"); + register(2082, "{Name:'minecraft:ender_chest',Properties:{facing:'north'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'north'}}"); + register(2083, "{Name:'minecraft:ender_chest',Properties:{facing:'south'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'south'}}"); + register(2084, "{Name:'minecraft:ender_chest',Properties:{facing:'west'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'west'}}"); + register(2085, "{Name:'minecraft:ender_chest',Properties:{facing:'east'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'east'}}"); + register(2096, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'false'}}"); + register(2097, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'false'}}"); + register(2098, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'false'}}"); + register(2099, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'false'}}"); + register(2100, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'false'}}"); + register(2101, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'false'}}"); + register(2102, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'false'}}"); + register(2103, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'false'}}"); + register(2104, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'true'}}"); + register(2105, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'true'}}"); + register(2106, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'true'}}"); + register(2107, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'true'}}"); + register(2108, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'true'}}"); + register(2109, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'true'}}"); + register(2110, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'true'}}"); + register(2111, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'true'}}"); + register(2112, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'true'}}"); + register(2113, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'true'}}"); + register(2114, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}"); + register(2115, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}"); + register(2116, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'true'}}"); + register(2117, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'true'}}"); + register(2118, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}"); + register(2119, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}"); + register(2120, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'true'}}"); + register(2121, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'true'}}"); + register(2122, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}"); + register(2123, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}"); + register(2124, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'true'}}"); + register(2125, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'true'}}"); + register(2126, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}"); + register(2128, "{Name:'minecraft:emerald_block'}", "{Name:'minecraft:emerald_block'}"); + register(2144, "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2145, "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2146, "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2147, "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2148, "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2149, "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2150, "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2151, "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2160, "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2161, "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2162, "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2163, "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2164, "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2165, "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2166, "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2167, "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2176, "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2177, "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2178, "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2179, "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2180, "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2181, "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2182, "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2183, "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2192, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'down'}}"); + register(2193, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'up'}}"); + register(2194, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'north'}}"); + register(2195, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'south'}}"); + register(2196, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'west'}}"); + register(2197, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'east'}}"); + register(2200, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'down'}}"); + register(2201, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'up'}}"); + register(2202, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'north'}}"); + register(2203, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'south'}}"); + register(2204, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'west'}}"); + register(2205, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'east'}}"); + register(2208, "{Name:'minecraft:beacon'}", "{Name:'minecraft:beacon'}"); + register(2224, "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'cobblestone',west:'true'}}"); + register(2225, "{Name:'minecraft:mossy_cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}"); + // There are a few changes made to flower pot here, notably handling how legacy data is handled. + // The TE itself should contain the target item and from there the proper state can be determined. However, there are + // blocks that do not contain a TE. So we need to make sure there is a default to fall on. + // I simply followed the legacy handling from BlockFlowerPot from 1.8.8 to find what legacy data mapped to what. + // It's better than defaulting everything to a cactus. + register(2240, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'0'}}"); + register(2241, "{Name:'minecraft:potted_poppy'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'1'}}"); + register(2242, "{Name:'minecraft:potted_dandelion'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'2'}}"); + register(2243, "{Name:'minecraft:potted_oak_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'3'}}"); + register(2244, "{Name:'minecraft:potted_spruce_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'4'}}"); + register(2245, "{Name:'minecraft:potted_birch_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'5'}}"); + register(2246, "{Name:'minecraft:potted_jungle_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'6'}}"); + register(2247, "{Name:'minecraft:potted_red_mushroom'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'7'}}"); + register(2248, "{Name:'minecraft:potted_brown_mushroom'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'8'}}"); + register(2249, "{Name:'minecraft:potted_cactus'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'9'}}"); + register(2250, "{Name:'minecraft:potted_dead_bush'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'10'}}"); + register(2251, "{Name:'minecraft:potted_fern'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'11'}}"); + register(2252, "{Name:'minecraft:potted_acacia_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'12'}}"); + register(2253, "{Name:'minecraft:potted_dark_oak_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'13'}}"); + register(2254, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'14'}}"); + register(2255, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'15'}}"); + register(2256, "{Name:'minecraft:carrots',Properties:{age:'0'}}", "{Name:'minecraft:carrots',Properties:{age:'0'}}"); + register(2257, "{Name:'minecraft:carrots',Properties:{age:'1'}}", "{Name:'minecraft:carrots',Properties:{age:'1'}}"); + register(2258, "{Name:'minecraft:carrots',Properties:{age:'2'}}", "{Name:'minecraft:carrots',Properties:{age:'2'}}"); + register(2259, "{Name:'minecraft:carrots',Properties:{age:'3'}}", "{Name:'minecraft:carrots',Properties:{age:'3'}}"); + register(2260, "{Name:'minecraft:carrots',Properties:{age:'4'}}", "{Name:'minecraft:carrots',Properties:{age:'4'}}"); + register(2261, "{Name:'minecraft:carrots',Properties:{age:'5'}}", "{Name:'minecraft:carrots',Properties:{age:'5'}}"); + register(2262, "{Name:'minecraft:carrots',Properties:{age:'6'}}", "{Name:'minecraft:carrots',Properties:{age:'6'}}"); + register(2263, "{Name:'minecraft:carrots',Properties:{age:'7'}}", "{Name:'minecraft:carrots',Properties:{age:'7'}}"); + register(2272, "{Name:'minecraft:potatoes',Properties:{age:'0'}}", "{Name:'minecraft:potatoes',Properties:{age:'0'}}"); + register(2273, "{Name:'minecraft:potatoes',Properties:{age:'1'}}", "{Name:'minecraft:potatoes',Properties:{age:'1'}}"); + register(2274, "{Name:'minecraft:potatoes',Properties:{age:'2'}}", "{Name:'minecraft:potatoes',Properties:{age:'2'}}"); + register(2275, "{Name:'minecraft:potatoes',Properties:{age:'3'}}", "{Name:'minecraft:potatoes',Properties:{age:'3'}}"); + register(2276, "{Name:'minecraft:potatoes',Properties:{age:'4'}}", "{Name:'minecraft:potatoes',Properties:{age:'4'}}"); + register(2277, "{Name:'minecraft:potatoes',Properties:{age:'5'}}", "{Name:'minecraft:potatoes',Properties:{age:'5'}}"); + register(2278, "{Name:'minecraft:potatoes',Properties:{age:'6'}}", "{Name:'minecraft:potatoes',Properties:{age:'6'}}"); + register(2279, "{Name:'minecraft:potatoes',Properties:{age:'7'}}", "{Name:'minecraft:potatoes',Properties:{age:'7'}}"); + register(2288, "{Name:'minecraft:oak_button',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'down',powered:'false'}}"); + register(2289, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'east',powered:'false'}}"); + register(2290, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'west',powered:'false'}}"); + register(2291, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'south',powered:'false'}}"); + register(2292, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'north',powered:'false'}}"); + register(2293, "{Name:'minecraft:oak_button',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'up',powered:'false'}}"); + register(2296, "{Name:'minecraft:oak_button',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'down',powered:'true'}}"); + register(2297, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'east',powered:'true'}}"); + register(2298, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'west',powered:'true'}}"); + register(2299, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'south',powered:'true'}}"); + register(2300, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'north',powered:'true'}}"); + register(2301, "{Name:'minecraft:oak_button',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'up',powered:'true'}}"); + register(2304, "{Name:'%%FILTER_ME%%',Properties:{facing:'down',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'down',nodrop:'false'}}"); + register(2305, "{Name:'%%FILTER_ME%%',Properties:{facing:'up',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'up',nodrop:'false'}}"); + register(2306, "{Name:'%%FILTER_ME%%',Properties:{facing:'north',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'north',nodrop:'false'}}"); + register(2307, "{Name:'%%FILTER_ME%%',Properties:{facing:'south',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'south',nodrop:'false'}}"); + register(2308, "{Name:'%%FILTER_ME%%',Properties:{facing:'west',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'west',nodrop:'false'}}"); + register(2309, "{Name:'%%FILTER_ME%%',Properties:{facing:'east',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'east',nodrop:'false'}}"); + register(2312, "{Name:'%%FILTER_ME%%',Properties:{facing:'down',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'down',nodrop:'true'}}"); + register(2313, "{Name:'%%FILTER_ME%%',Properties:{facing:'up',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'up',nodrop:'true'}}"); + register(2314, "{Name:'%%FILTER_ME%%',Properties:{facing:'north',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'north',nodrop:'true'}}"); + register(2315, "{Name:'%%FILTER_ME%%',Properties:{facing:'south',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'south',nodrop:'true'}}"); + register(2316, "{Name:'%%FILTER_ME%%',Properties:{facing:'west',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'west',nodrop:'true'}}"); + register(2317, "{Name:'%%FILTER_ME%%',Properties:{facing:'east',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'east',nodrop:'true'}}"); + register(2320, "{Name:'minecraft:anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'south'}}"); + register(2321, "{Name:'minecraft:anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'west'}}"); + register(2322, "{Name:'minecraft:anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'north'}}"); + register(2323, "{Name:'minecraft:anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'east'}}"); + register(2324, "{Name:'minecraft:chipped_anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'south'}}"); + register(2325, "{Name:'minecraft:chipped_anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'west'}}"); + register(2326, "{Name:'minecraft:chipped_anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'north'}}"); + register(2327, "{Name:'minecraft:chipped_anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'east'}}"); + register(2328, "{Name:'minecraft:damaged_anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'south'}}"); + register(2329, "{Name:'minecraft:damaged_anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'west'}}"); + register(2330, "{Name:'minecraft:damaged_anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'north'}}"); + register(2331, "{Name:'minecraft:damaged_anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'east'}}"); + register(2338, "{Name:'minecraft:trapped_chest',Properties:{facing:'north',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'north'}}"); + register(2339, "{Name:'minecraft:trapped_chest',Properties:{facing:'south',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'south'}}"); + register(2340, "{Name:'minecraft:trapped_chest',Properties:{facing:'west',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'west'}}"); + register(2341, "{Name:'minecraft:trapped_chest',Properties:{facing:'east',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'east'}}"); + register(2352, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'0'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'0'}}"); + register(2353, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'1'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'1'}}"); + register(2354, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'2'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'2'}}"); + register(2355, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'3'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'3'}}"); + register(2356, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'4'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'4'}}"); + register(2357, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'5'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'5'}}"); + register(2358, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'6'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'6'}}"); + register(2359, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'7'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'7'}}"); + register(2360, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'8'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'8'}}"); + register(2361, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'9'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'9'}}"); + register(2362, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'10'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'10'}}"); + register(2363, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'11'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'11'}}"); + register(2364, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'12'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'12'}}"); + register(2365, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'13'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'13'}}"); + register(2366, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'14'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'14'}}"); + register(2367, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'15'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'15'}}"); + register(2368, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'0'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'0'}}"); + register(2369, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'1'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'1'}}"); + register(2370, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'2'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'2'}}"); + register(2371, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'3'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'3'}}"); + register(2372, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'4'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'4'}}"); + register(2373, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'5'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'5'}}"); + register(2374, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'6'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'6'}}"); + register(2375, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'7'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'7'}}"); + register(2376, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'8'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'8'}}"); + register(2377, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'9'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'9'}}"); + register(2378, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'10'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'10'}}"); + register(2379, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'11'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'11'}}"); + register(2380, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'12'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'12'}}"); + register(2381, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'13'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'13'}}"); + register(2382, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'14'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'14'}}"); + register(2383, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'15'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'15'}}"); + register(2384, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}"); + register(2385, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}"); + register(2386, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}"); + register(2387, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}"); + register(2388, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}"); + register(2389, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}"); + register(2390, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}"); + register(2391, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}"); + register(2392, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}"); + register(2393, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}"); + register(2394, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}"); + register(2395, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}"); + register(2396, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}"); + register(2397, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}"); + register(2398, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}"); + register(2399, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}"); + register(2400, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}"); + register(2401, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}"); + register(2402, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}"); + register(2403, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}"); + register(2404, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}"); + register(2405, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}"); + register(2406, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}"); + register(2407, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}"); + register(2408, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}"); + register(2409, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}"); + register(2410, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}"); + register(2411, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}"); + register(2412, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}"); + register(2413, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}"); + register(2414, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}"); + register(2415, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}"); + register(2416, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'0'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'0'}}"); + register(2417, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'1'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'1'}}"); + register(2418, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'2'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'2'}}"); + register(2419, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'3'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'3'}}"); + register(2420, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'4'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'4'}}"); + register(2421, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'5'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'5'}}"); + register(2422, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'6'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'6'}}"); + register(2423, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'7'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'7'}}"); + register(2424, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'8'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'8'}}"); + register(2425, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'9'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'9'}}"); + register(2426, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'10'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'10'}}"); + register(2427, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'11'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'11'}}"); + register(2428, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'12'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'12'}}"); + register(2429, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'13'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'13'}}"); + register(2430, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'14'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'14'}}"); + register(2431, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'15'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'15'}}"); + register(2432, "{Name:'minecraft:redstone_block'}", "{Name:'minecraft:redstone_block'}"); + register(2448, "{Name:'minecraft:nether_quartz_ore'}", "{Name:'minecraft:quartz_ore'}"); + register(2464, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'down'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'down'}}"); + register(2466, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'north'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'north'}}"); + register(2467, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'south'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'south'}}"); + register(2468, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'west'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'west'}}"); + register(2469, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'east'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'east'}}"); + register(2472, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'down'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'down'}}"); + register(2474, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'north'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'north'}}"); + register(2475, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'south'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'south'}}"); + register(2476, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'west'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'west'}}"); + register(2477, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'east'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'east'}}"); + register(2480, "{Name:'minecraft:quartz_block'}", "{Name:'minecraft:quartz_block',Properties:{variant:'default'}}"); + register(2481, "{Name:'minecraft:chiseled_quartz_block'}", "{Name:'minecraft:quartz_block',Properties:{variant:'chiseled'}}"); + register(2482, "{Name:'minecraft:quartz_pillar',Properties:{axis:'y'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_y'}}"); + register(2483, "{Name:'minecraft:quartz_pillar',Properties:{axis:'x'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_x'}}"); + register(2484, "{Name:'minecraft:quartz_pillar',Properties:{axis:'z'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_z'}}"); + register(2496, "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2497, "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2498, "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2499, "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2500, "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2501, "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2502, "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2503, "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2512, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'north_south'}}"); + register(2513, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'east_west'}}"); + register(2514, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_east'}}"); + register(2515, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_west'}}"); + register(2516, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_north'}}"); + register(2517, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_south'}}"); + register(2520, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'north_south'}}"); + register(2521, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'east_west'}}"); + register(2522, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_east'}}"); + register(2523, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_west'}}"); + register(2524, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_north'}}"); + register(2525, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_south'}}"); + register(2528, "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'false'}}"); + register(2529, "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'false'}}"); + register(2530, "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'false'}}"); + register(2531, "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'false'}}"); + register(2532, "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'false'}}"); + register(2533, "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'false'}}"); + register(2536, "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'true'}}"); + register(2537, "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'true'}}"); + register(2538, "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'true'}}"); + register(2539, "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'true'}}"); + register(2540, "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'true'}}"); + register(2541, "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'true'}}"); + register(2544, "{Name:'minecraft:white_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'white'}}"); + register(2545, "{Name:'minecraft:orange_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'orange'}}"); + register(2546, "{Name:'minecraft:magenta_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'magenta'}}"); + register(2547, "{Name:'minecraft:light_blue_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'light_blue'}}"); + register(2548, "{Name:'minecraft:yellow_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'yellow'}}"); + register(2549, "{Name:'minecraft:lime_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'lime'}}"); + register(2550, "{Name:'minecraft:pink_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'pink'}}"); + register(2551, "{Name:'minecraft:gray_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'gray'}}"); + register(2552, "{Name:'minecraft:light_gray_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'silver'}}"); + register(2553, "{Name:'minecraft:cyan_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'cyan'}}"); + register(2554, "{Name:'minecraft:purple_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'purple'}}"); + register(2555, "{Name:'minecraft:blue_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'blue'}}"); + register(2556, "{Name:'minecraft:brown_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'brown'}}"); + register(2557, "{Name:'minecraft:green_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'green'}}"); + register(2558, "{Name:'minecraft:red_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'red'}}"); + register(2559, "{Name:'minecraft:black_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'black'}}"); + register(2560, "{Name:'minecraft:white_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'true',west:'true'}}"); + register(2561, "{Name:'minecraft:orange_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'true',west:'true'}}"); + register(2562, "{Name:'minecraft:magenta_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'true',west:'true'}}"); + register(2563, "{Name:'minecraft:light_blue_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'true',west:'true'}}"); + register(2564, "{Name:'minecraft:yellow_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'true',west:'true'}}"); + register(2565, "{Name:'minecraft:lime_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'true',west:'true'}}"); + register(2566, "{Name:'minecraft:pink_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'true',west:'true'}}"); + register(2567, "{Name:'minecraft:gray_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'true',west:'true'}}"); + register(2568, "{Name:'minecraft:light_gray_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'true',west:'true'}}"); + register(2569, "{Name:'minecraft:cyan_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'true',west:'true'}}"); + register(2570, "{Name:'minecraft:purple_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'true',west:'true'}}"); + register(2571, "{Name:'minecraft:blue_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'true',west:'true'}}"); + register(2572, "{Name:'minecraft:brown_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'true',west:'true'}}"); + register(2573, "{Name:'minecraft:green_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'true',west:'true'}}"); + register(2574, "{Name:'minecraft:red_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'true',west:'true'}}"); + register(2575, "{Name:'minecraft:black_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'true',west:'true'}}"); + register(2576, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'true',variant:'acacia'}}"); + register(2577, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'true',variant:'dark_oak'}}"); + register(2580, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'false',variant:'acacia'}}"); + register(2581, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'false',variant:'dark_oak'}}"); + register(2584, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'true',variant:'acacia'}}"); + register(2585, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'true',variant:'dark_oak'}}"); + register(2588, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'false',variant:'acacia'}}"); + register(2589, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'false',variant:'dark_oak'}}"); + register(2592, "{Name:'minecraft:acacia_log',Properties:{axis:'y'}}", "{Name:'minecraft:log2',Properties:{axis:'y',variant:'acacia'}}"); + register(2593, "{Name:'minecraft:dark_oak_log',Properties:{axis:'y'}}", "{Name:'minecraft:log2',Properties:{axis:'y',variant:'dark_oak'}}"); + register(2596, "{Name:'minecraft:acacia_log',Properties:{axis:'x'}}", "{Name:'minecraft:log2',Properties:{axis:'x',variant:'acacia'}}"); + register(2597, "{Name:'minecraft:dark_oak_log',Properties:{axis:'x'}}", "{Name:'minecraft:log2',Properties:{axis:'x',variant:'dark_oak'}}"); + register(2600, "{Name:'minecraft:acacia_log',Properties:{axis:'z'}}", "{Name:'minecraft:log2',Properties:{axis:'z',variant:'acacia'}}"); + register(2601, "{Name:'minecraft:dark_oak_log',Properties:{axis:'z'}}", "{Name:'minecraft:log2',Properties:{axis:'z',variant:'dark_oak'}}"); + register(2604, "{Name:'minecraft:acacia_bark'}", "{Name:'minecraft:log2',Properties:{axis:'none',variant:'acacia'}}"); + register(2605, "{Name:'minecraft:dark_oak_bark'}", "{Name:'minecraft:log2',Properties:{axis:'none',variant:'dark_oak'}}"); + register(2608, "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2609, "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2610, "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2611, "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2612, "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2613, "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2614, "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2615, "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2624, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2625, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2626, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2627, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2628, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2629, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2630, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2631, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2640, "{Name:'minecraft:slime_block'}", "{Name:'minecraft:slime'}"); + register(2656, "{Name:'minecraft:barrier'}", "{Name:'minecraft:barrier'}"); + register(2672, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}"); + register(2673, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}"); + register(2674, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}"); + register(2675, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}"); + register(2676, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}"); + register(2677, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}"); + register(2678, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}"); + register(2679, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}"); + register(2680, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}"); + register(2681, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}"); + register(2682, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}"); + register(2683, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}"); + register(2684, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}"); + register(2685, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}"); + register(2686, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}"); + register(2687, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}"); + register(2688, "{Name:'minecraft:prismarine'}", "{Name:'minecraft:prismarine',Properties:{variant:'prismarine'}}"); + register(2689, "{Name:'minecraft:prismarine_bricks'}", "{Name:'minecraft:prismarine',Properties:{variant:'prismarine_bricks'}}"); + register(2690, "{Name:'minecraft:dark_prismarine'}", "{Name:'minecraft:prismarine',Properties:{variant:'dark_prismarine'}}"); + register(2704, "{Name:'minecraft:sea_lantern'}", "{Name:'minecraft:sea_lantern'}"); + register(2720, "{Name:'minecraft:hay_block',Properties:{axis:'y'}}", "{Name:'minecraft:hay_block',Properties:{axis:'y'}}"); + register(2724, "{Name:'minecraft:hay_block',Properties:{axis:'x'}}", "{Name:'minecraft:hay_block',Properties:{axis:'x'}}"); + register(2728, "{Name:'minecraft:hay_block',Properties:{axis:'z'}}", "{Name:'minecraft:hay_block',Properties:{axis:'z'}}"); + register(2736, "{Name:'minecraft:white_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'white'}}"); + register(2737, "{Name:'minecraft:orange_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'orange'}}"); + register(2738, "{Name:'minecraft:magenta_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'magenta'}}"); + register(2739, "{Name:'minecraft:light_blue_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'light_blue'}}"); + register(2740, "{Name:'minecraft:yellow_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'yellow'}}"); + register(2741, "{Name:'minecraft:lime_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'lime'}}"); + register(2742, "{Name:'minecraft:pink_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'pink'}}"); + register(2743, "{Name:'minecraft:gray_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'gray'}}"); + register(2744, "{Name:'minecraft:light_gray_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'silver'}}"); + register(2745, "{Name:'minecraft:cyan_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'cyan'}}"); + register(2746, "{Name:'minecraft:purple_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'purple'}}"); + register(2747, "{Name:'minecraft:blue_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'blue'}}"); + register(2748, "{Name:'minecraft:brown_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'brown'}}"); + register(2749, "{Name:'minecraft:green_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'green'}}"); + register(2750, "{Name:'minecraft:red_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'red'}}"); + register(2751, "{Name:'minecraft:black_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'black'}}"); + register(2752, "{Name:'minecraft:terracotta'}", "{Name:'minecraft:hardened_clay'}"); + register(2768, "{Name:'minecraft:coal_block'}", "{Name:'minecraft:coal_block'}"); + register(2784, "{Name:'minecraft:packed_ice'}", "{Name:'minecraft:packed_ice'}"); + register(2800, "{Name:'minecraft:sunflower',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'sunflower'}}"); + register(2801, "{Name:'minecraft:lilac',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'syringa'}}"); + register(2802, "{Name:'minecraft:tall_grass',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_grass'}}"); + register(2803, "{Name:'minecraft:large_fern',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_fern'}}"); + register(2804, "{Name:'minecraft:rose_bush',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_rose'}}"); + register(2805, "{Name:'minecraft:peony',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'paeonia'}}"); + register(2808, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'syringa'}}"); + register(2809, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'syringa'}}"); + register(2810, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'syringa'}}"); + register(2811, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'syringa'}}"); + register(2816, "{Name:'minecraft:white_banner',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'0'}}"); + register(2817, "{Name:'minecraft:white_banner',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'1'}}"); + register(2818, "{Name:'minecraft:white_banner',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'2'}}"); + register(2819, "{Name:'minecraft:white_banner',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'3'}}"); + register(2820, "{Name:'minecraft:white_banner',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'4'}}"); + register(2821, "{Name:'minecraft:white_banner',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'5'}}"); + register(2822, "{Name:'minecraft:white_banner',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'6'}}"); + register(2823, "{Name:'minecraft:white_banner',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'7'}}"); + register(2824, "{Name:'minecraft:white_banner',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'8'}}"); + register(2825, "{Name:'minecraft:white_banner',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'9'}}"); + register(2826, "{Name:'minecraft:white_banner',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'10'}}"); + register(2827, "{Name:'minecraft:white_banner',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'11'}}"); + register(2828, "{Name:'minecraft:white_banner',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'12'}}"); + register(2829, "{Name:'minecraft:white_banner',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'13'}}"); + register(2830, "{Name:'minecraft:white_banner',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'14'}}"); + register(2831, "{Name:'minecraft:white_banner',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'15'}}"); + register(2834, "{Name:'minecraft:white_wall_banner',Properties:{facing:'north'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'north'}}"); + register(2835, "{Name:'minecraft:white_wall_banner',Properties:{facing:'south'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'south'}}"); + register(2836, "{Name:'minecraft:white_wall_banner',Properties:{facing:'west'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'west'}}"); + register(2837, "{Name:'minecraft:white_wall_banner',Properties:{facing:'east'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'east'}}"); + register(2848, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'0'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'0'}}"); + register(2849, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'1'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'1'}}"); + register(2850, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'2'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'2'}}"); + register(2851, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'3'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'3'}}"); + register(2852, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'4'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'4'}}"); + register(2853, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'5'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'5'}}"); + register(2854, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'6'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'6'}}"); + register(2855, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'7'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'7'}}"); + register(2856, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'8'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'8'}}"); + register(2857, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'9'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'9'}}"); + register(2858, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'10'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'10'}}"); + register(2859, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'11'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'11'}}"); + register(2860, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'12'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'12'}}"); + register(2861, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'13'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'13'}}"); + register(2862, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'14'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'14'}}"); + register(2863, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'15'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'15'}}"); + register(2864, "{Name:'minecraft:red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'red_sandstone'}}"); + register(2865, "{Name:'minecraft:chiseled_red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'chiseled_red_sandstone'}}"); + register(2866, "{Name:'minecraft:cut_red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'smooth_red_sandstone'}}"); + register(2880, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2881, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2882, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2883, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2884, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2885, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2886, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2887, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2896, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab2',Properties:{seamless:'false',variant:'red_sandstone'}}"); + register(2904, "{Name:'minecraft:smooth_red_sandstone'}", "{Name:'minecraft:double_stone_slab2',Properties:{seamless:'true',variant:'red_sandstone'}}"); + register(2912, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab2',Properties:{half:'bottom',variant:'red_sandstone'}}"); + register(2920, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab2',Properties:{half:'top',variant:'red_sandstone'}}"); + register(2928, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2929, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2930, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2931, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2932, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2933, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2934, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2935, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(2936, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(2937, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(2938, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(2939, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(2940, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(2941, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(2942, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(2943, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(2944, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2945, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2946, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2947, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2948, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2949, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2950, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2951, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(2952, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(2953, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(2954, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(2955, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(2956, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(2957, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(2958, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(2959, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(2960, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2961, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2962, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2963, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2964, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2965, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2966, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2967, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(2968, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(2969, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(2970, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(2971, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(2972, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(2973, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(2974, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(2975, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(2976, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2977, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2978, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2979, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2980, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2981, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2982, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2983, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(2984, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(2985, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(2986, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(2987, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(2988, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(2989, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(2990, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(2991, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(2992, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2993, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2994, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2995, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2996, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2997, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2998, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2999, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(3000, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(3001, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(3002, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(3003, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(3004, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(3005, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(3006, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(3007, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(3008, "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3024, "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3040, "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3056, "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3072, "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3088, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3089, "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3090, "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3091, "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3092, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3093, "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3094, "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3095, "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3096, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3097, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3098, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3099, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3104, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3105, "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3106, "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3107, "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3108, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3109, "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3110, "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3111, "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3112, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3113, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3114, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3115, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3120, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3121, "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3122, "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3123, "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3124, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3125, "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3126, "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3127, "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3128, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3129, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3130, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3131, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3136, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3137, "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3138, "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3139, "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3140, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3141, "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3142, "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3143, "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3144, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3145, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3146, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3147, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3152, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3153, "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3154, "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3155, "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3156, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3157, "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3158, "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3159, "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3160, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3161, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3162, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3163, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3168, "{Name:'minecraft:end_rod',Properties:{facing:'down'}}", "{Name:'minecraft:end_rod',Properties:{facing:'down'}}"); + register(3169, "{Name:'minecraft:end_rod',Properties:{facing:'up'}}", "{Name:'minecraft:end_rod',Properties:{facing:'up'}}"); + register(3170, "{Name:'minecraft:end_rod',Properties:{facing:'north'}}", "{Name:'minecraft:end_rod',Properties:{facing:'north'}}"); + register(3171, "{Name:'minecraft:end_rod',Properties:{facing:'south'}}", "{Name:'minecraft:end_rod',Properties:{facing:'south'}}"); + register(3172, "{Name:'minecraft:end_rod',Properties:{facing:'west'}}", "{Name:'minecraft:end_rod',Properties:{facing:'west'}}"); + register(3173, "{Name:'minecraft:end_rod',Properties:{facing:'east'}}", "{Name:'minecraft:end_rod',Properties:{facing:'east'}}"); + register(3184, "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(3200, "{Name:'minecraft:chorus_flower',Properties:{age:'0'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'0'}}"); + register(3201, "{Name:'minecraft:chorus_flower',Properties:{age:'1'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'1'}}"); + register(3202, "{Name:'minecraft:chorus_flower',Properties:{age:'2'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'2'}}"); + register(3203, "{Name:'minecraft:chorus_flower',Properties:{age:'3'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'3'}}"); + register(3204, "{Name:'minecraft:chorus_flower',Properties:{age:'4'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'4'}}"); + register(3205, "{Name:'minecraft:chorus_flower',Properties:{age:'5'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'5'}}"); + register(3216, "{Name:'minecraft:purpur_block'}", "{Name:'minecraft:purpur_block'}"); + register(3232, "{Name:'minecraft:purpur_pillar',Properties:{axis:'y'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'y'}}"); + register(3236, "{Name:'minecraft:purpur_pillar',Properties:{axis:'x'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'x'}}"); + register(3240, "{Name:'minecraft:purpur_pillar',Properties:{axis:'z'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'z'}}"); + register(3248, "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(3249, "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(3250, "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(3251, "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(3252, "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(3253, "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(3254, "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(3255, "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(3264, "{Name:'minecraft:purpur_slab',Properties:{type:'double'}}", "{Name:'minecraft:purpur_double_slab',Properties:{variant:'default'}}"); + register(3280, "{Name:'minecraft:purpur_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:purpur_slab',Properties:{half:'bottom',variant:'default'}}"); + register(3288, "{Name:'minecraft:purpur_slab',Properties:{type:'top'}}", "{Name:'minecraft:purpur_slab',Properties:{half:'top',variant:'default'}}"); + register(3296, "{Name:'minecraft:end_stone_bricks'}", "{Name:'minecraft:end_bricks'}"); + register(3312, "{Name:'minecraft:beetroots',Properties:{age:'0'}}", "{Name:'minecraft:beetroots',Properties:{age:'0'}}"); + register(3313, "{Name:'minecraft:beetroots',Properties:{age:'1'}}", "{Name:'minecraft:beetroots',Properties:{age:'1'}}"); + register(3314, "{Name:'minecraft:beetroots',Properties:{age:'2'}}", "{Name:'minecraft:beetroots',Properties:{age:'2'}}"); + register(3315, "{Name:'minecraft:beetroots',Properties:{age:'3'}}", "{Name:'minecraft:beetroots',Properties:{age:'3'}}"); + register(3328, "{Name:'minecraft:grass_path'}", "{Name:'minecraft:grass_path'}"); + register(3344, "{Name:'minecraft:end_gateway'}", "{Name:'minecraft:end_gateway'}"); + register(3360, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'down'}}"); + register(3361, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'up'}}"); + register(3362, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'north'}}"); + register(3363, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'south'}}"); + register(3364, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'west'}}"); + register(3365, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'east'}}"); + register(3368, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'down'}}"); + register(3369, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'up'}}"); + register(3370, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'north'}}"); + register(3371, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'south'}}"); + register(3372, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'west'}}"); + register(3373, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'east'}}"); + register(3376, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'down'}}"); + register(3377, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'up'}}"); + register(3378, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'north'}}"); + register(3379, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'south'}}"); + register(3380, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'west'}}"); + register(3381, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'east'}}"); + register(3384, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'down'}}"); + register(3385, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'up'}}"); + register(3386, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'north'}}"); + register(3387, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'south'}}"); + register(3388, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'west'}}"); + register(3389, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'east'}}"); + register(3392, "{Name:'minecraft:frosted_ice',Properties:{age:'0'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'0'}}"); + register(3393, "{Name:'minecraft:frosted_ice',Properties:{age:'1'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'1'}}"); + register(3394, "{Name:'minecraft:frosted_ice',Properties:{age:'2'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'2'}}"); + register(3395, "{Name:'minecraft:frosted_ice',Properties:{age:'3'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'3'}}"); + register(3408, "{Name:'minecraft:magma_block'}", "{Name:'minecraft:magma'}"); + register(3424, "{Name:'minecraft:nether_wart_block'}", "{Name:'minecraft:nether_wart_block'}"); + register(3440, "{Name:'minecraft:red_nether_bricks'}", "{Name:'minecraft:red_nether_brick'}"); + register(3456, "{Name:'minecraft:bone_block',Properties:{axis:'y'}}", "{Name:'minecraft:bone_block',Properties:{axis:'y'}}"); + register(3460, "{Name:'minecraft:bone_block',Properties:{axis:'x'}}", "{Name:'minecraft:bone_block',Properties:{axis:'x'}}"); + register(3464, "{Name:'minecraft:bone_block',Properties:{axis:'z'}}", "{Name:'minecraft:bone_block',Properties:{axis:'z'}}"); + register(3472, "{Name:'minecraft:structure_void'}", "{Name:'minecraft:structure_void'}"); + register(3488, "{Name:'minecraft:observer',Properties:{facing:'down',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'down',powered:'false'}}"); + register(3489, "{Name:'minecraft:observer',Properties:{facing:'up',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'up',powered:'false'}}"); + register(3490, "{Name:'minecraft:observer',Properties:{facing:'north',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'north',powered:'false'}}"); + register(3491, "{Name:'minecraft:observer',Properties:{facing:'south',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'south',powered:'false'}}"); + register(3492, "{Name:'minecraft:observer',Properties:{facing:'west',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'west',powered:'false'}}"); + register(3493, "{Name:'minecraft:observer',Properties:{facing:'east',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'east',powered:'false'}}"); + register(3496, "{Name:'minecraft:observer',Properties:{facing:'down',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'down',powered:'true'}}"); + register(3497, "{Name:'minecraft:observer',Properties:{facing:'up',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'up',powered:'true'}}"); + register(3498, "{Name:'minecraft:observer',Properties:{facing:'north',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'north',powered:'true'}}"); + register(3499, "{Name:'minecraft:observer',Properties:{facing:'south',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'south',powered:'true'}}"); + register(3500, "{Name:'minecraft:observer',Properties:{facing:'west',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'west',powered:'true'}}"); + register(3501, "{Name:'minecraft:observer',Properties:{facing:'east',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'east',powered:'true'}}"); + register(3504, "{Name:'minecraft:white_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'down'}}"); + register(3505, "{Name:'minecraft:white_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'up'}}"); + register(3506, "{Name:'minecraft:white_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'north'}}"); + register(3507, "{Name:'minecraft:white_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'south'}}"); + register(3508, "{Name:'minecraft:white_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'west'}}"); + register(3509, "{Name:'minecraft:white_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'east'}}"); + register(3520, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'down'}}"); + register(3521, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'up'}}"); + register(3522, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'north'}}"); + register(3523, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'south'}}"); + register(3524, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'west'}}"); + register(3525, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'east'}}"); + register(3536, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'down'}}"); + register(3537, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'up'}}"); + register(3538, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'north'}}"); + register(3539, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'south'}}"); + register(3540, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'west'}}"); + register(3541, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'east'}}"); + register(3552, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'down'}}"); + register(3553, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'up'}}"); + register(3554, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'north'}}"); + register(3555, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'south'}}"); + register(3556, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'west'}}"); + register(3557, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'east'}}"); + register(3568, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'down'}}"); + register(3569, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'up'}}"); + register(3570, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'north'}}"); + register(3571, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'south'}}"); + register(3572, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'west'}}"); + register(3573, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'east'}}"); + register(3584, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'down'}}"); + register(3585, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'up'}}"); + register(3586, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'north'}}"); + register(3587, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'south'}}"); + register(3588, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'west'}}"); + register(3589, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'east'}}"); + register(3600, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'down'}}"); + register(3601, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'up'}}"); + register(3602, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'north'}}"); + register(3603, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'south'}}"); + register(3604, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'west'}}"); + register(3605, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'east'}}"); + register(3616, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'down'}}"); + register(3617, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'up'}}"); + register(3618, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'north'}}"); + register(3619, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'south'}}"); + register(3620, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'west'}}"); + register(3621, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'east'}}"); + register(3632, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'down'}}"); + register(3633, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'up'}}"); + register(3634, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'north'}}"); + register(3635, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'south'}}"); + register(3636, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'west'}}"); + register(3637, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'east'}}"); + register(3648, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'down'}}"); + register(3649, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'up'}}"); + register(3650, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'north'}}"); + register(3651, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'south'}}"); + register(3652, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'west'}}"); + register(3653, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'east'}}"); + register(3664, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'down'}}"); + register(3665, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'up'}}"); + register(3666, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'north'}}"); + register(3667, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'south'}}"); + register(3668, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'west'}}"); + register(3669, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'east'}}"); + register(3680, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'down'}}"); + register(3681, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'up'}}"); + register(3682, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'north'}}"); + register(3683, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'south'}}"); + register(3684, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'west'}}"); + register(3685, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'east'}}"); + register(3696, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'down'}}"); + register(3697, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'up'}}"); + register(3698, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'north'}}"); + register(3699, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'south'}}"); + register(3700, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'west'}}"); + register(3701, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'east'}}"); + register(3712, "{Name:'minecraft:green_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'down'}}"); + register(3713, "{Name:'minecraft:green_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'up'}}"); + register(3714, "{Name:'minecraft:green_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'north'}}"); + register(3715, "{Name:'minecraft:green_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'south'}}"); + register(3716, "{Name:'minecraft:green_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'west'}}"); + register(3717, "{Name:'minecraft:green_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'east'}}"); + register(3728, "{Name:'minecraft:red_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'down'}}"); + register(3729, "{Name:'minecraft:red_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'up'}}"); + register(3730, "{Name:'minecraft:red_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'north'}}"); + register(3731, "{Name:'minecraft:red_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'south'}}"); + register(3732, "{Name:'minecraft:red_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'west'}}"); + register(3733, "{Name:'minecraft:red_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'east'}}"); + register(3744, "{Name:'minecraft:black_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'down'}}"); + register(3745, "{Name:'minecraft:black_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'up'}}"); + register(3746, "{Name:'minecraft:black_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'north'}}"); + register(3747, "{Name:'minecraft:black_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'south'}}"); + register(3748, "{Name:'minecraft:black_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'west'}}"); + register(3749, "{Name:'minecraft:black_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'east'}}"); + register(3760, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'south'}}"); + register(3761, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'west'}}"); + register(3762, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'north'}}"); + register(3763, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'east'}}"); + register(3776, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'south'}}"); + register(3777, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'west'}}"); + register(3778, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'north'}}"); + register(3779, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'east'}}"); + register(3792, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'south'}}"); + register(3793, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'west'}}"); + register(3794, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'north'}}"); + register(3795, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'east'}}"); + register(3808, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'south'}}"); + register(3809, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'west'}}"); + register(3810, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'north'}}"); + register(3811, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'east'}}"); + register(3824, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'south'}}"); + register(3825, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'west'}}"); + register(3826, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'north'}}"); + register(3827, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'east'}}"); + register(3840, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'south'}}"); + register(3841, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'west'}}"); + register(3842, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'north'}}"); + register(3843, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'east'}}"); + register(3856, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'south'}}"); + register(3857, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'west'}}"); + register(3858, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'north'}}"); + register(3859, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'east'}}"); + register(3872, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'south'}}"); + register(3873, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'west'}}"); + register(3874, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'north'}}"); + register(3875, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'east'}}"); + register(3888, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'south'}}"); + register(3889, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'west'}}"); + register(3890, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'north'}}"); + register(3891, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'east'}}"); + register(3904, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'south'}}"); + register(3905, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'west'}}"); + register(3906, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'north'}}"); + register(3907, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'east'}}"); + register(3920, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'south'}}"); + register(3921, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'west'}}"); + register(3922, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'north'}}"); + register(3923, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'east'}}"); + register(3936, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'south'}}"); + register(3937, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'west'}}"); + register(3938, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'north'}}"); + register(3939, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'east'}}"); + register(3952, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'south'}}"); + register(3953, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'west'}}"); + register(3954, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'north'}}"); + register(3955, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'east'}}"); + register(3968, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'south'}}"); + register(3969, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'west'}}"); + register(3970, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'north'}}"); + register(3971, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'east'}}"); + register(3984, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'south'}}"); + register(3985, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'west'}}"); + register(3986, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'north'}}"); + register(3987, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'east'}}"); + register(4000, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'south'}}"); + register(4001, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'west'}}"); + register(4002, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'north'}}"); + register(4003, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'east'}}"); + register(4016, "{Name:'minecraft:white_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'white'}}"); + register(4017, "{Name:'minecraft:orange_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'orange'}}"); + register(4018, "{Name:'minecraft:magenta_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'magenta'}}"); + register(4019, "{Name:'minecraft:light_blue_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'light_blue'}}"); + register(4020, "{Name:'minecraft:yellow_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'yellow'}}"); + register(4021, "{Name:'minecraft:lime_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'lime'}}"); + register(4022, "{Name:'minecraft:pink_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'pink'}}"); + register(4023, "{Name:'minecraft:gray_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'gray'}}"); + register(4024, "{Name:'minecraft:light_gray_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'silver'}}"); + register(4025, "{Name:'minecraft:cyan_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'cyan'}}"); + register(4026, "{Name:'minecraft:purple_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'purple'}}"); + register(4027, "{Name:'minecraft:blue_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'blue'}}"); + register(4028, "{Name:'minecraft:brown_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'brown'}}"); + register(4029, "{Name:'minecraft:green_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'green'}}"); + register(4030, "{Name:'minecraft:red_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'red'}}"); + register(4031, "{Name:'minecraft:black_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'black'}}"); + register(4032, "{Name:'minecraft:white_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'white'}}"); + register(4033, "{Name:'minecraft:orange_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'orange'}}"); + register(4034, "{Name:'minecraft:magenta_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'magenta'}}"); + register(4035, "{Name:'minecraft:light_blue_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'light_blue'}}"); + register(4036, "{Name:'minecraft:yellow_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'yellow'}}"); + register(4037, "{Name:'minecraft:lime_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'lime'}}"); + register(4038, "{Name:'minecraft:pink_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'pink'}}"); + register(4039, "{Name:'minecraft:gray_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'gray'}}"); + register(4040, "{Name:'minecraft:light_gray_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'silver'}}"); + register(4041, "{Name:'minecraft:cyan_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'cyan'}}"); + register(4042, "{Name:'minecraft:purple_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'purple'}}"); + register(4043, "{Name:'minecraft:blue_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'blue'}}"); + register(4044, "{Name:'minecraft:brown_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'brown'}}"); + register(4045, "{Name:'minecraft:green_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'green'}}"); + register(4046, "{Name:'minecraft:red_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'red'}}"); + register(4047, "{Name:'minecraft:black_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'black'}}"); + register(4080, "{Name:'minecraft:structure_block',Properties:{mode:'save'}}", "{Name:'minecraft:structure_block',Properties:{mode:'save'}}"); + register(4081, "{Name:'minecraft:structure_block',Properties:{mode:'load'}}", "{Name:'minecraft:structure_block',Properties:{mode:'load'}}"); + register(4082, "{Name:'minecraft:structure_block',Properties:{mode:'corner'}}", "{Name:'minecraft:structure_block',Properties:{mode:'corner'}}"); + register(4083, "{Name:'minecraft:structure_block',Properties:{mode:'data'}}", "{Name:'minecraft:structure_block',Properties:{mode:'data'}}"); + finalizeMaps(); + } +} diff --git a/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 ITEM_NAMES = new Int2ObjectOpenHashMap() { + @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 data, final Function renamer) { + if (data == null) { + return; + } + + List newKeys = null; + List 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 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 data, final String key, final Function renamer) { + if (data == null) { + return; + } + + final String value = data.getString(key); + if (value == null) { + return; + } + + final String renamed = renamer.apply(value); + if (renamed == null) { + return; + } + + data.setString(key, renamed); + } + + public static void renameListMapItems(final MapType data, final String listPath, final String mapPath, + final Function 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 renamer) { + register(version, 0, renamer); + } + public static void register(final int version, final int subVersion, final Function 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..154ba98bfb587fb4b880e39cd573701b1b049cfe --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java @@ -0,0 +1,35 @@ +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 java.util.function.Function; + +public final class ConverterEnchantmentsRename extends DataConverter, MapType> { + + private final Function renamer; + + public ConverterEnchantmentsRename(final int toVersion, final Function renamer) { + this(toVersion, 0, renamer); + } + + public ConverterEnchantmentsRename(final int toVersion, final int versionStep, final Function renamer) { + super(toVersion, versionStep); + + this.renamer = renamer; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + + if (tag == null) { + return null; + } + + RenameHelper.renameListMapItems(tag, "Enchantments", "id", this.renamer); + RenameHelper.renameListMapItems(tag, "StoredEnchantments", "id", this.renamer); + + return null; + } +} diff --git a/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> { + + private static final Logger LOGGER = LogUtils.getLogger(); + + // Map of "id.damage" -> "flattened id" + private static final Map 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 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 ITEMS_WITH_DAMAGE = new HashSet<>(Arrays.asList( + "minecraft:bow", + "minecraft:carrot_on_a_stick", + "minecraft:chainmail_boots", + "minecraft:chainmail_chestplate", + "minecraft:chainmail_helmet", + "minecraft:chainmail_leggings", + "minecraft:diamond_axe", + "minecraft:diamond_boots", + "minecraft:diamond_chestplate", + "minecraft:diamond_helmet", + "minecraft:diamond_hoe", + "minecraft:diamond_leggings", + "minecraft:diamond_pickaxe", + "minecraft:diamond_shovel", + "minecraft:diamond_sword", + "minecraft:elytra", + "minecraft:fishing_rod", + "minecraft:flint_and_steel", + "minecraft:golden_axe", + "minecraft:golden_boots", + "minecraft:golden_chestplate", + "minecraft:golden_helmet", + "minecraft:golden_hoe", + "minecraft:golden_leggings", + "minecraft:golden_pickaxe", + "minecraft:golden_shovel", + "minecraft:golden_sword", + "minecraft:iron_axe", + "minecraft:iron_boots", + "minecraft:iron_chestplate", + "minecraft:iron_helmet", + "minecraft:iron_hoe", + "minecraft:iron_leggings", + "minecraft:iron_pickaxe", + "minecraft:iron_shovel", + "minecraft:iron_sword", + "minecraft:leather_boots", + "minecraft:leather_chestplate", + "minecraft:leather_helmet", + "minecraft:leather_leggings", + "minecraft:shears", + "minecraft:shield", + "minecraft:stone_axe", + "minecraft:stone_hoe", + "minecraft:stone_pickaxe", + "minecraft:stone_shovel", + "minecraft:stone_sword", + "minecraft:wooden_axe", + "minecraft:wooden_hoe", + "minecraft:wooden_pickaxe", + "minecraft:wooden_shovel", + "minecraft:wooden_sword" + )); + + public ConverterFlattenItemStack() { + super(MCVersions.V17W47A, 4); + } + + public static String flattenItem(final String oldName, final int data) { + if (IDS_REQUIRING_FLATTENING.contains(oldName)) { + final String flattened = FLATTEN_MAP.get(oldName + '.' + data); + return flattened == null ? FLATTEN_MAP.get(oldName.concat(".0")) : flattened; + } else { + return null; + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + + if (id == null) { + return null; + } + + final int damage = data.getInt("Damage"); + data.remove("Damage"); + + if (IDS_REQUIRING_FLATTENING.contains(id)) { + String remap = FLATTEN_MAP.get(id + '.' + damage); + if (remap == null) { + remap = FLATTEN_MAP.get(id.concat(".0")); + // this shouldn't be null + } + if (remap != null) { + data.setString("id", remap); + } else { + LOGGER.warn("Item '" + id + "' requires flattening but found no mapping for it! (ConverterFlattenItemStack)"); + } + } + + if (damage != 0 && ITEMS_WITH_DAMAGE.contains(id)) { + // migrate damage + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + data.setMap("tag", tag); + } + tag.setInt("Damage", damage); + } + + return null; + } +} diff --git a/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> { + + private static final Map 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType entityTag = tag.getMap("EntityTag"); + if (entityTag == null) { + return null; + } + + final String id = entityTag.getString("id"); + if (id != null) { + data.setString("id", ENTITY_ID_TO_NEW_EGG_ID.getOrDefault(id, "minecraft:pig_spawn_egg")); + } + + return null; + } +} diff --git a/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..a5a21d1c7579e45b78eae4b42a9f023db74acc0a --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java @@ -0,0 +1,1244 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.itemstack; + +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.minecraft.versions.V3818; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import net.minecraft.util.Mth; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public final class ConverterItemStackToDataComponents { + + private static final int TOOLTIP_FLAG_HIDE_ENCHANTMENTS = 1 << 0; + private static final int TOOLTIP_FLAG_HIDE_MODIFIERS = 1 << 1; + private static final int TOOLTIP_FLAG_HIDE_UNBREAKABLE = 1 << 2; + private static final int TOOLTIP_FLAG_HIDE_CAN_DESTROY = 1 << 3; + private static final int TOOLTIP_FLAG_HIDE_CAN_PLACE = 1 << 4; + private static final int TOOLTIP_FLAG_HIDE_ADDITIONAL = 1 << 5; + private static final int TOOLTIP_FLAG_HIDE_DYE = 1 << 6; + private static final int TOOLTIP_FLAG_HIDE_UPGRADES = 1 << 7; + + private static final int DEFAULT_LEATHER_COLOUR = (160 << 16) | (101 << 8) | (64 << 0); // r, g, b + + private static final String[] BUCKETED_MOB_TAGS = new String[] { + "NoAI", + "Silent", + "NoGravity", + "Glowing", + "Invulnerable", + "Health", + "Age", + "Variant", + "HuntingCooldown", + "BucketVariantTag" + }; + private static final Set BOOLEAN_BLOCK_STATE_PROPERTIES = new HashSet<>( + Arrays.asList( + "attached", + "bottom", + "conditional", + "disarmed", + "drag", + "enabled", + "extended", + "eye", + "falling", + "hanging", + "has_bottle_0", + "has_bottle_1", + "has_bottle_2", + "has_record", + "has_book", + "inverted", + "in_wall", + "lit", + "locked", + "occupied", + "open", + "persistent", + "powered", + "short", + "signal_fire", + "snowy", + "triggered", + "unstable", + "waterlogged", + "berries", + "bloom", + "shrieking", + "can_summon", + "up", + "down", + "north", + "east", + "south", + "west", + "slot_0_occupied", + "slot_1_occupied", + "slot_2_occupied", + "slot_3_occupied", + "slot_4_occupied", + "slot_5_occupied", + "cracked", + "crafting" + ) + ); + private static final String[] MAP_DECORATION_CONVERSION_TABLE = new String[34]; + static { + MAP_DECORATION_CONVERSION_TABLE[0] = "player"; + MAP_DECORATION_CONVERSION_TABLE[1] = "frame"; + MAP_DECORATION_CONVERSION_TABLE[2] = "red_marker"; + MAP_DECORATION_CONVERSION_TABLE[3] = "blue_marker"; + MAP_DECORATION_CONVERSION_TABLE[4] = "target_x"; + MAP_DECORATION_CONVERSION_TABLE[5] = "target_point"; + MAP_DECORATION_CONVERSION_TABLE[6] = "player_off_map"; + MAP_DECORATION_CONVERSION_TABLE[7] = "player_off_limits"; + MAP_DECORATION_CONVERSION_TABLE[8] = "mansion"; + MAP_DECORATION_CONVERSION_TABLE[9] = "monument"; + MAP_DECORATION_CONVERSION_TABLE[10] = "banner_white"; + MAP_DECORATION_CONVERSION_TABLE[11] = "banner_orange"; + MAP_DECORATION_CONVERSION_TABLE[12] = "banner_magenta"; + MAP_DECORATION_CONVERSION_TABLE[13] = "banner_light_blue"; + MAP_DECORATION_CONVERSION_TABLE[14] = "banner_yellow"; + MAP_DECORATION_CONVERSION_TABLE[15] = "banner_lime"; + MAP_DECORATION_CONVERSION_TABLE[16] = "banner_pink"; + MAP_DECORATION_CONVERSION_TABLE[17] = "banner_gray"; + MAP_DECORATION_CONVERSION_TABLE[18] = "banner_light_gray"; + MAP_DECORATION_CONVERSION_TABLE[19] = "banner_cyan"; + MAP_DECORATION_CONVERSION_TABLE[20] = "banner_purple"; + MAP_DECORATION_CONVERSION_TABLE[21] = "banner_blue"; + MAP_DECORATION_CONVERSION_TABLE[22] = "banner_brown"; + MAP_DECORATION_CONVERSION_TABLE[23] = "banner_green"; + MAP_DECORATION_CONVERSION_TABLE[24] = "banner_red"; + MAP_DECORATION_CONVERSION_TABLE[25] = "banner_black"; + MAP_DECORATION_CONVERSION_TABLE[26] = "red_x"; + MAP_DECORATION_CONVERSION_TABLE[27] = "village_desert"; + MAP_DECORATION_CONVERSION_TABLE[28] = "village_plains"; + MAP_DECORATION_CONVERSION_TABLE[29] = "village_savanna"; + MAP_DECORATION_CONVERSION_TABLE[30] = "village_snowy"; + MAP_DECORATION_CONVERSION_TABLE[31] = "village_taiga"; + MAP_DECORATION_CONVERSION_TABLE[32] = "jungle_temple"; + MAP_DECORATION_CONVERSION_TABLE[33] = "swamp_hut"; + } + + private static String convertMapDecorationId(final int type) { + return type >= 0 && type < MAP_DECORATION_CONVERSION_TABLE.length ? MAP_DECORATION_CONVERSION_TABLE[type] : MAP_DECORATION_CONVERSION_TABLE[0]; + } + + private static void convertBlockStateProperties(final MapType properties) { + // convert values stored as boolean/integer to string + for (final String key : properties.keys()) { + final Object value = properties.getGeneric(key); + if (value instanceof Number number) { + if (BOOLEAN_BLOCK_STATE_PROPERTIES.contains(key)) { + properties.setString(key, Boolean.toString(number.byteValue() != (byte)0)); + } else { + properties.setString(key, number.toString()); + } + } + } + } + + private static void convertTileEntity(final MapType tileEntity, final TransientItemStack transientItem) { + final Object lock = tileEntity.getGeneric("Lock"); + if (lock != null) { + tileEntity.remove("Lock"); + transientItem.componentSetGeneric("minecraft:lock", lock); + } + + final Object lootTable = tileEntity.getGeneric("LootTable"); + if (lootTable != null) { + final MapType containerLoot = tileEntity.getTypeUtil().createEmptyMap(); + transientItem.componentSetMap("minecraft:container_loot", containerLoot); + + containerLoot.setGeneric("loot_table", lootTable); + + final long seed = tileEntity.getLong("LootTableSeed", 0L); + if (seed != 0L) { + containerLoot.setLong("seed", seed); + } + + tileEntity.remove("LootTable"); + tileEntity.remove("LootTableSeed"); + } + + final String id = NamespaceUtil.correctNamespace(tileEntity.getString("id", "")); + + switch (id) { + case "minecraft:skull": { + final Object noteBlockSound = tileEntity.getGeneric("note_block_sound"); + if (noteBlockSound != null) { + tileEntity.remove("note_block_sound"); + transientItem.componentSetGeneric("minecraft:note_block_sound", noteBlockSound); + } + + break; + } + case "minecraft:decorated_pot": { + final Object sherds = tileEntity.getGeneric("sherds"); + if (sherds != null) { + tileEntity.remove("sherds"); + transientItem.componentSetGeneric("minecraft:pot_decorations", sherds); + } + + final Object item = tileEntity.getGeneric("item"); + if (item != null) { + tileEntity.remove("item"); + + final ListType container = tileEntity.getTypeUtil().createEmptyList(); + transientItem.componentSetList("minecraft:container", container); + + final MapType wrappedItem = tileEntity.getTypeUtil().createEmptyMap(); + container.addMap(wrappedItem); + + wrappedItem.setInt("slot", 0); + wrappedItem.setGeneric("item", item); + } + + break; + } + case "minecraft:banner": { + final Object patterns = tileEntity.getGeneric("patterns"); + if (patterns != null) { + tileEntity.remove("patterns"); + + transientItem.componentSetGeneric("minecraft:banner_patterns", patterns); + } + + final Number base = tileEntity.getNumber("Base"); + if (base != null) { + tileEntity.remove("Base"); + + transientItem.componentSetString("minecraft:base_color", V3818.getBannerColour(base.intValue())); + } + + break; + } + + case "minecraft:shulker_box": + case "minecraft:chest": + case "minecraft:trapped_chest": + case "minecraft:furnace": + case "minecraft:ender_chest": + case "minecraft:dispenser": + case "minecraft:dropper": + case "minecraft:brewing_stand": + case "minecraft:hopper": + case "minecraft:barrel": + case "minecraft:smoker": + case "minecraft:blast_furnace": + case "minecraft:campfire": + case "minecraft:chiseled_bookshelf": + case "minecraft:crafter": { + final ListType items = tileEntity.getList("Items", ObjectType.MAP); + tileEntity.remove("Items"); + if (items != null && items.size() > 0) { + transientItem.componentSetList("minecraft:container", items); + + for (int i = 0, len = items.size(); i < len; ++i) { + final MapType item = items.getMap(i); + final int slot = (int)item.getByte("Slot", (byte)0) & 0xFF; + item.remove("Slot"); + + final MapType wrappedItem = item.getTypeUtil().createEmptyMap(); + items.setMap(i, wrappedItem); + + wrappedItem.setInt("slot", slot); + wrappedItem.setMap("item", item); + } + } + + break; + } + + case "minecraft:beehive": { + final Object bees = tileEntity.getGeneric("bees"); + if (bees != null) { + tileEntity.remove("bees"); + + transientItem.componentSetGeneric("minecraft:bees", bees); + } + break; + } + } + } + + private static void convertEnchantments(final TransientItemStack transientItem, final TypeUtil type, + final String tagKey, final String componentKey, + final boolean hideToolTip) { + final ListType enchantments = transientItem.tagRemoveList(tagKey, ObjectType.MAP); + if (enchantments == null || enchantments.size() == 0) { + if (hideToolTip) { + final MapType newEnchants = type.createEmptyMap(); + transientItem.componentSetMap(componentKey, newEnchants); + + newEnchants.setMap("levels", type.createEmptyMap()); + newEnchants.setBoolean("show_in_tooltip", false); + } + } else { + final MapType newEnchantments = type.createEmptyMap(); + + for (int i = 0, len = enchantments.size(); i < len; ++i) { + final MapType enchantment = enchantments.getMap(i); + + final String id = enchantment.getString("id"); + final Number level = enchantment.getNumber("lvl"); + + if (id == null || level == null) { + continue; + } + + newEnchantments.setInt(id, Mth.clamp(level.intValue(), 0, 0xFF)); + } + + if (!newEnchantments.isEmpty() || hideToolTip) { + final MapType newEnchants = type.createEmptyMap(); + transientItem.componentSetMap(componentKey, newEnchants); + + newEnchants.setMap("levels", newEnchantments); + if (hideToolTip) { + newEnchants.setBoolean("show_in_tooltip", false); + } + } + } + + if (enchantments != null && enchantments.size() == 0) { + transientItem.componentSetBoolean("minecraft:enchantment_glint_override", true); + } + } + + private static void convertDisplay(final TransientItemStack transientItem, final TypeUtil type, final int flags) { + final MapType display = transientItem.tag.getMap("display"); + + if (display != null) { + final Object name = display.getGeneric("Name"); + if (name != null) { + display.remove("Name"); + + transientItem.componentSetGeneric("minecraft:custom_name", name); + } + + final Object lore = display.getGeneric("Lore"); + if (lore != null) { + display.remove("Lore"); + + transientItem.componentSetGeneric("minecraft:lore", lore); + } + } + + final Number color = display == null ? null : display.getNumber("color"); + final boolean hideDye = (flags & TOOLTIP_FLAG_HIDE_DYE) != 0; + + if (hideDye || color != null) { + if (color != null) { + display.remove("color"); + } + + final MapType dyedColor = type.createEmptyMap(); + transientItem.componentSetMap("minecraft:dyed_color", dyedColor); + + dyedColor.setInt("rgb", color == null ? DEFAULT_LEATHER_COLOUR : color.intValue()); + if (hideDye) { + dyedColor.setBoolean("show_in_tooltip", false); + } + } + + final Object locName = display == null ? null : display.getGeneric("LocName"); + if (locName != null) { + display.remove("LocName"); + + if (locName instanceof String locNameString) { + transientItem.componentSetString("minecraft:item_name", ComponentUtils.createTranslatableComponent(locNameString)); + } + } + + if (display != null && "minecraft:filled_map".equals(transientItem.id)) { + final Object mapColor = display.getGeneric("MapColor"); + if (mapColor != null) { + display.remove("MapColor"); + + transientItem.componentSetGeneric("minecraft:map_color", mapColor); + } + } + + // mirror behavior of fixSubTag + if (display != null && display.isEmpty()) { + transientItem.tagRemoveMap("display"); + } + } + + public static MapType convertBlockStatePredicate(final String value, final TypeUtil type) { + final int propertyStart = value.indexOf('['); + final int nbtStart = value.indexOf('{'); + int blockNameEnd = value.length(); + + if (propertyStart != -1) { + blockNameEnd = propertyStart; + } + if (nbtStart != -1) { + blockNameEnd = Math.min(blockNameEnd, nbtStart); + } + + final MapType ret = type.createEmptyMap(); + + final String blockName = value.substring(0, blockNameEnd); + + // string is fine here, the underlying type accepts string AND list under the same name... + ret.setString("blocks", blockName.trim()); + + if (propertyStart != -1) { + // unlike DFU, set the fromIndex so that on malformed data we do not IOOBE + final int propertyEnd = value.indexOf(']', propertyStart + 1); + if (propertyEnd != -1) { + final MapType state = type.createEmptyMap(); + ret.setMap("state", state); + + for (final String property : value.substring(propertyStart + 1, propertyEnd).split(",")) { + final int separatorIdx = property.indexOf('='); + if (separatorIdx == -1) { + continue; + } + + final String propertyKey = property.substring(0, separatorIdx).trim(); + final String propertyValue = property.substring(separatorIdx + 1); + + state.setString(propertyKey, propertyValue); + } + } + } + + if (nbtStart != -1) { + // unlike DFU, set the fromIndex so that on malformed data we do not IOOBE + final int nbtEnd = value.indexOf('}', nbtStart + 1); + if (nbtEnd != -1) { + // note: want to include { and } + ret.setString("nbt", value.substring(nbtStart, nbtEnd + 1)); + } + } + + return ret; + } + + private static void convertBlockStatePredicates(final TransientItemStack item, final TypeUtil type, + final String tagKey, final String componentKey, + final boolean hideInTooltip) { + final ListType blocks = item.tagRemoveListUnchecked(tagKey); + if (blocks == null) { + return; + } + + final MapType blockPredicates = type.createEmptyMap(); + item.componentSetMap(componentKey, blockPredicates); + + if (hideInTooltip) { + blockPredicates.setBoolean("show_in_tooltip", false); + } + + final ListType predicates = type.createEmptyList(); + blockPredicates.setList("predicates", predicates); + + for (int i = 0, len = blocks.size(); i < len; ++i) { + final Object block = blocks.getGeneric(i); + if (!(block instanceof String blockString)) { + // cannot type error here, if block is not a string then nothing in `blocks` is as they have the same type + predicates.addGeneric(block); + continue; + } + + final MapType predicate = convertBlockStatePredicate(blockString, type); + + predicates.addMap(predicate); + } + } + + private static void convertAdventureMode(final TransientItemStack item, final TypeUtil type, final int flags) { + convertBlockStatePredicates( + item, type, "CanDestroy", "minecraft:can_break", + (flags & TOOLTIP_FLAG_HIDE_CAN_DESTROY) != 0 + ); + convertBlockStatePredicates( + item, type, "CanPlaceOn", "minecraft:can_place_on", + (flags & TOOLTIP_FLAG_HIDE_CAN_PLACE) != 0 + ); + } + + private static void copy(final MapType src, final String srcKey, final MapType dst, final String dstKey) { + if (src == null || dst == null) { + return; + } + + final Object srcValue = src.getGeneric(srcKey); + if (srcValue != null) { + dst.setGeneric(dstKey, srcValue); + } + } + + private static MapType convertAttribute(final Object inputGeneric, final TypeUtil type) { + final MapType input = inputGeneric instanceof MapType casted ? (MapType)casted : null; + + final MapType ret = type.createEmptyMap(); + ret.setString("name", ""); + ret.setDouble("amount", 0.0); + ret.setString("operation", "add_value"); + + copy(input, "AttributeName", ret, "type"); + copy(input, "Slot", ret, "slot"); + copy(input, "UUID", ret, "uuid"); + copy(input, "Name", ret, "name"); + copy(input, "Amount", ret, "amount"); + + // note: no type check on hasKey + if (input != null && input.hasKey("Operation")) { + final String operation; + switch (input.getInt("Operation", 0)) { + case 1: { + operation = "add_multiplied_base"; + break; + } + case 2: { + operation = "add_multiplied_total"; + break; + } + default: { + operation = "add_value"; + break; + } + } + ret.setString("operation", operation); + } + + return ret; + } + + private static void convertAttributes(final TransientItemStack item, final TypeUtil type, final int flags) { + final ListType attributes = item.tagRemoveListUnchecked("AttributeModifiers"); + final ListType newAttributes = type.createEmptyList(); + + if (attributes != null) { + for (int i = 0, len = attributes.size(); i < len; ++i) { + newAttributes.addMap(convertAttribute(attributes.getGeneric(i), type)); + } + } + + final boolean hideModifiers = (flags & TOOLTIP_FLAG_HIDE_MODIFIERS) != 0; + if (newAttributes.size() > 0 || hideModifiers) { + final MapType newModifiers = type.createEmptyMap(); + item.componentSetMap("minecraft:attribute_modifiers", newModifiers); + + newModifiers.setList("modifiers", newAttributes); + if (hideModifiers) { + newModifiers.setBoolean("show_in_tooltip", false); + } + } + } + + private static void convertMap(final TransientItemStack item, final TypeUtil type) { + item.tagMigrateToComponent("map", "minecraft:map_id"); + + final ListType decorations = item.tagRemoveListUnchecked("Decorations"); + if (decorations != null) { + final MapType newDecorations = type.createEmptyMap(); + + for (int i = 0, len = decorations.size(); i < len; ++i) { + final Object decorationGeneric = decorations.getGeneric(i); + + final MapType decoration = decorationGeneric instanceof MapType casted ? (MapType)casted : null; + + // 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 newDecoration = type.createEmptyMap(); + newDecorations.setMap(id, newDecoration); + + newDecoration.setString("type", convertMapDecorationId(typeId)); + newDecoration.setDouble("x", x); + newDecoration.setDouble("z", z); + newDecoration.setFloat("rotation", rot); + } + + if (!newDecorations.isEmpty()) { + item.componentSetMap("minecraft:map_decorations", newDecorations); + } + } + } + + private static void convertPotion(final TransientItemStack item, final TypeUtil type) { + final MapType potionContents = type.createEmptyMap(); + + final String potion = item.tagRemoveString("Potion"); + + if (potion != null && !"minecraft:empty".equals(potion)) { + potionContents.setString("potion", potion); + } + + item.migrateTagTo("CustomPotionColor", potionContents, "custom_color"); + item.migrateTagTo("custom_potion_effects", potionContents, "custom_effects"); + + if (!potionContents.isEmpty()) { + item.componentSetMap("minecraft:potion_contents", potionContents); + } + } + + private static MapType makeFilteredText(final String raw, final String filtered, final TypeUtil type) { + final MapType ret = type.createEmptyMap(); + + ret.setString("raw", raw); + if (filtered != null) { + ret.setString("filtered", filtered); + } + + return ret; + } + + private static ListType convertBookPages(final TransientItemStack item, final TypeUtil type) { + final ListType oldPages = item.tagRemoveListUnchecked("pages"); + + final MapType filteredPages = item.tagRemoveMap("filtered_pages"); + + if (oldPages == null || oldPages.size() == 0) { + return null; + } + + final ListType ret = type.createEmptyList(); + + for (int i = 0, len = oldPages.size(); i < len; ++i) { + final String page = oldPages.getGeneric(i) instanceof String str ? str : ""; + final String filtered = filteredPages == null ? null : filteredPages.getString(Integer.toString(i)); + + ret.addMap(makeFilteredText(page, filtered, type)); + } + + return ret; + } + + private static void convertWritableBook(final TransientItemStack item, final TypeUtil type) { + final ListType pages = convertBookPages(item, type); + if (pages != null) { + final MapType bookContent = type.createEmptyMap(); + item.componentSetMap("minecraft:writable_book_content", bookContent); + + bookContent.setList("pages", pages); + } + } + + private static void convertWrittenBook(final TransientItemStack item, final TypeUtil type) { + final ListType pages = convertBookPages(item, type); + + final MapType bookContent = type.createEmptyMap(); + item.componentSetMap("minecraft:written_book_content", bookContent); + if (pages != null) { + bookContent.setList("pages", pages); + } + + final String title = item.tagRemoveString("title", ""); + final String filteredTitle = item.tagRemoveString("filtered_title"); + + bookContent.setMap("title", makeFilteredText(title, filteredTitle, type)); + + 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 bucketEntityData = type.createEmptyMap(); + + for (final String oldKey : BUCKETED_MOB_TAGS) { + item.migrateTagTo(oldKey, bucketEntityData, oldKey); + } + + if (!bucketEntityData.isEmpty()) { + item.componentSetMap("minecraft:bucket_entity_data", bucketEntityData); + } + } + + private static void convertCompass(final TransientItemStack item, final TypeUtil type) { + final Object lodestonePos = item.tagRemoveGeneric("LodestonePos"); + final Object lodestoneDim = item.tagRemoveGeneric("LodestoneDimension"); + + if (lodestonePos == null && lodestoneDim == null) { + return; + } + + final MapType lodestoneTracker = type.createEmptyMap(); + item.componentSetMap("minecraft:lodestone_tracker", lodestoneTracker); + + if (lodestonePos != null && lodestoneDim != null) { + final MapType target = type.createEmptyMap(); + lodestoneTracker.setMap("target", target); + + target.setGeneric("pos", lodestonePos); + target.setGeneric("dimension", lodestoneDim); + } + + final boolean tracked = item.tagRemoveBoolean("LodestoneTracked", true); + if (!tracked) { + lodestoneTracker.setBoolean("tracked", false); + } + } + + private static void convertFireworkExplosion(final Object inputGeneric) { + if (!(inputGeneric instanceof MapType)) { + return; + } + + final MapType input = (MapType)inputGeneric; + + RenameHelper.renameSingle(input, "Colors", "colors"); + RenameHelper.renameSingle(input, "FadeColors", "fade_colors"); + RenameHelper.renameSingle(input, "Trail", "has_trail"); + RenameHelper.renameSingle(input, "Flicker", "has_twinkle"); + + final int type = input.getInt("Type", 0); + input.remove("Type"); + + final String newType; + switch (type) { + case 1: { + newType = "large_ball"; + break; + } + case 2: { + newType = "star"; + break; + } + case 3: { + newType = "creeper"; + break; + } + case 4: { + newType = "burst"; + break; + } + default: { + newType = "small_ball"; + break; + } + } + + input.setString("shape", newType); + } + + private static void convertFireworkRocket(final TransientItemStack item, final TypeUtil type) { + // adhere to fixSubTag(true) behavior + final Object fireworksGeneric = item.tag.getGeneric("Fireworks"); + if (fireworksGeneric == null) { + return; + } + + if (!(fireworksGeneric instanceof MapType)) { + final MapType newFireworks = type.createEmptyMap(); + item.componentSetMap("minecraft:fireworks", newFireworks); + + newFireworks.setList("explosions", type.createEmptyList()); + newFireworks.setByte("flight_duration", (byte)0); + + return; + } + + final MapType fireworks = (MapType)fireworksGeneric; + + final MapType newFireworks = type.createEmptyMap(); + item.componentSetMap("minecraft:fireworks", newFireworks); + + final int flight = fireworks.getInt("Flight", 0); + newFireworks.setByte("flight_duration", (byte)flight); + + final ListType explosions = fireworks.getListUnchecked("Explosions", type.createEmptyList()); + newFireworks.setList("explosions", explosions); + + for (int i = 0, len = explosions.size(); i < len; ++i) { + convertFireworkExplosion(explosions.getGeneric(i)); + } + + fireworks.remove("Explosions"); + fireworks.remove("Flight"); + if (fireworks.isEmpty()) { + item.tag.remove("Fireworks"); + } + } + + private static Object copyGeneric(final Object value, final TypeUtil type) { + if (value == null || value instanceof Number || value instanceof String) { + return value; + } + if (value instanceof MapType mapType) { + return mapType.copy(); + } + if (value instanceof ListType listType) { + return listType.copy(); + } + // rest of the cases can take the slow path + + final ListType dummy = type.createEmptyList(); + dummy.addGeneric(value); + + return dummy.copy().getGeneric(0); + } + + private static void convertFireworkStar(final TransientItemStack item, final TypeUtil type) { + // note: adhere to fixSubTag(true) behavior + final Object explosionGeneric = item.tag.getGeneric("Explosion"); + if (explosionGeneric == null) { + return; + } + + if (!(explosionGeneric instanceof MapType)) { + // important that we copy the generic value when not moving it + item.componentSetGeneric("minecraft:firework_explosion", copyGeneric(explosionGeneric, type)); + return; + } + + final MapType explosion = (MapType)explosionGeneric; + + final MapType explosionCopy = explosion.copy(); + item.componentSetGeneric("minecraft:firework_explosion", explosionCopy); + convertFireworkExplosion(explosionCopy); + + explosion.remove("Type"); + explosion.remove("Colors"); + explosion.remove("FadeColors"); + explosion.remove("Trail"); + explosion.remove("Flicker"); + + if (explosion.isEmpty()) { + item.tag.remove("Explosion"); + } + } + + private static boolean isValidPlayerName(final String name) { + if (name.length() > 16) { + return false; + } + + for (int i = 0, len = name.length(); i < len; ++i) { + final char character = name.charAt(i); + if (character <= 0x20 || character >= 0x7F) { // printable ascii + return false; + } + } + + return true; + } + + private static ListType convertProperties(final MapType properties, final TypeUtil type) { + final ListType ret = type.createEmptyList(); + + for (final String propertyKey : properties.keys()) { + final ListType propertyValues = properties.getListUnchecked(propertyKey); + + if (propertyValues == null) { + continue; + } + + for (int i = 0, len = propertyValues.size(); i < len; ++i) { + final MapType property = propertyValues.getGeneric(i) instanceof MapType casted ? (MapType)casted : null; + + final String value = property == null ? "" : property.getString("Value", ""); + final String signature = property == null ? null : property.getString("Signature"); + + final MapType newProperty = type.createEmptyMap(); + ret.addMap(newProperty); + + newProperty.setString("name", propertyKey); + newProperty.setString("value", value); + if (signature != null) { + newProperty.setString("signature", signature); + } + } + } + + return ret; + } + + public static MapType convertProfile(final Object inputGeneric, final TypeUtil type) { + final MapType ret = type.createEmptyMap(); + + if (inputGeneric instanceof String name) { + if (!isValidPlayerName(name)) { + return ret; + } + + ret.setString("name", name); + + return ret; + } + + final MapType input = inputGeneric instanceof MapType casted ? (MapType)casted : null; + + final String name = input == null ? "" : input.getString("Name", ""); + + if (isValidPlayerName(name)) { + ret.setString("name", name); + } + + final Object id = input == null ? null : input.getGeneric("Id"); + + if (id != null) { + ret.setGeneric("id", id); + } + + final MapType properties = input == null ? null : input.getMap("Properties"); + if (properties != null && !properties.isEmpty()) { + ret.setList("properties", convertProperties(properties, type)); + } + + return ret; + } + + private static void convertSukll(final TransientItemStack item, final TypeUtil type) { + final Object skullOwnerGeneric = item.tagRemoveGeneric("SkullOwner"); + if (skullOwnerGeneric == null) { + return; + } + + item.componentSetMap("minecraft:profile", convertProfile(skullOwnerGeneric, type)); + } + + // input is unmodified + public static MapType convertItem(final MapType input) { + if (!input.hasKey("id", ObjectType.STRING) || !input.hasKey("Count", ObjectType.NUMBER)) { + return input.copy(); + } + + final TypeUtil type = input.getTypeUtil(); + + final TransientItemStack item = new TransientItemStack(input); + + item.tagMigrateToComponent("Damage", "minecraft:damage", 0); + item.tagMigrateToComponent("RepairCost", "minecraft:repair_cost", 0); + item.tagMigrateToComponent("CustomModelData", "minecraft:custom_model_data"); + + final MapType blockStateProperties = item.tagRemoveMap("BlockStateTag"); + if (blockStateProperties != null) { + item.componentSetMap("minecraft:block_state", blockStateProperties); + convertBlockStateProperties(blockStateProperties); + } + + item.tagMigrateToComponent("EntityTag", "minecraft:entity_data"); + + final MapType tileEntityTag = item.tagRemoveMap("BlockEntityTag"); + if (tileEntityTag != null) { + convertTileEntity(tileEntityTag, item); + + if (tileEntityTag.size() > 1 || (tileEntityTag.size() == 1 && !tileEntityTag.hasKey("id"))) { + item.componentSetMap("minecraft:block_entity_data", tileEntityTag); + } + } + + final int flags = item.tagRemoveInt("HideFlags", 0); + + if (item.tagRemoveInt("Unbreakable", 0) != 0) { + final MapType unbreakable = type.createEmptyMap(); + item.componentSetMap("minecraft:unbreakable", unbreakable); + if ((flags & TOOLTIP_FLAG_HIDE_UNBREAKABLE) != 0) { + unbreakable.setBoolean("show_in_tooltip", false); + } + } + + convertEnchantments( + item, type, "Enchantments", "minecraft:enchantments", + (flags & TOOLTIP_FLAG_HIDE_ENCHANTMENTS) != 0 + ); + + convertDisplay(item, type, flags); + convertAdventureMode(item, type, flags); + convertAttributes(item, type, flags); + + final Object trim = item.tagRemoveGeneric("Trim"); + if (trim != null) { + // note: DFU set does nothing if not map + if ((flags & TOOLTIP_FLAG_HIDE_UPGRADES) != 0 && trim instanceof MapType) { + ((MapType)trim).setBoolean("show_in_tooltip", false); + } + + item.componentSetGeneric("minecraft:trim", trim); + } + + if ((flags & TOOLTIP_FLAG_HIDE_ADDITIONAL) != 0) { + item.componentSetMap("minecraft:hide_additional_tooltip", type.createEmptyMap()); + } + + switch (item.id) { + case "minecraft:enchanted_book": { + convertEnchantments( + item, type, "StoredEnchantments", "minecraft:stored_enchantments", + (flags & TOOLTIP_FLAG_HIDE_ADDITIONAL) != 0 + ); + break; + } + case "minecraft:crossbow": { + item.tagRemoveGeneric("Charged"); + item.tagMigrateNonEmptyListToComponent("ChargedProjectiles", "minecraft:charged_projectiles"); + break; + } + case "minecraft:bundle": { + item.tagMigrateNonEmptyListToComponent("Items", "minecraft:bundle_contents"); + break; + } + case "minecraft:filled_map": { + convertMap(item, type); + break; + } + case "minecraft:potion": + case "minecraft:splash_potion": + case "minecraft:lingering_potion": + case "minecraft:tipped_arrow": { + convertPotion(item, type); + break; + } + case "minecraft:writable_book": { + convertWritableBook(item, type); + break; + } + case "minecraft:written_book": { + convertWrittenBook(item, type); + break; + } + case "minecraft:suspicious_stew": { + item.tagMigrateToComponent("effects", "minecraft:suspicious_stew_effects"); + break; + } + case "minecraft:debug_stick": { + item.tagMigrateToComponent("DebugProperty", "minecraft:debug_stick_state"); + break; + } + case "minecraft:pufferfish_bucket": + case "minecraft:salmon_bucket": + case "minecraft:cod_bucket": + case "minecraft:tropical_fish_bucket": + case "minecraft:axolotl_bucket": + case "minecraft:tadpole_bucket": { + convertMobBucket(item, type); + break; + } + case "minecraft:goat_horn": { + item.tagMigrateToComponent("instrument", "minecraft:instrument"); + break; + } + case "minecraft:knowledge_book": { + item.tagMigrateToComponent("Recipes", "minecraft:recipes"); + break; + } + case "minecraft:compass": { + convertCompass(item, type); + break; + } + case "minecraft:firework_rocket": { + convertFireworkRocket(item, type); + break; + } + case "minecraft:firework_star": { + convertFireworkStar(item, type); + break; + } + case "minecraft:player_head": { + convertSukll(item, type); + break; + } + } + + return item.serialize(); + } + + private ConverterItemStackToDataComponents() {} + + private static final class TransientItemStack { + + private final String id; + private final int count; + + private final MapType components; + private final MapType tag; + private final MapType root; + + public TransientItemStack(final MapType root) { + this.id = root.getString("id"); + this.count = root.getInt("Count"); + + final TypeUtil type = root.getTypeUtil(); + + this.components = type.createEmptyMap(); + + final MapType rootCopy = root.copy(); + + final MapType tag = rootCopy.getMap("tag"); + + rootCopy.remove("id"); + rootCopy.remove("Count"); + rootCopy.remove("tag"); + + this.tag = tag == null ? type.createEmptyMap() : tag; + + this.root = rootCopy; + } + + public void migrateTagTo(final String tagKey, final MapType dst, final String dstKey) { + final Object value = this.tag.getGeneric(tagKey); + + if (value != null) { + this.tag.remove(tagKey); + + dst.setGeneric(dstKey, value); + } + } + + public String tagRemoveString(final String key) { + final String ret = this.tag.getString(key); + + this.tag.remove(key); + + return ret; + } + + public String tagRemoveString(final String key, final String dfl) { + final String ret = this.tag.getString(key, dfl); + + this.tag.remove(key); + + return ret; + } + + public ListType tagRemoveListUnchecked(final String key) { + final ListType ret = this.tag.getListUnchecked(key); + + this.tag.remove(key); + + return ret; + } + + public ListType tagRemoveList(final String key, final ObjectType listType) { + final ListType ret = this.tag.getList(key, listType); + + this.tag.remove(key); + + return ret; + } + + public MapType tagRemoveMap(final String key) { + final MapType ret = this.tag.getMap(key); + + this.tag.remove(key); + + return ret; + } + + public boolean tagRemoveBoolean(final String key, final boolean dfl) { + final boolean ret = this.tag.getBoolean(key, dfl); + + this.tag.remove(key); + + return ret; + } + + public int tagRemoveInt(final String key, final int dfl) { + final int ret = this.tag.getInt(key, dfl); + + this.tag.remove(key); + + return ret; + } + + public Object tagRemoveGeneric(final String key) { + final Object ret = this.tag.getGeneric(key); + + if (ret != null) { + this.tag.remove(key); + return ret; + } + + return ret; + } + + public void tagMigrateToComponent(final String tagKey, final String componentKey) { + final Object value = this.tag.getGeneric(tagKey); + if (value != null) { + this.tag.remove(tagKey); + + this.components.setGeneric(componentKey, value); + } + } + + public void tagMigrateNonEmptyListToComponent(final String tagKey, final String componentKey) { + final Object value = this.tag.getGeneric(tagKey); + if (value != null) { + this.tag.remove(tagKey); + + if (!(value instanceof ListType list) || list.size() > 0) { + this.components.setGeneric(componentKey, value); + } + } + } + + public void tagMigrateToComponent(final String tagKey, final String componentKey, final int defaultComponent) { + final int value = this.tag.getInt(tagKey, defaultComponent); + this.tag.remove(tagKey); + + if (value != defaultComponent) { + this.components.setGeneric(componentKey, value); + } + } + + public void componentSetBoolean(final String key, final boolean value) { + this.components.setBoolean(key, value); + } + + public void componentSetString(final String key, final String value) { + this.components.setString(key, value); + } + + public void componentSetList(final String key, final ListType value) { + this.components.setList(key, value); + } + + public void componentSetMap(final String key, final MapType value) { + this.components.setMap(key, value); + } + + public void componentSetGeneric(final String key, final Object value) { + this.components.setGeneric(key, value); + } + + public MapType serialize() { + final MapType ret = this.components.getTypeUtil().createEmptyMap(); + + ret.setString("id", this.id); + ret.setInt("count", this.count); + if (!this.tag.isEmpty()) { + this.components.setMap("minecraft:custom_data", this.tag); + } + + if (!this.components.isEmpty()) { + ret.setMap("components", this.components); + } + + // merge root to ret, with entries in ret taking priority + if (!this.root.isEmpty()) { + for (final String key : this.root.keys()) { + if (ret.hasKey(key)) { + continue; + } + + ret.setGeneric(key, this.root.getGeneric(key)); + } + } + + return ret; + } + } +} diff --git a/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> { + + private final Set flags; + + public ConverterRemoveFeatureFlag(final int toVersion, final Set flags) { + this(toVersion, 0, flags); + } + + public ConverterRemoveFeatureFlag(final int toVersion, final int versionStep, final Set flags) { + super(toVersion, versionStep); + this.flags = flags; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType enabledFeatures = data.getList("enabled_features", ObjectType.STRING); + if (enabledFeatures == null) { + return null; + } + + ListType removedFeatures = null; + + for (int i = 0; i < enabledFeatures.size(); ++i) { + final String flag = enabledFeatures.getString(i); + if (!this.flags.contains(flag)) { + continue; + } + enabledFeatures.remove(i--); + + if (removedFeatures == null) { + removedFeatures = data.getOrCreateList("removed_features", ObjectType.STRING); + } + removedFeatures.addString(flag); + } + + return null; + } +} diff --git a/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 renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int subVersion, final Function renamer) { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(version, subVersion) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameKeys(data, renamer); + return null; + } + }); + } + +} diff --git a/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 nbt, final String data) { + final MapType itemNBT = nbt.getTypeUtil().createEmptyMap(); + nbt.setMap("item", itemNBT); + itemNBT.setInt("Count", 1); + + final int nbtStart = data.indexOf('{'); + if (nbtStart == -1) { + // assume data is item name + itemNBT.setString("id", NamespaceUtil.correctNamespace(data)); + return; + } + // itemname{tagNBT} + itemNBT.setString("id", NamespaceUtil.correctNamespace(data.substring(0, nbtStart))); + + final CompoundTag tag = parseNBT(data.substring(nbtStart)); + if (tag != null) { + // do we need to worry about type conversion? + itemNBT.setMap("tag", new NBTMapType(tag)); + } + } + + private static MapType parseProperties(final String input, final TypeUtil type) { + final MapType ret = type.createEmptyMap(); + try { + // format: [p1=v1, p2=v2, p3=v3, ...] + final StringReader reader = new StringReader(input); + + reader.expect('['); + reader.skipWhitespace(); + + if (reader.canRead() && reader.peek() != ']') { + while (reader.canRead()) { + final String property = reader.readString(); + + reader.skipWhitespace(); + reader.expect('='); + reader.skipWhitespace(); + + final String value = reader.readString(); + ret.setString(property, value); + + reader.skipWhitespace(); + if (reader.canRead()) { + if (reader.peek() != ',') { + // invalid character or ']' + break; + } + + // skip ',' and move onto next entry + reader.skip(); + } + + reader.skipWhitespace(); + } + } + + reader.expect(']'); + return ret; + } catch (final Exception ex) { + LOGGER.warn("Failed to parse block properties: " + input, ex); + return null; + } + } + + private static void convertBlock(final MapType nbt, final String data) { + final MapType blockNBT = nbt.getTypeUtil().createEmptyMap(); + nbt.setMap("block_state", blockNBT); + + final int propertiesStart = data.indexOf('['); + if (propertiesStart == -1) { + // assume data is id + blockNBT.setString("Name", NamespaceUtil.correctNamespace(data)); + return; + } + blockNBT.setString("Name", NamespaceUtil.correctNamespace(data.substring(0, propertiesStart))); + + // blockname{properties} + final MapType properties = parseProperties(data.substring(propertiesStart), nbt.getTypeUtil()); + if (properties != null && !properties.isEmpty()) { + blockNBT.setMap("Properties", properties); + } + } + + private static ListType parseFloatVector(final StringReader reader, final TypeUtil type) throws CommandSyntaxException { + final float x = reader.readFloat(); + + reader.expect(' '); + final float y = reader.readFloat(); + + reader.expect(' '); + final float z = reader.readFloat(); + + final ListType ret = type.createEmptyList(); + ret.addFloat(x); + ret.addFloat(y); + ret.addFloat(z); + + return ret; + } + + private static void convertDust(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final ListType color = parseFloatVector(reader, nbt.getTypeUtil()); + + reader.expect(' '); + final float scale = reader.readFloat(); + + nbt.setList("color", color); + nbt.setFloat("scale", scale); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse dust particle: " + data, ex); + } + } + + private static void convertColorDust(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final ListType fromColor = parseFloatVector(reader, nbt.getTypeUtil()); + + reader.expect(' '); + final float scale = reader.readFloat(); + + reader.expect(' '); + final ListType toColor = parseFloatVector(reader, nbt.getTypeUtil()); + + nbt.setList("from_color", fromColor); + nbt.setFloat("scale", scale); + nbt.setList("to_color", toColor); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse color transition dust particle: " + data, ex); + } + } + + private static void convertSculk(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final float roll = reader.readFloat(); + + nbt.setFloat("roll", roll); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse sculk particle: " + data, ex); + } + } + + private static void convertVibration(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final double posX = reader.readDouble(); + + reader.expect(' '); + final double posY = reader.readDouble(); + + reader.expect(' '); + final double posZ = reader.readDouble(); + + reader.expect(' '); + final int arrival = reader.readInt(); + + nbt.setInt("arrival_in_ticks", arrival); + + final MapType destination = nbt.getTypeUtil().createEmptyMap(); + nbt.setMap("destination", destination); + + destination.setString("type", "minecraft:block"); + + final ListType pos = nbt.getTypeUtil().createEmptyList(); + destination.setList("pos", pos); + + pos.addInt(Mth.floor(posX)); + pos.addInt(Mth.floor(posY)); + pos.addInt(Mth.floor(posZ)); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse vibration particle: " + data, ex); + } + } + + private static void convertShriek(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final int delay = reader.readInt(); + + nbt.setInt("delay", delay); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse shriek particle: " + data, ex); + } + } + + public static MapType convert(final String flat, final TypeUtil type) { + final String[] split = flat.split(" ", 2); + final String name = NamespaceUtil.correctNamespace(split[0]); + + final MapType ret = type.createEmptyMap(); + ret.setString("type", name); + + if (split.length > 1) { + final String data = split[1]; + switch (name) { + case "minecraft:item": { + convertItem(ret, data); + break; + } + case "minecraft:block": + case "minecraft:block_marker": + case "minecraft:falling_dust": + case "minecraft:dust_pillar": { + convertBlock(ret, data); + break; + } + case "minecraft:dust": { + convertDust(ret, data); + break; + } + case "minecraft:dust_color_transition": { + convertColorDust(ret, data); + break; + } + case "minecraft:sculk_charge": { + convertSculk(ret, data); + break; + } + case "minecraft:vibration": { + convertVibration(ret, data); + break; + } + case "minecraft:shriek": { + convertShriek(ret, data); + break; + } + } + } + + return ret; + } + + private ConverterParticleToNBT() {} +} diff --git a/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 renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int subVersion, final Function renamer) { + MCTypeRegistry.POI_CHUNK.addStructureConverter(new DataConverter<>(version, subVersion) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType sections = data.getMap("Sections"); + if (sections == null) { + return null; + } + + for (final String key : sections.keys()) { + final MapType section = sections.getMap(key); + + final ListType records = section.getList("Records", ObjectType.MAP); + + if (records == null) { + continue; + } + + for (int i = 0, len = records.size(); i < len; ++i) { + final MapType record = records.getMap(i); + + final String type = record.getString("type"); + if (type != null) { + final String converted = renamer.apply(type); + if (converted != null) { + record.setString("type", converted); + } + } + } + } + + return null; + } + }); + } +} diff --git a/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> { + + private final Predicate delete; + + public ConverterPoiDelete(final int toVersion, final Predicate delete) { + super(toVersion); + this.delete = delete; + } + + public ConverterPoiDelete(final int toVersion, final int versionStep, final Predicate delete) { + super(toVersion, versionStep); + this.delete = delete; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType sections = data.getMap("Sections"); + if (sections == null) { + return null; + } + + for (final String key : sections.keys()) { + final MapType section = sections.getMap(key); + + final ListType records = section.getList("Records", ObjectType.MAP); + + if (records == null) { + continue; + } + + for (int i = 0; i < records.size();) { + final MapType record = records.getMap(i); + + final String type = record.getString("type"); + if (type != null && this.delete.test(type)) { + records.remove(i); + continue; + } + ++i; + } + } + + return null; + } +} diff --git a/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 renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int subVersion, final Function 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 renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int subVersion, final Function renamer) { + MCTypeRegistry.OBJECTIVE.addStructureConverter(new DataConverter<>(version, subVersion) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType criteriaType = data.getMap("CriteriaType"); + if (criteriaType == null) { + return null; + } + + final String type = criteriaType.getString("type"); + if (!"minecraft:custom".equals(type)) { + return null; + } + + final String id = criteriaType.getString("id"); + if (id == null) { + return null; + } + + final String rename = renamer.apply(id); + if (rename != null) { + criteriaType.setString("id", rename); + } + + return null; + } + }); + + MCTypeRegistry.STATS.addStructureConverter(new DataConverter<>(version, subVersion) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType stats = data.getMap("stats"); + + if (stats == null) { + return null; + } + + final MapType custom = stats.getMap("minecraft:custom"); + if (custom == null) { + return null; + } + + RenameHelper.renameKeys(custom, renamer); + + return null; + } + }); + } +} diff --git a/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 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 SKIP = new HashSet<>( + ImmutableSet.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 CUSTOM_MAP = new HashMap<>( + ImmutableMap.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 ITEM_KEYS = new HashMap<>( + ImmutableMap.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 ENTITY_KEYS = new HashMap<>( + ImmutableMap.builder() + .put("stat.entityKilledBy", "minecraft:killed_by") + .put("stat.killEntity", "minecraft:killed") + .build() + ); + + private static final Map ENTITIES = new HashMap<>( + ImmutableMap.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> makeStatsConverter() { + return new DataConverter<>(VERSION, VERSION_STEP) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType stats = Types.NBT.createEmptyMap(); + + for (final String statKey : data.keys()) { + final Number value = data.getNumber(statKey); + if (value == null) { + continue; + } + + final StatType converted = convertLegacyKey(statKey); + + if (converted == null) { + continue; + } + + stats.getOrCreateMap(converted.category()).setGeneric(converted.key(), value); + } + + data.clear(); + data.setMap("stats", stats); + + return null; + } + }; + } + + public static DataConverter, MapType> makeObjectiveConverter() { + return new DataConverter<>(VERSION, VERSION_STEP) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertCriteriaName(data, "CriteriaName"); + + // We also need to update CriteriaType that is created by the data hook in V1451, + // otherwise that data hook will overwrite our CriteriaName + final MapType criteriaType = data.getMap("CriteriaType"); + if (criteriaType != null) { + if ("_special".equals(criteriaType.getString("type"))) { + convertCriteriaName(criteriaType, "id"); + } + } + + return null; + } + + private void convertCriteriaName(final MapType data, final String key) { + final String criteriaName = data.getString(key); + + if (criteriaName == null) { + return; + } + + if (SPECIAL_OBJECTIVE_CRITERIA.contains(criteriaName)) { + return; + } + + final StatType converted = convertLegacyKey(criteriaName); + data.setString(key, converted == null ? "dummy" : V1451.packWithDot(converted.category()) + ":" + V1451.packWithDot(converted.key())); + } + }; + } +} diff --git a/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 renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int subVersion, final Function renamer) { + MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(version, subVersion) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + if (id == null) { + return null; + } + + final String converted = renamer.apply(id); + + if (converted != null) { + data.setString("id", converted); + } + + return null; + } + }); + } + +} diff --git a/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 { + + public final String name; + + protected final ArrayList> structureConverters = new ArrayList<>(); + protected final Long2ObjectArraySortedMap>> structureWalkers = new Long2ObjectArraySortedMap<>(); + protected final Long2ObjectArraySortedMap>> structureHooks = new Long2ObjectArraySortedMap<>(); + + public DynamicDataType(final String name) { + this.name = name; + } + + public void addStructureConverter(final DataConverter converter) { + MCVersionRegistry.checkVersion(converter.getEncodedVersion()); + this.structureConverters.add(converter); + this.structureConverters.sort(DataConverter.LOWEST_VERSION_COMPARATOR); + } + + public void addStructureWalker(final int minVersion, final DataWalker walker) { + this.addStructureWalker(minVersion, 0, walker); + } + + public void addStructureWalker(final int minVersion, final int versionStep, final DataWalker walker) { + this.structureWalkers.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> { + return new ArrayList<>(); + }).add(walker); + } + + public void addStructureHook(final int minVersion, final DataHook hook) { + this.addStructureHook(minVersion, 0, hook); + } + + public void addStructureHook(final int minVersion, final int versionStep, final DataHook 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> converters = this.structureConverters; + for (int i = 0, len = converters.size(); i < len; ++i) { + final DataConverter converter = converters.get(i); + final long converterVersion = converter.getEncodedVersion(); + + if (converterVersion <= fromVersion) { + continue; + } + + if (converterVersion > toVersion) { + break; + } + + List> 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> 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> 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>>>> walkersById = new HashMap<>(); + + public IDDataType(final String name) { + super(name); + } + + public void addConverterForId(final String id, final DataConverter, MapType> converter) { + this.addStructureConverter(new DataConverter<>(converter.getToVersion(), converter.getVersionStep()) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!id.equals(data.getString("id"))) { + return null; + } + return converter.convert(data, sourceVersion, toVersion); + } + }); + } + + public void addWalker(final int minVersion, final String id, final DataWalker> walker) { + this.addWalker(minVersion, 0, id, walker); + } + + public void addWalker(final int minVersion, final int versionStep, final String id, final DataWalker> 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>>> walkersForId = this.walkersById.get(fromId); + if (walkersForId == null) { + return; + } + + final List>> nearest = walkersForId.getFloor(version); + + if (nearest == null) { + return; + } + + for (final DataWalker> walker : nearest) { + this.addWalker(minVersion, versionStep, toId, walker); + } + } + + @Override + public MapType convert(MapType data, final long fromVersion, final long toVersion) { + MapType ret = null; + + final List, MapType>> converters = this.structureConverters; + for (int i = 0, len = converters.size(); i < len; ++i) { + final DataConverter, MapType> converter = converters.get(i); + final long converterVersion = converter.getEncodedVersion(); + + if (converterVersion <= fromVersion) { + continue; + } + + if (converterVersion > toVersion) { + break; + } + + List, MapType>> hooks = this.structureHooks.getFloor(converterVersion); + + if (hooks != null) { + for (int k = 0, klen = hooks.size(); k < klen; ++k) { + final MapType replace = hooks.get(k).preHook(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + } + } + + final MapType replace = converter.convert(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + + // possibly new data format, update hooks + hooks = this.structureHooks.getFloor(toVersion); + + if (hooks != null) { + for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) { + final MapType postReplace = hooks.get(k).postHook(data, fromVersion, toVersion); + if (postReplace != null) { + ret = data = postReplace; + } + } + } + } + + final List, MapType>> hooks = this.structureHooks.getFloor(toVersion); + + // run pre hooks + + if (hooks != null) { + for (int k = 0, klen = hooks.size(); k < klen; ++k) { + final MapType replace = hooks.get(k).preHook(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + } + } + + // run all walkers + + final List>> walkers = this.structureWalkers.getFloor(toVersion); + if (walkers != null) { + for (int i = 0, len = walkers.size(); i < len; ++i) { + final MapType replace = walkers.get(i).walk(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + } + } + + final Long2ObjectArraySortedMap>>> walkersByVersion = this.walkersById.get(data.getString("id")); + if (walkersByVersion != null) { + final List>> walkersForId = walkersByVersion.getFloor(toVersion); + if (walkersForId != null) { + for (int i = 0, len = walkersForId.size(); i < len; ++i) { + final MapType replace = walkersForId.get(i).walk(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + } + } + } + + // run post hooks + + if (hooks != null) { + for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) { + final MapType postReplace = hooks.get(k).postHook(data, fromVersion, toVersion); + if (postReplace != null) { + ret = data = postReplace; + } + } + } + + return ret; + } +} diff --git a/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> { + + public final String name; + + protected final ArrayList, MapType>> structureConverters = new ArrayList<>(); + protected final Long2ObjectArraySortedMap>>> structureWalkers = new Long2ObjectArraySortedMap<>(); + protected final Long2ObjectArraySortedMap, MapType>>> structureHooks = new Long2ObjectArraySortedMap<>(); + + public MCDataType(final String name) { + this.name = name; + } + + public void addStructureConverter(final DataConverter, MapType> converter) { + MCVersionRegistry.checkVersion(converter.getEncodedVersion()); + this.structureConverters.add(converter); + this.structureConverters.sort(DataConverter.LOWEST_VERSION_COMPARATOR); + } + + public void addStructureWalker(final int minVersion, final DataWalker> walker) { + this.addStructureWalker(minVersion, 0, walker); + } + + public void addStructureWalker(final int minVersion, final int versionStep, final DataWalker> 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> hook) { + this.addStructureHook(minVersion, 0, hook); + } + + public void addStructureHook(final int minVersion, final int versionStep, final DataHook, MapType> hook) { + this.structureHooks.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> { + return new ArrayList<>(); + }).add(hook); + } + + @Override + public MapType convert(MapType data, final long fromVersion, final long toVersion) { + MapType ret = null; + + final List, MapType>> converters = this.structureConverters; + for (int i = 0, len = converters.size(); i < len; ++i) { + final DataConverter, MapType> converter = converters.get(i); + final long converterVersion = converter.getEncodedVersion(); + + if (converterVersion <= fromVersion) { + continue; + } + + if (converterVersion > toVersion) { + break; + } + + List, MapType>> hooks = this.structureHooks.getFloor(converterVersion); + + if (hooks != null) { + for (int k = 0, klen = hooks.size(); k < klen; ++k) { + final MapType replace = hooks.get(k).preHook(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + } + } + + final MapType replace = converter.convert(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + + // possibly new data format, update hooks + hooks = this.structureHooks.getFloor(toVersion); + + if (hooks != null) { + for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) { + final MapType postReplace = hooks.get(k).postHook(data, fromVersion, toVersion); + if (postReplace != null) { + ret = data = postReplace; + } + } + } + } + + final List, MapType>> hooks = this.structureHooks.getFloor(toVersion); + + if (hooks != null) { + for (int k = 0, klen = hooks.size(); k < klen; ++k) { + final MapType replace = hooks.get(k).preHook(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + } + } + + final List>> walkers = this.structureWalkers.getFloor(toVersion); + if (walkers != null) { + for (int i = 0, len = walkers.size(); i < len; ++i) { + final MapType replace = walkers.get(i).walk(data, fromVersion, toVersion); + if (replace != null) { + ret = data = replace; + } + } + } + + if (hooks != null) { + for (int klen = hooks.size(), k = klen - 1; k >= 0; --k) { + final MapType postReplace = hooks.get(k).postHook(data, fromVersion, toVersion); + if (postReplace != null) { + ret = data = postReplace; + } + } + } + + return ret; + } +} diff --git a/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..37519f2aab94c299f68819d1b2df2caffb75c9cd --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java @@ -0,0 +1,298 @@ +package ca.spottedleaf.dataconverter.minecraft.datatypes; + +import ca.spottedleaf.dataconverter.minecraft.versions.*; +import com.mojang.logging.LogUtils; +import org.slf4j.Logger; + +public final class MCTypeRegistry { + + private static final Logger LOGGER = LogUtils.getLogger(); + + 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 { + try { + registerAll(); + } catch (final Throwable thr) { + LOGGER.error(LogUtils.FATAL_MARKER, "Failed to register data converters", thr); + throw new RuntimeException(thr); + } + } + + 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(); + } + + 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 { + + public final String name; + + protected final ArrayList> converters = new ArrayList<>(); + protected final Long2ObjectArraySortedMap>> structureHooks = new Long2ObjectArraySortedMap<>(); + + public MCValueType(final String name) { + this.name = name; + } + + public void addStructureHook(final int minVersion, final DataHook hook) { + this.addStructureHook(minVersion, 0, hook); + } + + public void addStructureHook(final int minVersion, final int versionStep, final DataHook hook) { + this.structureHooks.computeIfAbsent(DataConverter.encodeVersions(minVersion, versionStep), (final long keyInMap) -> { + return new ArrayList<>(); + }).add(hook); + } + + public void addConverter(final DataConverter 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> converters = this.converters; + + for (int i = 0, len = converters.size(); i < len; ++i) { + final DataConverter converter = converters.get(i); + final long converterVersion = converter.getEncodedVersion(); + + if (converterVersion <= fromVersion) { + continue; + } + + if (converterVersion > toVersion) { + break; + } + + List> 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> { + + private final String path; + + public DataHookEnforceNamespacedID() { + this("id"); + } + + public DataHookEnforceNamespacedID(final String path) { + this.path = path; + } + + @Override + public MapType preHook(final MapType data, final long fromVersion, final long toVersion) { + NamespaceUtil.enforceForPath(data, this.path); + return null; + } + + @Override + public MapType postHook(final MapType data, final long fromVersion, final long toVersion) { + return null; + } +} diff --git a/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 { + + @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..7f8f9d002b286f166d6e59bbf77aff74af10731c --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java @@ -0,0 +1,78 @@ +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) { + 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType equipment = data.getList("Equipment", ObjectType.MAP); + data.remove("Equipment"); + + if (equipment != null) { + if (equipment.size() > 0 && data.getListUnchecked("HandItems") == null) { + final ListType handItems = Types.NBT.createEmptyList(); + data.setList("HandItems", handItems); + handItems.addMap(equipment.getMap(0)); + handItems.addMap(Types.NBT.createEmptyMap()); + } + + if (equipment.size() > 1 && data.getListUnchecked("ArmorItems") == null) { + final ListType armorItems = Types.NBT.createEmptyList(); + data.setList("ArmorItems", armorItems); + for (int i = 1; i < Math.min(equipment.size(), 5); ++i) { + armorItems.addMap(equipment.getMap(i)); + } + } + } + + final ListType dropChances = data.getList("DropChances", ObjectType.FLOAT); + data.remove("DropChances"); + + if (dropChances != null) { + if (data.getListUnchecked("HandDropChances") == null) { + final ListType handDropChances = Types.NBT.createEmptyList(); + data.setList("HandDropChances", handDropChances); + if (0 < dropChances.size()) { + handDropChances.addFloat(dropChances.getFloat(0)); + } else { + handDropChances.addFloat(0.0F); + } + handDropChances.addFloat(0.0F); + } + + if (data.getListUnchecked("ArmorDropChances") == null) { + final ListType armorDropChances = Types.NBT.createEmptyList(); + data.setList("ArmorDropChances", armorDropChances); + for (int i = 1; i < 5; ++i) { + if (i < dropChances.size()) { + armorDropChances.addFloat(dropChances.getFloat(i)); + } else { + armorDropChances.addFloat(0.0F); + } + } + } + } + + return null; + } + }); + + 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 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 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..96ea4669d6ad893ba52af045082f9ccb90fe90bf --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V101.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V101 { + + private static final int VERSION = MCVersions.V15W32A + 1; + + private static void updateLine(final MapType data, final String path) { + final String textString = data.getString(path); + + if (textString == null) { + return; + } + + data.setString(path, ComponentUtils.convertFromLenient(textString)); + } + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("Sign", new DataConverter<>(VERSION) { + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateLine(data, "Text1"); + updateLine(data, "Text2"); + updateLine(data, "Text3"); + updateLine(data, "Text4"); + return null; + } + }); + } + + 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey("id", ObjectType.NUMBER)) { + return null; + } + + final int id = data.getInt("id"); + + String remap = HelperItemNameV102.getNameFromId(id); + if (remap == null) { + LOGGER.warn("Unknown legacy integer id (V102) " + id); + remap = HelperItemNameV102.getNameFromId(0); + } + + data.setString("id", remap); + + return null; + } + }); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:potion", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final short damage = data.getShort("Damage"); + if (damage != 0) { + data.setShort("Damage", (short)0); + } + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + data.setMap("tag", tag); + } + + if (!tag.hasKey("Potion", ObjectType.STRING)) { + final String converted = HelperItemNameV102.getPotionNameFromId(damage); + tag.setString("Potion", converted == null ? "minecraft:water" : converted); + if ((damage & 16384) == 16384) { + data.setString("id", "minecraft:splash_potion"); + } + } + + return null; + } + }); + } + + private V102() {} +} diff --git a/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..c1510d9167f466d3b7e3756353224f12f3876442 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java @@ -0,0 +1,41 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1022 { + + private static final int VERSION = MCVersions.V17W06A; + + public static void register() { + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("RootVehicle"), "Entity", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "EnderItems", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityLeft", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityRight", fromVersion, toVersion); + + final MapType recipeBook = data.getMap("recipeBook"); + if (recipeBook != null) { + WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "recipes", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "toBeDisplayed", fromVersion, toVersion); + } + + return null; + }); + + MCTypeRegistry.HOTBAR.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + for (final String key : data.keys()) { + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, key, fromVersion, toVersion); + } + + return null; + }); + } + + private V1022() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + } + + final short damage = data.getShort("Damage"); + if (damage != 0) { + data.setShort("Damage", (short)0); + } + + MapType entityTag = tag.getMap("EntityTag"); + if (entityTag == null) { + entityTag = Types.NBT.createEmptyMap(); + } + + if (!entityTag.hasKey("id", ObjectType.STRING)) { + final String converted = HelperSpawnEggNameV105.getSpawnNameFromId(damage); + if (converted != null) { + entityTag.setString("id", converted); + tag.setMap("EntityTag", entityTag); + data.setMap("tag", tag); + } + } + + return null; + } + }); + } + + private V105() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + // While all converters for spawners check the id for this version, we don't because spawners exist in minecarts. ooops! Loading a chunk + // with a minecart spawner from 1.7.10 in 1.16.5 vanilla will fail to convert! Clearly there was a mistake in how they + // used and applied spawner converters. In anycase, do not check the id - we are not guaranteed to be a tile + // entity. We can be a regular old minecart spawner. And we know we are a spawner because this is only called from data walkers. + + final String entityId = data.getString("EntityId"); + if (entityId != null) { + data.remove("EntityId"); + MapType spawnData = data.getMap("SpawnData"); + if (spawnData == null) { + spawnData = Types.NBT.createEmptyMap(); + data.setMap("SpawnData", spawnData); + } + spawnData.setString("id", entityId.isEmpty() ? "Pig" : entityId); + } + + final ListType spawnPotentials = data.getList("SpawnPotentials", ObjectType.MAP); + if (spawnPotentials != null) { + for (int i = 0, len = spawnPotentials.size(); i < len; ++i) { + // convert to standard entity format (it's not a coincidence a walker for spawners is only added + // in this version) + final MapType spawn = spawnPotentials.getMap(i); + final String spawnType = spawn.getString("Type"); + if (spawnType == null) { + continue; + } + spawn.remove("Type"); + + MapType properties = spawn.getMap("Properties"); + if (properties == null) { + properties = Types.NBT.createEmptyMap(); + } else { + spawn.remove("Properties"); + } + + properties.setString("id", spawnType); + + spawn.setMap("Entity", properties); + } + } + + return null; + } + }); + + MCTypeRegistry.UNTAGGED_SPAWNER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final ListType spawnPotentials = data.getList("SpawnPotentials", ObjectType.MAP); + if (spawnPotentials != null) { + for (int i = 0, len = spawnPotentials.size(); i < len; ++i) { + final MapType spawnPotential = spawnPotentials.getMap(i); + WalkerUtils.convert(MCTypeRegistry.ENTITY, spawnPotential, "Entity", fromVersion, toVersion); + } + } + + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "SpawnData", fromVersion, toVersion); + + return null; + }); + } + + private V106() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + String newId = "MinecartRideable"; // dfl + final int type = data.getInt("Type"); + data.remove("Type"); + + if (type >= 0 && type < MINECART_IDS.length) { + newId = MINECART_IDS[type]; + } + data.setString("id", newId); + + return null; + } + }); + } + + private V107() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final String uuidString = data.getString("UUID"); + + if (uuidString == null) { + return null; + } + data.remove("UUID"); + + final UUID uuid; + try { + uuid = UUID.fromString(uuidString); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse UUID for legacy entity (V108): " + uuidString, ex); + return null; + } + + data.setLong("UUIDMost", uuid.getMostSignificantBits()); + data.setLong("UUIDLeast", uuid.getLeastSignificantBits()); + + return null; + } + }); + } + + private V108() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number healF = data.getNumber("HealF"); + final Number heal = data.getNumber("Health"); + + final float newHealth; + + if (healF != null) { + data.remove("HealF"); + newHealth = healF.floatValue(); + } else { + if (heal == null) { + return null; + } + + newHealth = heal.floatValue(); + } + + data.setFloat("Health", newHealth); + + return null; + } + }); + } + + private V109() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.getBoolean("Saddle") || data.hasKey("SaddleItem", ObjectType.MAP)) { + return null; + } + + final MapType saddleItem = Types.NBT.createEmptyMap(); + data.remove("Saddle"); + data.setMap("SaddleItem", saddleItem); + + saddleItem.setString("id", "minecraft:saddle"); + saddleItem.setByte("Count", (byte)1); + saddleItem.setShort("Damage", (short)0); + + return null; + } + }); + } + + private V110() {} +} diff --git a/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> { + + private static final int[][] DIRECTIONS = new int[][] { + {0, 0, 1}, + {-1, 0, 0}, + {0, 0, -1}, + {1, 0, 0} + }; + + public EntityRotationFix(final int version) { + super(version); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getNumber("Facing") != null) { + return null; + } + + final Number direction = data.getNumber("Direction"); + final int facing; + if (direction != null) { + data.remove("Direction"); + facing = direction.intValue() % DIRECTIONS.length; + final int[] offsets = DIRECTIONS[facing]; + data.setInt("TileX", data.getInt("TileX") + offsets[0]); + data.setInt("TileY", data.getInt("TileY") + offsets[1]); + data.setInt("TileZ", data.getInt("TileZ") + offsets[2]); + if ("ItemFrame".equals(data.getString("id"))) { + final Number rotation = data.getNumber("ItemRotation"); + if (rotation != null) { + data.setByte("ItemRotation", (byte)(rotation.byteValue() * 2)); + } + } + } else { + facing = data.getByte("Dir") % DIRECTIONS.length; + data.remove("Dir"); + } + + data.setByte("Facing", (byte)facing); + + return null; + } + } +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final int chunkX = level.getInt("xPos"); + final int chunkZ = level.getInt("zPos"); + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + ListType tileEntities = level.getList("TileEntities", ObjectType.MAP); + if (tileEntities == null) { + tileEntities = Types.NBT.createEmptyList(); + level.setList("TileEntities", tileEntities); + } + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + final byte sectionY = section.getByte("Y"); + final byte[] blocks = section.getBytes("Blocks"); + + if (blocks == null) { + continue; + } + + for (int blockIndex = 0; blockIndex < blocks.length; ++blockIndex) { + if (BED_BLOCK_ID != ((blocks[blockIndex] & 255) << 4)) { + continue; + } + + final int localX = blockIndex & 15; + final int localZ = (blockIndex >> 4) & 15; + final int localY = (blockIndex >> 8) & 15; + + final MapType newTile = Types.NBT.createEmptyMap(); + newTile.setString("id", "minecraft:bed"); + newTile.setInt("x", localX + (chunkX << 4)); + newTile.setInt("y", localY + (sectionY << 4)); + newTile.setInt("z", localZ + (chunkZ << 4)); + newTile.setShort("color", (short)14); // Red + + tileEntities.addMap(newTile); + } + } + + return null; + } + }); + + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:bed", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getShort("Damage") == 0) { + data.setShort("Damage", (short)14); // Red + } + + return null; + } + }); + + + MCTypeRegistry.ADVANCEMENTS.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertKeys(MCTypeRegistry.BIOME, data.getMap("minecraft:adventure/adventuring_time"), "criteria", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/kill_a_mob"), "criteria", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/kill_all_mobs"), "criteria", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/bred_all_animals"), "criteria", fromVersion, toVersion); + + return null; + }); + + // Enforce namespacing for ids + MCTypeRegistry.BIOME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced()); + } + + private V1125() {} +} diff --git a/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 data, final String id, final int requiredLength) { + final ListType list = data.getList(id, ObjectType.FLOAT); + if (list != null && list.size() == requiredLength) { + for (int i = 0; i < requiredLength; ++i) { + if (list.getFloat(i) != 0.0F) { + return; + } + } + } + + data.remove(id); + } + + public static void register() { + // Removes "HandDropChances" and "ArmorDropChances" if they're empty. + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + checkList(data, "HandDropChances", 2); + checkList(data, "ArmorDropChances", 4); + return null; + } + }); + } + + private V113() {} +} diff --git a/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 BUTTON_ID_TO_NAME = new Int2ObjectOpenHashMap<>(); + static { + BUTTON_ID_TO_NAME.put(0, "key.unknown"); + BUTTON_ID_TO_NAME.put(11, "key.0"); + BUTTON_ID_TO_NAME.put(2, "key.1"); + BUTTON_ID_TO_NAME.put(3, "key.2"); + BUTTON_ID_TO_NAME.put(4, "key.3"); + BUTTON_ID_TO_NAME.put(5, "key.4"); + BUTTON_ID_TO_NAME.put(6, "key.5"); + BUTTON_ID_TO_NAME.put(7, "key.6"); + BUTTON_ID_TO_NAME.put(8, "key.7"); + BUTTON_ID_TO_NAME.put(9, "key.8"); + BUTTON_ID_TO_NAME.put(10, "key.9"); + BUTTON_ID_TO_NAME.put(30, "key.a"); + BUTTON_ID_TO_NAME.put(40, "key.apostrophe"); + BUTTON_ID_TO_NAME.put(48, "key.b"); + BUTTON_ID_TO_NAME.put(43, "key.backslash"); + BUTTON_ID_TO_NAME.put(14, "key.backspace"); + BUTTON_ID_TO_NAME.put(46, "key.c"); + BUTTON_ID_TO_NAME.put(58, "key.caps.lock"); + BUTTON_ID_TO_NAME.put(51, "key.comma"); + BUTTON_ID_TO_NAME.put(32, "key.d"); + BUTTON_ID_TO_NAME.put(211, "key.delete"); + BUTTON_ID_TO_NAME.put(208, "key.down"); + BUTTON_ID_TO_NAME.put(18, "key.e"); + BUTTON_ID_TO_NAME.put(207, "key.end"); + BUTTON_ID_TO_NAME.put(28, "key.enter"); + BUTTON_ID_TO_NAME.put(13, "key.equal"); + BUTTON_ID_TO_NAME.put(1, "key.escape"); + BUTTON_ID_TO_NAME.put(33, "key.f"); + BUTTON_ID_TO_NAME.put(59, "key.f1"); + BUTTON_ID_TO_NAME.put(68, "key.f10"); + BUTTON_ID_TO_NAME.put(87, "key.f11"); + BUTTON_ID_TO_NAME.put(88, "key.f12"); + BUTTON_ID_TO_NAME.put(100, "key.f13"); + BUTTON_ID_TO_NAME.put(101, "key.f14"); + BUTTON_ID_TO_NAME.put(102, "key.f15"); + BUTTON_ID_TO_NAME.put(103, "key.f16"); + BUTTON_ID_TO_NAME.put(104, "key.f17"); + BUTTON_ID_TO_NAME.put(105, "key.f18"); + BUTTON_ID_TO_NAME.put(113, "key.f19"); + BUTTON_ID_TO_NAME.put(60, "key.f2"); + BUTTON_ID_TO_NAME.put(61, "key.f3"); + BUTTON_ID_TO_NAME.put(62, "key.f4"); + BUTTON_ID_TO_NAME.put(63, "key.f5"); + BUTTON_ID_TO_NAME.put(64, "key.f6"); + BUTTON_ID_TO_NAME.put(65, "key.f7"); + BUTTON_ID_TO_NAME.put(66, "key.f8"); + BUTTON_ID_TO_NAME.put(67, "key.f9"); + BUTTON_ID_TO_NAME.put(34, "key.g"); + BUTTON_ID_TO_NAME.put(41, "key.grave.accent"); + BUTTON_ID_TO_NAME.put(35, "key.h"); + BUTTON_ID_TO_NAME.put(199, "key.home"); + BUTTON_ID_TO_NAME.put(23, "key.i"); + BUTTON_ID_TO_NAME.put(210, "key.insert"); + BUTTON_ID_TO_NAME.put(36, "key.j"); + BUTTON_ID_TO_NAME.put(37, "key.k"); + BUTTON_ID_TO_NAME.put(82, "key.keypad.0"); + BUTTON_ID_TO_NAME.put(79, "key.keypad.1"); + BUTTON_ID_TO_NAME.put(80, "key.keypad.2"); + BUTTON_ID_TO_NAME.put(81, "key.keypad.3"); + BUTTON_ID_TO_NAME.put(75, "key.keypad.4"); + BUTTON_ID_TO_NAME.put(76, "key.keypad.5"); + BUTTON_ID_TO_NAME.put(77, "key.keypad.6"); + BUTTON_ID_TO_NAME.put(71, "key.keypad.7"); + BUTTON_ID_TO_NAME.put(72, "key.keypad.8"); + BUTTON_ID_TO_NAME.put(73, "key.keypad.9"); + BUTTON_ID_TO_NAME.put(78, "key.keypad.add"); + BUTTON_ID_TO_NAME.put(83, "key.keypad.decimal"); + BUTTON_ID_TO_NAME.put(181, "key.keypad.divide"); + BUTTON_ID_TO_NAME.put(156, "key.keypad.enter"); + BUTTON_ID_TO_NAME.put(141, "key.keypad.equal"); + BUTTON_ID_TO_NAME.put(55, "key.keypad.multiply"); + BUTTON_ID_TO_NAME.put(74, "key.keypad.subtract"); + BUTTON_ID_TO_NAME.put(38, "key.l"); + BUTTON_ID_TO_NAME.put(203, "key.left"); + BUTTON_ID_TO_NAME.put(56, "key.left.alt"); + BUTTON_ID_TO_NAME.put(26, "key.left.bracket"); + BUTTON_ID_TO_NAME.put(29, "key.left.control"); + BUTTON_ID_TO_NAME.put(42, "key.left.shift"); + BUTTON_ID_TO_NAME.put(219, "key.left.win"); + BUTTON_ID_TO_NAME.put(50, "key.m"); + BUTTON_ID_TO_NAME.put(12, "key.minus"); + BUTTON_ID_TO_NAME.put(49, "key.n"); + BUTTON_ID_TO_NAME.put(69, "key.num.lock"); + BUTTON_ID_TO_NAME.put(24, "key.o"); + BUTTON_ID_TO_NAME.put(25, "key.p"); + BUTTON_ID_TO_NAME.put(209, "key.page.down"); + BUTTON_ID_TO_NAME.put(201, "key.page.up"); + BUTTON_ID_TO_NAME.put(197, "key.pause"); + BUTTON_ID_TO_NAME.put(52, "key.period"); + BUTTON_ID_TO_NAME.put(183, "key.print.screen"); + BUTTON_ID_TO_NAME.put(16, "key.q"); + BUTTON_ID_TO_NAME.put(19, "key.r"); + BUTTON_ID_TO_NAME.put(205, "key.right"); + BUTTON_ID_TO_NAME.put(184, "key.right.alt"); + BUTTON_ID_TO_NAME.put(27, "key.right.bracket"); + BUTTON_ID_TO_NAME.put(157, "key.right.control"); + BUTTON_ID_TO_NAME.put(54, "key.right.shift"); + BUTTON_ID_TO_NAME.put(220, "key.right.win"); + BUTTON_ID_TO_NAME.put(31, "key.s"); + BUTTON_ID_TO_NAME.put(70, "key.scroll.lock"); + BUTTON_ID_TO_NAME.put(39, "key.semicolon"); + BUTTON_ID_TO_NAME.put(53, "key.slash"); + BUTTON_ID_TO_NAME.put(57, "key.space"); + BUTTON_ID_TO_NAME.put(20, "key.t"); + BUTTON_ID_TO_NAME.put(15, "key.tab"); + BUTTON_ID_TO_NAME.put(22, "key.u"); + BUTTON_ID_TO_NAME.put(200, "key.up"); + BUTTON_ID_TO_NAME.put(47, "key.v"); + BUTTON_ID_TO_NAME.put(17, "key.w"); + BUTTON_ID_TO_NAME.put(45, "key.x"); + BUTTON_ID_TO_NAME.put(21, "key.y"); + BUTTON_ID_TO_NAME.put(44, "key.z"); + } + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + for (final String key : data.keys()) { + if (!key.startsWith("key_")) { + continue; + } + final String value = data.getString(key); + final int code; + try { + code = Integer.parseInt(value); + } catch (final NumberFormatException ex) { + continue; + } + + final String newEntry; + + if (code < 0) { + final int mouseCode = code + 100; + switch (mouseCode) { + case 0: + newEntry = "key.mouse.left"; + break; + case 1: + newEntry = "key.mouse.right"; + break; + case 2: + newEntry = "key.mouse.middle"; + break; + default: + newEntry = "key.mouse." + (mouseCode + 1); + break; + } + } else { + newEntry = BUTTON_ID_TO_NAME.getOrDefault(code, "key.unknown"); + } + + // No CMEs occur for existing entries in maps. + data.setString(key, newEntry); + } + return null; + } + }); + } + + private V1344() {} +} diff --git a/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..1c9f754332d8a2299b7e2e5565882da52948d3a9 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V135.java @@ -0,0 +1,60 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V135 { + + private static final int VERSION = MCVersions.V15W40B + 1; + + public static void register() { + // In this update they changed the "Riding" value to be "Passengers", which is now a list. So it added + // support for multiple entities riding. Of course, Riding and Passenger are opposites - so it also will + // switch the data layout to be from highest rider to lowest rider, in terms of depth. + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(MapType data, final long sourceVersion, final long toVersion) { + MapType ret = null; + while (data.hasKey("Riding", ObjectType.MAP)) { + final MapType riding = data.getMap("Riding"); + data.remove("Riding"); + + final ListType passengers = Types.NBT.createEmptyList(); + riding.setList("Passengers", passengers); + passengers.addMap(data); + + ret = data = riding; + } + + return ret; + } + }); + + + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, new DataWalkerItemLists("Inventory", "EnderItems")); + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType rootVehicle = data.getMap("RootVehicle"); + if (rootVehicle != null) { + WalkerUtils.convert(MCTypeRegistry.ENTITY, rootVehicle, "Entity", fromVersion, toVersion); + } + + return null; + }); + + MCTypeRegistry.ENTITY.addStructureWalker(VERSION, (final MapType 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + for (final String key : data.keys()) { + if (!key.startsWith("key_")) { + continue; + } + + final String value = data.getString(key); + + if (value.startsWith("key.mouse") || value.startsWith("scancode.")) { + continue; + } + + data.setString(key, "key.keyboard." + value.substring("key.".length())); + } + return null; + } + }); + } + + private V1446() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType ret = HelperBlockFlatteningV1450.flattenNBT(data); + return ret == data ? null : ret.copy(); // copy to avoid problems with later state datafixers + } + }); + } + + private V1450() {} +} diff --git a/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..fd46b075f3c18c52e31aeee4cb4638d5d7b673c3 --- /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 data, final long fromVersion, final long toVersion) -> { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion); + + final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP); + if (tileTicks != null) { + for (int i = 0, len = tileTicks.size(); i < len; ++i) { + final MapType tileTick = tileTicks.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion); + } + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section, "Palette", fromVersion, toVersion); + } + } + + return null; + }); + + // V2 + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:piston", new DataConverter<>(VERSION, 2) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int blockId = data.getInt("blockId"); + final int blockData = data.getInt("blockData") & 15; + + data.remove("blockId"); + data.remove("blockData"); + + data.setMap("blockState", HelperBlockFlatteningV1450.getNBTForId((blockId << 4) | blockData).copy()); // copy to avoid problems with later state datafixers + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, 2, "minecraft:piston", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "blockState")); + + // V3 + ConverterFlattenEntity.register(); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:filled_map", new DataConverter<>(VERSION, 3) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + data.setMap("tag", tag); + } + + if (!tag.hasKey("map", ObjectType.NUMBER)) { // This if is from CB. as usual, no documentation from CB. I'm guessing it just wants to avoid possibly overwriting it. seems fine. + tag.setInt("map", data.getInt("Damage")); + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:potion", new DataWalkerItems("Potion")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:arrow", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState")); + 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 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number colour = data.getNumber("CollarColor"); + + if (colour != null) { + data.setByte("CollarColor", (byte)(15 - colour.intValue())); + } + + return null; + } + }); + */ + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION, 5) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number base = data.getNumber("Base"); + if (base != null) { + data.setInt("Base", 15 - base.intValue()); + } + + final ListType patterns = data.getList("Patterns", ObjectType.MAP); + if (patterns != null) { + for (int i = 0, len = patterns.size(); i < len; ++i) { + final MapType pattern = patterns.getMap(i); + final Number colour = pattern.getNumber("Color"); + if (colour != null) { + pattern.setInt("Color", 15 - colour.intValue()); + } + } + } + + return null; + } + }); + MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION, 5) { + private final Splitter SPLITTER = Splitter.on(';').limit(5); + private final Splitter LAYER_SPLITTER = Splitter.on(','); + private final Splitter OLD_AMOUNT_SPLITTER = Splitter.on('x').limit(2); + private final Splitter AMOUNT_SPLITTER = Splitter.on('*').limit(2); + private final Splitter BLOCK_SPLITTER = Splitter.on(':').limit(3); + + // idk man i just copy and pasted this one + private String fixGeneratorSettings(final String generatorSettings) { + if (generatorSettings.isEmpty()) { + return "minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;1;village"; + } else { + Iterator 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 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 list2 = BLOCK_SPLITTER.splitToList(string3); + int l = ((String)list2.get(0)).equals("minecraft") ? 1 : 0; + String string5 = (String)list2.get(l); + int m = j == 3 ? EntityBlockStateFix.getBlockId("minecraft:" + string5) : NumberUtils.toInt(string5, 0); + int n = l + 1; + int o = list2.size() > n ? NumberUtils.toInt((String)list2.get(n), 0) : 0; + return (k == 1 ? "" : k + "*") + BlockStateData.getTag(m << 4 | o).get("Name").asString(""); + }).collect(Collectors.joining(","))); + + while(iterator.hasNext()) { + stringBuilder.append(';').append((String)iterator.next()); + } + + return stringBuilder.toString(); + } else { + return "minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;1;village"; + } + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"flat".equalsIgnoreCase(data.getString("generatorName"))) { + return null; + } + + final String generatorOptions = data.getString("generatorOptions"); + if (generatorOptions == null) { + return null; + } + + data.setString("generatorOptions", this.fixGeneratorSettings(generatorOptions)); + + return null; + } + }); + + // V6 + MCTypeRegistry.STATS.addStructureConverter(ConverterFlattenStats.makeStatsConverter()); + MCTypeRegistry.OBJECTIVE.addStructureConverter(ConverterFlattenStats.makeObjectiveConverter()); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:jukebox", new DataConverter<>(VERSION, 6) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int record = data.getInt("Record"); + if (record <= 0) { + return null; + } + + data.remove("Record"); + + final String newItemId = ConverterFlattenItemStack.flattenItem(HelperItemNameV102.getNameFromId(record), 0); + if (newItemId == null) { + return null; + } + + final MapType recordItem = Types.NBT.createEmptyMap(); + data.setMap("RecordItem", recordItem); + + recordItem.setString("id", newItemId); + recordItem.setByte("Count", (byte)1); + + return null; + } + }); + + MCTypeRegistry.STATS.addStructureWalker(VERSION, 6, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType stats = data.getMap("stats"); + if (stats == null) { + return null; + } + + WalkerUtils.convertKeys(MCTypeRegistry.BLOCK_NAME, stats, "minecraft:mined", fromVersion, toVersion); + + WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:crafted", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:used", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:broken", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:picked_up", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ITEM_NAME, stats, "minecraft:dropped", fromVersion, toVersion); + + WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, stats, "minecraft:killed", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, stats, "minecraft:killed_by", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.OBJECTIVE.addStructureHook(VERSION, 6, new DataHook<>() { + @Override + public MapType preHook(final MapType data, final long fromVersion, final long toVersion) { + // unpack + final String criteriaName = data.getString("CriteriaName"); + String type; + String id; + + if (criteriaName != null) { + final int index = criteriaName.indexOf(':'); + if (index < 0) { + type = "_special"; + id = criteriaName; + } else { + try { + type = ResourceLocation.of(criteriaName.substring(0, index), '.').toString(); + id = ResourceLocation.of(criteriaName.substring(index + 1), '.').toString(); + } catch (final Exception ex) { + type = "_special"; + id = criteriaName; + } + } + } else { + type = null; + id = null; + } + + if (type != null && id != null) { + final MapType criteriaType = Types.NBT.createEmptyMap(); + data.setMap("CriteriaType", criteriaType); + + criteriaType.setString("type", type); + criteriaType.setString("id", id); + } + + return null; + } + + @Override + public MapType postHook(final MapType data, final long fromVersion, final long toVersion) { + // repack + final MapType criteriaType = data.getMap("CriteriaType"); + + final String newName; + if (criteriaType == null) { + newName = null; + } else { + final String type = criteriaType.getString("type"); + final String id = criteriaType.getString("id"); + if (type != null && id != null) { + if ("_special".equals(type)) { + newName = id; + } else { + newName = packWithDot(type) + ":" + packWithDot(id); + } + } else { + newName = null; + } + } + + if (newName != null) { + data.remove("CriteriaType"); + data.setString("CriteriaName", newName); + } + + return null; + } + }); + + MCTypeRegistry.OBJECTIVE.addStructureWalker(VERSION, 6, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType criteriaType = data.getMap("CriteriaType"); + if (criteriaType == null) { + return null; + } + + final String type = criteriaType.getString("type"); + + if (type == null) { + return null; + } + + switch (type) { + case "minecraft:mined": { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, criteriaType, "id", fromVersion, toVersion); + break; + } + + case "minecraft:crafted": + case "minecraft:used": + case "minecraft:broken": + case "minecraft:picked_up": + case "minecraft:dropped": { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, criteriaType, "id", fromVersion, toVersion); + break; + } + + case "minecraft:killed": + case "minecraft:killed_by": { + WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, criteriaType, "id", fromVersion, toVersion); + break; + } + } + + return null; + }); + + + // V7 + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION, 7) { + private static void convertToBlockState(final MapType data, final String path) { + final Number number = data.getNumber(path); + if (number == null) { + return; + } + + data.setMap(path, HelperBlockFlatteningV1450.getNBTForId(number.intValue() << 4).copy()); // copy to avoid problems with later state datafixers + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType children = data.getList("Children", ObjectType.MAP); + if (children == null) { + return null; + } + + for (int i = 0, len = children.size(); i < len; ++i) { + final MapType child = children.getMap(i); + + final String id = child.getString("id"); + + switch (id) { + case "ViF": + convertToBlockState(child, "CA"); + convertToBlockState(child, "CB"); + break; + case "ViDF": + convertToBlockState(child, "CA"); + convertToBlockState(child, "CB"); + convertToBlockState(child, "CC"); + convertToBlockState(child, "CD"); + break; + } + } + + return null; + } + }); + + // convert villagers to trade with pumpkins and not the carved pumpkin + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION, 7) { + private static void convertPumpkin(final MapType data, final String path) { + final MapType item = data.getMap(path); + if (item == null) { + return; + } + + final String id = item.getString("id"); + + if (id.equals("minecraft:carved_pumpkin")) { + item.setString("id", "minecraft:pumpkin"); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType offers = data.getMap("Offers"); + if (offers != null) { + final ListType recipes = offers.getList("Recipes", ObjectType.MAP); + if (recipes != null) { + for (int i = 0, len = recipes.size(); i < len; ++i) { + final MapType recipe = recipes.getMap(i); + + convertPumpkin(recipe, "buy"); + convertPumpkin(recipe, "buyB"); + convertPumpkin(recipe, "sell"); + } + } + } + return null; + } + }); + + MCTypeRegistry.STRUCTURE_FEATURE.addStructureWalker(VERSION, 7, (final MapType data, final long fromVersion, final long toVersion) -> { + final ListType list = data.getList("Children", ObjectType.MAP); + if (list == null) { + return null; + } + + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType child = list.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CA", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CB", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CC", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CD", fromVersion, toVersion); + } + + 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 convert(final MapType 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 updateCustomName(final MapType data) { + final String customName = data.getString("CustomName", ""); + + if (customName.isEmpty()) { + data.remove("CustomName"); + } else { + data.setString("CustomName", ComponentUtils.createPlainTextComponent(customName)); + } + + return null; + } + + public static void register() { + // From CB + MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + return updateCustomName(data); + } + }); + + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if ("minecraft:commandblock_minecart".equals(data.getString("id"))) { + return null; + } + + return updateCustomName(data); + } + }); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType display = tag.getMap("display"); + if (display == null) { + return null; + } + + final String name = display.getString("Name"); + if (name != null) { + display.setString("Name", ComponentUtils.createPlainTextComponent(name)); + } /* In 1.20.5, Mojang removed this branch (ItemCustomNameToComponentFix) */ /*else { + final String localisedName = display.getString("LocName"); + if (localisedName != null) { + display.setString("Name", ComponentUtils.createTranslatableComponent(localisedName)); + display.remove("LocName"); + } + }*/ + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if ("minecraft:command_block".equals(data.getString("id"))) { + return null; + } + + return updateCustomName(data); + } + }); + + } + + 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..9933c54eba686ba851e0d2112c7a22a09544c2c2 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V1460.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.minecraft.walkers.block_name.DataWalkerBlockNames; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.MapType; +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 MOTIVE_REMAP = new HashMap<>(); + + static { + MOTIVE_REMAP.put("donkeykong", "donkey_kong"); + MOTIVE_REMAP.put("burningskull", "burning_skull"); + MOTIVE_REMAP.put("skullandroses", "skull_and_roses"); + } + + private static final int VERSION = MCVersions.V18W01A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:painting", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + String motive = data.getString("Motive"); + if (motive != null) { + motive = motive.toLowerCase(Locale.ROOT); + data.setString("Motive", new ResourceLocation(MOTIVE_REMAP.getOrDefault(motive, motive)).toString()); + } + 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final boolean terrainPopulated = level.getBoolean("TerrainPopulated"); + final boolean lightPopulated = level.getBoolean("LightPopulated") || level.getNumber("LightPopulated") == null; + final String newStatus = !terrainPopulated ? "carved" : (lightPopulated ? "mobs_spawned" : "decorated"); + + level.setString("Status", newStatus); + level.setBoolean("hasLegacyStructureData", true); + + // convert biome byte[] into int[] + final byte[] biomes = level.getBytes("Biomes"); + if (biomes != null) { + final int[] newBiomes = new int[256]; + for (int i = 0, len = Math.min(newBiomes.length, biomes.length); i < len; ++i) { + newBiomes[i] = biomes[i] & 255; + } + level.setInts("Biomes", newBiomes); + } + + // ProtoChunks have their own dedicated tick list, so we must convert the TileTicks to that. + final ListType ticks = level.getList("TileTicks", ObjectType.MAP); + if (ticks != null) { + final ListType sections = Types.NBT.createEmptyList(); + final ListType[] sectionAccess = new ListType[16]; + for (int i = 0; i < sectionAccess.length; ++i) { + sections.addList(sectionAccess[i] = Types.NBT.createEmptyList()); + } + level.setList("ToBeTicked", sections); + + for (int i = 0, len = ticks.size(); i < len; ++i) { + final MapType tick = ticks.getMap(i); + + final int x = tick.getInt("x"); + final int y = tick.getInt("y"); + final int z = tick.getInt("z"); + final short coordinate = packOffsetCoordinates(x, y, z); + + sectionAccess[y >> 4].addShort(coordinate); + } + } + + return null; + } + }); + + + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion); + + final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP); + if (tileTicks != null) { + for (int i = 0, len = tileTicks.size(); i < len; ++i) { + final MapType tileTick = tileTicks.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion); + } + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section, "Palette", fromVersion, toVersion); + } + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, level.getMap("Structures"), "Starts", fromVersion, toVersion); + + return null; + }); + MCTypeRegistry.STRUCTURE_FEATURE.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final ListType list = data.getList("Children", ObjectType.MAP); + if (list != null) { + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType child = list.getMap(i); + + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CA", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CB", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CC", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CD", fromVersion, toVersion); + } + } + + WalkerUtils.convert(MCTypeRegistry.BIOME, data, "biome", fromVersion, toVersion); + + return null; + }); + } + + private V1466() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getBoolean("Silent") && !data.getBoolean("Marker")) { + data.remove("Silent"); + } + + return null; + } + }); + } + + private V147() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getInt("Color") == 10) { + data.setByte("Color", (byte)16); + } + return null; + } + }); + // data hooks ensure the inputs are namespaced + ConverterAbstractBlockRename.register(VERSION, (final String old) -> { + return "minecraft:purple_shulker_box".equals(old) ? "minecraft:shulker_box" : null; + }); + ConverterAbstractItemRename.register(VERSION, (final String old) -> { + return "minecraft:purple_shulker_box".equals(old) ? "minecraft:shulker_box" : null; + }); + } + + private V1474() {} +} diff --git a/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 RENAMED_IDS = new HashMap<>( + ImmutableMap.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 renamed = new HashMap<>( + ImmutableMap.of( + "minecraft:sea_grass", "minecraft:seagrass", + "minecraft:tall_sea_grass", "minecraft:tall_seagrass" + ) + ); + + ConverterAbstractItemRename.register(VERSION, renamed::get); + ConverterAbstractBlockRename.register(VERSION, renamed::get); + + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final MapType heightmaps = level.getMap("Heightmaps"); + + if (heightmaps == null) { + return null; + } + + final Object liquid = heightmaps.getGeneric("LIQUID"); + if (liquid != null) { + heightmaps.remove("LIQUID"); + heightmaps.setGeneric("WORLD_SURFACE_WG", liquid); + } + + final Object solid = heightmaps.getGeneric("SOLID"); + if (solid != null) { + heightmaps.remove("SOLID"); + heightmaps.setGeneric("OCEAN_FLOOR_WG", solid); + heightmaps.setGeneric("OCEAN_FLOOR", solid); + } + + final Object light = heightmaps.getGeneric("LIGHT"); + if (light != null) { + heightmaps.remove("LIGHT"); + heightmaps.setGeneric("LIGHT_BLOCKING", light); + } + + final Object rain = heightmaps.getGeneric("RAIN"); + if (rain != null) { + heightmaps.remove("RAIN"); + heightmaps.setGeneric("MOTION_BLOCKING", rain); + heightmaps.setGeneric("MOTION_BLOCKING_NO_LEAVES", rain); + } + + return null; + } + }); + } + + private V1484() {} +} diff --git a/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 RENAMED_ENTITY_IDS = new HashMap<>( + ImmutableMap.builder() + .put("minecraft:salmon_mob", "minecraft:salmon") + .put("minecraft:cod_mob", "minecraft:cod") + .build() + ); + public static final Map RENAMED_ITEM_IDS = new HashMap<>( + ImmutableMap.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 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 piece) { + return "Iglu".equals(piece.getString("id")); + } + + public static void register() { + ConverterAbstractBlockRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:kelp_top", "minecraft:kelp", + "minecraft:kelp", "minecraft:kelp_plant" + ) + )::get); + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:kelp_top", "minecraft:kelp" + ) + )::get); + + // Don't ask me why in V1458 they wrote the converter to NOT do command blocks and THEN in THIS version + // to ONLY do command blocks. I don't know. + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:command_block", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + return V1458.updateCustomName(data); + } + }); + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:commandblock_minecart", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + return V1458.updateCustomName(data); + } + }); + + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType children = data.getList("Children", ObjectType.MAP); + boolean isIgloo; + if (children != null) { + isIgloo = true; + for (int i = 0, len = children.size(); i < len; ++i) { + if (!isIglooPiece(children.getMap(i))) { + isIgloo = false; + break; + } + } + } else { + isIgloo = false; + } + + if (isIgloo) { + data.remove("Children"); + data.setString("id", "Igloo"); + return null; + } + + if (children != null) { + for (int i = 0; i < children.size();) { + final MapType child = children.getMap(i); + if (isIglooPiece(child)) { + children.remove(i); + continue; + } + ++i; + } + } + + return null; + } + }); + } + + 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>> RENAMES = ImmutableMap.>>builder() + .put("EndCity", Pair.of( + "ECP", + ImmutableMap.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.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.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.builder() + .put("minecraft:ruin/big_ruin1_brick", "minecraft:underwater_ruin/big_brick_1") + .put("minecraft:ruin/big_ruin2_brick", "minecraft:underwater_ruin/big_brick_2") + .put("minecraft:ruin/big_ruin3_brick", "minecraft:underwater_ruin/big_brick_3") + .put("minecraft:ruin/big_ruin8_brick", "minecraft:underwater_ruin/big_brick_8") + .put("minecraft:ruin/big_ruin1_cracked", "minecraft:underwater_ruin/big_cracked_1") + .put("minecraft:ruin/big_ruin2_cracked", "minecraft:underwater_ruin/big_cracked_2") + .put("minecraft:ruin/big_ruin3_cracked", "minecraft:underwater_ruin/big_cracked_3") + .put("minecraft:ruin/big_ruin8_cracked", "minecraft:underwater_ruin/big_cracked_8") + .put("minecraft:ruin/big_ruin1_mossy", "minecraft:underwater_ruin/big_mossy_1") + .put("minecraft:ruin/big_ruin2_mossy", "minecraft:underwater_ruin/big_mossy_2") + .put("minecraft:ruin/big_ruin3_mossy", "minecraft:underwater_ruin/big_mossy_3") + .put("minecraft:ruin/big_ruin8_mossy", "minecraft:underwater_ruin/big_mossy_8") + .put("minecraft:ruin/big_ruin_warm4", "minecraft:underwater_ruin/big_warm_4") + .put("minecraft:ruin/big_ruin_warm5", "minecraft:underwater_ruin/big_warm_5") + .put("minecraft:ruin/big_ruin_warm6", "minecraft:underwater_ruin/big_warm_6") + .put("minecraft:ruin/big_ruin_warm7", "minecraft:underwater_ruin/big_warm_7") + .put("minecraft:ruin/ruin1_brick", "minecraft:underwater_ruin/brick_1") + .put("minecraft:ruin/ruin2_brick", "minecraft:underwater_ruin/brick_2") + .put("minecraft:ruin/ruin3_brick", "minecraft:underwater_ruin/brick_3") + .put("minecraft:ruin/ruin4_brick", "minecraft:underwater_ruin/brick_4") + .put("minecraft:ruin/ruin5_brick", "minecraft:underwater_ruin/brick_5") + .put("minecraft:ruin/ruin6_brick", "minecraft:underwater_ruin/brick_6") + .put("minecraft:ruin/ruin7_brick", "minecraft:underwater_ruin/brick_7") + .put("minecraft:ruin/ruin8_brick", "minecraft:underwater_ruin/brick_8") + .put("minecraft:ruin/ruin1_cracked", "minecraft:underwater_ruin/cracked_1") + .put("minecraft:ruin/ruin2_cracked", "minecraft:underwater_ruin/cracked_2") + .put("minecraft:ruin/ruin3_cracked", "minecraft:underwater_ruin/cracked_3") + .put("minecraft:ruin/ruin4_cracked", "minecraft:underwater_ruin/cracked_4") + .put("minecraft:ruin/ruin5_cracked", "minecraft:underwater_ruin/cracked_5") + .put("minecraft:ruin/ruin6_cracked", "minecraft:underwater_ruin/cracked_6") + .put("minecraft:ruin/ruin7_cracked", "minecraft:underwater_ruin/cracked_7") + .put("minecraft:ruin/ruin8_cracked", "minecraft:underwater_ruin/cracked_8") + .put("minecraft:ruin/ruin1_mossy", "minecraft:underwater_ruin/mossy_1") + .put("minecraft:ruin/ruin2_mossy", "minecraft:underwater_ruin/mossy_2") + .put("minecraft:ruin/ruin3_mossy", "minecraft:underwater_ruin/mossy_3") + .put("minecraft:ruin/ruin4_mossy", "minecraft:underwater_ruin/mossy_4") + .put("minecraft:ruin/ruin5_mossy", "minecraft:underwater_ruin/mossy_5") + .put("minecraft:ruin/ruin6_mossy", "minecraft:underwater_ruin/mossy_6") + .put("minecraft:ruin/ruin7_mossy", "minecraft:underwater_ruin/mossy_7") + .put("minecraft:ruin/ruin8_mossy", "minecraft:underwater_ruin/mossy_8") + .put("minecraft:ruin/ruin_warm1", "minecraft:underwater_ruin/warm_1") + .put("minecraft:ruin/ruin_warm2", "minecraft:underwater_ruin/warm_2") + .put("minecraft:ruin/ruin_warm3", "minecraft:underwater_ruin/warm_3") + .put("minecraft:ruin/ruin_warm4", "minecraft:underwater_ruin/warm_4") + .put("minecraft:ruin/ruin_warm5", "minecraft:underwater_ruin/warm_5") + .put("minecraft:ruin/ruin_warm6", "minecraft:underwater_ruin/warm_6") + .put("minecraft:ruin/ruin_warm7", "minecraft:underwater_ruin/warm_7") + .put("minecraft:ruin/ruin_warm8", "minecraft:underwater_ruin/warm_8") + .put("minecraft:ruin/big_brick_1", "minecraft:underwater_ruin/big_brick_1") + .put("minecraft:ruin/big_brick_2", "minecraft:underwater_ruin/big_brick_2") + .put("minecraft:ruin/big_brick_3", "minecraft:underwater_ruin/big_brick_3") + .put("minecraft:ruin/big_brick_8", "minecraft:underwater_ruin/big_brick_8") + .put("minecraft:ruin/big_mossy_1", "minecraft:underwater_ruin/big_mossy_1") + .put("minecraft:ruin/big_mossy_2", "minecraft:underwater_ruin/big_mossy_2") + .put("minecraft:ruin/big_mossy_3", "minecraft:underwater_ruin/big_mossy_3") + .put("minecraft:ruin/big_mossy_8", "minecraft:underwater_ruin/big_mossy_8") + .put("minecraft:ruin/big_cracked_1", "minecraft:underwater_ruin/big_cracked_1") + .put("minecraft:ruin/big_cracked_2", "minecraft:underwater_ruin/big_cracked_2") + .put("minecraft:ruin/big_cracked_3", "minecraft:underwater_ruin/big_cracked_3") + .put("minecraft:ruin/big_cracked_8", "minecraft:underwater_ruin/big_cracked_8") + .put("minecraft:ruin/big_warm_4", "minecraft:underwater_ruin/big_warm_4") + .put("minecraft:ruin/big_warm_5", "minecraft:underwater_ruin/big_warm_5") + .put("minecraft:ruin/big_warm_6", "minecraft:underwater_ruin/big_warm_6") + .put("minecraft:ruin/big_warm_7", "minecraft:underwater_ruin/big_warm_7") + .build() + ) + ) + + .build(); + + private static final int VERSION = MCVersions.V18W20B + 1; + + public static void register() { + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType children = data.getList("Children", ObjectType.MAP); + if (children == null) { + return null; + } + + final String id = data.getString("id"); + + final Pair> renames = RENAMES.get(id); + if (renames == null) { + return null; + } + + for (int i = 0, len = children.size(); i < len; ++i) { + final MapType child = children.getMap(i); + + if (renames.getFirst().equals(child.getString("id"))) { + final String template = child.getString("Template", ""); + child.setString("Template", renames.getSecond().getOrDefault(template, template)); + } + } + + return null; + } + }); + } + + private V1492() {} +} diff --git a/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 ENCH_ID_TO_NAME = new Int2ObjectOpenHashMap<>(); + static { + ENCH_ID_TO_NAME.put(0, "minecraft:protection"); + ENCH_ID_TO_NAME.put(1, "minecraft:fire_protection"); + ENCH_ID_TO_NAME.put(2, "minecraft:feather_falling"); + ENCH_ID_TO_NAME.put(3, "minecraft:blast_protection"); + ENCH_ID_TO_NAME.put(4, "minecraft:projectile_protection"); + ENCH_ID_TO_NAME.put(5, "minecraft:respiration"); + ENCH_ID_TO_NAME.put(6, "minecraft:aqua_affinity"); + ENCH_ID_TO_NAME.put(7, "minecraft:thorns"); + ENCH_ID_TO_NAME.put(8, "minecraft:depth_strider"); + ENCH_ID_TO_NAME.put(9, "minecraft:frost_walker"); + ENCH_ID_TO_NAME.put(10, "minecraft:binding_curse"); + ENCH_ID_TO_NAME.put(16, "minecraft:sharpness"); + ENCH_ID_TO_NAME.put(17, "minecraft:smite"); + ENCH_ID_TO_NAME.put(18, "minecraft:bane_of_arthropods"); + ENCH_ID_TO_NAME.put(19, "minecraft:knockback"); + ENCH_ID_TO_NAME.put(20, "minecraft:fire_aspect"); + ENCH_ID_TO_NAME.put(21, "minecraft:looting"); + ENCH_ID_TO_NAME.put(22, "minecraft:sweeping"); + ENCH_ID_TO_NAME.put(32, "minecraft:efficiency"); + ENCH_ID_TO_NAME.put(33, "minecraft:silk_touch"); + ENCH_ID_TO_NAME.put(34, "minecraft:unbreaking"); + ENCH_ID_TO_NAME.put(35, "minecraft:fortune"); + ENCH_ID_TO_NAME.put(48, "minecraft:power"); + ENCH_ID_TO_NAME.put(49, "minecraft:punch"); + ENCH_ID_TO_NAME.put(50, "minecraft:flame"); + ENCH_ID_TO_NAME.put(51, "minecraft:infinity"); + ENCH_ID_TO_NAME.put(61, "minecraft:luck_of_the_sea"); + ENCH_ID_TO_NAME.put(62, "minecraft:lure"); + ENCH_ID_TO_NAME.put(65, "minecraft:loyalty"); + ENCH_ID_TO_NAME.put(66, "minecraft:impaling"); + ENCH_ID_TO_NAME.put(67, "minecraft:riptide"); + ENCH_ID_TO_NAME.put(68, "minecraft:channeling"); + ENCH_ID_TO_NAME.put(70, "minecraft:mending"); + ENCH_ID_TO_NAME.put(71, "minecraft:vanishing_curse"); + } + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final ListType enchants = tag.getList("ench", ObjectType.MAP); + if (enchants != null) { + tag.remove("ench"); + tag.setList("Enchantments", enchants); + + for (int i = 0, len = enchants.size(); i < len; ++i) { + final MapType enchant = enchants.getMap(i); + enchant.setString("id", ENCH_ID_TO_NAME.getOrDefault(enchant.getInt("id"), "null")); + } + } + + final ListType storedEnchants = tag.getList("StoredEnchantments", ObjectType.MAP); + if (storedEnchants != null) { + for (int i = 0, len = storedEnchants.size(); i < len; ++i) { + final MapType enchant = storedEnchants.getMap(i); + enchant.setString("id", ENCH_ID_TO_NAME.getOrDefault(enchant.getInt("id"), "null")); + } + } + + + return null; + } + }); + } + + private V1494() {} +} diff --git a/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 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 LOGS = new HashSet<>( + Arrays.asList( + "minecraft:acacia_bark", + "minecraft:birch_bark", + "minecraft:dark_oak_bark", + "minecraft:jungle_bark", + "minecraft:oak_bark", + "minecraft:spruce_bark", + "minecraft:acacia_log", + "minecraft:birch_log", + "minecraft:dark_oak_log", + "minecraft:jungle_log", + "minecraft:oak_log", + "minecraft:spruce_log", + "minecraft:stripped_acacia_log", + "minecraft:stripped_birch_log", + "minecraft:stripped_dark_oak_log", + "minecraft:stripped_jungle_log", + "minecraft:stripped_oak_log", + "minecraft:stripped_spruce_log" + ) + ); + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final ListType sectionsNBT = level.getList("Sections", ObjectType.MAP); + if (sectionsNBT == null) { + return null; + } + + int newSides = 0; + + final LeavesSection[] sections = new LeavesSection[16]; + boolean skippable = true; + for (int i = 0, len = sectionsNBT.size(); i < len; ++i) { + final LeavesSection section = new LeavesSection(sectionsNBT.getMap(i)); + sections[section.sectionY] = section; + + skippable &= section.isSkippable(); + } + + if (skippable) { + return null; + } + + final IntOpenHashSet[] positionsByDistance = new IntOpenHashSet[7]; + for (int i = 0; i < positionsByDistance.length; ++i) { + positionsByDistance[i] = new IntOpenHashSet(); + } + + for (final LeavesSection section : sections) { + if (section == null || section.isSkippable()) { + continue; + } + + for (int index = 0; index < 4096; ++index) { + final int block = section.getBlock(index); + if (section.isLog(block)) { + positionsByDistance[0].add(section.getSectionY() << 12 | index); + } else if (section.isLeaf(block)) { + int x = getX(index); + int z = getZ(index); + newSides |= getSideMask(x == 0, x == 15, z == 0, z == 15); + } + } + } + + // this is basically supposed to recalculate the distances, because a higher cap was added + for (int distance = 1; distance < 7; ++distance) { + final IntOpenHashSet positionsLess = positionsByDistance[distance - 1]; + final IntOpenHashSet positionsEqual = positionsByDistance[distance]; + + for (final IntIterator iterator = positionsLess.iterator(); iterator.hasNext();) { + final int position = iterator.nextInt(); + final int fromX = getX(position); + final int fromY = getY(position); + final int fromZ = getZ(position); + + for (final int[] direction : DIRECTIONS) { + final int toX = fromX + direction[0]; + final int toY = fromY + direction[1]; + final int toZ = fromZ + direction[2]; + + if (!(toX >= 0 && toX <= 15 && toZ >= 0 && toZ <= 15 && toY >= 0 && toY <= 255)) { + continue; + } + + final LeavesSection toSection = sections[toY >> 4]; + if (toSection == null || toSection.isSkippable()) { + continue; + } + + final int sectionLocalIndex = getIndex(toX, toY & 15, toZ); + final int toBlock = toSection.getBlock(sectionLocalIndex); + + if (toSection.isLeaf(toBlock)) { + final int newDistance = toSection.getDistance(toBlock); + if (newDistance > distance) { + toSection.setDistance(sectionLocalIndex, toBlock, distance); + positionsEqual.add(getIndex(toX, toY, toZ)); + } + } + } + } + } + + // done updating blocks, now just update the blockstates and palette + for (int i = 0, len = sectionsNBT.size(); i < len; ++i) { + final MapType sectionNBT = sectionsNBT.getMap(i); + final int y = sectionNBT.getInt("Y"); + final LeavesSection section = sections[y]; + + section.writeInto(sectionNBT); + } + + // if sides changed during process, update it now + if (newSides != 0) { + MapType upgradeData = level.getMap("UpgradeData"); + if (upgradeData == null) { + level.setMap("UpgradeData", upgradeData = Types.NBT.createEmptyMap()); + } + + upgradeData.setByte("Sides", (byte)(upgradeData.getByte("Sides") | newSides)); + } + + return null; + } + }); + } + + public static int getIndex(final int x, final int y, final int z) { + return y << 8 | z << 4 | x; + } + + public static int getX(final int index) { + return index & 15; + } + + public static int getY(final int index) { + return index >> 8 & 255; + } + + public static int getZ(final int index) { + return index >> 4 & 15; + } + + public static int getSideMask(final boolean noLeft, final boolean noRight, final boolean noBack, final boolean noForward) { + final int ret; + + if (noBack) { + if (noRight) { + ret = 2; + } else if (noLeft) { + ret = 128; + } else { + ret = 1; + } + } else if (noForward) { + if (noLeft) { + ret = 32; + } else if (noRight) { + ret = 8; + } else { + ret = 16; + } + } else if (noRight) { + ret = 4; + } else if (noLeft) { + ret = 64; + } else { + ret = 0; + } + + return ret; + } + + private V1496() {} + + public abstract static class Section { + protected final ListType palette; + protected final int sectionY; + protected PackedBitStorage storage; + + public Section(final MapType section) { + this.palette = section.getList("Palette", ObjectType.MAP); + this.sectionY = section.getInt("Y"); + this.readStorage(section); + } + + protected void readStorage(final MapType section) { + if (this.initSkippable()) { + this.storage = null; + } else { + final long[] states = section.getLongs("BlockStates"); + final int bits = Math.max(4, DataFixUtils.ceillog2(this.palette.size())); + this.storage = new PackedBitStorage(bits, 4096, states); + } + } + + public void writeInto(final MapType section) { + if (this.isSkippable()) { + return; + } + + section.setList("Palette", this.palette); + section.setLongs("BlockStates", this.storage.getRaw()); + } + + public boolean isSkippable() { + return this.storage == null; + } + + public int getBlock(final int index) { + return this.storage.get(index); + } + + protected int getStateId(final String name, final boolean persistent, final int distance) { + return LEAVES_TO_ID.getInt(name) << 5 | (persistent ? 16 : 0) | distance; + } + + protected int getSectionY() { + return this.sectionY; + } + + protected abstract boolean initSkippable(); + } + + public static final class LeavesSection extends Section { + private IntOpenHashSet leaveIds; + private IntOpenHashSet logIds; + private Int2IntOpenHashMap stateToIdMap; + + public LeavesSection(final MapType section) { + super(section); + } + + @Override + protected boolean initSkippable() { + this.leaveIds = new IntOpenHashSet(); + this.logIds = new IntOpenHashSet(); + this.stateToIdMap = new Int2IntOpenHashMap(); + this.stateToIdMap.defaultReturnValue(-1); + + for(int i = 0; i < this.palette.size(); ++i) { + final MapType blockState = this.palette.getMap(i); + final String name = blockState.getString("Name", ""); + if (LEAVES_TO_ID.containsKey(name)) { + final MapType properties = blockState.getMap("Properties"); + final boolean notDecayable = properties != null && "false".equals(properties.getString("decayable")); + + this.leaveIds.add(i); + this.stateToIdMap.put(this.getStateId(name, notDecayable, 7), i); + this.palette.setMap(i, this.makeNewLeafTag(name, notDecayable, 7)); + } + + if (LOGS.contains(name)) { + this.logIds.add(i); + } + } + + return this.leaveIds.isEmpty() && this.logIds.isEmpty(); + } + + private MapType makeNewLeafTag(final String name, final boolean notDecayable, final int distance) { + final MapType properties = Types.NBT.createEmptyMap(); + final MapType ret = Types.NBT.createEmptyMap(); + + ret.setString("Name", name); + ret.setMap("Properties", properties); + + properties.setString("persistent", Boolean.toString(notDecayable)); + properties.setString("distance", Integer.toString(distance)); + + return ret; + } + + public boolean isLog(final int id) { + return this.logIds.contains(id); + } + + public boolean isLeaf(final int id) { + return this.leaveIds.contains(id); + } + + // only call for logs or leaves, will throw otherwise! + private int getDistance(final int id) { + if (this.isLog(id)) { + return 0; + } + + return Integer.parseInt(this.palette.getMap(id).getMap("Properties").getString("distance")); + } + + private void setDistance(final int index, final int id, final int distance) { + final MapType state = this.palette.getMap(id); + final String name = state.getString("Name"); + final boolean persistent = "true".equals(state.getMap("Properties").getString("persistent")); + final int newState = this.getStateId(name, persistent, distance); + int newStateId; + if ((newStateId = this.stateToIdMap.get(newState)) == -1) { + newStateId = this.palette.size(); + this.leaveIds.add(newStateId); + this.stateToIdMap.put(newState, newStateId); + this.palette.addMap(this.makeNewLeafTag(name, persistent, distance)); + } + + if (1 << this.storage.getBits() <= newStateId) { + // need to widen storage + final PackedBitStorage newStorage = new PackedBitStorage(this.storage.getBits() + 1, 4096); + + for(int i = 0; i < 4096; ++i) { + newStorage.set(i, this.storage.get(i)); + } + + this.storage = newStorage; + } + + this.storage.set(index, newStateId); + } + } +} diff --git a/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 convert(final MapType 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 RENAMES = new HashMap<>( + ImmutableMap.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 RECIPES_UPDATES = new HashMap<>( + ImmutableMap.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 MAP = new HashMap<>(); + static { + MAP.put("0", "minecraft:ocean"); + MAP.put("1", "minecraft:plains"); + MAP.put("2", "minecraft:desert"); + MAP.put("3", "minecraft:mountains"); + MAP.put("4", "minecraft:forest"); + MAP.put("5", "minecraft:taiga"); + MAP.put("6", "minecraft:swamp"); + MAP.put("7", "minecraft:river"); + MAP.put("8", "minecraft:nether"); + MAP.put("9", "minecraft:the_end"); + MAP.put("10", "minecraft:frozen_ocean"); + MAP.put("11", "minecraft:frozen_river"); + MAP.put("12", "minecraft:snowy_tundra"); + MAP.put("13", "minecraft:snowy_mountains"); + MAP.put("14", "minecraft:mushroom_fields"); + MAP.put("15", "minecraft:mushroom_field_shore"); + MAP.put("16", "minecraft:beach"); + MAP.put("17", "minecraft:desert_hills"); + MAP.put("18", "minecraft:wooded_hills"); + MAP.put("19", "minecraft:taiga_hills"); + MAP.put("20", "minecraft:mountain_edge"); + MAP.put("21", "minecraft:jungle"); + MAP.put("22", "minecraft:jungle_hills"); + MAP.put("23", "minecraft:jungle_edge"); + MAP.put("24", "minecraft:deep_ocean"); + MAP.put("25", "minecraft:stone_shore"); + MAP.put("26", "minecraft:snowy_beach"); + MAP.put("27", "minecraft:birch_forest"); + MAP.put("28", "minecraft:birch_forest_hills"); + MAP.put("29", "minecraft:dark_forest"); + MAP.put("30", "minecraft:snowy_taiga"); + MAP.put("31", "minecraft:snowy_taiga_hills"); + MAP.put("32", "minecraft:giant_tree_taiga"); + MAP.put("33", "minecraft:giant_tree_taiga_hills"); + MAP.put("34", "minecraft:wooded_mountains"); + MAP.put("35", "minecraft:savanna"); + MAP.put("36", "minecraft:savanna_plateau"); + MAP.put("37", "minecraft:badlands"); + MAP.put("38", "minecraft:wooded_badlands_plateau"); + MAP.put("39", "minecraft:badlands_plateau"); + MAP.put("40", "minecraft:small_end_islands"); + MAP.put("41", "minecraft:end_midlands"); + MAP.put("42", "minecraft:end_highlands"); + MAP.put("43", "minecraft:end_barrens"); + MAP.put("44", "minecraft:warm_ocean"); + MAP.put("45", "minecraft:lukewarm_ocean"); + MAP.put("46", "minecraft:cold_ocean"); + MAP.put("47", "minecraft:deep_warm_ocean"); + MAP.put("48", "minecraft:deep_lukewarm_ocean"); + MAP.put("49", "minecraft:deep_cold_ocean"); + MAP.put("50", "minecraft:deep_frozen_ocean"); + MAP.put("127", "minecraft:the_void"); + MAP.put("129", "minecraft:sunflower_plains"); + MAP.put("130", "minecraft:desert_lakes"); + MAP.put("131", "minecraft:gravelly_mountains"); + MAP.put("132", "minecraft:flower_forest"); + MAP.put("133", "minecraft:taiga_mountains"); + MAP.put("134", "minecraft:swamp_hills"); + MAP.put("140", "minecraft:ice_spikes"); + MAP.put("149", "minecraft:modified_jungle"); + MAP.put("151", "minecraft:modified_jungle_edge"); + MAP.put("155", "minecraft:tall_birch_forest"); + MAP.put("156", "minecraft:tall_birch_hills"); + MAP.put("157", "minecraft:dark_forest_hills"); + MAP.put("158", "minecraft:snowy_taiga_mountains"); + MAP.put("160", "minecraft:giant_spruce_taiga"); + MAP.put("161", "minecraft:giant_spruce_taiga_hills"); + MAP.put("162", "minecraft:modified_gravelly_mountains"); + MAP.put("163", "minecraft:shattered_savanna"); + MAP.put("164", "minecraft:shattered_savanna_plateau"); + MAP.put("165", "minecraft:eroded_badlands"); + MAP.put("166", "minecraft:modified_wooded_badlands_plateau"); + MAP.put("167", "minecraft:modified_badlands_plateau"); + } + + public static void register() { + MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String generatorOptions = data.getString("generatorOptions"); + final String generatorName = data.getString("generatorName"); + if ("flat".equalsIgnoreCase(generatorName)) { + data.setMap("generatorOptions", V1506.convert(generatorOptions == null ? "" : generatorOptions)); + } else if ("buffet".equalsIgnoreCase(generatorName) && generatorOptions != null) { + data.setMap("generatorOptions", JsonTypeUtil.convertJsonToNBT(new JsonMapType(GsonHelper.parse(generatorOptions, true), false))); + } + return null; + } + }); + } + + private static MapType convert(final String param0) { + final Dynamic 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 Dynamic convert(final String generatorSettings, final DynamicOps ops) { + final Iterator splitSettings = Splitter.on(';').split(generatorSettings).iterator(); + String biome = "minecraft:plains"; + final Map> structures = Maps.newHashMap(); + final List> 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 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> getLayersInfoFromString(final String layersString) { + final List> ret = new ArrayList<>(); + final String[] layers = layersString.split(","); + + for (final String layerString : layers) { + final Pair 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 RENAMED_ENTITY_IDS = new HashMap<>( + ImmutableMap.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 RENAMED_BLOCKS = new HashMap<>( + ImmutableMap.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 RENAMED_ITEMS = new HashMap<>( + ImmutableMap.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 RECIPES_UPDATES = new HashMap<>( + ImmutableMap.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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final String displayName = data.getString("DisplayName"); + if (displayName == null) { + return null; + } + + final String update = ComponentUtils.createPlainTextComponent(displayName); + + data.setString("DisplayName", update); + + return null; + } + }); + + MCTypeRegistry.TEAM.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String displayName = data.getString("DisplayName"); + if (displayName == null) { + return null; + } + + final String update = ComponentUtils.createPlainTextComponent(displayName); + + data.setString("DisplayName", update); + + return null; + } + }); + + MCTypeRegistry.OBJECTIVE.addStructureConverter(new DataConverter<>(VERSION) { + private static String getRenderType(String string) { + return string.equals("health") ? "hearts" : "integer"; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String renderType = data.getString("RenderType"); + if (renderType != null) { + return null; + } + + final String criteriaName = data.getString("CriteriaName", ""); + + data.setString("RenderType", getRenderType(criteriaName)); + + return null; + } + }); + } + + private V1514() {} +} diff --git a/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 RENAMED_BLOCK_IDS = new HashMap<>( + ImmutableMap.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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + final IntOpenHashSet positionsToLook = new IntOpenHashSet(); + + for (int i = 0, len = sections.size(); i < len; ++i) { + final TrappedChestSection section = new TrappedChestSection(sections.getMap(i)); + if (section.isSkippable()) { + continue; + } + + for (int index = 0; index < 4096; ++index) { + if (section.isTrappedChest(section.getBlock(index))) { + positionsToLook.add(section.getSectionY() << 12 | index); + } + } + } + + final int chunkX = level.getInt("xPos"); + final int chunkZ = level.getInt("zPos"); + + final ListType tileEntities = level.getList("TileEntities", ObjectType.MAP); + + if (tileEntities != null) { + for (int i = 0, len = tileEntities.size(); i < len; ++i) { + final MapType tile = tileEntities.getMap(i); + + final int x = tile.getInt("x"); + final int y = tile.getInt("y"); + final int z = tile.getInt("z"); + + final int index = V1496.getIndex(x - (chunkX << 4), y, z - (chunkZ << 4)); + if (!positionsToLook.contains(index)) { + continue; + } + + final String id = tile.getString("id"); + if (!"minecraft:chest".equals(id)) { + LOGGER.warn("Block Entity ({},{},{}) was expected to be a chest (V1624)", x, y, z); + } + + tile.setString("id", "minecraft:trapped_chest"); + } + } + + return null; + } + }); + } + + private V1624() {} + + public static final class TrappedChestSection extends V1496.Section { + + private IntOpenHashSet chestIds; + + public TrappedChestSection(final MapType section) { + super(section); + } + + @Override + protected boolean initSkippable() { + this.chestIds = new IntOpenHashSet(); + + for (int i = 0; i < this.palette.size(); ++i) { + final MapType blockState = this.palette.getMap(i); + final String name = blockState.getString("Name"); + if ("minecraft:trapped_chest".equals(name)) { + this.chestIds.add(i); + } + } + + return this.chestIds.isEmpty(); + } + + public boolean isTrappedChest(final int id) { + return this.chestIds.contains(id); + } + } +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final ListType pages = tag.getList("pages", ObjectType.STRING); + if (pages == null) { + return null; + } + + for (int i = 0, len = pages.size(); i < len; ++i) { + final String page = pages.getString(i); + + pages.setString(i, ComponentUtils.convertFromLenient(page)); + } + + return null; + } + }); + } + + private V165() {} +} diff --git a/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 RENAMED_ITEM_IDS = new HashMap<>( + ImmutableMap.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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + + if (tag == null) { + return null; + } + + final MapType display = tag.getMap("display"); + + if (display == null) { + return null; + } + + final ListType lore = display.getList("Lore", ObjectType.STRING); + if (lore == null) { + return null; + } + + for (int i = 0, len = lore.size(); i < len; ++i) { + lore.setString(i, ComponentUtils.createPlainTextComponent(lore.getString(i))); + } + + return null; + } + }); + } + + private V1803() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final int catType = data.getInt("CatType"); + + if (catType == 0) { + final String owner = data.getString("Owner"); + final String ownerUUID = data.getString("OwnerUUID"); + if ((owner != null && owner.length() > 0) || (ownerUUID != null && ownerUUID.length() > 0)) { + data.setBoolean("Trusting", true); + } + } else if (catType > 0 && catType < 4) { + data.setString("id", "minecraft:cat"); + data.setString("OwnerUUID", data.getString("OwnerUUID", "")); + } + + return null; + } + }); + + registerMob("minecraft:cat"); + } + + 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final String status = level.getString("Status"); + + if ("postprocessed".equals(status)) { + level.setString("Status", "fullchunk"); + } + + return null; + } + }); + } + + private V1905() {} +} diff --git a/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 CHUNK_STATUS_REMAP = new HashMap<>( + ImmutableMap.builder() + .put("structure_references", "empty") + .put("biomes", "empty") + .put("base", "surface") + .put("carved", "carvers") + .put("liquid_carved", "liquid_carvers") + .put("decorated", "features") + .put("lighted", "light") + .put("mobs_spawned", "spawn") + .put("finalized", "heightmaps") + .put("fullchunk", "full") + .build() + ); + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final String status = level.getString("Status", "empty"); + level.setString("Status", CHUNK_STATUS_REMAP.getOrDefault(status, "empty")); + + return null; + } + }); + } + + private V1911() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final String lootTable = data.getString("LootTable"); + + if ("minecraft:chests/village_blacksmith".equals(lootTable)) { + data.setString("LootTable", "minecraft:chests/village/village_weaponsmith"); + } + + return null; + } + }); + } + + private V1914() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getInt("CatType") == 9) { + data.setInt("CatType", 10); + } + return null; + } + }); + } + + private V1917() {} +} diff --git a/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> converter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int profession = data.getInt("Profession"); + final int career = data.getInt("Career"); + final int careerLevel = data.getInt("CareerLevel", 1); + data.remove("Profession"); + data.remove("Career"); + data.remove("CareerLevel"); + + final MapType villagerData = Types.NBT.createEmptyMap(); + data.setMap("VillagerData", villagerData); + villagerData.setString("type", "minecraft:plains"); + villagerData.setString("profession", getProfessionString(profession, career)); + villagerData.setInt("level", careerLevel); + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", converter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", converter); + } + + private V1918() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final MapType structures = level.getMap("Structures"); + if (structures == null) { + return null; + } + + final MapType starts = structures.getMap("Starts"); + if (starts != null) { + final MapType village = starts.getMap("New_Village"); + if (village != null) { + starts.remove("New_Village"); + starts.setMap("Village", village); + } else { + starts.remove("Village"); + } + } + + final MapType references = structures.getMap("References"); + if (references != null) { + final MapType newVillage = references.getMap("New_Village"); + // I believe Mojang had a typo here, removing Village from references only made sense + // if the new village didn't exist. DFU removes it whether or not it exists, but still relocates + // New_Village to Village first. It doesn't make sense to me to relocate it just to remove it, so it + // must be a typo. + if (newVillage == null) { + references.remove("Village"); + } else { + references.remove("New_Village"); + references.setMap("Village", newVillage); + } + } + + return null; + } + }); + + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + + if ("minecraft:new_village".equals(NamespaceUtil.correctNamespace(id))) { + data.setString("id", "minecraft:village"); + } + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:campfire", new DataWalkerItemLists("Items")); + } + + private V1920() {} +} diff --git a/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 convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + if (data == null) { + final MapType ret = Types.NBT.createEmptyMap(); + ret.setMap("data", root); + + return ret; + } + return null; + } + }); + } + + 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 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 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final String chatOpacity = data.getString("chatOpacity"); + if (chatOpacity != null) { + // Vanilla uses createDouble here, but options is always string -> string. I presume they made + // a mistake with this converter. + data.setString("textBackgroundOpacity", Double.toString(calculateBackground(chatOpacity))); + } + return null; + } + }); + } + + private static double calculateBackground(final String opacity) { + try { + final double d = 0.9D * Double.parseDouble(opacity) + 0.1D; + return d / 2.0D; + } catch (final NumberFormatException ex) { + return 0.5D; + } + } + + private V1936() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType sections = Types.NBT.createEmptyMap(); + data.setMap("Sections", sections); + + for (int y = 0; y < 16; ++y) { + final String key = Integer.toString(y); + final Object records = data.getGeneric(key); + + if (records == null) { + continue; + } + + data.remove(key); + + final MapType section = Types.NBT.createEmptyMap(); + section.setGeneric("Records", records); + sections.setMap(key, section); // 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType display = tag.getMap("display"); + if (display == null) { + return null; + } + + final String name = display.getString("Name"); + if (name == null) { + return null; + } + + display.setString("Name", name.replace("\"translate\":\"block.minecraft.illager_banner\"", "\"translate\":\"block.minecraft.ominous_banner\"")); + + return null; + } + }); + } + + private V1948() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final String name = data.getString("CustomName"); + if (name != null) { + data.setString("CustomName", name.replace("\"translate\":\"block.minecraft.illager_banner\"", "\"translate\":\"block.minecraft.ominous_banner\"")); + } + return null; + } + }); + } + + private V1953() {} +} diff --git a/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 data, final int level) { + MapType villagerData = data.getMap("VillagerData"); + if (villagerData == null) { + villagerData = Types.NBT.createEmptyMap(); + data.setMap("VillagerData", villagerData); + } + villagerData.setInt("level", level); + } + + private static void addXpFromLevel(final MapType data, final int level) { + data.setInt("Xp", getMinXpPerLevel(level)); + } + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType villagerData = data.getMap("VillagerData"); + int level = villagerData == null ? 0 : villagerData.getInt("level"); + if (level == 0 || level == 1) { + // count recipes + final MapType offers = data.getMap("Offers"); + final ListType recipes = offers == null ? null : offers.getList("Recipes", ObjectType.MAP); + final int recipeCount; + if (recipes != null) { + recipeCount = recipes.size(); + } else { + recipeCount = 0; + } + + level = Mth.clamp(recipeCount / 2, 1, 5); + if (level > 1) { + addLevel(data, level); + } + } + + if (!data.hasKey("Xp", ObjectType.NUMBER)) { + addXpFromLevel(data, level); + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number xp = data.getNumber("Xp"); + if (xp == null) { + final int level; + final MapType villagerData = data.getMap("VillagerData"); + if (villagerData == null) { + level = 1; + } else { + level = villagerData.getInt("level", 1); + } + + data.setInt("Xp", getMinXpPerLevel(level)); + } + return null; + } + }); + } + + private V1955() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + level.remove("isLightOn"); + + return null; + } + }); + } + + private V1961() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType gossips = data.getList("Gossips", ObjectType.MAP); + if (gossips == null) { + return null; + } + + for (int i = 0; i < gossips.size();) { + final MapType gossip = gossips.getMap(i); + if ("golem".equals(gossip.getString("Type"))) { + gossips.remove(i); + continue; + } + + ++i; + } + + return null; + } + }); + } + + private V1963() {} +} diff --git a/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 RECIPE_RENAMES = new HashMap<>( + ImmutableMap.of( + "minecraft:sugar", "minecraft:sugar_from_sugar_cane" + ) + ); + private static final Map 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final int[] oldBiomes = level.getInts("Biomes"); + + if (oldBiomes == null || oldBiomes.length != 256) { + return null; + } + + final int[] newBiomes = new int[1024]; + level.setInts("Biomes", newBiomes); + + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + int k = (j << 2) + 2; + int l = (i << 2) + 2; + int m = l << 4 | k; + newBiomes[i << 2 | j] = oldBiomes[m]; + } + } + + for (int i = 1; i < 64; ++i) { + System.arraycopy(newBiomes, 0, newBiomes, i * 16, 16); + } + + return null; + } + }); + } + + private V2202() {} +} diff --git a/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 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey("references", ObjectType.NUMBER)) { + return null; + } + + final int references = data.getInt("references"); + if (references <= 0) { + data.setInt("references", 1); + } + return null; + } + }); + } + + private V2211() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType sections = data.getMap("Sections"); + if (sections == null) { + return null; + } + + for (final String key : sections.keys()) { + final MapType section = sections.getMap(key); + + section.remove("Valid"); + } + + return null; + } + }); + } + + private V2218() {} +} diff --git a/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> converter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int recipesUsedSize = data.getInt("RecipesUsedSize"); + data.remove("RecipesUsedSize"); + + if (recipesUsedSize <= 0) { + return null; + } + + final MapType newRecipes = Types.NBT.createEmptyMap(); + data.setMap("RecipesUsed", newRecipes); + + for (int i = 0; i < recipesUsedSize; ++i) { + final String recipeKey = data.getString("RecipeLocation" + i); + data.remove("RecipeLocation" + i); + final int recipeAmount = data.getInt("RecipeAmount" + i); + data.remove("RecipeAmount" + i); + + if (i <= 0 || recipeKey == null) { + continue; + } + + newRecipes.setInt(recipeKey, recipeAmount); + } + + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:furnace", converter); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:blast_furnace", converter); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:smoker", converter); + + registerFurnace("minecraft:furnace"); + registerFurnace("minecraft:smoker"); + registerFurnace("minecraft:blast_furnace"); + } + + private V2501() {} +} diff --git a/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 WALL_BLOCKS = new HashSet<>( + ImmutableSet.of( + "minecraft:andesite_wall", + "minecraft:brick_wall", + "minecraft:cobblestone_wall", + "minecraft:diorite_wall", + "minecraft:end_stone_brick_wall", + "minecraft:granite_wall", + "minecraft:mossy_cobblestone_wall", + "minecraft:mossy_stone_brick_wall", + "minecraft:nether_brick_wall", + "minecraft:prismarine_wall", + "minecraft:red_nether_brick_wall", + "minecraft:red_sandstone_wall", + "minecraft:sandstone_wall", + "minecraft:stone_brick_wall" + ) + ); + + private static void changeWallProperty(final MapType properties, final String path) { + final String property = properties.getString(path); + if (property != null) { + properties.setString(path, "true".equals(property) ? "low" : "none"); + } + } + + public static void register() { + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!WALL_BLOCKS.contains(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + if (properties == null) { + return null; + } + + changeWallProperty(properties, "east"); + changeWallProperty(properties, "west"); + changeWallProperty(properties, "north"); + changeWallProperty(properties, "south"); + + return null; + } + }); + ConverterAbstractAdvancementsRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:recipes/misc/composter", "minecraft:recipes/decorations/composter" + ) + )::get); + } + + private V2503() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType brain = data.getMap("Brain"); + if (brain == null) { + return null; + } + + final MapType memories = brain.getMap("memories"); + if (memories == null) { + return null; + } + + for (final String key : memories.keys()) { + final Object value = memories.getGeneric(key); + + final MapType wrapped = Types.NBT.createEmptyMap(); + wrapped.setGeneric("value", value); + + memories.setMap(key, wrapped); + } + + return null; + } + }); + + 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 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 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> throwableConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType owner = data.getMap("owner"); + data.remove("owner"); + if (owner == null) { + return null; + } + + setUUID(data, owner.getLong("M"), owner.getLong("L")); + + return null; + } + }; + final DataConverter, MapType> potionConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType potion = data.getMap("Potion"); + data.remove("Potion"); + + data.setMap("Item", potion == null ? Types.NBT.createEmptyMap() : potion); + + return null; + } + }; + final DataConverter, MapType> llamaSpitConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType owner = data.getMap("Owner"); + data.remove("Owner"); + if (owner == null) { + return null; + } + + setUUID(data, owner.getLong("OwnerUUIDMost"), owner.getLong("OwnerUUIDLeast")); + + return null; + } + }; + final DataConverter, MapType> arrowConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + setUUID(data, data.getLong("OwnerUUIDMost"), data.getLong("OwnerUUIDLeast")); + + data.remove("OwnerUUIDMost"); + data.remove("OwnerUUIDLeast"); + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:egg", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:ender_pearl", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:experience_bottle", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:snowball", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:potion", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:potion", potionConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:llama_spit", llamaSpitConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", arrowConverter); + + // Vanilla 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 ABSTRACT_HORSES = Sets.newHashSet(); + private static final Set TAMEABLE_ANIMALS = Sets.newHashSet(); + private static final Set ANIMALS = Sets.newHashSet(); + private static final Set MOBS = Sets.newHashSet(); + private static final Set LIVING_ENTITIES = Sets.newHashSet(); + private static final Set PROJECTILES = Sets.newHashSet(); + static { + ABSTRACT_HORSES.add("minecraft:donkey"); + ABSTRACT_HORSES.add("minecraft:horse"); + ABSTRACT_HORSES.add("minecraft:llama"); + ABSTRACT_HORSES.add("minecraft:mule"); + ABSTRACT_HORSES.add("minecraft:skeleton_horse"); + ABSTRACT_HORSES.add("minecraft:trader_llama"); + ABSTRACT_HORSES.add("minecraft:zombie_horse"); + + TAMEABLE_ANIMALS.add("minecraft:cat"); + TAMEABLE_ANIMALS.add("minecraft:parrot"); + TAMEABLE_ANIMALS.add("minecraft:wolf"); + + ANIMALS.add("minecraft:bee"); + ANIMALS.add("minecraft:chicken"); + ANIMALS.add("minecraft:cow"); + ANIMALS.add("minecraft:fox"); + ANIMALS.add("minecraft:mooshroom"); + ANIMALS.add("minecraft:ocelot"); + ANIMALS.add("minecraft:panda"); + ANIMALS.add("minecraft:pig"); + ANIMALS.add("minecraft:polar_bear"); + ANIMALS.add("minecraft:rabbit"); + ANIMALS.add("minecraft:sheep"); + ANIMALS.add("minecraft:turtle"); + ANIMALS.add("minecraft:hoglin"); + + MOBS.add("minecraft:bat"); + MOBS.add("minecraft:blaze"); + MOBS.add("minecraft:cave_spider"); + MOBS.add("minecraft:cod"); + MOBS.add("minecraft:creeper"); + MOBS.add("minecraft:dolphin"); + MOBS.add("minecraft:drowned"); + MOBS.add("minecraft:elder_guardian"); + MOBS.add("minecraft:ender_dragon"); + MOBS.add("minecraft:enderman"); + MOBS.add("minecraft:endermite"); + MOBS.add("minecraft:evoker"); + MOBS.add("minecraft:ghast"); + MOBS.add("minecraft:giant"); + MOBS.add("minecraft:guardian"); + MOBS.add("minecraft:husk"); + MOBS.add("minecraft:illusioner"); + MOBS.add("minecraft:magma_cube"); + MOBS.add("minecraft:pufferfish"); + MOBS.add("minecraft:zombified_piglin"); + MOBS.add("minecraft:salmon"); + MOBS.add("minecraft:shulker"); + MOBS.add("minecraft:silverfish"); + MOBS.add("minecraft:skeleton"); + MOBS.add("minecraft:slime"); + MOBS.add("minecraft:snow_golem"); + MOBS.add("minecraft:spider"); + MOBS.add("minecraft:squid"); + MOBS.add("minecraft:stray"); + MOBS.add("minecraft:tropical_fish"); + MOBS.add("minecraft:vex"); + MOBS.add("minecraft:villager"); + MOBS.add("minecraft:iron_golem"); + MOBS.add("minecraft:vindicator"); + MOBS.add("minecraft:pillager"); + MOBS.add("minecraft:wandering_trader"); + MOBS.add("minecraft:witch"); + MOBS.add("minecraft:wither"); + MOBS.add("minecraft:wither_skeleton"); + MOBS.add("minecraft:zombie"); + MOBS.add("minecraft:zombie_villager"); + MOBS.add("minecraft:phantom"); + MOBS.add("minecraft:ravager"); + MOBS.add("minecraft:piglin"); + + LIVING_ENTITIES.add("minecraft:armor_stand"); + + PROJECTILES.add("minecraft:arrow"); + PROJECTILES.add("minecraft:dragon_fireball"); + PROJECTILES.add("minecraft:firework_rocket"); + PROJECTILES.add("minecraft:fireball"); + PROJECTILES.add("minecraft:llama_spit"); + PROJECTILES.add("minecraft:small_fireball"); + PROJECTILES.add("minecraft:snowball"); + PROJECTILES.add("minecraft:spectral_arrow"); + PROJECTILES.add("minecraft:egg"); + PROJECTILES.add("minecraft:ender_pearl"); + PROJECTILES.add("minecraft:experience_bottle"); + PROJECTILES.add("minecraft:potion"); + PROJECTILES.add("minecraft:trident"); + PROJECTILES.add("minecraft:wither_skull"); + } + + static int[] createUUIDArray(final long most, final long least) { + return new int[] { + (int)(most >>> 32), + (int)most, + (int)(least >>> 32), + (int)least + }; + } + + static int[] createUUIDFromString(final MapType data, final String path) { + if (data == null) { + return null; + } + + final String uuidString = data.getString(path); + if (uuidString == null) { + return null; + } + + try { + final UUID uuid = UUID.fromString(uuidString); + return createUUIDArray(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits()); + } catch (final IllegalArgumentException ignore) { + return null; + } + } + + static int[] createUUIDFromLongs(final MapType data, final String most, final String least) { + if (data == null) { + return null; + } + + final long mostBits = data.getLong(most); + final long leastBits = data.getLong(least); + + return (mostBits != 0 || leastBits != 0) ? createUUIDArray(mostBits, leastBits) : null; + } + + static void replaceUUIDString(final MapType data, final String oldPath, final String newPath) { + final int[] newUUID = createUUIDFromString(data, oldPath); + if (newUUID != null) { + data.remove(oldPath); + data.setInts(newPath, newUUID); + } + } + + static void replaceUUIDMLTag(final MapType data, final String oldPath, final String newPath) { + final int[] uuid = createUUIDFromLongs(data.getMap(oldPath), "M", "L"); + if (uuid != null) { + data.remove(oldPath); + data.setInts(newPath, uuid); + } + } + + static void replaceUUIDLeastMost(final MapType data, final String prefix, final String newPath) { + final String mostPath = prefix.concat("Most"); + final String leastPath = prefix.concat("Least"); + + final int[] uuid = createUUIDFromLongs(data, mostPath, leastPath); + if (uuid != null) { + data.remove(mostPath); + data.remove(leastPath); + data.setInts(newPath, uuid); + } + } + + private static void updatePiglin(final MapType data) { + final MapType brain = data.getMap("Brain"); + if (brain == null) { + return; + } + + final MapType memories = brain.getMap("memories"); + if (memories == null) { + return; + } + + final MapType angryAt = memories.getMap("minecraft:angry_at"); + + replaceUUIDString(angryAt, "value", "value"); + } + + private static void updateEvokerFangs(final MapType data) { + replaceUUIDLeastMost(data, "OwnerUUID", "Owner"); + } + + private static void updateZombieVillager(final MapType data) { + replaceUUIDLeastMost(data, "ConversionPlayer", "ConversionPlayer"); + } + + private static void updateAreaEffectCloud(final MapType data) { + replaceUUIDLeastMost(data, "OwnerUUID", "Owner"); + } + + private static void updateShulkerBullet(final MapType data) { + replaceUUIDMLTag(data, "Owner", "Owner"); + replaceUUIDMLTag(data, "Target", "Target"); + } + + private static void updateItem(final MapType data) { + replaceUUIDMLTag(data, "Owner", "Owner"); + replaceUUIDMLTag(data, "Thrower", "Thrower"); + } + + private static void updateFox(final MapType data) { + final ListType trustedUUIDS = data.getList("TrustedUUIDs", ObjectType.MAP); + if (trustedUUIDS == null) { + return; + } + + final ListType newUUIDs = Types.NBT.createEmptyList(); + data.remove("TrustedUUIDs"); + data.setList("Trusted", newUUIDs); + + for (int i = 0, len = trustedUUIDS.size(); i < len; ++i) { + final MapType uuid = trustedUUIDS.getMap(i); + final int[] newUUID = createUUIDFromLongs(uuid, "M", "L"); + if (newUUID != null) { + newUUIDs.addIntArray(newUUID); + } + } + } + + private static void updateHurtBy(final MapType data) { + replaceUUIDString(data, "HurtBy", "HurtBy"); + } + + private static void updateAnimalOwner(final MapType data) { + updateAnimal(data); + + replaceUUIDString(data, "OwnerUUID", "Owner"); + } + + private static void updateAnimal(final MapType data) { + updateMob(data); + + replaceUUIDLeastMost(data, "LoveCause", "LoveCause"); + } + + private static void updateMob(final MapType data) { + updateLivingEntity(data); + + final MapType leash = data.getMap("Leash"); + if (leash == null) { + return; + } + + replaceUUIDLeastMost(leash, "UUID", "UUID"); + } + + private static void updateLivingEntity(final MapType data) { + final ListType attributes = data.getList("Attributes", ObjectType.MAP); + if (attributes == null) { + return; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + final MapType attribute = attributes.getMap(i); + + final ListType modifiers = attribute.getList("Modifiers", ObjectType.MAP); + if (modifiers == null) { + continue; + } + + for (int k = 0; k < modifiers.size(); ++k) { + replaceUUIDLeastMost(modifiers.getMap(k), "UUID", "UUID"); + } + } + } + + private static void updateProjectile(final MapType data) { + final Object ownerUUID = data.getGeneric("OwnerUUID"); + if (ownerUUID != null) { + data.remove("OwnerUUID"); + data.setGeneric("Owner", ownerUUID); + } + } + + private static void updateEntityUUID(final MapType data) { + replaceUUIDLeastMost(data, "UUID", "UUID"); + } + + public static void register() { + // Entity UUID fixes + + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateEntityUUID(data); + return null; + } + }); + + final DataConverter, MapType> animalOwnerConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateAnimalOwner(data); + return null; + } + }; + final DataConverter, MapType> animalConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateAnimal(data); + return null; + } + }; + final DataConverter, MapType> mobConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateMob(data); + return null; + } + }; + final DataConverter, MapType> livingEntityConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateLivingEntity(data); + return null; + } + }; + final DataConverter, MapType> projectileConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateProjectile(data); + return null; + } + }; + for (final String id : ABSTRACT_HORSES) { + MCTypeRegistry.ENTITY.addConverterForId(id, animalOwnerConverter); + } + for (final String id : TAMEABLE_ANIMALS) { + MCTypeRegistry.ENTITY.addConverterForId(id, animalOwnerConverter); + } + for (final String id : ANIMALS) { + MCTypeRegistry.ENTITY.addConverterForId(id, animalConverter); + } + for (final String id : MOBS) { + MCTypeRegistry.ENTITY.addConverterForId(id, mobConverter); + } + for (final String id : LIVING_ENTITIES) { + MCTypeRegistry.ENTITY.addConverterForId(id, livingEntityConverter); + } + for (final String id : PROJECTILES) { + MCTypeRegistry.ENTITY.addConverterForId(id, projectileConverter); + } + + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:bee", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateHurtBy(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombified_piglin", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateHurtBy(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:fox", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateFox(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:item", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateItem(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker_bullet", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateShulkerBullet(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateAreaEffectCloud(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateZombieVillager(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:evoker_fangs", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateEvokerFangs(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:piglin", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updatePiglin(data); + return null; + } + }); + + + // Update TE + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:conduit", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + replaceUUIDMLTag(data, "target_uuid", "Target"); + return null; + } + }); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:skull", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType owner = data.getMap("Owner"); + if (owner == null) { + return null; + } + + data.remove("Owner"); + + replaceUUIDString(owner, "Id", "Id"); + + data.setMap("SkullOwner", owner); + + return null; + } + }); + + // Player UUID + MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateLivingEntity(data); + updateEntityUUID(data); + + final MapType rootVehicle = data.getMap("RootVehicle"); + if (rootVehicle == null) { + return null; + } + + replaceUUIDLeastMost(rootVehicle, "Attach", "Attach"); + + return null; + } + }); + + // Level.dat + MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + replaceUUIDString(data, "WanderingTraderId", "WanderingTraderId"); + + final MapType dimensionData = data.getMap("DimensionData"); + if (dimensionData != null) { + for (final String key : dimensionData.keys()) { + final MapType dimension = dimensionData.getMap(key); + + final MapType dragonFight = dimension.getMap("DragonFight"); + if (dragonFight == null) { + continue; + } + + replaceUUIDLeastMost(dragonFight, "DragonUUID", "Dragon"); + } + } + + final MapType customBossEvents = data.getMap("CustomBossEvents"); + if (customBossEvents != null) { + for (final String key : customBossEvents.keys()) { + final MapType customBossEvent = customBossEvents.getMap(key); + + final ListType players = customBossEvent.getList("Players", ObjectType.MAP); + if (players == null) { + continue; + } + + final ListType newPlayers = Types.NBT.createEmptyList(); + customBossEvent.setList("Players", newPlayers); + + for (int i = 0, len = players.size(); i < len; ++i) { + final int[] newUUID = createUUIDFromLongs(players.getMap(i), "M", "L"); + if (newUUID != null) { + newPlayers.addIntArray(newUUID); + } + } + } + } + + return null; + } + }); + + MCTypeRegistry.SAVED_DATA_RAIDS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + final ListType raids = data.getList("Raids", ObjectType.MAP); + if (raids == null) { + return null; + } + + for (int i = 0, len = raids.size(); i < len; ++i) { + final MapType raid = raids.getMap(i); + + final ListType heros = raid.getList("HeroesOfTheVillage", ObjectType.MAP); + + if (heros == null) { + continue; + } + + final ListType newHeros = Types.NBT.createEmptyList(); + raid.setList("HeroesOfTheVillage", newHeros); + + for (int k = 0, klen = heros.size(); k < klen; ++k) { + final MapType uuidOld = heros.getMap(i); + final int[] uuidNew = createUUIDFromLongs(uuidOld, "UUIDMost", "UUIDLeast"); + if (uuidNew != null) { + newHeros.addIntArray(uuidNew); + } + } + } + + return null; + } + }); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + updateAttributeModifiers(tag); + + if ("minecraft:player_head".equals(data.getString("id"))) { + updateSkullOwner(tag); + } + + return null; + } + }); + } + + private static void updateAttributeModifiers(final MapType tag) { + final ListType attributes = tag.getList("AttributeModifiers", ObjectType.MAP); + if (attributes == null) { + return; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + replaceUUIDLeastMost(attributes.getMap(i), "UUID", "UUID"); + } + } + + private static void updateSkullOwner(final MapType tag) { + replaceUUIDString(tag.getMap("SkullOwner"), "Id", "Id"); + } + + private V2514() {} +} diff --git a/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> gossipUUIDConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType gossips = data.getList("Gossips", ObjectType.MAP); + + if (gossips == null) { + return null; + } + + for (int i = 0, len = gossips.size(); i < len; ++i) { + V2514.replaceUUIDLeastMost(gossips.getMap(i), "Target", "Target"); + } + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", gossipUUIDConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", gossipUUIDConverter); + } + + private V2516() {} +} diff --git a/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 FACING_RENAMES = new HashMap<>( + ImmutableMap.builder() + .put("down", "down_south") + .put("up", "up_north") + .put("north", "north_up") + .put("south", "south_up") + .put("west", "west_up") + .put("east", "east_up") + .build() + ); + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:jigsaw", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String type = data.getString("attachement_type", "minecraft:empty"); + final String pool = data.getString("target_pool", "minecraft:empty"); + data.remove("attachement_type"); + data.remove("target_pool"); + + data.setString("name", type); + data.setString("target", type); + data.setString("pool", pool); + + return null; + } + }); + + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"minecraft:jigsaw".equals(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + if (properties == null) { + return null; + } + + final String facing = properties.getString("facing", "north"); + properties.remove("facing"); + properties.setString("orientation", FACING_RENAMES.getOrDefault(facing, facing)); + + return null; + } + }); + } + + private V2518() {} +} diff --git a/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..af295e8800b6eb5c13bbb88d21b391e5cc4bee1a --- /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.ConverterAbstractAttributesRename; +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 RENAMES = new HashMap<>( + ImmutableMap.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() { + ConverterAbstractAttributesRename.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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + final ListType palette = section.getList("Palette", ObjectType.MAP); + + if (palette == null) { + continue; + } + + final int bits = Math.max(4, DataFixUtils.ceillog2(palette.size())); + + if (Mth.isPowerOfTwo(bits)) { + // fits perfectly + continue; + } + + final long[] states = section.getLongs("BlockStates"); + if (states == null) { + // wat + continue; + } + + section.setLongs("BlockStates", addPadding(4096, bits, states)); + } + } + + final MapType heightMaps = level.getMap("Heightmaps"); + if (heightMaps != null) { + for (final String key : heightMaps.keys()) { + final long[] old = heightMaps.getLongs(key); + heightMaps.setLongs(key, addPadding(256, 9, old)); + } + } + + return null; + } + }); + } + + public static long[] addPadding(final int indices, final int bits, final long[] old) { + int k = old.length; + if (k == 0) { + return old; + } else { + long l = (1L << bits) - 1L; + int m = 64 / bits; + int n = (indices + m - 1) / m; + long[] padded = new long[n]; + int o = 0; + int p = 0; + long q = 0L; + int r = 0; + long s = old[0]; + long t = k > 1 ? old[1] : 0L; + + for(int u = 0; u < indices; ++u) { + int v = u * bits; + int w = v >> 6; + int x = (u + 1) * bits - 1 >> 6; + int y = v ^ w << 6; + if (w != r) { + s = t; + t = w + 1 < k ? old[w + 1] : 0L; + r = w; + } + + long ab; + int ac; + if (w == x) { + ab = s >>> y & l; + } else { + ac = 64 - y; + ab = (s >>> y | t << ac) & l; + } + + ac = p + bits; + if (ac >= 64) { + padded[o++] = q; + q = ab; + p = bits; + } else { + q |= ab << p; + p = ac; + } + } + + if (q != 0L) { + padded[o] = q; + } + + return padded; + } + } + + private V2527() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getBoolean("NoGravity")) { + data.setBoolean("NoGravity", false); + } + return null; + } + }); + } + + private V2529() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"minecraft:redstone_wire".equals(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + + if (properties == null) { + return null; + } + + + final String east = properties.getString("east", "none"); + final String west = properties.getString("west", "none"); + final String north = properties.getString("north", "none"); + final String south = properties.getString("south", "none"); + + final boolean connectedX = isConnected(east) || isConnected(west); + final boolean connectedZ = isConnected(north) || isConnected(south); + + final String newEast = !isConnected(east) && !connectedZ ? "side" : east; + final String newWest = !isConnected(west) && !connectedZ ? "side" : west; + final String newNorth = !isConnected(north) && !connectedX ? "side" : north; + final String newSouth = !isConnected(south) && !connectedX ? "side" : south; + + if (properties.hasKey("east")) { + properties.setString("east", newEast); + } + if (properties.hasKey("west")) { + properties.setString("west", newWest); + } + if (properties.hasKey("north")) { + properties.setString("north", newNorth); + } + if (properties.hasKey("south")) { + properties.setString("south", newSouth); + } + + return null; + } + }); + } + + private V2531() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType attributes = data.getList("Attributes", ObjectType.MAP); + + if (attributes == null) { + return null; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + final MapType attribute = attributes.getMap(i); + + if (!"generic.follow_range".equals(attribute.getString("Name"))) { + continue; + } + + if (attribute.getDouble("Base") == 16.0) { + attribute.setDouble("Base", 48.0); + } + } + + return null; + } + }); + } + + private V2533() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + // Mojang uses doubles for whatever reason... rotation is in FLOAT. by using double here + // the entity load will just ignore rotation and set it to 0... + final ListType rotation = data.getList("Rotation", ObjectType.FLOAT); + + if (rotation == null || rotation.size() == 0) { + return null; + } + + rotation.setFloat(0, rotation.getFloat(0) - 180.0F); + + return null; + } + }); + } + + private V2535() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType worldGenSettings = data.getOrCreateMap("WorldGenSettings"); + + for (final String key : MERGE_KEYS) { + final Object value = data.getGeneric(key); + if (value == null) { + continue; + } + + data.remove(key); + worldGenSettings.setGeneric(key, value); + } + + return null; + } + }); + } + + private V2538() {} +} diff --git a/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 DEFAULTS = new HashMap<>( + ImmutableMap.builder() + .put("minecraft:village", new StructureFeatureConfiguration(32, 8, 10387312)) + .put("minecraft:desert_pyramid", new StructureFeatureConfiguration(32, 8, 14357617)) + .put("minecraft:igloo", new StructureFeatureConfiguration(32, 8, 14357618)) + .put("minecraft:jungle_pyramid", new StructureFeatureConfiguration(32, 8, 14357619)) + .put("minecraft:swamp_hut", new StructureFeatureConfiguration(32, 8, 14357620)) + .put("minecraft:pillager_outpost", new StructureFeatureConfiguration(32, 8, 165745296)) + .put("minecraft:monument", new StructureFeatureConfiguration(32, 5, 10387313)) + .put("minecraft:endcity", new StructureFeatureConfiguration(20, 11, 10387313)) + .put("minecraft:mansion", new StructureFeatureConfiguration(80, 20, 10387319)) + .build() + ); + + private static record StructureFeatureConfiguration(int spacing, int separation, int salt) { + + public MapType serialize() { + final MapType ret = Types.NBT.createEmptyMap(); + + ret.setInt("spacing", this.spacing); + ret.setInt("separation", this.separation); + ret.setInt("salt", this.salt); + + return ret; + } + } + + public static void register() { + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final long seed = data.getLong("RandomSeed"); + String generatorName = data.getString("generatorName"); + if (generatorName != null) { + generatorName = generatorName.toLowerCase(Locale.ROOT); + } + String legacyCustomOptions = data.getString("legacy_custom_options"); + if (legacyCustomOptions == null) { + legacyCustomOptions = "customized".equals(generatorName) ? data.getString("generatorOptions") : null; + } + + final MapType generator; + boolean caves = false; + + if ("customized".equals(generatorName) || generatorName == null) { + generator = defaultOverworld(seed); + } else { + switch (generatorName) { + case "flat": { + final MapType generatorOptions = data.getMap("generatorOptions"); + + final MapType structures = fixFlatStructures(generatorOptions); + final MapType settings = Types.NBT.createEmptyMap(); + generator = Types.NBT.createEmptyMap(); + generator.setString("type", "minecraft:flat"); + generator.setMap("settings", settings); + + settings.setMap("structures", structures); + + ListType layers = generatorOptions.getList("layers", ObjectType.MAP); + if (layers == null) { + layers = Types.NBT.createEmptyList(); + + final int[] heights = new int[] { 1, 2, 1 }; + final String[] blocks = new String[] { "minecraft:bedrock", "minecraft:dirt", "minecraft:grass_block" }; + for (int i = 0; i < 3; ++i) { + final MapType layer = Types.NBT.createEmptyMap(); + layer.setInt("height", heights[i]); + layer.setString("block", blocks[i]); + layers.addMap(layer); + } + } + + settings.setList("layers", layers); + settings.setString("biome", generatorOptions.getString("biome", "minecraft:plains")); + + break; + } + + case "debug_all_block_states": { + generator = Types.NBT.createEmptyMap(); + generator.setString("type", "minecraft:debug"); + break; + } + + case "buffet": { + final MapType generatorOptions = data.getMap("generatorOptions"); + final MapType chunkGenerator = generatorOptions == null ? null : generatorOptions.getMap("chunk_generator"); + final String chunkGeneratorType = chunkGenerator == null ? null : chunkGenerator.getString("type"); + + final String newType; + if ("minecraft:caves".equals(chunkGeneratorType)) { + newType = "minecraft:caves"; + caves = true; + } else if ("minecraft:floating_islands".equals(chunkGeneratorType)) { + newType = "minecraft:floating_islands"; + } else { + newType = "minecraft:overworld"; + } + + MapType biomeSource = generatorOptions == null ? null : generatorOptions.getMap("biome_source"); + if (biomeSource == null) { + biomeSource = Types.NBT.createEmptyMap(); + biomeSource.setString("type", "minecraft:fixed"); + } + + if ("minecraft:fixed".equals(biomeSource.getString("type"))) { + final MapType options = biomeSource.getMap("options"); + final ListType biomes = options == null ? null : options.getList("biomes", ObjectType.STRING); + final String biome = biomes == null || biomes.size() == 0 ? "minecraft:ocean" : biomes.getString(0); + biomeSource.remove("options"); + biomeSource.setString("biome", biome); + } + + generator = noise(seed, newType, biomeSource); + break; + } + + default: { + boolean defaultGen = generatorName.equals("default"); + boolean default11Gen = generatorName.equals("default_1_1") || defaultGen && data.getInt("generatorVersion") == 0; + boolean amplified = generatorName.equals("amplified"); + boolean largeBiomes = generatorName.equals("largebiomes"); + + generator = noise(seed, amplified ? "minecraft:amplified" : "minecraft:overworld", + vanillaBiomeSource(seed, default11Gen, largeBiomes)); + break; + } + } + } + + final boolean mapFeatures = data.getBoolean("MapFeatures", true); + final boolean bonusChest = data.getBoolean("BonusChest", false); + + final MapType ret = Types.NBT.createEmptyMap(); + + ret.setLong("seed", seed); + ret.setBoolean("generate_features", mapFeatures); + ret.setBoolean("bonus_chest", bonusChest); + ret.setMap("dimensions", vanillaLevels(seed, generator, caves)); + if (legacyCustomOptions != null) { + ret.setString("legacy_custom_options", legacyCustomOptions); + } + + return ret; + } + }); + } + + public static MapType noise(final long seed, final String worldType, final MapType biomeSource) { + final MapType ret = Types.NBT.createEmptyMap(); + + ret.setString("type", "minecraft:noise"); + ret.setMap("biome_source", biomeSource); + ret.setLong("seed", seed); + ret.setString("settings", worldType); + + return ret; + } + + public static MapType vanillaBiomeSource(final long seed, final boolean default11Gen, final boolean largeBiomes) { + final MapType ret = Types.NBT.createEmptyMap(); + + ret.setString("type", "minecraft:vanilla_layered"); + ret.setLong("seed", seed); + ret.setBoolean("large_biomes", largeBiomes); + if (default11Gen) { + ret.setBoolean("legacy_biome_init_layer", default11Gen); + } + + return ret; + } + + public static MapType fixFlatStructures(final MapType generatorOptions) { + int distance = 32; + int spread = 3; + int count = 128; + boolean stronghold = false; + final Map newStructures = new HashMap<>(); + + if (generatorOptions == null) { + stronghold = true; + newStructures.put("minecraft:village", DEFAULTS.get("minecraft:village")); + } + + final MapType oldStructures = generatorOptions == null ? null : generatorOptions.getMap("structures"); + if (oldStructures != null) { + for (final String structureName : oldStructures.keys()) { + final MapType structureValues = oldStructures.getMap(structureName); + if (structureValues == null) { + continue; + } + + for (final String structureValueKey : structureValues.keys()) { + final String structureValue = structureValues.getString(structureValueKey); + + if ("stronghold".equals(structureName)) { + stronghold = true; + switch (structureValueKey) { + case "distance": + distance = getInt(structureValue, distance, 1); + break; + case "spread": + spread = getInt(structureValue, spread, 1); + break; + case "count": + count = getInt(structureValue, count, 1); + break; + } + } else { + switch (structureValueKey) { + case "distance": + switch (structureName) { + case "village": + setSpacing(newStructures, "minecraft:village", structureValue, 9); + break; + case "biome_1": + setSpacing(newStructures, "minecraft:desert_pyramid", structureValue, 9); + setSpacing(newStructures, "minecraft:igloo", structureValue, 9); + setSpacing(newStructures, "minecraft:jungle_pyramid", structureValue, 9); + setSpacing(newStructures, "minecraft:swamp_hut", structureValue, 9); + setSpacing(newStructures, "minecraft:pillager_outpost", structureValue, 9); + break; + case "endcity": + setSpacing(newStructures, "minecraft:endcity", structureValue, 1); + break; + case "mansion": + setSpacing(newStructures, "minecraft:mansion", structureValue, 1); + break; + default: + break; + } + case "separation": + if ("oceanmonument".equals(structureName)) { + final StructureFeatureConfiguration structure = newStructures.getOrDefault("minecraft:monument", DEFAULTS.get("minecraft:monument")); + final int newSpacing = getInt(structureValue, structure.separation, 1); + newStructures.put("minecraft:monument", new StructureFeatureConfiguration(newSpacing, structure.separation, structure.salt)); + } + + break; + case "spacing": + if ("oceanmonument".equals(structureName)) { + setSpacing(newStructures, "minecraft:monument", structureValue, 1); + } + + break; + } + } + } + } + } + + final MapType ret = Types.NBT.createEmptyMap(); + final MapType structuresSerialized = Types.NBT.createEmptyMap(); + ret.setMap("structures", structuresSerialized); + for (final String key : newStructures.keySet()) { + structuresSerialized.setMap(key, newStructures.get(key).serialize()); + } + + if (stronghold) { + final MapType strongholdData = Types.NBT.createEmptyMap(); + ret.setMap("stronghold", strongholdData); + + strongholdData.setInt("distance", distance); + strongholdData.setInt("spread", spread); + strongholdData.setInt("count", count); + } + + return ret; + } + + public static MapType vanillaLevels(final long seed, final MapType generator, final boolean caves) { + final MapType ret = Types.NBT.createEmptyMap(); + + final MapType overworld = Types.NBT.createEmptyMap(); + final MapType nether = Types.NBT.createEmptyMap(); + final MapType end = Types.NBT.createEmptyMap(); + + ret.setMap("minecraft:overworld", overworld); + ret.setMap("minecraft:the_nether", nether); + ret.setMap("minecraft:the_end", end); + + // overworld + overworld.setString("type", caves ? "minecraft:overworld_caves" : "minecraft:overworld"); + overworld.setMap("generator", generator); + + // nether + nether.setString("type", "minecraft:the_nether"); + final MapType netherBiomeSource = Types.NBT.createEmptyMap(); + netherBiomeSource.setString("type", "minecraft:multi_noise"); + netherBiomeSource.setLong("seed", seed); + netherBiomeSource.setString("preset", "minecraft:nether"); + + nether.setMap("generator", noise(seed, "minecraft:nether", netherBiomeSource)); + + // end + end.setString("type", "minecraft:the_end"); + final MapType endBiomeSource = Types.NBT.createEmptyMap(); + endBiomeSource.setString("type", "minecraft:the_end"); + endBiomeSource.setLong("seed", seed); + end.setMap("generator", noise(seed,"minecraft:end", endBiomeSource)); + + return ret; + } + + public static MapType defaultOverworld(final long seed) { + return noise(seed, "minecraft:overworld", vanillaBiomeSource(seed, false, false)); + } + + private static int getInt(final String value, final int dfl) { + return NumberUtils.toInt(value, dfl); + } + + private static int getInt(final String value, final int dfl, final int minVal) { + return Math.max(minVal, getInt(value, dfl)); + } + + private static void setSpacing(final Map 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 data, final long fromVersion, final long toVersion) -> { + final MapType dimensions = data.getMap("dimensions"); + + if (dimensions == null) { + return null; + } + + for (final String dimension : dimensions.keys()) { + final MapType dimensionData = dimensions.getMap(dimension); + if (dimensionData == null) { + continue; + } + + final MapType generator = dimensionData.getMap("generator"); + if (generator == null) { + continue; + } + + final String type = generator.getString("type"); + if (type == null) { + continue; + } + + switch (type) { + case "minecraft:flat": { + final MapType settings = generator.getMap("settings"); + if (settings == null) { + continue; + } + + WalkerUtils.convert(MCTypeRegistry.BIOME, settings, "biome", fromVersion, toVersion); + + final ListType layers = settings.getList("layers", ObjectType.MAP); + if (layers != null) { + for (int i = 0, len = layers.size(); i < len; ++i) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, layers.getMap(i), "block", fromVersion, toVersion); + } + } + + break; + } + case "minecraft:noise": { + final MapType settings = generator.getMap("settings"); + if (settings != null) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_block", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_fluid", fromVersion, toVersion); + } + + final MapType biomeSource = generator.getMap("biome_source"); + if (biomeSource != null) { + final String biomeSourceType = biomeSource.getString("type", ""); + switch (biomeSourceType) { + case "minecraft:fixed": { + WalkerUtils.convert(MCTypeRegistry.BIOME, biomeSource, "biome", fromVersion, toVersion); + break; + } + + case "minecraft:multi_noise": { + // Vanilla's schema is wrong. It should be DSL.fields("biomes", DSL.list(DSL.fields("biome"))) + // But it just contains the list part. That obviously can never be the case, because + // the root object is a compound, not a list. + + final ListType biomes = biomeSource.getList("biomes", ObjectType.MAP); + if (biomes != null) { + for (int i = 0, len = biomes.size(); i < len; ++i) { + WalkerUtils.convert(MCTypeRegistry.BIOME, biomes.getMap(i), "biome", fromVersion, toVersion); + } + } + break; + } + + case "minecraft:checkerboard": { + WalkerUtils.convertList(MCTypeRegistry.BIOME, biomeSource, "biomes", fromVersion, toVersion); + break; + } + } + } + + break; + } + } + } + + return null; + }); + } + + private V2551() {} +} diff --git a/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 BIOME_RENAMES = new HashMap<>( + ImmutableMap.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 convert(final MapType data, final long sourceVersion, final long toVersion) { + MapType dimensions = data.getMap("dimensions"); + if (dimensions == null) { + dimensions = Types.NBT.createEmptyMap(); + data.setMap("dimensions", dimensions); + } + + if (dimensions.isEmpty()) { + data.setMap("dimensions", recreateSettings(data)); + } + + return null; + } + }); + } + + private static MapType recreateSettings(final MapType data) { + final long seed = data.getLong("seed"); + + return V2550.vanillaLevels(seed, V2550.defaultOverworld(seed), false); + } + + private V2558() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"minecraft:cauldron".equals(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + + if (properties == null) { + return null; + } + + if (properties.getString("level", "0").equals("0")) { + data.remove("Properties"); + return null; + } else { + data.setString("Name", "minecraft:water_cauldron"); + return null; + } + } + }); + } + + private V2679() {} +} diff --git a/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 RENAMES = new HashMap<>( + ImmutableMap.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 RENAMES = new HashMap<>( + ImmutableMap.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 RENAMES = new HashMap<>( + ImmutableMap.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 PIECE_TYPE = Sets.newHashSet( + "minecraft:jigsaw", + "minecraft:nvi", + "minecraft:pcp", + "minecraft:bastionremnant", + "minecraft:runtime" + ); + private static final Set FEATURES = Sets.newHashSet( + "minecraft:tree", + "minecraft:flower", + "minecraft:block_pile", + "minecraft:random_patch" + ); + + public static void register() { + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType children = data.getList("Children", ObjectType.MAP); + + if (children == null) { + return null; + } + + for (int i = 0, len = children.size(); i < len; ++i) { + final MapType child = children.getMap(i); + + if (!PIECE_TYPE.contains(child.getString("id"))) { + continue; + } + + final String poolElement = child.getString("pool_element"); + if (!"minecraft:feature_pool_element".equals(poolElement)) { + continue; + } + + final MapType feature = child.getMap("feature"); + if (feature == null) { + continue; + } + + final String replacement = convertToString(feature); + + if (replacement != null) { + child.setString("feature", replacement); + } + } + + return null; + } + }); + } + + private static String getNestedString(final MapType root, final String... paths) { + if (paths.length == 0) { + throw new IllegalArgumentException("Missing path"); + } + + Object current = root.getGeneric(paths[0]); + + for (int i = 1; i < paths.length; ++i) { + final String path = paths[i]; + + final Matcher indexMatcher = INDEX_PATTERN.matcher(path); + if (!indexMatcher.matches()) { + current = (current instanceof MapType) ? ((MapType)current).getGeneric(path) : null; + if (current == null) { + break; + } + continue; + } + + final int index = Integer.parseInt(indexMatcher.group(1)); + if (!(current instanceof ListType)) { + current = null; + break; + } else { + final ListType list = (ListType)current; + if (index >= 0 && index < list.size()) { + current = list.getGeneric(index); + } else { + current = null; + break; + } + } + } + + return current instanceof String ? (String)current : ""; + } + + private static String convertToString(final MapType feature) { + return getReplacement( + getNestedString(feature, "type"), + getNestedString(feature, "name"), + getNestedString(feature, "config", "state_provider", "type"), + getNestedString(feature, "config", "state_provider", "state", "Name"), + getNestedString(feature, "config", "state_provider", "entries", "[0]", "data", "Name"), + getNestedString(feature, "config", "foliage_placer", "type"), + getNestedString(feature, "config", "leaves_provider", "state", "Name") + ); + } + + private static String getReplacement(final String type, final String name, final String stateType, final String stateName, + final String firstEntryName, final String foliageName, final String leavesName) { + final String actualType; + if (!type.isEmpty()) { + actualType = type; + } else { + if (name.isEmpty()) { + return null; + } + + if ("minecraft:normal_tree".equals(name)) { + actualType = "minecraft:tree"; + } else { + actualType = name; + } + } + + if (FEATURES.contains(actualType)) { + if ("minecraft:random_patch".equals(actualType)) { + if ("minecraft:simple_state_provider".equals(stateType)) { + if ("minecraft:sweet_berry_bush".equals(stateName)) { + return "minecraft:patch_berry_bush"; + } + + if ("minecraft:cactus".equals(stateName)) { + return "minecraft:patch_cactus"; + } + } else if ("minecraft:weighted_state_provider".equals(stateType) && ("minecraft:grass".equals(firstEntryName) || "minecraft:fern".equals(firstEntryName))) { + return "minecraft:patch_taiga_grass"; + } + } else if ("minecraft:block_pile".equals(actualType)) { + if (!"minecraft:simple_state_provider".equals(stateType) && !"minecraft:rotated_block_provider".equals(stateType)) { + if ("minecraft:weighted_state_provider".equals(stateType)) { + if ("minecraft:packed_ice".equals(firstEntryName) || "minecraft:blue_ice".equals(firstEntryName)) { + return "minecraft:pile_ice"; + } + + if ("minecraft:jack_o_lantern".equals(firstEntryName) || "minecraft:pumpkin".equals(firstEntryName)) { + return "minecraft:pile_pumpkin"; + } + } + } else { + if ("minecraft:hay_block".equals(stateName)) { + return "minecraft:pile_hay"; + } + + if ("minecraft:melon".equals(stateName)) { + return "minecraft:pile_melon"; + } + + if ("minecraft:snow".equals(stateName)) { + return "minecraft:pile_snow"; + } + } + } else { + if ("minecraft:flower".equals(actualType)) { + return "minecraft:flower_plain"; + } + + if ("minecraft:tree".equals(actualType)) { + if ("minecraft:acacia_foliage_placer".equals(foliageName)) { + return "minecraft:acacia"; + } + + if ("minecraft:blob_foliage_placer".equals(foliageName) && "minecraft:oak_leaves".equals(leavesName)) { + return "minecraft:oak"; + } + + if ("minecraft:pine_foliage_placer".equals(foliageName)) { + return "minecraft:pine"; + } + + if ("minecraft:spruce_foliage_placer".equals(foliageName)) { + return "minecraft:spruce"; + } + } + } + } + + return null; + } + + private V2701() {} +} diff --git a/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> arrowConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.hasKey("pickup")) { + return null; + } + + final boolean player = data.getBoolean("player", true); + data.remove("player"); + + data.setByte("pickup", player ? (byte)1 : (byte)0); + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", arrowConverter); + } + + private V2702() {} +} diff --git a/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 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 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 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 convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType spawnData = root.getMap("SpawnData"); + if (spawnData != null) { + final MapType wrapped = Types.NBT.createEmptyMap(); + root.setMap("SpawnData", wrapped); + + wrapped.setMap("entity", spawnData); + } + + final ListType spawnPotentials = root.getList("SpawnPotentials", ObjectType.MAP); + if (spawnPotentials != null) { + for (int i = 0, len = spawnPotentials.size(); i < len; ++i) { + final MapType spawnPotential = spawnPotentials.getMap(i); + + // new format of weighted list (SpawnPotentials): + // root.data -> data + // root.weight -> weight + + final MapType entity = spawnPotential.getMap("Entity"); + final int weight = spawnPotential.getInt("Weight", 1); + spawnPotential.remove("Entity"); + spawnPotential.remove("Weight"); + spawnPotential.setInt("weight", weight); + + final MapType data = Types.NBT.createEmptyMap(); + spawnPotential.setMap("data", data); + + data.setMap("entity", entity); + } + } + + return null; + } + }); + } + + private V2831() {} +} diff --git a/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 STATUS_IS_OR_AFTER_SURFACE = new HashSet<>(Arrays.asList( + "surface", + "carvers", + "liquid_carvers", + "features", + "light", + "spawn", + "heightmaps", + "full" + )); + private static final Set STATUS_IS_OR_AFTER_NOISE = new HashSet<>(Arrays.asList( + "noise", + "surface", + "carvers", + "liquid_carvers", + "features", + "light", + "spawn", + "heightmaps", + "full" + )); + private static final Set BLOCKS_BEFORE_FEATURE_STATUS = new HashSet<>(Arrays.asList( + "minecraft:air", + "minecraft:basalt", + "minecraft:bedrock", + "minecraft:blackstone", + "minecraft:calcite", + "minecraft:cave_air", + "minecraft:coarse_dirt", + "minecraft:crimson_nylium", + "minecraft:dirt", + "minecraft:end_stone", + "minecraft:grass_block", + "minecraft:gravel", + "minecraft:ice", + "minecraft:lava", + "minecraft:mycelium", + "minecraft:nether_wart_block", + "minecraft:netherrack", + "minecraft:orange_terracotta", + "minecraft:packed_ice", + "minecraft:podzol", + "minecraft:powder_snow", + "minecraft:red_sand", + "minecraft:red_sandstone", + "minecraft:sand", + "minecraft:sandstone", + "minecraft:snow_block", + "minecraft:soul_sand", + "minecraft:soul_soil", + "minecraft:stone", + "minecraft:terracotta", + "minecraft:warped_nylium", + "minecraft:warped_wart_block", + "minecraft:water", + "minecraft:white_terracotta" + )); + + private static int getObjectsPerValue(final long[] val) { + return (4096 + val.length - 1) / (val.length); // expression is invalid if it returns > 64 + } + + private static long[] resize(final long[] val, final int oldBitsPerObject, final int newBitsPerObject) { + final long oldMask = (1L << oldBitsPerObject) - 1; // works even if bitsPerObject == 64 + final long newMask = (1L << newBitsPerObject) - 1; + final int oldObjectsPerValue = 64 / oldBitsPerObject; + final int newObjectsPerValue = 64 / newBitsPerObject; + + if (newBitsPerObject == oldBitsPerObject) { + return val; + } + + final int items = 4096; + + final long[] ret = new long[(items + newObjectsPerValue - 1) / newObjectsPerValue]; + + final int expectedSize = ((items + oldObjectsPerValue - 1) / oldObjectsPerValue); + if (val.length != expectedSize) { + throw new IllegalStateException("Expected size: " + expectedSize + ", got: " + val.length); + } + + int shift = 0; + int idx = 0; + long newCurr = 0L; + + int currItem = 0; + for (int i = 0; i < val.length; ++i) { + final long oldCurr = val[i]; + + for (int objIdx = 0; currItem < items && objIdx + oldBitsPerObject <= 64; objIdx += oldBitsPerObject, ++currItem) { + final long value = (oldCurr >> objIdx) & oldMask; + + if ((value & newMask) != value) { + throw new IllegalStateException("Old data storage has values that cannot be moved into new palette (would erase data)!"); + } + + newCurr |= value << shift; + shift += newBitsPerObject; + + if (shift + newBitsPerObject > 64) { // will next write overflow? + // must move to next idx + ret[idx++] = newCurr; + shift = 0; + newCurr = 0L; + } + } + } + + // don't forget to write the last one + if (shift != 0) { + ret[idx] = newCurr; + } + + return ret; + } + + private static void fixLithiumChunks(final MapType data) { + // See https://github.com/CaffeineMC/lithium-fabric/issues/279 + final MapType level = data.getMap("Level"); + if (level == null) { + return; + } + + final int chunkX = level.getInt("xPos"); + final int chunkZ = level.getInt("zPos"); + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections == null) { + return; + } + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + final int sectionY = section.getInt("Y"); + + final ListType palette = section.getList("Palette", ObjectType.MAP); + final long[] blockStates = section.getLongs("BlockStates"); + + if (palette == null || blockStates == null) { + continue; + } + + final int expectedBits = Math.max(4, ceilLog2(palette.size())); + final int gotObjectsPerValue = getObjectsPerValue(blockStates); + final int gotBits = 64 / gotObjectsPerValue; + + if (expectedBits == gotBits) { + continue; + } + + try { + section.setLongs("BlockStates", resize(blockStates, gotBits, expectedBits)); + } catch (final Exception ex) { + LOGGER.error("Failed to rewrite mismatched palette and data storage for section y: " + sectionY + + " for chunk [" + chunkX + "," + chunkZ + "], palette entries: " + palette.size() + ", data storage size: " + + blockStates.length, + ex + ); + } + } + } + + public static void register() { + // See V2551 for the layout of world gen settings + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // converters were added to older versions note whether the world has increased height already or not + final boolean noHeightFlag = !data.hasKey("has_increased_height_already"); + final boolean hasIncreasedHeight = data.getBoolean("has_increased_height_already", true); + data.remove("has_increased_height_already"); + + final MapType dimensions = data.getMap("dimensions"); + if (dimensions == null) { + // wat + return null; + } + + // only care about overworld + final MapType overworld = dimensions.getMap("minecraft:overworld"); + if (overworld == null) { + // wat + return null; + } + + final MapType generator = overworld.getMap("generator"); + if (generator == null) { + // wat + return null; + } + + final String type = generator.getString("type", ""); + switch (type) { + case "minecraft:noise": { + final MapType biomeSource = generator.getMap("biome_source"); + final String sourceType = biomeSource.getString("type"); + + boolean largeBiomes = false; + + if ("minecraft:vanilla_layered".equals(sourceType) || (noHeightFlag && "minecraft:multi_noise".equals(sourceType))) { + largeBiomes = biomeSource.getBoolean("large_biomes"); + + final MapType newBiomeSource = Types.NBT.createEmptyMap(); + generator.setMap("biome_source", newBiomeSource); + + newBiomeSource.setString("preset", "minecraft:overworld"); + newBiomeSource.setString("type", "minecraft:multi_noise"); + } + + if (largeBiomes) { + if ("minecraft:overworld".equals(generator.getString("settings"))) { + generator.setString("settings", "minecraft:large_biomes"); + } + } + + break; + } + case "minecraft:flat": { + if (!hasIncreasedHeight) { + final MapType settings = generator.getMap("settings"); + if (settings == null) { + break; + } + + updateLayers(settings.getList("layers", ObjectType.MAP)); + } + break; + } + default: + // do nothing + break; + } + + return null; + } + }); + + + // It looks like DFU will only support worlds in the old height format or the new one, any custom one isn't supported + // and by not supported I mean it will just treat it as the old format... maybe at least throw in that case? + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // The below covers padPaletteEntries - this was written BEFORE that code was added to the datafixer - + // and this still works, so I'm keeping it. Don't fix what isn't broken. + fixLithiumChunks(data); // See https://github.com/CaffeineMC/lithium-fabric/issues/279 + + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final MapType context = data.getMap("__context"); // Passed through by ChunkStorage + final String dimension = context == null ? "" : context.getString("dimension", ""); + final String generator = context == null ? "" : context.getString("generator", ""); + final boolean isOverworld = "minecraft:overworld".equals(dimension); + final int minSection = isOverworld ? -4 : 0; + final MutableBoolean isAlreadyExtended = new MutableBoolean(); + + final MapType[] newBiomes = createBiomeSections(level, isOverworld, minSection, isAlreadyExtended); + final MapType wrappedEmptyBlockPalette = getEmptyBlockPalette(); + + ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections == null) { + level.setList("Sections", sections = Types.NBT.createEmptyList()); + } + + // must update sections for two things: + // 1. the biomes are now stored per section, so we must insert the biomes palette into each section (and create them if they don't exist) + // 2. each section must now have block states (or at least DFU is ensuring they do, but current code does not require) + V2841.SimplePaletteReader bottomSection = null; + final Set allBlocks = new HashSet<>(); + final IntOpenHashSet existingSections = new IntOpenHashSet(); + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + final int y = section.getInt("Y"); + final int sectionIndex = y - minSection; + + existingSections.add(y); + + // add in relevant biome section + if (sectionIndex >= 0 && sectionIndex < newBiomes.length) { + // exclude out of bounds sections (i.e the light sections above and below the world) + section.setMap("biomes", newBiomes[sectionIndex]); + } + + // update palette + final ListType palette = section.getList("Palette", ObjectType.MAP); + final long[] blockStates = section.getLongs("BlockStates"); + + section.remove("Palette"); + section.remove("BlockStates"); + + if (palette != null) { + for (int j = 0, len2 = palette.size(); j < len2; ++j) { + allBlocks.add(V2841.getBlockId(palette.getMap(j))); + } + } + + final MapType palettedContainer; + if (palette != null && blockStates != null) { + // only if both exist, same as DFU, same as legacy chunk loading code + section.setMap("block_states", palettedContainer = wrapPaletteOptimised(palette, blockStates)); + } else { + section.setMap("block_states", palettedContainer = wrappedEmptyBlockPalette.copy()); // must write a palette now, copy so that later edits do not edit them all + } + + if (section.getInt("Y", Integer.MAX_VALUE) == 0) { + bottomSection = new V2841.SimplePaletteReader(palettedContainer.getList("palette", ObjectType.MAP), palettedContainer.getLongs("data")); + } + } + + // all existing sections updated, now we must create new sections just for the biomes migration + for (int sectionIndex = 0; sectionIndex < newBiomes.length; ++sectionIndex) { + final int sectionY = sectionIndex + minSection; + if (!existingSections.add(sectionY)) { + // exists already + continue; + } + + final MapType newSection = Types.NBT.createEmptyMap(); + sections.addMap(newSection); + + newSection.setByte("Y", (byte)sectionY); + // must write a palette now, copy so that later edits do not edit them all + newSection.setMap("block_states", wrappedEmptyBlockPalette.copy()); + + newSection.setGeneric("biomes", newBiomes[sectionIndex]); + } + + // update status so interpolation can take place + predictChunkStatusBeforeSurface(level, allBlocks); + + // done with sections, update the rest of the chunk + updateChunkData(level, isOverworld, isAlreadyExtended.getValue(), "minecraft:noise".equals(generator), bottomSection); + + return null; + } + }); + + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType dimensions = data.getMap("dimensions"); + + if (dimensions == null) { + return null; + } + + for (final String dimension : dimensions.keys()) { + final MapType dimensionData = dimensions.getMap(dimension); + if (dimensionData == null) { + continue; + } + + final MapType generator = dimensionData.getMap("generator"); + if (generator == null) { + continue; + } + + final String type = generator.getString("type"); + if (type == null) { + continue; + } + + switch (type) { + case "minecraft:flat": { + final MapType settings = generator.getMap("settings"); + if (settings == null) { + continue; + } + + WalkerUtils.convert(MCTypeRegistry.BIOME, settings, "biome", fromVersion, toVersion); + + final ListType layers = settings.getList("layers", ObjectType.MAP); + if (layers != null) { + for (int i = 0, len = layers.size(); i < len; ++i) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, layers.getMap(i), "block", fromVersion, toVersion); + } + } + + break; + } + case "minecraft:noise": { + final MapType settings = generator.getMap("settings"); + if (settings != null) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_block", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_fluid", fromVersion, toVersion); + } + + final MapType biomeSource = generator.getMap("biome_source"); + if (biomeSource != null) { + final String biomeSourceType = biomeSource.getString("type", ""); + switch (biomeSourceType) { + case "minecraft:fixed": { + WalkerUtils.convert(MCTypeRegistry.BIOME, biomeSource, "biome", fromVersion, toVersion); + break; + } + + case "minecraft:multi_noise": { + 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 data, final long fromVersion, final long toVersion) -> { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion); + + final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP); + if (tileTicks != null) { + for (int i = 0, len = tileTicks.size(); i < len; ++i) { + final MapType tileTick = tileTicks.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion); + } + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + WalkerUtils.convertList(MCTypeRegistry.BIOME, section.getMap("biomes"), "palette", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section.getMap("block_states"), "palette", fromVersion, toVersion); + } + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, level.getMap("Structures"), "Starts", fromVersion, toVersion); + + return null; + }); + } + + private static void predictChunkStatusBeforeSurface(final MapType level, final Set chunkBlocks) { + final String status = level.getString("Status", "empty"); + if (STATUS_IS_OR_AFTER_SURFACE.contains(status)) { + return; + } + + chunkBlocks.remove("minecraft:air"); + final boolean chunkNotEmpty = !chunkBlocks.isEmpty(); + chunkBlocks.removeAll(BLOCKS_BEFORE_FEATURE_STATUS); + final boolean chunkFeatureStatus = !chunkBlocks.isEmpty(); + + final String update; + if (chunkFeatureStatus) { + update = "liquid_carvers"; + } else if (!"noise".equals(status) && !chunkNotEmpty) { + update = "biomes".equals(status) ? "structure_references" : status; + } else { + update = "noise"; + } + + level.setString("Status", update); + } + + private static MapType getEmptyBlockPalette() { + final MapType airBlockState = Types.NBT.createEmptyMap(); + airBlockState.setString("Name", "minecraft:air"); + + final ListType emptyBlockPalette = Types.NBT.createEmptyList(); + emptyBlockPalette.addMap(airBlockState); + + return V2832.wrapPalette(emptyBlockPalette); + } + + private static void shiftUpgradeData(final MapType upgradeData, final int shift) { + if (upgradeData == null) { + return; + } + + final MapType indices = upgradeData.getMap("Indices"); + if (indices == null) { + return; + } + + RenameHelper.renameKeys(indices, (final String input) -> { + return Integer.toString(Integer.parseInt(input) + shift); + }); + } + + private static void updateChunkData(final MapType level, final boolean wantExtendedHeight, final boolean isAlreadyExtended, + final boolean onNoiseGenerator, final V2841.SimplePaletteReader bottomSection) { + level.remove("Biomes"); + if (!wantExtendedHeight) { + padCarvingMasks(level, 16, 0); + return; + } + + if (isAlreadyExtended) { + padCarvingMasks(level, 24, 0); + return; + } + + offsetHeightmaps(level); + // Difference from DFU: Still convert the Lights data. Just because it's being removed in a later version doesn't mean + // that it should be removed here. + // Generally, converters act only on the current version to bring it to the next. This principle allows the converter + // for the next version to assume that it acts on its current version, not some in-between of the current version + // and some future version that did not exist at the time it was written. This allows converters to be written and tested + // only with knowledge of the current version and the next version. + addEmptyListPadding(level, "Lights"); + addEmptyListPadding(level, "LiquidsToBeTicked"); + addEmptyListPadding(level, "PostProcessing"); + addEmptyListPadding(level, "ToBeTicked"); + shiftUpgradeData(level.getMap("UpgradeData"), 4); // https://bugs.mojang.com/browse/MC-238076 - fixed now, Mojang fix is identical. No change required. + padCarvingMasks(level, 24, 4); + + if (!onNoiseGenerator) { + return; + } + + final String status = level.getString("Status"); + if (status == null || "empty".equals(status)) { + return; + } + + final MapType blendingData = Types.NBT.createEmptyMap(); + level.setMap("blending_data", blendingData); + + blendingData.setBoolean("old_noise", STATUS_IS_OR_AFTER_NOISE.contains(status)); + + if (bottomSection == null) { + return; + } + + final BitSet missingBedrock = new BitSet(256); + boolean hasBedrock = status.equals("noise"); + + for (int z = 0; z <= 15; ++z) { + for (int x = 0; x <= 15; ++x) { + final MapType state = bottomSection.getState(x, 0, z); + final String blockId = V2841.getBlockId(state); + final boolean isBedrock = state != null && "minecraft:bedrock".equals(blockId); + final boolean isAir = state != null && "minecraft:air".equals(blockId); + if (isAir) { + missingBedrock.set((z << 4) | x); + } + + hasBedrock |= isBedrock; + } + } + + if (hasBedrock && missingBedrock.cardinality() != missingBedrock.size()) { + final String targetStatus = "full".equals(status) ? "heightmaps" : status; + + final MapType belowZeroRetrogen = Types.NBT.createEmptyMap(); + level.setMap("below_zero_retrogen", belowZeroRetrogen); + + belowZeroRetrogen.setString("target_status", targetStatus); + belowZeroRetrogen.setLongs("missing_bedrock", missingBedrock.toLongArray()); + + level.setString("Status", "empty"); + } + + level.setBoolean("isLightOn", false); + } + + private static void padCarvingMasks(final MapType level, final int newSize, final int offset) { + final MapType carvingMasks = level.getMap("CarvingMasks"); + if (carvingMasks == null) { + // if empty, DFU still writes + level.setMap("CarvingMasks", Types.NBT.createEmptyMap()); + return; + } + + for (final String key : carvingMasks.keys()) { + final long[] old = BitSet.valueOf(carvingMasks.getBytes(key)).toLongArray(); + final long[] newVal = new long[64 * newSize]; + + System.arraycopy(old, 0, newVal, 64 * offset, old.length); + + carvingMasks.setLongs(key, newVal); // no CME: key exists already + } + } + + private static void addEmptyListPadding(final MapType level, final String path) { + ListType list = level.getListUnchecked(path); + if (list != null && list.size() == 24) { + return; + } + + if (list == null) { + // difference from DFU: Don't create the damn thing! + return; + } + + + // offset the section array to the new format + for (int i = 0; i < 4; ++i) { + // always create new copies, so that modifying one doesn't modify ALL of them! + list.addList(0, Types.NBT.createEmptyList()); // add below + list.addList(Types.NBT.createEmptyList()); // add above + } + } + + private static void offsetHeightmaps(final MapType level) { + final MapType heightmaps = level.getMap("Heightmaps"); + if (heightmaps == null) { + return; + } + + for (final String key : HEIGHTMAP_TYPES) { + offsetHeightmap(heightmaps.getLongs(key)); + } + } + + private static void offsetHeightmap(final long[] heightmap) { + if (heightmap == null) { + return; + } + + // heightmaps are configured to have 9 bits per value, with 256 total values + // heightmaps are also relative to the lowest position + for (int idx = 0, len = heightmap.length; idx < len; ++idx) { + long curr = heightmap[idx]; + long next = 0L; + + for (int objIdx = 0; objIdx + 9 <= 64; objIdx += 9) { + final long value = (curr >> objIdx) & 511L; + if (value != 0L) { + final long offset = Math.min(511L, value + 64L); + + next |= (offset << objIdx); + } + } + + heightmap[idx] = next; + } + } + + private static MapType[] createBiomeSections(final MapType level, final boolean wantExtendedHeight, + final int minSection, final MutableBoolean isAlreadyExtended) { + final MapType[] ret = new MapType[wantExtendedHeight ? 24 : 16]; + + final int[] biomes = level.getInts("Biomes"); + + if (biomes != null && biomes.length == 1536) { // magic value for 24 sections of biomes (24 * 4^3) + isAlreadyExtended.setValue(true); + for (int sectionIndex = 0; sectionIndex < 24; ++sectionIndex) { + ret[sectionIndex] = createBiomeSection(biomes, sectionIndex * 64, -1); // -1 is all 1s + } + } else if (biomes != null && biomes.length == 1024) { // magic value for 24 sections of biomes (16 * 4^3) + for (int sectionY = 0; sectionY < 16; ++sectionY) { + ret[sectionY - minSection] = createBiomeSection(biomes, sectionY * 64, -1); // -1 is all 1s + } + + if (wantExtendedHeight) { + // must set the new sections at top and bottom + final MapType bottomCopy = createBiomeSection(biomes, 0, 15); // just want the biomes at y = 0 + final MapType topCopy = createBiomeSection(biomes, 1008, 15); // just want the biomes at y = 252 + + for (int sectionIndex = 0; sectionIndex < 4; ++sectionIndex) { + ret[sectionIndex] = bottomCopy.copy(); // copy palette so that later possible modifications don't trash all sections + } + + for (int sectionIndex = 20; sectionIndex < 24; ++sectionIndex) { + ret[sectionIndex] = topCopy.copy(); // copy palette so that later possible modifications don't trash all sections + } + } + } else { + final ListType palette = Types.NBT.createEmptyList(); + palette.addString("minecraft:plains"); + + for (int i = 0; i < ret.length; ++i) { + ret[i] = wrapPalette(palette.copy()); // copy palette so that later possible modifications don't trash all sections + } + } + + return ret; + } + + private static MapType createBiomeSection(final int[] biomes, final int offset, final int mask) { + final Int2IntLinkedOpenHashMap paletteId = new Int2IntLinkedOpenHashMap(); + + for (int idx = 0; idx < 64; ++idx) { + final int biome = biomes[offset + (idx & mask)]; + paletteId.putIfAbsent(biome, paletteId.size()); + } + + final ListType paletteString = Types.NBT.createEmptyList(); + for (final IntIterator iterator = paletteId.keySet().iterator(); iterator.hasNext();) { + final int biomeId = iterator.nextInt(); + final String biome = biomeId >= 0 && biomeId < BIOMES_BY_ID.length ? BIOMES_BY_ID[biomeId] : null; + paletteString.addString(biome == null ? "minecraft:plains" : biome); + } + + final int bitsPerObject = ceilLog2(paletteString.size()); + if (bitsPerObject == 0) { + return wrapPalette(paletteString); + } + + // manually create packed integer data + final int objectsPerValue = 64 / bitsPerObject; + final long[] packed = new long[(64 + objectsPerValue - 1) / objectsPerValue]; + + int shift = 0; + int idx = 0; + long curr = 0; + + for (int biome_idx = 0; biome_idx < 64; ++biome_idx) { + final int biome = biomes[offset + (biome_idx & mask)]; + + curr |= ((long)paletteId.get(biome)) << shift; + + shift += bitsPerObject; + + if (shift + bitsPerObject > 64) { // will next write overflow? + // must move to next idx + packed[idx++] = curr; + shift = 0; + curr = 0L; + } + } + + // don't forget to write the last one + if (shift != 0) { + packed[idx] = curr; + } + + return wrapPalette(paletteString, packed); + } + + private static MapType wrapPalette(final ListType palette) { + return wrapPalette(palette, null); + } + + private static MapType wrapPalette(final ListType palette, final long[] blockStates) { + final MapType ret = Types.NBT.createEmptyMap(); + ret.setList("palette", palette); + if (blockStates != null) { + ret.setLongs("data", blockStates); + } + + return ret; + } + + private static MapType wrapPaletteOptimised(final ListType palette, final long[] blockStates) { + if (palette.size() == 1) { + return wrapPalette(palette); + } + + return wrapPalette(palette, blockStates); + } + + public static int ceilLog2(final int value) { + return value == 0 ? 0 : Integer.SIZE - Integer.numberOfLeadingZeros(value - 1); // see doc of numberOfLeadingZeros + } + + private static void updateLayers(final ListType layers) { + if (layers == null) { + return; + } + + layers.addMap(0, createEmptyLayer()); // add at the bottom + } + + private static MapType createEmptyLayer() { + final MapType ret = Types.NBT.createEmptyMap(); + ret.setInt("height", 64); + ret.setString("block", "minecraft:air"); + + return ret; + } + + private V2832() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType dimensions = data.getMap("dimensions"); + + for (final String dimensionKey : dimensions.keys()) { + final MapType dimension = dimensions.getMap(dimensionKey); + if (!dimension.hasKey("type")) { + throw new IllegalStateException("Unable load old custom worlds."); + } + } + + return null; + } + }); + } + + private V2833() {} +} diff --git a/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 BIOME_UPDATE = new HashMap<>( + ImmutableMap.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 ALWAYS_WATERLOGGED = new HashSet<>( + Arrays.asList( + "minecraft:bubble_column", + "minecraft:kelp", + "minecraft:kelp_plant", + "minecraft:seagrass", + "minecraft:tall_seagrass" + ) + ); + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType level = root.getMap("Level"); + if (level == null) { + return null; + } + + { + // Why it's renamed here and not the next data version is beyond me. + final MapType liquidTicks = level.getMap("LiquidTicks"); + if (liquidTicks != null) { + level.remove("LiquidTicks"); + level.setMap("fluid_ticks", liquidTicks); + } + } + + final Int2ObjectOpenHashMap sectionBlocks = new Int2ObjectOpenHashMap<>(); + final ListType sections = level.getList("Sections", ObjectType.MAP); + int minSection = 0; // TODO wtf is this + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + final int sectionY = section.getInt("Y"); + if (sectionY < minSection && section.hasKey("biomes")) { + minSection = sectionY; + } + + final MapType blockStates = section.getMap("block_states"); + if (blockStates == null) { + continue; + } + + sectionBlocks.put(sectionY, new SimplePaletteReader(section.getList("palette", ObjectType.MAP), section.getLongs("data"))); + } + } + + level.setByte("yPos", (byte)minSection); // TODO ??????????????????????????????????????? + + if (level.hasKey("fluid_ticks") || level.hasKey("TileTicks")) { + return null; + } + + final int sectionX = level.getInt("xPos"); + final int sectionZ = level.getInt("zPos"); + + final ListType fluidTicks = level.getList("LiquidsToBeTicked", ObjectType.LIST); + final ListType blockTicks = level.getList("ToBeTicked", ObjectType.LIST); + level.remove("LiquidsToBeTicked"); + level.remove("ToBeTicked"); + + level.setList("fluid_ticks", migrateTickList(fluidTicks, false, sectionBlocks, sectionX, minSection, sectionZ)); + level.setList("TileTicks", migrateTickList(blockTicks, true, sectionBlocks, sectionX, minSection, sectionZ)); + + return null; + } + }); + } + + public static ListType migrateTickList(final ListType ticks, final boolean blockTicks, final Int2ObjectOpenHashMap sectionBlocks, + final int sectionX, final int minSection, final int sectionZ) { + final ListType ret = Types.NBT.createEmptyList(); + + if (ticks == null) { + return ret; + } + + for (int sectionIndex = 0, totalSections = ticks.size(); sectionIndex < totalSections; ++sectionIndex) { + final int sectionY = sectionIndex + minSection; + final ListType sectionTicks = ticks.getList(sectionIndex); + final SimplePaletteReader palette = sectionBlocks.get(sectionY); + + for (int i = 0, len = sectionTicks.size(); i < len; ++i) { + final int localIndex = sectionTicks.getShort(i) & 0xFFFF; + final MapType blockState = palette == null ? null : palette.getState(localIndex); + final String subjectId = blockTicks ? getBlockId(blockState) : getLiquidId(blockState); + + ret.addMap(createNewTick(subjectId, localIndex, sectionX, sectionY, sectionZ)); + } + } + + return ret; + } + + public static MapType createNewTick(final String subjectId, final int localIndex, final int sectionX, final int sectionY, final int sectionZ) { + final int newX = (localIndex & 15) + (sectionX << 4); + final int newZ = ((localIndex >> 4) & 15) + (sectionZ << 4); + final int newY = ((localIndex >> 8) & 15) + (sectionY << 4); + + final MapType ret = Types.NBT.createEmptyMap(); + + ret.setString("i", subjectId); + ret.setInt("x", newX); + ret.setInt("y", newY); + ret.setInt("z", newZ); + ret.setInt("t", 0); + ret.setInt("p", 0); + + return ret; + } + + public static String getBlockId(final MapType blockState) { + return blockState == null ? "minecraft:air" : blockState.getString("Name", "minecraft:air"); + } + + private static String getLiquidId(final MapType blockState) { + if (blockState == null) { + return "minecraft:empty"; + } + + final String name = blockState.getString("Name"); + if (ALWAYS_WATERLOGGED.contains(name)) { + return "minecraft:water"; + } + + final MapType properties = blockState.getMap("Properties"); + // Correctly read block state properties as strings - https://github.com/PaperMC/DataConverter/issues/6 + if ("minecraft:water".equals(name)) { + return properties != null && "0".equals(properties.getString("level")) ? "minecraft:water" : "minecraft:flowing_water"; + } else if ("minecraft:lava".equals(name)) { + return properties != null && "0".equals(properties.getString("level")) ? "minecraft:lava" : "minecraft:flowing_lava"; + } + + return (properties != null && "true".equals(properties.getString("waterlogged"))) ? "minecraft:water" : "minecraft:empty"; + } + + private V2841() {} + + public static final class SimplePaletteReader { + + public final ListType palette; + public final long[] data; + private final int bitsPerValue; + private final long mask; + private final int valuesPerLong; + + public SimplePaletteReader(final ListType palette, final long[] data) { + this.palette = palette == null ? null : (palette.size() == 0 ? null : palette); + this.data = data; + this.bitsPerValue = Math.max(4, IntegerUtil.ceilLog2(this.palette == null ? 0 : this.palette.size())); + this.mask = (1L << this.bitsPerValue) - 1L; + this.valuesPerLong = (int)(64L / this.bitsPerValue); + } + + public MapType getState(final int x, final int y, final int z) { + final int index = x | (z << 4) | (y << 8); + return this.getState(index); + } + + public MapType getState(final int index) { + final ListType palette = this.palette; + if (palette == null) { + return null; + } + + final int paletteSize = palette.size(); + if (paletteSize == 1) { + return palette.getMap(0); + } + + // x86 div computes mod. no loss here using mod + // if needed, can compute magic mul and shift for div values using IntegerUtil + final int dataIndex = index / this.valuesPerLong; + final int localIndex = (index % this.valuesPerLong) * this.bitsPerValue; + final long[] data = this.data; + if (dataIndex < 0 || dataIndex >= data.length) { + return null; + } + + final long value = data[dataIndex]; + final int paletteIndex = (int)((value >>> localIndex) & this.mask); + if (paletteIndex < 0 || paletteIndex >= paletteSize) { + return null; + } + + return palette.getMap(paletteIndex); + } + } +} diff --git a/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 convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType level = root.getMap("Level"); + root.remove("Level"); + + if (!root.isEmpty()) { + for (final String key : root.keys()) { + if (level.hasKey(key)) { + // Don't clobber Level's data + continue; + } + level.setGeneric(key, root.getGeneric(key)); + } + } + + // Rename top level first + RenameHelper.renameSingle(level, "TileEntities", "block_entities"); + RenameHelper.renameSingle(level, "TileTicks", "block_ticks"); + RenameHelper.renameSingle(level, "Entities", "entities"); + RenameHelper.renameSingle(level, "Sections", "sections"); + RenameHelper.renameSingle(level, "Structures", "structures"); + + // 2nd level + final MapType structures = level.getMap("structures"); + if (structures != null) { + RenameHelper.renameSingle(structures, "Starts", "starts"); + } + + return level; // Level is now root tag. + } + }); + + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, data, "block_entities", fromVersion, toVersion); + + final ListType blockTicks = data.getList("block_ticks", ObjectType.MAP); + if (blockTicks != null) { + for (int i = 0, len = blockTicks.size(); i < len; ++i) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, blockTicks.getMap(i), "i", fromVersion, toVersion); + } + } + + final ListType sections = data.getList("sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + WalkerUtils.convertList(MCTypeRegistry.BIOME, section.getMap("biomes"), "palette", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section.getMap("block_states"), "palette", fromVersion, toVersion); + } + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data.getMap("structures"), "starts", fromVersion, toVersion); + + return null; + }); + } + + private V2842() {} +} diff --git a/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 chunkRoot, final int chunkX, final int chunkZ, final String intoKey) { + if (ticks == null) { + return; + } + + ListType outOfBounds = null; + for (int i = 0, len = ticks.size(); i < len; ++i) { + final MapType tick = ticks.getMap(i); + final int x = tick.getInt("x"); + final int z = tick.getInt("z"); + // anything > 1 is lost, anything less than 1 stays. + if (Math.max(Math.abs(chunkX - (x >> 4)), Math.abs(chunkZ - (z >> 4))) == 1) { + // DFU doesn't remove, so neither do we. + if (outOfBounds == null) { + outOfBounds = Types.NBT.createEmptyList(); + } + outOfBounds.addMap(tick.copy()); + } + } + + if (outOfBounds != null) { + MapType upgradeData = chunkRoot.getMap("UpgradeData"); + if (upgradeData == null) { + chunkRoot.setMap("UpgradeData", upgradeData = Types.NBT.createEmptyMap()); + } + upgradeData.setList(intoKey, outOfBounds); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // After renames, so use new names + final int x = data.getInt("xPos"); + final int z = data.getInt("zPos"); + + moveOutOfBoundTicks(data.getList("block_ticks", ObjectType.MAP), data, x, z, "neighbor_block_ticks"); + moveOutOfBoundTicks(data.getList("fluid_ticks", ObjectType.MAP), data, x, z, "neighbor_fluid_ticks"); + + return null; + } + }); + + // DFU is missing schema for UpgradeData block names + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, data, "block_entities", fromVersion, toVersion); + + 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 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 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType dimensions = data.getMap("dimensions"); + + for (final String dimensionKey : dimensions.keys()) { + final MapType dimension = dimensions.getMap(dimensionKey); + if (!dimension.hasKey("type")) { + throw new IllegalStateException("Unable load old custom worlds."); + } + } + + return null; + } + }); + } + + private V2852() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType dimensions = data.getMap("dimensions"); + + if (dimensions == null) { + return null; + } + + for (final String dimension : dimensions.keys()) { + final MapType dimensionData = dimensions.getMap(dimension); + if (dimensionData == null) { + continue; + } + + final MapType generator = dimensionData.getMap("generator"); + if (generator == null) { + continue; + } + + final MapType settings = generator.getMap("settings"); + if (settings == null) { + continue; + } + + final MapType structures = settings.getMap("structures"); + if (structures == null) { + continue; + } + + for (final String structureKey : structures.keys()) { + structures.getMap(structureKey).setString("type", "minecraft:random_spread"); + } + + final MapType stronghold = structures.getMap("stronghold"); + stronghold.setString("type", "minecraft:concentric_rings"); + structures.setMap("minecraft:stronghold", stronghold.copy()); + } + + return null; + } + }); + } + + private V2967() {} +} diff --git a/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 CONVERSION_MAP = new HashMap<>( + ImmutableMap.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 countBiomes(final MapType chunk) { + final ListType sections = chunk.getList("sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + final Object2IntOpenHashMap ret = new Object2IntOpenHashMap<>(); + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + final MapType biomes = section.getMap("biomes"); + + if (biomes == null) { + continue; + } + + final ListType palette = biomes.getList("palette", ObjectType.STRING); + + if (palette == null) { + continue; + } + + for (int k = 0, len2 = palette.size(); k < len2; ++k) { + ret.addTo(palette.getString(k), 1); + } + } + + return ret; + } + + private static String getStructureConverted(String id, final Object2IntOpenHashMap 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 remapCount = new Object2IntOpenHashMap<>(); + + for (final Iterator> iterator = biomeCount.object2IntEntrySet().fastIterator(); iterator.hasNext();) { + final Object2IntMap.Entry 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> iterator = remapCount.object2IntEntrySet().fastIterator(); iterator.hasNext();) { + final Object2IntMap.Entry entry = iterator.next(); + final int count = entry.getIntValue(); + if (count > maxCount) { + maxCount = count; + converted = entry.getKey(); + } + } + + return converted; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType structures = data.getMap("structures"); + if (structures == null || structures.isEmpty()) { + return null; + } + + final Object2IntOpenHashMap biomeCounts = countBiomes(data); + + final MapType starts = structures.getMap("starts"); + final MapType references = structures.getMap("References"); + + if (starts != null) { + final MapType newStarts = data.getTypeUtil().createEmptyMap(); + structures.setMap("starts", newStarts); + + for (final String key : starts.keys()) { + final MapType value = starts.getMap(key); + if ("INVALID".equals(value.getString("id", "INVALID"))) { + continue; + } + + final String remapped = getStructureConverted(key, biomeCounts); + + if (remapped == null) { + LOGGER.warn("Encountered unknown structure in dataconverter: " + key); + continue; + } + + value.setString("id", remapped); + newStarts.setMap(remapped, value); + } + } + + // This TRULY is a guess, no idea what biomes the referent has. + if (references != null) { + final MapType newReferences = data.getTypeUtil().createEmptyMap(); + structures.setMap("References", newReferences); + for (final String key : references.keys()) { + final long[] value = references.getLongs(key); + if (value.length == 0) { + continue; + } + + final String newKey = getStructureConverted(key, biomeCounts); + if (newKey == null) { + LOGGER.warn("Encountered unknown structure reference in dataconverter: " + key); + continue; + } + + newReferences.setLongs(newKey, value); + } + } + + return null; + } + }); + } + + private V2970() {} + + private static final class BiomeRemap { + + public final Map biomeToNewStructure; + public final String dfl; + + private BiomeRemap(final Map 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, String> biomeMap, final String newId) { + final Map biomeToNewStructure = new HashMap<>(); + + for (final Map.Entry, String> entry : biomeMap.entrySet()) { + final List 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final boolean isLightOn = data.getBoolean("isLightOn"); + if (isLightOn) { + return null; + } + + final ListType sections = data.getList("sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + section.remove("BlockLight"); + section.remove("SkyLight"); + } + + return null; + } + }); + } + + private V3077() {} +} diff --git a/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 GAME_EVENT_RENAMES = new HashMap<>( + ImmutableMap.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 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 CAT_ADVANCEMENTS_CONVERSION = new HashMap<>( + ImmutableMap.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 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Motive", "variant"); + RenameHelper.renameSingle(data, "Facing", "facing"); + return null; + } + }); + } + + private V3090() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setBoolean("HasLeftHorn", true); + data.setBoolean("HasRightHorn", true); + return null; + } + }); + } + + private V3093() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + + if (tag == null) { + return null; + } + + final int soundVariant = tag.getInt("SoundVariant"); + tag.remove("SoundVariant"); + + tag.setString("instrument", SOUND_VARIANT_TO_INSTRUMENT[soundVariant < 0 || soundVariant >= SOUND_VARIANT_TO_INSTRUMENT.length ? 0 : soundVariant]); + + return null; + } + }); + } + + private V3094() {} +} diff --git a/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> removeFilteredBookText = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + tag.remove("filtered_title"); + tag.remove("filtered_pages"); + + return null; + } + }; + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:writable_book", removeFilteredBookText); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:written_book", removeFilteredBookText); + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.remove("FilteredText1"); + data.remove("FilteredText2"); + data.remove("FilteredText3"); + data.remove("FilteredText4"); + + return null; + } + }); + + final Map britishRenamer = new HashMap<>(Map.of( + "minecraft:british", "minecraft:british_shorthair" + )); + final Set 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType context = data.getMap("__context"); + if ("minecraft:overworld".equals(context == null ? null : context.getString("dimension"))) { + return null; + } + + data.remove("blending_data"); + + return null; + } + }); + } + + private V3108() {} +} diff --git a/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 data, final String target) { + if (data == null) { + return; + } + final String curr = data.getString(target); + if (curr == null) { + return; + } + data.setString(target, curr.replace("\"programer_art\"", "\"programmer_art\"")); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + fixList(data, "resourcePacks"); + fixList(data, "incompatibleResourcePacks"); + return null; + } + }); + } + + private V3201() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final String value = data.getString("ao"); + + if ("0".equals(value)) { + data.setString("ao", "false"); + } else if ("1".equals(value) || "2".equals(value)) { + data.setString("ao", "true"); + } + + return null; + } + }); + } + + private V3214() {} +} diff --git a/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 convert(final MapType 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 EFFECT_ITEM_TYPES = new HashSet<>( + Set.of( + "minecraft:potion", + "minecraft:splash_potion", + "minecraft:lingering_potion", + "minecraft:tipped_arrow" + ) + ); + + private static void updateEffectList(final MapType root, final String path) { + if (root == null) { + return; + } + + final ListType effects = root.getList(path, ObjectType.MAP); + + if (effects == null) { + return; + } + + for (int i = 0, len = effects.size(); i < len; ++i) { + final MapType data = effects.getMap(i); + final MapType factorData = data.getMap("FactorCalculationData"); + if (factorData == null) { + continue; + } + + final int timestamp = factorData.getInt("effect_changed_timestamp", -1); + factorData.remove("effect_changed_timestamp"); + + final int duration = data.getInt("Duration", -1); + + final int ticksActive = timestamp - duration; + factorData.setInt("ticks_active", ticksActive); + } + } + + public static void register() { + final DataConverter, MapType> entityEffectFix = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateEffectList(data, "Effects"); + updateEffectList(data, "ActiveEffects"); + updateEffectList(data, "CustomPotionEffects"); + return null; + } + }; + + MCTypeRegistry.PLAYER.addStructureConverter(entityEffectFix); + MCTypeRegistry.ENTITY.addStructureConverter(entityEffectFix); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + if (!EFFECT_ITEM_TYPES.contains(id)) { + return null; + } + + updateEffectList(data.getMap("tag"), "CustomPotionEffects"); + + return null; + } + }); + } + + private V3322() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "loot_table", "LootTable"); + RenameHelper.renameSingle(data, "loot_table_seed", "LootTableSeed"); + return null; + } + }); + + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + Map.of( + "minecraft:pottery_shard_archer", "minecraft:archer_pottery_shard", + "minecraft:pottery_shard_prize", "minecraft:prize_pottery_shard", + "minecraft:pottery_shard_arms_up", "minecraft:arms_up_pottery_shard", + "minecraft:pottery_shard_skull", "minecraft:skull_pottery_shard" + ) + )::get); + } + + private V3438() {} +} diff --git a/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> signTileUpdater = new DataConverter<>(VERSION) { + private static final String DEFAULT_COLOR = "black"; + + private static ListType migrateToList(final MapType root, final String prefix) { + if (root == null) { + return null; + } + + final ListType ret = root.getTypeUtil().createEmptyList(); + + ret.addString(root.getString(prefix.concat("1"), ComponentUtils.EMPTY)); + ret.addString(root.getString(prefix.concat("2"), ComponentUtils.EMPTY)); + ret.addString(root.getString(prefix.concat("3"), ComponentUtils.EMPTY)); + ret.addString(root.getString(prefix.concat("4"), ComponentUtils.EMPTY)); + + return ret; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // front text + final MapType frontText = data.getTypeUtil().createEmptyMap(); + data.setMap("front_text", frontText); + + final ListType frontMessages = migrateToList(data, "Text"); + frontText.setList("messages", frontMessages); + + ListType frontFilteredMessages = null; + + for (int i = 0; i < 4; ++i) { + final String filtered = data.getString("FilteredText" + i); + if (filtered == null) { + if (frontFilteredMessages != null) { + frontFilteredMessages.addString(frontMessages.getString(i)); + } + continue; + } + + if (frontFilteredMessages == null) { + frontFilteredMessages = data.getTypeUtil().createEmptyList(); + for (int k = 0; k < i; ++k) { + frontFilteredMessages.addString(frontMessages.getString(k)); + } + } + + frontFilteredMessages.addString(filtered); + } + + if (frontFilteredMessages != null) { + frontText.setList("filtered_messages", frontFilteredMessages); + } + + frontText.setString("color", data.getString("Color", DEFAULT_COLOR)); + frontText.setBoolean("has_glowing_text", data.getBoolean("GlowingText", false)); + frontText.setBoolean("_filtered_correct", true); + + // back text + final MapType backText = data.getTypeUtil().createEmptyMap(); + data.setMap("back_text", backText); + + final ListType blankMessages = data.getTypeUtil().createEmptyList(); + backText.setList("messages", blankMessages); + + for (int i = 0; i < 4; ++i) { + blankMessages.addString(ComponentUtils.EMPTY); + } + + backText.setString("color", DEFAULT_COLOR); + backText.setBoolean("has_glowing_text", false); + + // misc + data.setBoolean("is_waxed", false); + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", signTileUpdater); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:hanging_sign", signTileUpdater); + } + + 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 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 convert(final MapType 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + data.remove("isLightOn"); + + final ListType sections = data.getList("sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + section.remove("BlockLight"); + section.remove("SkyLight"); + } + + return null; + } + }); + } + + private V3451() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.hasKey("DragonFight")) { + return null; + } + + final MapType dimensionData = data.getMap("DimensionData"); + if (dimensionData == null) { + return null; + } + + final MapType endData = dimensionData.getMap("1"); + if (endData != null) { + final MapType dragonFight = endData.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> converter = new DataConverter<>(VERSION) { + + private static final String[] LEGACY_FIELDS = new String[] { + "Text1", + "Text2", + "Text3", + "Text4", + + "FilteredText1", + "FilteredText2", + "FilteredText3", + "FilteredText4", + + "Color", + + "GlowingText" + }; + + + private static void updateText(final MapType text) { + if (text == null) { + return; + } + + if (text.getBoolean("_filtered_correct", false)) { + text.remove("_filtered_correct"); + return; + } + + final ListType filteredMessages = text.getList("filtered_messages", ObjectType.STRING); + + if (filteredMessages == null || filteredMessages.size() == 0) { + return; + } + + // should treat null here as empty list + final ListType messages = text.getList("messages", ObjectType.STRING); + + final ListType newFilteredList = filteredMessages.getTypeUtil().createEmptyList(); + boolean newFilteredIsEmpty = true; + + for (int i = 0, len = filteredMessages.size(); i < len; ++i) { + final String filtered = filteredMessages.getString(i); + final String message = messages != null && i < messages.size() ? messages.getString(i) : ComponentUtils.EMPTY; + + final String newFiltered = ComponentUtils.EMPTY.equals(filtered) ? message : filtered; + + newFilteredList.addString(newFiltered); + + newFilteredIsEmpty = newFilteredIsEmpty && ComponentUtils.EMPTY.equals(newFiltered); + } + + if (newFilteredIsEmpty) { + text.remove("filtered_messages"); + } else { + text.setList("filtered_messages", newFilteredList); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateText(data.getMap("front_text")); + updateText(data.getMap("back_text")); + + for (final String toRemove : LEGACY_FIELDS) { + data.remove(toRemove); + } + + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", converter); + 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 convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType oldData = root.getMap("data"); + if (oldData == null) { + return null; + } + + final MapType newData = root.getTypeUtil().createEmptyMap(); + root.setMap("data", newData); + + newData.setMap("sequences", oldData); + + return null; + } + }); + } + + private V3565() {} +} diff --git a/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 SLOT_RENAMES = new HashMap<>( + ImmutableMap.builder() + .put("slot_0", "list") + .put("slot_1", "sidebar") + .put("slot_2", "below_name") + .put("slot_3", "sidebar.team.black") + .put("slot_4", "sidebar.team.dark_blue") + .put("slot_5", "sidebar.team.dark_green") + .put("slot_6", "sidebar.team.dark_aqua") + .put("slot_7", "sidebar.team.dark_red") + .put("slot_8", "sidebar.team.dark_purple") + .put("slot_9", "sidebar.team.gold") + .put("slot_10", "sidebar.team.gray") + .put("slot_11", "sidebar.team.dark_gray") + .put("slot_12", "sidebar.team.blue") + .put("slot_13", "sidebar.team.green") + .put("slot_14", "sidebar.team.aqua") + .put("slot_15", "sidebar.team.red") + .put("slot_16", "sidebar.team.light_purple") + .put("slot_17", "sidebar.team.yellow") + .put("slot_18", "sidebar.team.white") + .build() + ); + + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + RenameHelper.renameKeys(data.getMap("DisplaySlots"), SLOT_RENAMES::get); + + return null; + } + }); + } + + private V3566() {} +} diff --git a/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 EFFECT_ITEMS = + new HashSet<>( + Set.of( + "minecraft:potion", + "minecraft:splash_potion", + "minecraft:lingering_potion", + "minecraft:tipped_arrow" + ) + ); + + private static String readLegacyEffect(final MapType data, final String path) { + final Number id = data.getNumber(path); + if (id == null) { + return null; + } + + final int castedId = id.intValue(); + return castedId >= 0 && castedId < EFFECT_ID_MAP.length ? EFFECT_ID_MAP[castedId] : null; + } + + private static void convertLegacyEffect(final MapType data, final String legacyPath, final String newPath) { + final Number id = data.getNumber(legacyPath); + data.remove(legacyPath); + + if (id == null) { + return; + } + + final int castedId = id.intValue(); + final String newId = castedId >= 0 && castedId < EFFECT_ID_MAP.length ? EFFECT_ID_MAP[castedId] : null; + + if (newId == null) { + return; + } + + data.setString(newPath, newId); + } + + private static final Map MOB_EFFECT_RENAMES = new HashMap<>(); + static { + MOB_EFFECT_RENAMES.put("Ambient", "ambient"); + MOB_EFFECT_RENAMES.put("Amplifier", "amplifier"); + MOB_EFFECT_RENAMES.put("Duration", "duration"); + MOB_EFFECT_RENAMES.put("ShowParticles", "show_particles"); + MOB_EFFECT_RENAMES.put("ShowIcon", "show_icon"); + MOB_EFFECT_RENAMES.put("FactorCalculationData", "factor_calculation_data"); + MOB_EFFECT_RENAMES.put("HiddenEffect", "hidden_effect"); + } + + private static void convertMobEffect(final MapType mobEffect) { + if (mobEffect == null) { + return; + } + + convertLegacyEffect(mobEffect, "Id", "id"); + + for (final Map.Entry rename : MOB_EFFECT_RENAMES.entrySet()) { + RenameHelper.renameSingle(mobEffect, rename.getKey(), rename.getValue()); + } + + convertMobEffect(mobEffect.getMap("hidden_effect")); + } + + private static void convertMobEffectList(final MapType data, final String oldPath, final String newPath) { + final ListType effects = data.getList(oldPath, ObjectType.MAP); + if (effects == null) { + return; + } + + for (int i = 0, len = effects.size(); i < len; ++i) { + convertMobEffect(effects.getMap(i)); + } + + data.remove(oldPath); + data.setList(newPath, effects); + } + + private static void removeAndSet(final MapType data, final String toRemovePath, + final String toSetPath, final Object toSet) { + data.remove(toRemovePath); + if (toSet != null) { + data.setGeneric(toSetPath, toSet); + } + } + + private static void updateSuspiciousStew(final MapType from, final MapType into) { + removeAndSet(into, "EffectId", "id", readLegacyEffect(from, "EffectId")); + removeAndSet(into, "EffectDuration", "duration", from.getGeneric("EffectDuration")); + } + + public static void register() { + final DataConverter, MapType> beaconConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertLegacyEffect(data, "Primary", "primary_effect"); + convertLegacyEffect(data, "Secondary", "secondary_effect"); + + return null; + } + }; + + final DataConverter, MapType> mooshroomConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType newEffect = data.getTypeUtil().createEmptyMap(); + updateSuspiciousStew(data, newEffect); + + data.remove("EffectId"); + data.remove("EffectDuration"); + + if (!newEffect.isEmpty()) { + final ListType stewEffects = data.getTypeUtil().createEmptyList(); + data.setList("stew_effects", stewEffects); + + stewEffects.addMap(newEffect); + } + + return null; + } + }; + final DataConverter, MapType> arrowConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertMobEffectList(data, "CustomPotionEffects", "custom_potion_effects"); + return null; + } + }; + final DataConverter, MapType> areaEffectCloudConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertMobEffectList(data, "Effects", "effects"); + return null; + } + }; + final DataConverter, MapType> livingEntityConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertMobEffectList(data, "ActiveEffects", "active_effects"); + return null; + } + }; + + final DataConverter, MapType> itemConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final String id = root.getString("id"); + + final MapType tag = root.getMap("tag"); + + if (tag == null) { + return null; + } + + if ("minecraft:suspicious_stew".equals(id)) { + RenameHelper.renameSingle(tag, "Effects", "effects"); + + final ListType effects = tag.getList("effects", ObjectType.MAP); + + if (effects != null) { + for (int i = 0, len = effects.size(); i < len; ++i) { + final MapType effect = effects.getMap(i); + updateSuspiciousStew(effect, effect); + } + } + + return null; + } + + if (EFFECT_ITEMS.contains(id)) { + convertMobEffectList(tag, "CustomPotionEffects", "custom_potion_effects"); + return null; + } + + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beacon", beaconConverter); + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:mooshroom", mooshroomConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", areaEffectCloudConverter); + MCTypeRegistry.ENTITY.addStructureConverter(livingEntityConverter); + + MCTypeRegistry.PLAYER.addStructureConverter(livingEntityConverter); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(itemConverter); + } + + private V3568() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Fuse", "fuse"); + + final MapType defaultState = data.getTypeUtil().createEmptyMap(); + data.setMap("block_state", defaultState); + + defaultState.setString("Name", "minecraft:tnt"); + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:tnt", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "block_state")); + } + + private V3683() {} +} diff --git a/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 arrow) { + return "minecraft:empty".equals(arrow.getString("Potion", "minecraft:empty")) ? "minecraft:arrow" : "minecraft:tipped_arrow"; + } + + private static MapType createItem(final TypeUtil util, final String id, final int count) { + final MapType ret = util.createEmptyMap(); + + ret.setString("id", id); + ret.setInt("Count", count); + + return ret; + } + + private static void registerArrowEntity(final String id) { + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState")); + // new: item + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItems("item")); + } + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Trident", "item"); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setMap("item", createItem(data.getTypeUtil(), getType(data), 1)); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setMap("item", createItem(data.getTypeUtil(), "minecraft:spectral_arrow", 1)); + return null; + } + }); + + registerArrowEntity("minecraft:trident"); + registerArrowEntity("minecraft:spectral_arrow"); + registerArrowEntity("minecraft:arrow"); + } + + private V3685() {} +} diff --git a/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 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 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 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 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 data, final String path) { + if (data == null) { + return; + } + + final MapType pos = data.getMap(path); + if (pos == null) { + return; + } + + final Number x = pos.getNumber("X"); + final Number y = pos.getNumber("Y"); + final Number z = pos.getNumber("Z"); + + if (x == null || y == null || z == null) { + return; + } + + data.setInts(path, new int[] { x.intValue(), y.intValue(), z.intValue() }); + } + + public static void register() { + // Step 0 + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:vault", (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root.getMap("config"), "key_item", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root.getMap("server_data"), "items_to_eject", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root.getMap("shared_data"), "display_item", fromVersion, toVersion); + + return null; + }); + + // Step 1 + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION, 1) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + + if (data == null) { + return null; + } + + final ListType banners = data.getList("banners", ObjectType.MAP); + + if (banners == null) { + return null; + } + + for (int i = 0, len = banners.size(); i < len; ++i) { + V3807.flattenBlockPos(banners.getMap(i), "Pos"); + } + + return null; + } + }); + } + + private V3807() {} +} diff --git a/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..22b7bf301c8ab7cde285fa257f240986a697b83f --- /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> { + private final String path; + private final boolean clearArmor; + + public BodyArmorConverter(final int toVersion, final String path, final boolean clearArmor) { + this(toVersion, 0, path, clearArmor); + } + + public BodyArmorConverter(final int toVersion, final int versionStep, final String path, final boolean clearArmor) { + super(toVersion, versionStep); + + this.path = path; + this.clearArmor = clearArmor; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType prev = data.getMap(this.path); + + if (prev == null) { + return null; + } + + data.remove(this.path); + + data.setMap("body_armor_item", prev); + data.setFloat("body_armor_drop_chance", 2.0F); + + if (this.clearArmor) { + final ListType armor = data.getList("ArmorItems", ObjectType.MAP); + if (armor.size() > 2) { + armor.setMap(2, data.getTypeUtil().createEmptyMap()); + } + + final ListType chances = data.getList("ArmorDropChances", ObjectType.FLOAT); + if (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> slotConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType items = data.getList("Items", ObjectType.MAP); + if (items == null) { + return null; + } + + for (int i = 0, len = items.size(); i < len; ++i) { + final MapType item = items.getMap(i); + + final int slot = item.getInt("Slot", 2); + item.setByte("Slot", (byte)(slot - 2)); + } + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:llama", slotConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trader_llama", slotConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:mule", slotConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:donkey", slotConverter); + } + + private V3809() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + boolean doubleHealth = false; + + final ListType attributes = data.getList("Attributes", ObjectType.MAP); + if (attributes != null) { + for (int i = 0, len = attributes.size(); i < len; ++i) { + final MapType attribute = attributes.getMap(i); + + if (!"minecraft:generic.max_health".equals(NamespaceUtil.correctNamespace(attribute.getString("Name")))) { + continue; + } + + final double base = attribute.getDouble("Base", 0.0D); + if (base == 20.0D) { + attribute.setDouble("Base", 40.0D); + doubleHealth = true; + } + } + } + + if (doubleHealth) { + data.setFloat("Health", data.getFloat("Health", 0.0F) * 2.0F); + } + + return null; + } + }); + } + + private V3812() {} +} diff --git a/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> { + private final RenamePair[] convert; + + public RootPositionConverter(final int toVersion, final RenamePair[] convert) { + this(toVersion, 0, convert); + } + + public RootPositionConverter(final int toVersion, final int versionStep, final RenamePair[] convert) { + super(toVersion, versionStep); + this.convert = convert; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + for (final RenamePair rename : this.convert) { + V3807.flattenBlockPos(data, rename.from); + RenameHelper.renameSingle(data, rename.from, rename.to); + } + return null; + } + } + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:bee", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("HivePos", "hive_pos"), + new RenamePair("FlowerPos", "flower_pos") + })); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:end_crystal", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("BeamTarget", "beam_target"), + })); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:wandering_trader", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("WanderTarget", "wander_target"), + })); + + final RootPositionConverter patrolConverter = new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("PatrolTarget", "patrol_target"), + }); + for (final String id : PATROLLING_MOBS) { + MCTypeRegistry.ENTITY.addConverterForId(id, patrolConverter); + } + + MCTypeRegistry.ENTITY.addStructureConverter(new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("Leash", "leash"), + })); + + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beehive", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("FlowerPos", "flower_pos"), + })); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:end_gateway", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("ExitPortal", "exit_portal"), + })); + + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + + if (data == null) { + return null; + } + + final ListType frames = data.getList("frames", ObjectType.MAP); + if (frames != null) { + for (int i = 0, len = frames.size(); i < len; ++i) { + final MapType frame = frames.getMap(i); + + V3807.flattenBlockPos(frame, "Pos"); + + RenameHelper.renameSingle(frame, "Pos", "pos"); + RenameHelper.renameSingle(frame, "Rotation", "rotation"); + RenameHelper.renameSingle(frame, "EntityId", "entity_id"); + } + } + + final ListType banners = data.getList("banners", ObjectType.MAP); + for (int i = 0, len = banners.size(); i < len; ++i) { + final MapType banner = banners.getMap(i); + + RenameHelper.renameSingle(banner, "Pos", "pos"); + RenameHelper.renameSingle(banner, "Color", "color"); + RenameHelper.renameSingle(banner, "Name", "name"); + } + + return null; + } + }); + + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:compass", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + + if (tag == null) { + return null; + } + + V3807.flattenBlockPos(tag, "LodestonePos"); + + return null; + } + }); + } + + 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..d3b156129452202aea1f3b9f32142c91b64dc777 --- /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.ConverterAbstractAttributesRename; +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 renames = new HashMap<>( + Map.of("minecraft:horse.jump_strength", "minecraft:generic.jump_strength") + ); + + ConverterAbstractAttributesRename.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..40f9b8f2a3d0b01dc97472f34c441321a0e33079 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java @@ -0,0 +1,339 @@ +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 convert(final MapType data, final long sourceVersion, final long toVersion) { + for (final String key : data.keys()) { + final ListType itemList = data.getList(key, ObjectType.MAP); + if (itemList != null) { + for (int i = 0, len = itemList.size(); i < len; ++i) { + final MapType item = itemList.getMap(i); + + final String id = item.getString("id"); + final int count = item.getInt("Count"); + + if ("minecraft:air".equals(id) || count <= 0) { + itemList.setMap(i, item.getTypeUtil().createEmptyMap()); + } + } + } + } + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beehive", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Bees", "bees"); + + final ListType bees = data.getList("bees", ObjectType.MAP); + if (bees != null) { + for (int i = 0, len = bees.size(); i < len; ++i) { + final MapType bee = bees.getMap(i); + + RenameHelper.renameSingle(bee, "EntityData", "entity_data"); + RenameHelper.renameSingle(bee, "TicksInHive", "ticks_in_hive"); + RenameHelper.renameSingle(bee, "MinOccupationTicks", "min_ticks_in_hive"); + } + } + + return null; + } + }); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:beehive", (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "bees", "entity_data", fromVersion, toVersion); + + return null; + }); + + // Step 1 + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION, 1) { + private static final Map PATTERN_UPDATE = new HashMap<>(); + static { + PATTERN_UPDATE.put("b", "minecraft:base"); + PATTERN_UPDATE.put("bl", "minecraft:square_bottom_left"); + PATTERN_UPDATE.put("br", "minecraft:square_bottom_right"); + PATTERN_UPDATE.put("tl", "minecraft:square_top_left"); + PATTERN_UPDATE.put("tr", "minecraft:square_top_right"); + PATTERN_UPDATE.put("bs", "minecraft:stripe_bottom"); + PATTERN_UPDATE.put("ts", "minecraft:stripe_top"); + PATTERN_UPDATE.put("ls", "minecraft:stripe_left"); + PATTERN_UPDATE.put("rs", "minecraft:stripe_right"); + PATTERN_UPDATE.put("cs", "minecraft:stripe_center"); + PATTERN_UPDATE.put("ms", "minecraft:stripe_middle"); + PATTERN_UPDATE.put("drs", "minecraft:stripe_downright"); + PATTERN_UPDATE.put("dls", "minecraft:stripe_downleft"); + PATTERN_UPDATE.put("ss", "minecraft:small_stripes"); + PATTERN_UPDATE.put("cr", "minecraft:cross"); + PATTERN_UPDATE.put("sc", "minecraft:straight_cross"); + PATTERN_UPDATE.put("bt", "minecraft:triangle_bottom"); + PATTERN_UPDATE.put("tt", "minecraft:triangle_top"); + PATTERN_UPDATE.put("bts", "minecraft:triangles_bottom"); + PATTERN_UPDATE.put("tts", "minecraft:triangles_top"); + PATTERN_UPDATE.put("ld", "minecraft:diagonal_left"); + PATTERN_UPDATE.put("rd", "minecraft:diagonal_up_right"); + PATTERN_UPDATE.put("lud", "minecraft:diagonal_up_left"); + PATTERN_UPDATE.put("rud", "minecraft:diagonal_right"); + PATTERN_UPDATE.put("mc", "minecraft:circle"); + PATTERN_UPDATE.put("mr", "minecraft:rhombus"); + PATTERN_UPDATE.put("vh", "minecraft:half_vertical"); + PATTERN_UPDATE.put("hh", "minecraft:half_horizontal"); + PATTERN_UPDATE.put("vhr", "minecraft:half_vertical_right"); + PATTERN_UPDATE.put("hhb", "minecraft:half_horizontal_bottom"); + PATTERN_UPDATE.put("bo", "minecraft:border"); + PATTERN_UPDATE.put("cbo", "minecraft:curly_border"); + PATTERN_UPDATE.put("gra", "minecraft:gradient"); + PATTERN_UPDATE.put("gru", "minecraft:gradient_up"); + PATTERN_UPDATE.put("bri", "minecraft:bricks"); + PATTERN_UPDATE.put("glb", "minecraft:globe"); + PATTERN_UPDATE.put("cre", "minecraft:creeper"); + PATTERN_UPDATE.put("sku", "minecraft:skull"); + PATTERN_UPDATE.put("flo", "minecraft:flower"); + PATTERN_UPDATE.put("moj", "minecraft:mojang"); + PATTERN_UPDATE.put("pig", "minecraft:piglin"); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType patterns = data.getList("Patterns", ObjectType.MAP); + if (patterns != null) { + for (int i = 0, len = patterns.size(); i < len; ++i) { + final MapType pattern = patterns.getMap(i); + + final String patternName = pattern.getString("Pattern"); + if (patternName != null) { + final String renamed = PATTERN_UPDATE.get(patternName); + if (renamed != null) { + pattern.setString("Pattern", renamed); + } + } + RenameHelper.renameSingle(pattern, "Pattern", "pattern"); + + final String newColour = getBannerColour(pattern.getInt("Color")); + pattern.setString("Color", newColour); + RenameHelper.renameSingle(pattern, "Color", "color"); + } + } + RenameHelper.renameSingle(data, "Patterns", "patterns"); + + return null; + } + }); + + // Step 2 + // Note: there is nothing after the previous breakpoint (1.19.4) that reads nested entity item + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", new DataConverter<>(VERSION, 2) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Object potion = data.getGeneric("Potion"); + final Object customPotionEffects = data.getGeneric("custom_potion_effects"); + final Object color = data.getGeneric("Color"); + + if (potion == null && customPotionEffects == null && color == null) { + return null; + } + + data.remove("Potion"); + data.remove("custom_potion_effects"); + data.remove("Color"); + + final MapType item = data.getMap("item"); + if (item == null) { + return null; + } + + final MapType tag = item.getOrCreateMap("tag"); + + if (potion != null) { + tag.setGeneric("Potion", potion); + } + if (customPotionEffects != null) { + tag.setGeneric("custom_potion_effects", customPotionEffects); + } + if (color != null) { + tag.setGeneric("CustomPotionColor", color); + } + + return null; + } + }); + + // Step 3 + MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, 3, new DataWalker<>() { + private static void walkBlockPredicates(final MapType root, final long fromVersion, final long toVersion) { + if (root.hasKey("blocks", ObjectType.STRING)) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion); + } else if (root.hasKey("blocks", ObjectType.LIST)) { + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion); + } + } + + @Override + public MapType walk(final MapType root, final long fromVersion, final long toVersion) { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "minecraft:bees", "entity_data", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.TILE_ENTITY, root, "minecraft:block_entity_data", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:bundle_contents", fromVersion, toVersion); + + final MapType canBreak = root.getMap("minecraft:can_break"); + if (canBreak != null) { + final ListType predicates = canBreak.getList("predicates", ObjectType.MAP); + if (predicates != null) { + for (int i = 0, len = predicates.size(); i < len; ++i) { + walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion); + } + } + // Not handled by DFU: simple encoding does not require "predicates" + walkBlockPredicates(canBreak, fromVersion, toVersion); + } + + final MapType canPlaceOn = root.getMap("minecraft:can_place_on"); + if (canPlaceOn != null) { + final ListType predicates = canPlaceOn.getList("predicates", ObjectType.MAP); + if (predicates != null) { + for (int i = 0, len = predicates.size(); i < len; ++i) { + walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion); + } + } + // Not handled by DFU: simple encoding does not require "predicates" + walkBlockPredicates(canPlaceOn, fromVersion, toVersion); + } + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:charged_projectiles", fromVersion, toVersion); + WalkerUtils.convertListPath(MCTypeRegistry.ITEM_STACK, root, "minecraft:container", "item", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ENTITY, root, "minecraft:entity_data", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_NAME, root, "minecraft:pot_decorations", fromVersion, toVersion); + + return null; + } + }); + + // Step 4 + MCTypeRegistry.PARTICLE.addStructureConverter(new DataConverter<>(VERSION, 4) { + @Override + public MapType convert(final Object input, final long sourceVersion, final long toVersion) { + if (!(input instanceof String flat)) { + return null; + } + + return ConverterParticleToNBT.convert(flat, Types.NBT); + } + }); + + MCTypeRegistry.PARTICLE.addStructureWalker(VERSION, 4, (final Object input, final long fromVersion, final long toVersion) -> { + if (!(input instanceof MapType)) { + return null; + } + + final MapType root = (MapType)input; + + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "item", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, root, "block_state", fromVersion, toVersion); + + return null; + }); + + // Step 5 + // Note: needs breakpoint, reads nested tile entity data + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION, 5) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + return ConverterItemStackToDataComponents.convertItem(data); + } + }); + + MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, 5, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, root, "id", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.DATA_COMPONENTS, root, "components", fromVersion, toVersion); + + return null; + }); + + // 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final Object color = data.getGeneric("Color"); + final Object effects = data.getGeneric("effects"); + final Object potion = data.getGeneric("Potion"); + + if (color == null && effects == null && potion == null) { + return null; + } + data.remove("Color"); + data.remove("effects"); + data.remove("Potion"); + + final MapType potionContents = data.getTypeUtil().createEmptyMap(); + data.setMap("potion_contents", potionContents); + + if (color != null) { + potionContents.setGeneric("custom_color", color); + } + + if (effects != null) { + potionContents.setGeneric("custom_effects", effects); + } + + if (potion != null) { + potionContents.setGeneric("potion", potion); + } + + return null; + } + }); + } + + private V3818() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final Object skullOwner = data.getGeneric("SkullOwner"); + final Object extraType = data.getGeneric("ExtraType"); + + if (skullOwner == null && extraType == null) { + return null; + } + + data.remove("SkullOwner"); + data.remove("ExtraType"); + + data.setMap( + "profile", + ConverterItemStackToDataComponents.convertProfile( + skullOwner == null ? extraType : skullOwner, data.getTypeUtil() + ) + ); + + return null; + } + }); + // I don't see why this converter is necessary, V3818 should have converted correctly... + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType components = data.getMap("components"); + + if (components == null) { + return null; + } + + final MapType oldTarget = components.getMap("minecraft:lodestone_target"); + if (oldTarget == null) { + return null; + } + + components.remove("minecraft:lodestone_target"); + components.setMap("minecraft:lodestone_tracker", oldTarget); + + final Object pos = oldTarget.getGeneric("pos"); + final Object dim = oldTarget.getGeneric("dimension"); + + if (pos == null || dim == null) { + return null; + } + + oldTarget.remove("pos"); + oldTarget.remove("dimension"); + + final MapType target = oldTarget.getTypeUtil().createEmptyMap(); + oldTarget.setMap("target", target); + + target.setGeneric("pos", pos); + target.setGeneric("dimension", dim); + + return null; + } + }); + } + + 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 BANNER_NAMES = new HashSet<>( + Arrays.asList( + "block.minecraft.ominous_banner" + ) + ); + private static final Set MAP_NAMES = new HashSet<>( + Arrays.asList( + "filled_map.buried_treasure", + "filled_map.explorer_jungle", + "filled_map.explorer_swamp", + "filled_map.mansion", + "filled_map.monument", + "filled_map.trial_chambers", + "filled_map.village_desert", + "filled_map.village_plains", + "filled_map.village_savanna", + "filled_map.village_snowy", + "filled_map.village_taiga" + ) + ); + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + private static void convertName(final MapType components, final Set standardNames) { + final String customName = components.getString("minecraft:custom_name"); + if (customName == null) { + return; + } + + final String translation = ComponentUtils.retrieveTranslationString(customName); + if (translation == null) { + return; + } + + if (standardNames.contains(translation)) { + components.remove("minecraft:custom_name"); + components.setString("minecraft:item_name", customName); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType components = data.getMap("components"); + if (components == null) { + return null; + } + + final String id = data.getString("id"); + if (id == null) { + return null; + } + + switch (id) { + case "minecraft:white_banner": { + convertName(components, BANNER_NAMES); + break; + } + case "minecraft:filled_map": { + convertName(components, MAP_NAMES); + break; + } + } + + return null; + } + }); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String customName = data.getString("CustomName"); + if (customName == null || !"block.minecraft.ominous_banner".equals(ComponentUtils.retrieveTranslationString(customName))) { + return null; + } + + data.remove("CustomName"); + + final MapType components = data.getOrCreateMap("components"); + + components.setString("minecraft:item_name", customName); + components.setMap("minecraft:hide_additional_tooltip", components.getTypeUtil().createEmptyMap()); + + return null; + } + }); + // DFU does not change the schema, even though it moves spawn_potentials + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:trial_spawner", (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType normalConfig = data.getMap("normal_config"); + if (normalConfig != null) { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, normalConfig, "spawn_potentials", "data", "entity", fromVersion, toVersion); + } + final MapType ominousConfig = data.getMap("ominous_config"); + if (ominousConfig != null) { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, ominousConfig, "spawn_potentials", "data", "entity", fromVersion, toVersion); + } + + WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("spawn_data"), "entity", fromVersion, toVersion); + return null; + }); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:trial_spawner", new DataConverter<>(VERSION) { + private static final String[] NORMAL_CONFIG_KEYS = new String[] { + "spawn_range", + "total_mobs", + "simultaneous_mobs", + "total_mobs_added_per_player", + "simultaneous_mobs_added_per_player", + "ticks_between_spawn", + "spawn_potentials", + "loot_tables_to_eject", + "items_to_drop_when_ominous" + }; + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType normalConfig = data.getTypeUtil().createEmptyMap(); + + for (final String normalKey : NORMAL_CONFIG_KEYS) { + final Object normalValue = data.getGeneric(normalKey); + if (normalValue != null) { + data.remove(normalKey); + normalConfig.setGeneric(normalKey, normalValue); + } + } + + if (!normalConfig.isEmpty()) { + data.setMap("normal_config", normalConfig); + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:ominous_item_spawner", new DataWalkerItems("item")); + } + + private V3825() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType buyB = data.getMap("buyB"); + + if (buyB == null) { + return null; + } + + final String id = NamespaceUtil.correctNamespace(buyB.getString("id", "minecraft:air")); + final int count = buyB.getInt("count", 0); + + // Fix DFU: use count <= 0 instead of count == 0 + if ("minecraft:air".equals(id) || count <= 0) { + data.remove("buyB"); + } + + return null; + } + }); + } + + private V3828() {} +} diff --git a/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..4581b9ce0734e552fd8810239e7b86f8b43513c5 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V3833.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 V3833 { + + private static final int VERSION = MCVersions.V1_20_5_PRE4 + 1; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:brushable_block", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType item = data.getMap("item"); + if (item == null) { + return null; + } + + + final String id = NamespaceUtil.correctNamespace(item.getString("id", "minecraft:air")); + final int count = item.getInt("count", 0); + + // Fix DFU: use count <= 0 instead of count == 0 + if ("minecraft:air".equals(id) || count <= 0) { + data.remove("item"); + } + + return null; + } + }); + } + + private V3833() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.getBoolean("IsVillager")) { + return null; + } + + data.remove("IsVillager"); + + if (data.hasKey("ZombieType")) { + return null; + } + + int type = data.getInt("VillagerProfession", -1); + // Vanilla doesn't remove the profession tag, so we don't! + if (type < 0 || type >= 6) { + type = ThreadLocalRandom.current().nextInt(6); + } + + data.setInt("ZombieType", type); + + return null; + } + }); + } + + private V502() {} +} diff --git a/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 convert(final MapType 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getBoolean("Elder")) { + data.setString("id", "ElderGuardian"); + } + data.remove("Elder"); + return null; + } + }); + + registerMob("ElderGuardian"); + } + + 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final int type = data.getInt("SkeletonType"); + data.remove("SkeletonType"); + + switch (type) { + case 1: + data.setString("id", "WitherSkeleton"); + break; + case 2: + data.setString("id", "Stray"); + break; + } + + return null; + } + }); + + registerMob("WitherSkeleton"); + 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final int zombieType = data.getInt("ZombieType"); + data.remove("ZombieType"); + + switch (zombieType) { + case 0: + default: + break; + + case 1: + case 2: + case 3: + case 4: + case 5: + data.setString("id", "ZombieVillager"); + data.setInt("Profession", zombieType - 1); + break; + + case 6: + data.setString("id", "Husk"); + break; + } + + return null; + } + }); + + registerMob("ZombieVillager"); + MCTypeRegistry.ENTITY.addWalker(VERSION, "ZombieVillager", (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, root.getMap("Offers"), "Recipes", fromVersion, toVersion); + return null; + }); + registerMob( "Husk"); + } + + 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final int type = data.getInt("Type"); + data.remove("Type"); + + switch (type) { + case 0: + default: + data.setString("id", "Horse"); + break; + + case 1: + data.setString("id", "Donkey"); + break; + + case 2: + data.setString("id", "Mule"); + break; + + case 3: + data.setString("id", "ZombieHorse"); + break; + + case 4: + data.setString("id", "SkeletonHorse"); + break; + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "Horse", new DataWalkerItems("ArmorItem", "SaddleItem")); + 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..10ee10109405bd569beb23a235a7411db45d6ec0 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V704.java @@ -0,0 +1,432 @@ +package ca.spottedleaf.dataconverter.minecraft.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 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 makeSingle(final long k1, final String v1) { + final Long2ObjectArraySortedMap ret = new Long2ObjectArraySortedMap<>(); + + ret.put(k1, v1); + + return ret; + } + + private static Long2ObjectArraySortedMap makeDouble(final long k1, final String v1, + final long k2, final String v2) { + final Long2ObjectArraySortedMap ret = new Long2ObjectArraySortedMap<>(); + + ret.put(k1, v1); + ret.put(k2, v2); + + return ret; + } + + private static final Map> 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")); + } + + private static final Map 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + if (id == null) { + return null; + } + + data.setString("id", TILE_ID_UPDATE.getOrDefault(id, id)); + return null; + } + }); + + + MCTypeRegistry.TILE_ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.DATA_COMPONENTS, data, "components", fromVersion, toVersion); + return null; + }); + 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 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 data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, data, "id", fromVersion, toVersion); + + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + // 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 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 :_spawn_egg post flattening + entityId = itemId.substring(0, itemId.indexOf("_spawn_egg")); + } else { + final Long2ObjectArraySortedMap mappingByVersion = ITEM_ID_TO_ENTITY_ID.get(itemId); + final String mapped = mappingByVersion == null ? null : mappingByVersion.getFloor(fromVersion); + entityId = mapped == null ? entityTag.getString("id") : mapped; + } + + if (entityId == null) { + if (!"minecraft:air".equals(itemId)) { + LOGGER.warn("Unable to resolve Entity for ItemStack (V704): " + itemId); + } + } else { + if (!entityTag.hasKey("id", ObjectType.STRING)) { + entityTag.setString("id", entityId); + } + } + + final MapType replace = MCTypeRegistry.ENTITY.convert(entityTag, fromVersion, toVersion); + + if (replace != null) { + entityTag = replace; + tag.setMap("EntityTag", entityTag); + } + } + + MapType blockEntityTag = tag.getMap("BlockEntityTag"); + if (blockEntityTag != null) { + final String 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 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 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 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 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 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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType blockEntity = tag.getMap("BlockEntityTag"); + if (blockEntity == null) { + return null; + } + + if (!blockEntity.hasKey("Base", ObjectType.NUMBER)) { + return null; + } + + data.setShort("Damage", (short)(blockEntity.getShort("Base") & 15)); + + final MapType display = tag.getMap("display"); + if (display != null) { + final ListType lore = display.getList("Lore", ObjectType.STRING); + if (lore != null) { + if (lore.size() == 1 && "(+NBT)".equals(lore.getString(0))) { + return null; + } + } + } + + blockEntity.remove("Base"); + if (blockEntity.isEmpty()) { + tag.remove("BlockEntityTag"); + } + + if (tag.isEmpty()) { + data.remove("tag"); + } + + return null; + } + }); + } + + private V804() {} +} diff --git a/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> potionWaterUpdater = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + data.setMap("tag", tag); + } + + if (!tag.hasKey("Potion", ObjectType.STRING)) { + tag.setString("Potion", "minecraft:water"); + } + + return null; + } + }; + + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:potion", potionWaterUpdater); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:splash_potion", potionWaterUpdater); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:lingering_potion", potionWaterUpdater); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:tipped_arrow", potionWaterUpdater); + } + + private V806() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey("Color", ObjectType.NUMBER)) { + data.setByte("Color", (byte)10); + } + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:shulker_box", new DataWalkerItemLists("Items")); + } + + private V808() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType blockEntity = tag.getMap("BlockEntityTag"); + if (blockEntity == null) { + return null; + } + + final int color = blockEntity.getInt("Color"); + blockEntity.remove("Color"); + + data.setString("id", SHULKER_ID_BY_COLOUR[color % SHULKER_ID_BY_COLOUR.length]); + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:shulker_box", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.remove("Color"); + return null; + } + }); + } + + private V813() {} +} diff --git a/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 convert(final MapType data, final long sourceVersion, final long toVersion) { + final String lang = data.getString("lang"); + if (lang != null) { + data.setString("lang", lang.toLowerCase(Locale.ROOT)); + } + return null; + } + }); + } + + private V816() {} +} diff --git a/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 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 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 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 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 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 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 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 data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, data, "id", fromVersion, toVersion); + + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + // 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 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 replace = MCTypeRegistry.ENTITY.convert(entityTag, fromVersion, toVersion); + + if (replace != null) { + entityTag = replace; + tag.setMap("EntityTag", entityTag); + } + if (removeId) { + entityTag.remove("id"); + } + } + + MapType blockEntityTag = tag.getMap("BlockEntityTag"); + if (blockEntityTag != null) { + final String 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 replace = MCTypeRegistry.TILE_ENTITY.convert(blockEntityTag, fromVersion, toVersion); + if (replace != null) { + blockEntityTag = replace; + tag.setMap("BlockEntityTag", blockEntityTag); + } + if (removeId) { + blockEntityTag.remove("id"); + } + } + + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanDestroy", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanPlaceOn", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, new DataWalkerItemLists("Inventory", "EnderItems")); + + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion); + + final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP); + if (tileTicks != null) { + for (int i = 0, len = tileTicks.size(); i < len; ++i) { + final MapType tileTick = tileTicks.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion); + } + } + + return null; + }); + + MCTypeRegistry.ENTITY_CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Entities", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.SAVED_DATA_SCOREBOARD.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.OBJECTIVE, data, "Objectives", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TEAM, data, "Teams", fromVersion, toVersion); + + return null; + }); + MCTypeRegistry.SAVED_DATA_STRUCTURE_FEATURE_INDICES.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data, "Features", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.VILLAGER_TRADE.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "buy", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "buyB", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "sell", fromVersion, toVersion); + + return null; + }); + + // 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 { + + 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> { + + @Override + public MapType walk(final MapType data, final long fromVersion, final long toVersion) { + final MapType listener = data.getMap("listener"); + if (listener == null) { + return null; + } + + final MapType 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 implements DataWalker> { + + protected final DataType type; + protected final String[] paths; + + public DataWalkerListPaths(final DataType type, final String... paths) { + this.type = type; + this.paths = paths; + } + + @Override + public final MapType walk(final MapType data, final long fromVersion, final long toVersion) { + final DataType 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 implements DataWalker> { + + protected final DataType type; + protected final String[] paths; + + public DataWalkerTypePaths(final DataType type, final String... paths) { + this.type = type; + this.paths = paths; + } + + @Override + public final MapType walk(final MapType data, final long fromVersion, final long toVersion) { + for (final String path : this.paths) { + final Object current = data.getGeneric(path); + if (current == null) { + continue; + } + + final Object converted = this.type.convert((T)current, fromVersion, toVersion); + + if (converted != null) { + data.setGeneric(path, converted); + } + } + + return null; + } +} diff --git a/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 data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final MapType map = data.getMap(path); + if (map != null) { + final MapType replace = type.convert(map, fromVersion, toVersion); + if (replace != null) { + data.setMap(path, replace); + } + } + } + + public static void convertList(final MCDataType type, final MapType data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final ListType list = data.getList(path, ObjectType.MAP); + if (list != null) { + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType replace = type.convert(list.getMap(i), fromVersion, toVersion); + if (replace != null) { + list.setMap(i, replace); + } + } + } + } + + public static void convertListPath(final MCDataType type, final MapType data, final String listPath, final String elementPath, + final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final ListType list = data.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 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 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 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 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 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 data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final MapType map = data.getMap(path); + if (map != null) { + convertKeys(type, map, fromVersion, toVersion); + } + } + + public static void convertKeys(final MCValueType type, final MapType data, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + RenameHelper.renameKeys(data, (final String input) -> { + return (String)type.convert(input, fromVersion, toVersion); + }); + } + + public static void convertValues(final MCDataType type, final MapType data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + convertValues(type, data.getMap(path), fromVersion, toVersion); + } + + public static void convertValues(final MCDataType type, final MapType data, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + for (final String key : data.keys()) { + final MapType value = data.getMap(key); + if (value != null) { + final MapType replace = type.convert(value, fromVersion, toVersion); + if (replace != null) { + // no CME, key is in map already + data.setMap(key, replace); + } + } + } + } +} diff --git a/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 { + + 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> { + + 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> { + + 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> { + + 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 MapType 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 { + + 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 keys(); + + // Provides a deep copy of this map + public MapType 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 MapType getMap(final K key); + + public default MapType getOrCreateMap(final K key) { + MapType ret = this.getMap(key); + if (ret == null) { + this.setMap(key, ret = this.getTypeUtil().createEmptyMap()); + } + + return ret; + } + + public MapType getMap(final K key, final MapType 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 MapType 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 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 { + + 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 keys() { + // ah shit. no keyset method + final Set keys = new LinkedHashSet<>(); + + for (final Map.Entry entry : this.map.entrySet()) { + keys.add(entry.getKey()); + } + + return keys; + } + + @Override + public MapType 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 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 createEmptyMap() { + return new JsonMapType(false); + } + + public static 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 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 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 { + + 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 keys() { + return this.map.getAllKeys(); + } + + public CompoundTag getTag() { + return this.map; + } + + @Override + public MapType copy() { + return new NBTMapType(this.map.copy()); + } + + @Override + public boolean hasKey(final String key) { + return this.map.get(key) != null; + } + + @Override + public boolean hasKey(final String key, final ObjectType type) { + final Tag tag = this.map.get(key); + if (tag == null) { + return false; + } + + final ObjectType valueType = NBTListType.getType(tag.getId()); + + return valueType == type || (type == ObjectType.NUMBER && valueType.isNumber()); + } + + @Override + public void remove(final String key) { + this.map.remove(key); + } + + @Override + public Object getGeneric(final String key) { + final Tag tag = this.map.get(key); + if (tag == null) { + return null; + } + + switch (NBTListType.getType(tag.getId())) { + case BYTE: + case SHORT: + case INT: + case LONG: + case FLOAT: + case DOUBLE: + return ((NumericTag)tag).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 getMap(final String key) { + return this.getMap(key, null); + } + + @Override + public MapType getMap(final String key, final MapType dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof CompoundTag) { + 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 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..6f2a30eed4e9741a128b5a171edef6abedab7362 --- /dev/null +++ b/src/main/java/ca/spottedleaf/dataconverter/util/CommandArgumentUpgrader.java @@ -0,0 +1,491 @@ +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.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 dispatcher; + private final CommandBuildContext context; + private final CommandSourceStack source; + private final Map, BiFunction, 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.registerExtraCommand(CommandArgumentUpgrader::registerSummon_1_20_4_to_1_20_5); + }); + } + + public CommandArgumentUpgrader( + final int functionPermissionLevel, + final Consumer consumer + ) { + this( + new Commands(Commands.CommandSelection.DEDICATED, makeDummyCommandBuildContext()).getDispatcher(), + functionPermissionLevel, + consumer + ); + } + + private CommandArgumentUpgrader( + final CommandDispatcher dispatcher, + final int functionPermissionLevel, + final Consumer 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> aliases = new ArrayList<>(); + for (final CommandNode 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 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> 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, BiFunction, CommandBuildContext, ArgumentType>> replacements = + new HashMap<>(); + private final List>> extra = new ArrayList<>(); + + private ReplacementsBuilder() { + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + public > void registerReplacement( + final Class type, + final BiFunction> upgrader + ) { + this.replacements.put(type, (BiFunction) upgrader); + } + + public void registerExtraCommand(final Consumer> consumer) { + this.extra.add(consumer); + } + } + + public interface UpgradableArgument { + String upgrade(int index, List>> arguments); + } + + public record UpgradedArgument(String upgraded) {} + + private static final class ItemParser_1_20_4 implements ArgumentType { + @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 { + 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); + } + } + } + + // 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 parseResult = this.dispatcher.parse(reader, this.source); + if (!parseResult.getExceptions().isEmpty()) { + return command; + } + final Map replacements = new LinkedHashMap<>(); + final List>> mergedArguments = new ArrayList<>(); + addArguments(mergedArguments, parseResult.getContext()); + for (int i = 0; i < mergedArguments.size(); i++) { + final Pair> 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 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 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> 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>> mergedArguments, + final @Nullable CommandContextBuilder 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, CommandBuildContext, ArgumentType> upgrader = + this.replacements.get(type.getClass()); + if (upgrader != null) { + return upgrader.apply(type, ctx); + } + return type; + } + + record CopyResult( + CommandNode root, + boolean replaced, + List> aliases + ) { + CopyResult replacedResult() { + if (this.replaced) { + return this; + } + return new CopyResult(this.root, true, new ArrayList<>(this.aliases)); + } + } + + private CopyResult copyCommand( + final CommandNode parent, + final CommandNode node, + @Nullable CopyResult result + ) { + final CommandNode 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> 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 argument = + (ArgumentCommandNode) 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 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 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() { + @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> 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>> listRegistries() { + return Stream.of(); + } + + @Override + public Optional> lookup( + final ResourceKey> registryRef + ) { + return Optional.of(new HolderLookup.RegistryLookup() { + @Override + public ResourceKey> key() { + return registryRef; + } + + @Override + public Lifecycle registryLifecycle() { + return Lifecycle.stable(); + } + + @Override + public Stream> listElements() { + return Stream.of(); + } + + @Override + public Stream> listTags() { + return Stream.of(); + } + + @Override + public Optional> get(final ResourceKey key) { + return Optional.of(Holder.Reference.createStandAlone(this, key)); + } + + @Override + public Optional> get(final TagKey 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 { + + 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 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 { + + 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 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 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/net/minecraft/data/structures/StructureUpdater.java b/src/main/java/net/minecraft/data/structures/StructureUpdater.java index c0296e62fe46302e887b0c4528471e3bccde1c67..1327a33c594b56a2142d35fff8e6ef07f688797d 100644 --- a/src/main/java/net/minecraft/data/structures/StructureUpdater.java +++ b/src/main/java/net/minecraft/data/structures/StructureUpdater.java @@ -25,7 +25,7 @@ public class StructureUpdater implements SnbtToNbt.Filter { LOGGER.warn("SNBT Too old, do not forget to update: {} < {}: {}", i, 3798, 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.asLookup(), 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 e605dbdb821b2d13217ac88426e50480a4e4741d..a62c90e10c0dfa4c6211a05c4071932756d7b218 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 @@ -83,7 +83,7 @@ public class ChunkStorage implements AutoCloseable { 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(); @@ -95,7 +95,7 @@ public class ChunkStorage implements AutoCloseable { // CraftBukkit end if (i < 1493) { - nbttagcompound = DataFixTypes.CHUNK.update(this.fixerUpper, nbttagcompound, i, 1493); + 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); @@ -113,7 +113,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 if (i < SharedConstants.getCurrentVersion().getDataVersion().getVersion()) { NbtUtils.addCurrentDataVersion(nbttagcompound); } 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 cf44d7b48c774d4c2431d42e352b42d200ee1b71..fa4f9afb421c7924557372cbb2f20caf9e13c81c 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 upgradeChunkTag(Dynamic 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 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 c6181e14d85d454506534f9bbe856156c0d4a062..609100ed7aa0b23aa5a9c6fbf6878ea320bd3a93 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 39b4f29fb97464c2021b857bccb2fa933d4003d7..4d9dbf27c7c7d57a06e5f12b7fe30723d2cb69ef 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 @@ -233,7 +233,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 e69d805701def93466ad7fa94f019ec4610efb47..427ee4d6f12a7abd8da0c65e0b9081b25824df40 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 1d287dd7379e56f7fd4b425880b850cd843f5789..8ab7ca373a885fbe658013c9c6a2e38d32d77bb2 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 4c199dd62982eaedf7adba49444af7bf8f3d04bc..e46714f38df931350d81c30907560c381c8d2725 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -520,7 +520,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()); } @@ -541,7 +541,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");