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/ca/spottedleaf/dataconverter/converters/DataConverter.java b/ca/spottedleaf/dataconverter/converters/DataConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..1863c606be715683d53863a0c9293525d199c9cf --- /dev/null +++ b/ca/spottedleaf/dataconverter/converters/DataConverter.java @@ -0,0 +1,54 @@ +package ca.spottedleaf.dataconverter.converters; + +import java.util.Comparator; + +public abstract class DataConverter { + + 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/ca/spottedleaf/dataconverter/converters/datatypes/DataHook.java b/ca/spottedleaf/dataconverter/converters/datatypes/DataHook.java new file mode 100644 index 0000000000000000000000000000000000000000..0b92c5c66ad3a5198873f98287a5ced71c231d09 --- /dev/null +++ b/ca/spottedleaf/dataconverter/converters/datatypes/DataHook.java @@ -0,0 +1,9 @@ +package ca.spottedleaf.dataconverter.converters.datatypes; + +public interface DataHook { + + public R preHook(final T data, final long fromVersion, final long toVersion); + + public R postHook(final T data, final long fromVersion, final long toVersion); + +} diff --git a/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java b/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java new file mode 100644 index 0000000000000000000000000000000000000000..52f2a3131f314e723a31194c517e7756983482b9 --- /dev/null +++ b/ca/spottedleaf/dataconverter/converters/datatypes/DataType.java @@ -0,0 +1,15 @@ +package ca.spottedleaf.dataconverter.converters.datatypes; + +public abstract class DataType { + + public final R convertOrOriginal(final T data, final long fromVersion, final long toVersion) { + final R replaced = this.convert(data, fromVersion, toVersion); + if (replaced != null) { + return replaced; + } + return (R)data; + } + + public abstract R convert(final T data, final long fromVersion, final long toVersion); + +} diff --git a/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java b/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java new file mode 100644 index 0000000000000000000000000000000000000000..a57dd1e28fd7a1e7d832833f820186dacac407d4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/converters/datatypes/DataWalker.java @@ -0,0 +1,15 @@ +package ca.spottedleaf.dataconverter.converters.datatypes; + +public interface DataWalker { + + public static final DataWalker NO_OP = (final Object data, final long fromVersion, final long toVersion) -> { + return null; + }; + + public static DataWalker noOp() { + return (DataWalker)NO_OP; + } + + public T walk(final T data, final long fromVersion, final long toVersion); + +} diff --git a/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java b/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..515f6691c72ffa82ac8b92646768be7a17931efb --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/MCDataConverter.java @@ -0,0 +1,86 @@ +package ca.spottedleaf.dataconverter.minecraft; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataType; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType; +import ca.spottedleaf.dataconverter.minecraft.versions.V99; +import ca.spottedleaf.dataconverter.types.json.JsonMapType; +import ca.spottedleaf.dataconverter.types.nbt.NBTMapType; +import com.google.gson.JsonObject; +import it.unimi.dsi.fastutil.longs.LongArrayList; +import net.minecraft.nbt.CompoundTag; + +public final class MCDataConverter { + + private static final LongArrayList BREAKPOINTS = MCVersionRegistry.getBreakpoints(); + + public static T 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, final int fromVersion, final int toVersion) { + return convertWithSubVersion( + type, data, + DataConverter.encodeVersions(Math.max(fromVersion, V99.VERSION), Integer.MAX_VALUE), + DataConverter.encodeVersions(toVersion, Integer.MAX_VALUE) + ); + } + + public static R convertWithSubVersion(final DataType type, final T data, final long fromVersion, final long toVersion) { + Object ret = data; + + long currentVersion = fromVersion; + + for (int i = 0, len = BREAKPOINTS.size(); i < len; ++i) { + final long breakpoint = BREAKPOINTS.getLong(i); + + if (currentVersion >= breakpoint) { + continue; + } + + final Object converted = type.convert((T)ret, currentVersion, Math.min(toVersion, breakpoint - 1L)); + if (converted != null) { + ret = converted; + } + + currentVersion = Math.min(toVersion, breakpoint - 1L); + + if (currentVersion == toVersion) { + break; + } + } + + if (currentVersion != toVersion) { + final Object converted = type.convert((T)ret, currentVersion, toVersion); + if (converted != null) { + ret = converted; + } + } + + return (R)ret; + } + + private MCDataConverter() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java b/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java new file mode 100644 index 0000000000000000000000000000000000000000..7b5803c8f8bf0b201f6862768cf6d6b6fa103b1e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/MCVersionRegistry.java @@ -0,0 +1,487 @@ +package ca.spottedleaf.dataconverter.minecraft; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.versions.V4290; +import com.mojang.logging.LogUtils; +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntRBTreeSet; +import it.unimi.dsi.fastutil.longs.LongArrayList; +import it.unimi.dsi.fastutil.longs.LongComparator; +import it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet; +import org.slf4j.Logger; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Locale; + +public final class MCVersionRegistry { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static final Int2ObjectLinkedOpenHashMap 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, + 2537, + 2538, + 2550, + 2551, + 2552, + 2553, + 2558, + 2568, + 2671, + 2679, + 2680, + 2684, + 2686, + 2688, + 2690, + 2691, + 2693, + 2696, + 2700, + 2701, + 2702, + 2704, + 2707, + 2710, + 2717, + 2825, + 2831, + 2832, + 2833, + 2838, + 2841, + 2842, + 2843, + 2846, + 2852, + 2967, + 2970, + 3077, + 3078, + 3081, + 3082, + 3083, + 3084, + 3086, + 3087, + 3088, + 3090, + 3093, + 3094, + 3097, + 3108, + 3201, + 3203, + 3204, + 3209, + 3214, + 3319, + 3322, + 3438, + 3439, + 3440, + 3441, + 3447, + 3448, + 3450, + 3451, + 3459, + 3564, + 3565, + 3566, + 3568, + 3683, + 3685, + 3692, + 3800, + 3803, + 3807, + 3808, + 3809, + 3812, + 3813, + 3814, + 3818, + 3820, + 3825, + 3828, + 3833, + 3939, + 3943, + 3945, + 4054, + 4055, + 4057, + 4059, + 4061, + 4064, + 4067, + 4068, + 4081, + 4173, + 4175, + 4176, + 4180, + 4181, + 4185, + 4187, + 4290, + 4291, + 4292, + 4293, + 4294, + 4295, + 4296, + 4297, + 4299, + 4300, + 4301, + 4302, + 4303, + 4305, + 4306, + 4307, + 4309, + 4311, + 4312, + 4314, + 4420, + 4424, + // All up to 1.21.7 + }; + Arrays.sort(converterVersions); + + DATACONVERTER_VERSIONS_MAJOR.addAll(DATACONVERTER_VERSIONS_LIST = new IntArrayList(converterVersions)); + + // add sub versions + registerSubVersion(MCVersions.V16W38A + 1, 1); + + registerSubVersion(MCVersions.V17W47A, 1); + registerSubVersion(MCVersions.V17W47A, 2); + registerSubVersion(MCVersions.V17W47A, 3); + registerSubVersion(MCVersions.V17W47A, 4); + registerSubVersion(MCVersions.V17W47A, 5); + registerSubVersion(MCVersions.V17W47A, 6); + registerSubVersion(MCVersions.V17W47A, 7); + + registerSubVersion(MCVersions.V24W04A + 1, 1); + registerSubVersion(MCVersions.V24W04A + 2, 1); + registerSubVersion(MCVersions.V24W04A + 2, 2); + + registerSubVersion(MCVersions.V24W07A + 1, 1); + registerSubVersion(MCVersions.V24W07A + 1, 2); + registerSubVersion(MCVersions.V24W07A + 1, 4); + registerSubVersion(MCVersions.V24W07A + 1, 5); + registerSubVersion(MCVersions.V24W07A + 1, 6); + + registerSubVersion(V4290.VERSION, 1); + + // register breakpoints here + // for all major releases after 1.16, add them. this reduces the work required to determine if a breakpoint + // is needed for new converters + + // Too much changed in this version. + registerBreakpoint(MCVersions.V17W47A); + registerBreakpointAfter(MCVersions.V17W47A, Integer.MAX_VALUE); + + // final release of major version + registerBreakpointAfter(MCVersions.V1_17_1, Integer.MAX_VALUE); + + // final release of major version + registerBreakpointAfter(MCVersions.V1_18_2, Integer.MAX_VALUE); + + // final release of major version + registerBreakpointAfter(MCVersions.V1_19_4, Integer.MAX_VALUE); + + // Too much changed in this version. + registerBreakpoint(MCVersions.V24W07A + 1, 5); + registerBreakpointAfter(MCVersions.V24W07A + 1, Integer.MAX_VALUE); + + // final release of major version + registerBreakpointAfter(MCVersions.V1_20_6, Integer.MAX_VALUE); + + // There is a read of entity sub data in V4299 (salmon) which was written to after V1_20_6 + // There is also a sub type read in V4290 as it reads and converts all data within a text component + registerBreakpointAfter(V4290.VERSION); + } + + static { + final Field[] fields = MCVersions.class.getDeclaredFields(); + for (final Field field : fields) { + final String name = field.getName(); + final int value; + try { + value = field.getInt(null); + } catch (final Exception ex) { + throw new RuntimeException(ex); + } + + // Mojang registered 15w33a and 15w33b under the same id. + // Mojang registered 1.21.5-pre2 and 1.21.5-pre3 under the same id. + if (VERSION_NAMES.containsKey(value) && value != MCVersions.V15W33B && value != MCVersions.V1_21_5_PRE3) { + LOGGER.warn("Error registering version \"" + name + "\", version number '" + value + "' is already associated with \"" + VERSION_NAMES.get(value) + "\""); + } + + VERSION_NAMES.put(value, name.substring(1).replace("_PRE", "-PRE").replace("_RC", "-RC").replace('_', '.').toLowerCase(Locale.ROOT)); + } + + for (final int version : DATACONVERTER_VERSIONS_MAJOR) { + if (VERSION_NAMES.containsKey(version)) { + continue; + } + + // find closest greatest version above this one + int closest = Integer.MAX_VALUE; + String closestName = null; + for (final int v : VERSION_NAMES.keySet()) { + if (v > version && v < closest) { + closest = v; + closestName = VERSION_NAMES.get(v); + } + } + + if (closestName == null) { + VERSION_NAMES.put(version, "unregistered_v" + version); + } else { + VERSION_NAMES.put(version, closestName + "-dev" + (closest - version)); + } + } + + // Explicit override for V99, as 99 is very special. + VERSION_NAMES.put(99, "pre_converter"); + + VERSION_LIST = new IntArrayList(new IntRBTreeSet(VERSION_NAMES.keySet())); + + DATA_VERSION_LIST = new LongArrayList(); + for (final int version : VERSION_LIST) { + DATA_VERSION_LIST.add(DataConverter.encodeVersions(version, 0)); + + final IntArrayList subVersions = SUBVERSIONS.get(version); + if (subVersions == null) { + continue; + } + + for (final int step : subVersions) { + DATA_VERSION_LIST.add(DataConverter.encodeVersions(version, step)); + } + } + + DATA_VERSION_LIST.sort((LongComparator)null); + + for (final int version : DATACONVERTER_VERSIONS_MAJOR) { + DATACONVERTER_VERSIONS.add(DataConverter.encodeVersions(version, 0)); + + final IntArrayList subVersions = SUBVERSIONS.get(version); + if (subVersions == null) { + continue; + } + + for (final int step : subVersions) { + DATACONVERTER_VERSIONS.add(DataConverter.encodeVersions(version, step)); + } + } + } + + private static void registerSubVersion(final int version, final int step) { + if (DATA_VERSION_LIST != null) { + throw new IllegalStateException("Added too late!"); + } + SUBVERSIONS.computeIfAbsent(version, (final int keyInMap) -> { + return new IntArrayList(); + }).add(step); + } + + private static void registerBreakpointBefore(final int version) { + registerBreakpointBefore(version, 0); + } + + private static void registerBreakpointBefore(final int version, final int step) { + BREAKPOINTS.add(DataConverter.encodeVersions(version, step) - 1L); + } + + private static void registerBreakpoint(final int version) { + registerBreakpoint(version, 0); + } + + private static void registerBreakpoint(final int version, final int step) { + BREAKPOINTS.add(DataConverter.encodeVersions(version, step)); + } + + private static void registerBreakpointAfter(final int version) { + registerBreakpointAfter(version, 0); + } + + private static void registerBreakpointAfter(final int version, final int step) { + BREAKPOINTS.add(DataConverter.encodeVersions(version, step) + 1L); + } + + // returns only versions that have dataconverters + public static boolean hasDataConverters(final int version) { + return DATACONVERTER_VERSIONS_MAJOR.contains(version); + } + + public String getVersionName(final int version) { + return VERSION_NAMES.get(version); + } + + public boolean isRegisteredVersion(final int version) { + return VERSION_NAMES.containsKey(version); + } + + public static IntArrayList getVersionList() { + return VERSION_LIST; + } + + public static LongArrayList getDataVersionList() { + return DATA_VERSION_LIST; + } + + public static int getMaxVersion() { + return VERSION_LIST.getInt(VERSION_LIST.size() - 1); + } + + public static LongArrayList getBreakpoints() { + return BREAKPOINTS; + } + + public static void checkVersion(final long version) { + if (!DATACONVERTER_VERSIONS.contains(version)) { + throw new IllegalStateException("Version " + DataConverter.encodedToString(version) + " is not registered to have dataconverters, yet has a dataconverter"); + } + } + + private MCVersionRegistry() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/MCVersions.java b/ca/spottedleaf/dataconverter/minecraft/MCVersions.java new file mode 100644 index 0000000000000000000000000000000000000000..7a46f8fbc90f65a2bf849d2bec5709145b8e6458 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/MCVersions.java @@ -0,0 +1,600 @@ +package ca.spottedleaf.dataconverter.minecraft; + +@SuppressWarnings("unused") +public final class MCVersions { + + /* https://minecraft.wiki/w/Data_version */ + + public static final int V15W32A = 100; + public static final int V15W32B = 103; + public static final int V15W32C = 104; + public static final int V15W33A = 111; + public static final int V15W33B = 111; + public static final int V15W33C = 112; + public static final int V15W34A = 114; + public static final int V15W34B = 115; + public static final int V15W34C = 116; + public static final int V15W34D = 117; + public static final int V15W35A = 118; + public static final int V15W35B = 119; + public static final int V15W35C = 120; + public static final int V15W35D = 121; + public static final int V15W35E = 122; + public static final int V15W36A = 123; + public static final int V15W36B = 124; + public static final int V15W36C = 125; + public static final int V15W36D = 126; + public static final int V15W37A = 127; + public static final int V15W38A = 128; + public static final int V15W38B = 129; + public static final int V15W39A = 130; + public static final int V15W39B = 131; + public static final int V15W39C = 132; + public static final int V15W40A = 133; + public static final int V15W40B = 134; + public static final int V15W41A = 136; + public static final int V15W41B = 137; + public static final int V15W42A = 138; + public static final int V15W43A = 139; + public static final int V15W43B = 140; + public static final int V15W43C = 141; + public static final int V15W44A = 142; + public static final int V15W44B = 143; + public static final int V15W45A = 145; + public static final int V15W46A = 146; + public static final int V15W47A = 148; + public static final int V15W47B = 149; + public static final int V15W47C = 150; + public static final int V15W49A = 151; + public static final int V15W49B = 152; + public static final int V15W50A = 153; + public static final int V15W51A = 154; + public static final int V15W51B = 155; + public static final int V16W02A = 156; + public static final int V16W03A = 157; + public static final int V16W04A = 158; + public static final int V16W05A = 159; + public static final int V16W05B = 160; + public static final int V16W06A = 161; + public static final int V16W07A = 162; + public static final int V16W07B = 163; + public static final int V1_9_PRE1 = 164; + public static final int V1_9_PRE2 = 165; + public static final int V1_9_PRE3 = 167; + public static final int V1_9_PRE4 = 168; + public static final int V1_9 = 169; + public static final int V1_9_1_PRE1 = 170; + public static final int V1_9_1_PRE2 = 171; + public static final int V1_9_1_PRE3 = 172; + public static final int V1_9_1 = 175; + public static final int V1_9_2 = 176; + public static final int V16W14A = 177; + public static final int V16W15A = 178; + public static final int V16W15B = 179; + public static final int V1_9_3_PRE1 = 180; + public static final int V1_9_3_PRE2 = 181; + public static final int V1_9_3_PRE3 = 182; + public static final int V1_9_3 = 183; + public static final int V1_9_4 = 184; + public static final int V16W20A = 501; + public static final int V16W21A = 503; + public static final int V16W21B = 504; + public static final int V1_10_PRE1 = 506; + public static final int V1_10_PRE2 = 507; + public static final int V1_10 = 510; + public static final int V1_10_1 = 511; + public static final int V1_10_2 = 512; + public static final int V16W32A = 800; + public static final int V16W32B = 801; + public static final int V16W33A = 802; + public static final int V16W35A = 803; + public static final int V16W36A = 805; + public static final int V16W38A = 807; + public static final int V16W39A = 809; + public static final int V16W39B = 811; + public static final int V16W39C = 812; + public static final int V16W40A = 813; + public static final int V16W41A = 814; + public static final int V16W42A = 815; + public static final int V16W43A = 816; + public static final int V16W44A = 817; + public static final int V1_11_PRE1 = 818; + public static final int V1_11 = 819; + public static final int V16W50A = 920; + public static final int V1_11_1 = 921; + public static final int V1_11_2 = 922; + public static final int V17W06A = 1022; + public static final int V17W13A = 1122; + public static final int V17W13B = 1123; + public static final int V17W14A = 1124; + public static final int V17W15A = 1125; + public static final int V17W16A = 1126; + public static final int V17W16B = 1127; + public static final int V17W17A = 1128; + public static final int V17W17B = 1129; + public static final int V17W18A = 1130; + public static final int V17W18B = 1131; + public static final int V1_12_PRE1 = 1132; + public static final int V1_12_PRE2 = 1133; + public static final int V1_12_PRE3 = 1134; + public static final int V1_12_PRE4 = 1135; + public static final int V1_12_PRE5 = 1136; + public static final int V1_12_PRE6 = 1137; + public static final int V1_12_PRE7 = 1138; + public static final int V1_12 = 1139; + public static final int V17W31A = 1239; + public static final int V1_12_1_PRE1 = 1240; + public static final int V1_12_1 = 1241; + public static final int V1_12_2_PRE1 = 1341; + public static final int V1_12_2_PRE2 = 1342; + public static final int V1_12_2 = 1343; + public static final int V17W43A = 1444; + public static final int V17W43B = 1445; + public static final int V17W45A = 1447; + public static final int V17W45B = 1448; + public static final int V17W46A = 1449; + public static final int V17W47A = 1451; + public static final int V17W47B = 1452; + public static final int V17W48A = 1453; + public static final int V17W49A = 1454; + public static final int V17W49B = 1455; + public static final int V17W50A = 1457; + public static final int V18W01A = 1459; + public static final int V18W02A = 1461; + public static final int V18W03A = 1462; + public static final int V18W03B = 1463; + public static final int V18W05A = 1464; + public static final int V18W06A = 1466; + public static final int V18W07A = 1467; + public static final int V18W07B = 1468; + public static final int V18W07C = 1469; + public static final int V18W08A = 1470; + public static final int V18W08B = 1471; + public static final int V18W09A = 1472; + public static final int V18W10A = 1473; + public static final int V18W10B = 1474; + public static final int V18W10C = 1476; + public static final int V18W10D = 1477; + public static final int V18W11A = 1478; + public static final int V18W14A = 1479; + public static final int V18W14B = 1481; + public static final int V18W15A = 1482; + public static final int V18W16A = 1483; + public static final int V18W19A = 1484; + public static final int V18W19B = 1485; + public static final int V18W20A = 1489; + public static final int V18W20B = 1491; + public static final int V18W20C = 1493; + public static final int V18W21A = 1495; + public static final int V18W21B = 1496; + public static final int V18W22A = 1497; + public static final int V18W22B = 1498; + public static final int V18W22C = 1499; + public static final int V1_13_PRE1 = 1501; + public static final int V1_13_PRE2 = 1502; + public static final int V1_13_PRE3 = 1503; + public static final int V1_13_PRE4 = 1504; + public static final int V1_13_PRE5 = 1511; + public static final int V1_13_PRE6 = 1512; + public static final int V1_13_PRE7 = 1513; + public static final int V1_13_PRE8 = 1516; + public static final int V1_13_PRE9 = 1517; + public static final int V1_13_PRE10 = 1518; + public static final int V1_13 = 1519; + public static final int V18W30A = 1620; + public static final int V18W30B = 1621; + public static final int V18W31A = 1622; + public static final int V18W32A = 1623; + public static final int V18W33A = 1625; + public static final int V1_13_1_PRE1 = 1626; + public static final int V1_13_1_PRE2 = 1627; + public static final int V1_13_1 = 1628; + public static final int V1_13_2_PRE1 = 1629; + public static final int V1_13_2_PRE2 = 1630; + public static final int V1_13_2 = 1631; + public static final int V18W43A = 1901; + public static final int V18W43B = 1902; + public static final int V18W43C = 1903; + public static final int V18W44A = 1907; + public static final int V18W45A = 1908; + public static final int V18W46A = 1910; + public static final int V18W47A = 1912; + public static final int V18W47B = 1913; + public static final int V18W48A = 1914; + public static final int V18W48B = 1915; + public static final int V18W49A = 1916; + public static final int V18W50A = 1919; + public static final int V19W02A = 1921; + public static final int V19W03A = 1922; + public static final int V19W03B = 1923; + public static final int V19W03C = 1924; + public static final int V19W04A = 1926; + public static final int V19W04B = 1927; + public static final int V19W05A = 1930; + public static final int V19W06A = 1931; + public static final int V19W07A = 1932; + public static final int V19W08A = 1933; + public static final int V19W08B = 1934; + public static final int V19W09A = 1935; + public static final int V19W11A = 1937; + public static final int V19W11B = 1938; + public static final int V19W12A = 1940; + public static final int V19W12B = 1941; + public static final int V19W13A = 1942; + public static final int V19W13B = 1943; + public static final int V19W14A = 1944; + public static final int V19W14B = 1945; + public static final int V1_14_PRE1 = 1947; + public static final int V1_14_PRE2 = 1948; + public static final int V1_14_PRE3 = 1949; + public static final int V1_14_PRE4 = 1950; + public static final int V1_14_PRE5 = 1951; + public static final int V1_14 = 1952; + public static final int V1_14_1_PRE1 = 1955; + public static final int V1_14_1_PRE2 = 1956; + public static final int V1_14_1 = 1957; + public static final int V1_14_2_PRE1 = 1958; + public static final int V1_14_2_PRE2 = 1959; + public static final int V1_14_2_PRE3 = 1960; + public static final int V1_14_2_PRE4 = 1962; + public static final int V1_14_2 = 1963; + public static final int V1_14_3_PRE1 = 1964; + public static final int V1_14_3_PRE2 = 1965; + public static final int V1_14_3_PRE3 = 1966; + public static final int V1_14_3_PRE4 = 1967; + public static final int V1_14_3 = 1968; + public static final int V1_14_4_PRE1 = 1969; + public static final int V1_14_4_PRE2 = 1970; + public static final int V1_14_4_PRE3 = 1971; + public static final int V1_14_4_PRE4 = 1972; + public static final int V1_14_4_PRE5 = 1973; + public static final int V1_14_4_PRE6 = 1974; + public static final int V1_14_4_PRE7 = 1975; + public static final int V1_14_4 = 1976; + public static final int V19W34A = 2200; + public static final int V19W35A = 2201; + public static final int V19W36A = 2203; + public static final int V19W37A = 2204; + public static final int V19W38A = 2205; + public static final int V19W38B = 2206; + public static final int V19W39A = 2207; + public static final int V19W40A = 2208; + public static final int V19W41A = 2210; + public static final int V19W42A = 2212; + public static final int V19W44A = 2213; + public static final int V19W45A = 2214; + public static final int V19W45B = 2215; + public static final int V19W46A = 2216; + public static final int V19W46B = 2217; + public static final int V1_15_PRE1 = 2218; + public static final int V1_15_PRE2 = 2219; + public static final int V1_15_PRE3 = 2220; + public static final int V1_15_PRE4 = 2221; + public static final int V1_15_PRE5 = 2222; + public static final int V1_15_PRE6 = 2223; + public static final int V1_15_PRE7 = 2224; + public static final int V1_15 = 2225; + public static final int V1_15_1_PRE1 = 2226; + public static final int V1_15_1 = 2227; + public static final int V1_15_2_PRE1 = 2228; + public static final int V1_15_2_PRE2 = 2229; + public static final int V1_15_2 = 2230; + public static final int V20W06A = 2504; + public static final int V20W07A = 2506; + public static final int V20W08A = 2507; + public static final int V20W09A = 2510; + public static final int V20W10A = 2512; + public static final int V20W11A = 2513; + public static final int V20W12A = 2515; + public static final int V20W13A = 2520; + public static final int V20W13B = 2521; + public static final int V20W14A = 2524; + public static final int V20W15A = 2525; + public static final int V20W16A = 2526; + public static final int V20W17A = 2529; + public static final int V20W18A = 2532; + public static final int V20W19A = 2534; + public static final int V20W20A = 2536; + public static final int V20W20B = 2537; + public static final int V20W21A = 2554; + public static final int V20W22A = 2555; + public static final int V1_16_PRE1 = 2556; + public static final int V1_16_PRE2 = 2557; + public static final int V1_16_PRE3 = 2559; + public static final int V1_16_PRE4 = 2560; + public static final int V1_16_PRE5 = 2561; + public static final int V1_16_PRE6 = 2562; + public static final int V1_16_PRE7 = 2563; + public static final int V1_16_PRE8 = 2564; + public static final int V1_16_RC1 = 2565; + public static final int V1_16 = 2566; + public static final int V1_16_1 = 2567; + public static final int V20W27A = 2569; + public static final int V20W28A = 2570; + public static final int V20W29A = 2571; + public static final int V20W30A = 2572; + public static final int V1_16_2_PRE1 = 2573; + public static final int V1_16_2_PRE2 = 2574; + public static final int V1_16_2_PRE3 = 2575; + public static final int V1_16_2_RC1 = 2576; + public static final int V1_16_2_RC2 = 2577; + public static final int V1_16_2 = 2578; + public static final int V1_16_3_RC1 = 2579; + public static final int V1_16_3 = 2580; + public static final int V1_16_4_PRE1 = 2581; + public static final int V1_16_4_PRE2 = 2582; + public static final int V1_16_4_RC1 = 2583; + public static final int V1_16_4 = 2584; + public static final int V1_16_5_RC1 = 2585; + public static final int V1_16_5 = 2586; + public static final int V20W45A = 2681; + public static final int V20W46A = 2682; + public static final int V20W48A = 2683; + public static final int V20W49A = 2685; + public static final int V20W51A = 2687; + public static final int V21W03A = 2689; + public static final int V21W05A = 2690; + public static final int V21W05B = 2692; + public static final int V21W06A = 2694; + public static final int V21W07A = 2695; + public static final int V21W08A = 2697; + public static final int V21W08B = 2698; + public static final int V21W10A = 2699; + public static final int V21W11A = 2703; + public static final int V21W13A = 2705; + public static final int V21W14A = 2706; + public static final int V21W15A = 2709; + public static final int V21W16A = 2711; + public static final int V21W17A = 2712; + public static final int V21W18A = 2713; + public static final int V21W19A = 2714; + public static final int V21W20A = 2715; + public static final int V1_17_PRE1 = 2716; + public static final int V1_17_PRE2 = 2718; + public static final int V1_17_PRE3 = 2719; + public static final int V1_17_PRE4 = 2720; + public static final int V1_17_PRE5 = 2721; + public static final int V1_17_RC1 = 2722; + public static final int V1_17_RC2 = 2723; + public static final int V1_17 = 2724; + public static final int V1_17_1_PRE1 = 2725; + public static final int V1_17_1_PRE2 = 2726; + public static final int V1_17_1_PRE3 = 2727; + public static final int V1_17_1_RC1 = 2728; + public static final int V1_17_1_RC2 = 2729; + public static final int V1_17_1 = 2730; + public static final int V21W37A = 2834; + public static final int V21W38A = 2835; + public static final int V21W39A = 2836; + public static final int V21W40A = 2838; + public static final int V21W41A = 2839; + public static final int V21W42A = 2840; + public static final int V21W43A = 2844; + public static final int V21W44A = 2845; + public static final int V1_18_PRE1 = 2847; + public static final int V1_18_PRE2 = 2848; + public static final int V1_18_PRE3 = 2849; + public static final int V1_18_PRE4 = 2850; + public static final int V1_18_PRE5 = 2851; + public static final int V1_18_PRE6 = 2853; + public static final int V1_18_PRE7 = 2854; + public static final int V1_18_PRE8 = 2855; + public static final int V1_18_RC1 = 2856; + public static final int V1_18_RC2 = 2857; + public static final int V1_18_RC3 = 2858; + public static final int V1_18_RC4 = 2859; + public static final int V1_18 = 2860; + public static final int V1_18_1_PRE1 = 2861; + public static final int V1_18_1_RC1 = 2862; + public static final int V1_18_1_RC2 = 2863; + public static final int V1_18_1_RC3 = 2864; + public static final int V1_18_1 = 2865; + public static final int V22W03A = 2966; + public static final int V22W05A = 2967; + public static final int V22W06A = 2968; + public static final int V22W07A = 2969; + public static final int V1_18_2_PRE1 = 2971; + public static final int V1_18_2_PRE2 = 2972; + public static final int V1_18_2_PRE3 = 2973; + public static final int V1_18_2_RC1 = 2974; + public static final int V1_18_2 = 2975; + public static final int V22W11A = 3080; + public static final int V22W12A = 3082; + public static final int V22W13A = 3085; + public static final int V22W14A = 3088; + public static final int V22W15A = 3089; + public static final int V22W16A = 3091; + public static final int V22W16B = 3092; + public static final int V22W17A = 3093; + public static final int V22W18A = 3095; + public static final int V22W19A = 3096; + public static final int V1_19_PRE1 = 3098; + public static final int V1_19_PRE2 = 3099; + public static final int V1_19_PRE3 = 3100; + public static final int V1_19_PRE4 = 3101; + public static final int V1_19_PRE5 = 3102; + public static final int V1_19_RC1 = 3103; + public static final int V1_19_RC2 = 3104; + public static final int V1_19 = 3105; + public static final int V22W24A = 3106; + public static final int V1_19_1_PRE1 = 3107; + public static final int V1_19_1_RC1 = 3109; + public static final int V1_19_1_PRE2 = 3110; + public static final int V1_19_1_PRE3 = 3111; + public static final int V1_19_1_PRE4 = 3112; + public static final int V1_19_1_PRE5 = 3113; + public static final int V1_19_1_PRE6 = 3114; + public static final int V1_19_1_RC2 = 3115; + public static final int V1_19_1_RC3 = 3116; + public static final int V1_19_1 = 3117; + public static final int V1_19_2_RC1 = 3118; + public static final int V1_19_2_RC2 = 3119; + public static final int V1_19_2 = 3120; + public static final int V22W42A = 3205; + public static final int V22W43A = 3206; + public static final int V22W44A = 3207; + public static final int V22W45A = 3208; + public static final int V22W46A = 3210; + public static final int V1_19_3_PRE1 = 3211; + public static final int V1_19_3_PRE2 = 3212; + public static final int V1_19_3_PRE3 = 3213; + public static final int V1_19_3_RC1 = 3215; + public static final int V1_19_3 = 3218; + public static final int V23W03A = 3320; + public static final int V23W04A = 3321; + public static final int V23W05A = 3323; + public static final int V23W06A = 3326; + public static final int V23W07A = 3329; + public static final int V1_19_4_PRE1 = 3330; + public static final int V1_19_4_PRE2 = 3331; + public static final int V1_19_4_PRE3 = 3332; + public static final int V1_19_4_PRE4 = 3333; + public static final int V1_19_4_RC1 = 3334; + public static final int V1_19_4_RC2 = 3335; + public static final int V1_19_4_RC3 = 3336; + public static final int V1_19_4 = 3337; + public static final int V23W12A = 3442; + public static final int V23W13A = 3443; + public static final int V23W14A = 3445; + public static final int V23W16A = 3449; + public static final int V23W17A = 3452; + public static final int V23W19A = 3453; + public static final int V1_20_PRE1 = 3454; + public static final int V1_20_PRE2 = 3455; + public static final int V1_20_PRE3 = 3456; + public static final int V1_20_PRE4 = 3457; + public static final int V1_20_PRE5 = 3458; + public static final int V1_20_PRE6 = 3460; + public static final int V1_20_PRE7 = 3461; + public static final int V1_20_RC1 = 3462; + public static final int V1_20 = 3463; + public static final int V1_20_1_RC1 = 3464; + public static final int V1_20_1 = 3465; + public static final int V23W31A = 3567; + public static final int V23W32A = 3569; + public static final int V23W33A = 3570; + public static final int V23W35A = 3571; + public static final int V1_20_2_PRE1 = 3572; + public static final int V1_20_2_PRE2 = 3573; + public static final int V1_20_2_PRE3 = 3574; + public static final int V1_20_2_PRE4 = 3575; + public static final int V1_20_2_RC1 = 3576; + public static final int V1_20_2_RC2 = 3577; + public static final int V1_20_2 = 3578; + public static final int V23W40A = 3679; + public static final int V23W41A = 3681; + public static final int V23W42A = 3684; + public static final int V23W43A = 3686; + public static final int V23W43B = 3687; + public static final int V23W44A = 3688; + public static final int V23W45A = 3690; + public static final int V23W46A = 3691; + public static final int V1_20_3_PRE1 = 3693; + public static final int V1_20_3_PRE2 = 3694; + public static final int V1_20_3_PRE3 = 3695; + public static final int V1_20_3_PRE4 = 3696; + public static final int V1_20_3_RC1 = 3697; + public static final int V1_20_3 = 3698; + public static final int V1_20_4_RC1 = 3699; + public static final int V1_20_4 = 3700; + public static final int V23W51A = 3801; + public static final int V23W51B = 3802; + public static final int V24W03A = 3804; + public static final int V24W03B = 3805; + public static final int V24W04A = 3806; + public static final int V24W05A = 3809; + public static final int V24W05B = 3811; + public static final int V24W06A = 3815; + public static final int V24W07A = 3817; + public static final int V24W09A = 3819; + public static final int V24W10A = 3821; + public static final int V24W11A = 3823; + public static final int V24W12A = 3824; + public static final int V24W13A = 3826; + public static final int V24W14A = 3827; + public static final int V1_20_5_PRE1 = 3829; + public static final int V1_20_5_PRE2 = 3830; + public static final int V1_20_5_PRE3 = 3831; + public static final int V1_20_5_PRE4 = 3832; + public static final int V1_20_5_RC1 = 3834; + public static final int V1_20_5_RC2 = 3835; + public static final int V1_20_5_RC3 = 3836; + public static final int V1_20_5 = 3837; + public static final int V1_20_6_RC1 = 3838; + public static final int V1_20_6 = 3839; + public static final int V24W18A = 3940; + public static final int V24W19A = 3941; + public static final int V24W19B = 3942; + public static final int V24W20A = 3944; + public static final int V24W21A = 3946; + public static final int V24W21B = 3947; + public static final int V1_21_PRE1 = 3948; + public static final int V1_21_PRE2 = 3949; + public static final int V1_21_PRE3 = 3950; + public static final int V1_21_PRE4 = 3951; + public static final int V1_21_RC1 = 3952; + public static final int V1_21 = 3953; + public static final int V1_21_RC = 3954; + public static final int V1_21_1 = 3955; + public static final int V24W33A = 4058; + public static final int V24W34A = 4060; + public static final int V24W35A = 4062; + public static final int V24W36A = 4063; + public static final int V24W37A = 4065; + public static final int V24W38A = 4066; + public static final int V24W39A = 4069; + public static final int V24W40A = 4072; + public static final int V1_21_2_PRE1 = 4073; + public static final int V1_21_2_PRE2 = 4074; + public static final int V1_21_2_PRE3 = 4075; + public static final int V1_21_2_PRE4 = 4076; + public static final int V1_21_2_PRE5 = 4077; + public static final int V1_21_2_RC1 = 4078; + public static final int V1_21_2_RC2 = 4079; + public static final int V1_21_2 = 4080; + public static final int V1_21_3 = 4082; + public static final int V24W44A = 4174; + public static final int V24W45A = 4177; + public static final int V24W46A = 4178; + public static final int V1_21_4_PRE1 = 4179; + public static final int V1_21_4_PRE2 = 4182; + public static final int V1_21_4_PRE3 = 4183; + public static final int V1_21_4_RC1 = 4184; + public static final int V1_21_4_RC2 = 4186; + public static final int V1_21_4_RC3 = 4188; + public static final int V1_21_4 = 4189; + public static final int V25W02A = 4298; + public static final int V25W03A = 4304; + public static final int V25W04A = 4308; + public static final int V25W05A = 4310; + public static final int V25W06A = 4313; + public static final int V25W07A = 4315; + public static final int V25W08A = 4316; + public static final int V25W09A = 4317; + public static final int V25W09B = 4318; + public static final int V25W10A = 4319; + public static final int V1_21_5_PRE1 = 4320; + public static final int V1_21_5_PRE2 = 4321; + public static final int V1_21_5_PRE3 = 4321; + public static final int V1_21_5_RC1 = 4323; + public static final int V1_21_5_RC2 = 4324; + public static final int V1_21_5 = 4325; + public static final int V25W15A = 4422; + public static final int V25W16A = 4423; + public static final int V25W17A = 4425; + public static final int V25W18A = 4426; + public static final int V25W19A = 4427; + public static final int V25W20A = 4428; + public static final int V25W21A = 4429; + public static final int V1_21_6_PRE1 = 4430; + public static final int V1_21_6_PRE2 = 4431; + public static final int V1_21_6_PRE3 = 4432; + public static final int V1_21_6_PRE4 = 4433; + public static final int V1_21_6_RC1 = 4434; + public static final int V1_21_6 = 4435; + public static final int V1_21_7_RC1 = 4436; + public static final int V1_21_7_RC2 = 4437; + public static final int V1_21_7 = 4438; + + private MCVersions() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java new file mode 100644 index 0000000000000000000000000000000000000000..9022385edc8dd887780aa0881741d6d042fe2bc4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.advancements; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.ArrayList; +import java.util.function.Function; + +public final class ConverterAbstractAdvancementsRename { + + private ConverterAbstractAdvancementsRename() {} + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterCriteriaRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterCriteriaRename.java new file mode 100644 index 0000000000000000000000000000000000000000..72d0d70b5ade04469aaecbf454b37a2643923a97 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterCriteriaRename.java @@ -0,0 +1,42 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.advancements; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.function.Function; + +public final class ConverterCriteriaRename extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.java new file mode 100644 index 0000000000000000000000000000000000000000..75efa3e470e3d386f993064b3af7f67d82ca4b50 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractAttributesRename.java @@ -0,0 +1,60 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.attributes; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import java.util.function.Function; + +public final class ConverterAbstractAttributesRename { + + public static void register(final int version, final Function renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int versionStep, final Function renamer) { + MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(version, versionStep) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType attributeModifiers = data.getMap("minecraft:attribute_modifiers"); + if (attributeModifiers == null) { + return null; + } + + final ListType modifiers = attributeModifiers.getList("modifiers", ObjectType.MAP); + if (modifiers == null) { + return null; + } + + for (int i = 0, len = modifiers.size(); i < len; ++i) { + RenameHelper.renameString(modifiers.getMap(i), "type", renamer); + } + + return null; + } + }); + + final DataConverter entityConverter = new DataConverter<>(version, versionStep) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType modifiers = data.getList("attributes", ObjectType.MAP); + if (modifiers == null) { + return null; + } + + for (int i = 0, len = modifiers.size(); i < len; ++i) { + RenameHelper.renameString(modifiers.getMap(i), "id", renamer); + } + + return null; + } + }; + + MCTypeRegistry.ENTITY.addStructureConverter(entityConverter); + MCTypeRegistry.PLAYER.addStructureConverter(entityConverter); + } + + private ConverterAbstractAttributesRename() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractOldAttributesRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractOldAttributesRename.java new file mode 100644 index 0000000000000000000000000000000000000000..1a6d02df13f3461402fed429f7fbdb5acee877c4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterAbstractOldAttributesRename.java @@ -0,0 +1,57 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.attributes; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import java.util.function.Function; + +public final class ConverterAbstractOldAttributesRename { + + public static void register(final int version, final Function renamer) { + register(version, 0, renamer); + } + + public static void register(final int version, final int versionStep, final Function renamer) { + final DataConverter entityConverter = new DataConverter<>(version, versionStep) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType attributes = data.getList("Attributes", ObjectType.MAP); + + if (attributes == null) { + return null; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + RenameHelper.renameString(attributes.getMap(i), "Name", renamer); + } + + return null; + } + }; + + MCTypeRegistry.ENTITY.addStructureConverter(entityConverter); + MCTypeRegistry.PLAYER.addStructureConverter(entityConverter); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(version, versionStep) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType attributes = data.getList("AttributeModifiers", ObjectType.MAP); + + if (attributes == null) { + return null; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + RenameHelper.renameString(attributes.getMap(i), "AttributeName", renamer); + } + + return null; + } + }); + } + + private ConverterAbstractOldAttributesRename() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterEntityAttributesBaseValueUpdater.java b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterEntityAttributesBaseValueUpdater.java new file mode 100644 index 0000000000000000000000000000000000000000..071272260593f834b03b195a1e4c71c81a051be5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/attributes/ConverterEntityAttributesBaseValueUpdater.java @@ -0,0 +1,45 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.attributes; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import java.util.function.DoubleUnaryOperator; + +public final class ConverterEntityAttributesBaseValueUpdater extends DataConverter { + + private final String targetId; + private final DoubleUnaryOperator updater; + + public ConverterEntityAttributesBaseValueUpdater(final int toVersion, final String targetId, final DoubleUnaryOperator updater) { + this(toVersion, 0, targetId, updater); + } + + public ConverterEntityAttributesBaseValueUpdater(final int toVersion, final int versionStep, final String targetId, + final DoubleUnaryOperator updater) { + super(toVersion, versionStep); + this.targetId = targetId; + this.updater = updater; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType modifiers = data.getList("attributes", ObjectType.MAP); + if (modifiers == null) { + return null; + } + + for (int i = 0, len = modifiers.size(); i < len; ++i) { + final MapType modifier = modifiers.getMap(i); + + if (!this.targetId.equals(NamespaceUtil.correctNamespace(modifier.getString("id", "")))) { + continue; + } + + modifier.setDouble("base", this.updater.applyAsDouble(modifier.getDouble("base", 0.0))); + } + + return null; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/blockname/ConverterAbstractBlockRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/blockname/ConverterAbstractBlockRename.java new file mode 100644 index 0000000000000000000000000000000000000000..316bc54366bb1ba2273e52dc52aaef6c8e43a2c3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/blockname/ConverterAbstractBlockRename.java @@ -0,0 +1,64 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.blockname; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.function.Function; + +public final class ConverterAbstractBlockRename { + + private ConverterAbstractBlockRename() {} + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterAddBlendingData.java b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterAddBlendingData.java new file mode 100644 index 0000000000000000000000000000000000000000..038f19b72870aee2b94e6691c03074e464e7d253 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterAddBlendingData.java @@ -0,0 +1,65 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.chunk; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public final class ConverterAddBlendingData extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterFlattenChunk.java b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterFlattenChunk.java new file mode 100644 index 0000000000000000000000000000000000000000..ed7468f57047ad4ec7bf58680871848efe350182 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterFlattenChunk.java @@ -0,0 +1,1016 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.chunk; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperItemNameV102; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import com.mojang.datafixers.DataFixUtils; +import com.mojang.logging.LogUtils; +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntIterator; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; +import net.minecraft.util.datafix.PackedBitStorage; +import org.slf4j.Logger; +import java.util.Arrays; +import java.util.BitSet; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Objects; + +import static it.unimi.dsi.fastutil.HashCommon.arraySize; + +public final class ConverterFlattenChunk extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterRenameStatus.java b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterRenameStatus.java new file mode 100644 index 0000000000000000000000000000000000000000..5ba45909b5e60655f83ba96a8dc9ae43077c9fa4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/chunk/ConverterRenameStatus.java @@ -0,0 +1,32 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.chunk; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import java.util.function.Function; + +public final class ConverterRenameStatus extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterAbstractEntityRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterAbstractEntityRename.java new file mode 100644 index 0000000000000000000000000000000000000000..e7e34dd98541f28a9d9abd43c65c0772062e6de2 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterAbstractEntityRename.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.entity; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.function.Function; + +public final class ConverterAbstractEntityRename { + + private ConverterAbstractEntityRename() {} + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityToVariant.java b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityToVariant.java new file mode 100644 index 0000000000000000000000000000000000000000..915df90809ca5614393c851da2603920893c4251 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityToVariant.java @@ -0,0 +1,44 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.entity; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.function.IntFunction; + +public final class ConverterEntityToVariant extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityVariantRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityVariantRename.java new file mode 100644 index 0000000000000000000000000000000000000000..81385ba3acb471437eb36cd289ad0548cb59b93b --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterEntityVariantRename.java @@ -0,0 +1,37 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.entity; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.function.Function; + +public final class ConverterEntityVariantRename extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterFlattenEntity.java b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterFlattenEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..610cafc176ca951b49b0db1b9f9386d3c3fa2ce3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/entity/ConverterFlattenEntity.java @@ -0,0 +1,371 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.entity; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +import java.util.HashMap; +import java.util.Map; + +public final class ConverterFlattenEntity extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/helpers/AddFlagIfAbsent.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/AddFlagIfAbsent.java new file mode 100644 index 0000000000000000000000000000000000000000..3ebc450551fe75bc3d22c8162eda91bd4105b80a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/AddFlagIfAbsent.java @@ -0,0 +1,30 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.helpers; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class AddFlagIfAbsent extends DataConverter { + + public final String path; + public final boolean dfl; + + public AddFlagIfAbsent(final int toVersion, final String path, final boolean dfl) { + super(toVersion); + this.path = path; + this.dfl = dfl; + } + + public AddFlagIfAbsent(final int toVersion, final int versionStep, final String path, final boolean dfl) { + super(toVersion, versionStep); + this.path = path; + this.dfl = dfl; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey(this.path)) { + data.setBoolean(this.path, this.dfl); + } + return null; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/ConverterAbstractStringValueTypeRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/ConverterAbstractStringValueTypeRename.java new file mode 100644 index 0000000000000000000000000000000000000000..bc79670f47aaa413ea3e96ef6a32e14099ad8a58 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/ConverterAbstractStringValueTypeRename.java @@ -0,0 +1,24 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.helpers; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCValueType; +import java.util.function.Function; + +public final class ConverterAbstractStringValueTypeRename { + + private ConverterAbstractStringValueTypeRename() {} + + public static void register(final int version, final MCValueType type, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/helpers/CopyHelper.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/CopyHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..549c997463df2d5c9e0d1c29a6df8ba8eeecfce8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/CopyHelper.java @@ -0,0 +1,79 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.helpers; + +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class CopyHelper { + + // sets value at dstPath in dst to a copied value of the value at srcPath in src + public static boolean copy(final MapType src, final String srcPath, final MapType dst, final String dstPath) { + final Object val = src.getGeneric(srcPath); + if (val == null) { + dst.remove(dstPath); + return false; + } + + dst.setGeneric(dstPath, copyGeneric(val)); + return true; + } + + // moves the value at dstPath in dst to srcPath in src + public static boolean move(final MapType src, final String srcPath, final MapType dst, final String dstPath) { + final Object val = src.getGeneric(srcPath); + src.remove(srcPath); + if (val == null) { + dst.remove(dstPath); + return false; + } + + dst.setGeneric(dstPath, val); + return true; + } + + public static Number sanitizeNumber(final Number input) { + return switch (input) { + case Byte b -> b; + case Short s -> s; + case Integer i -> i; + case Long l -> l; + case Float f -> f; + case Double d -> d; + default -> null; + }; + } + + public static Object copyGeneric(final Object value) { + if (value == null || value instanceof String || value instanceof Boolean) { + // immutable + return value; + } + if (value instanceof Number number) { + if (sanitizeNumber(number) == null) { + throw new IllegalArgumentException("Unknown type: " + value.getClass()); + } + return number; + } + + if (value instanceof MapType mapType) { + return mapType.copy(); + } + + if (value instanceof ListType listType) { + return listType.copy(); + } + + if (value.getClass().isArray()) { + if (value instanceof byte[] bytes) { + return bytes.clone(); + } else if (value instanceof short[] shorts) { + return shorts.clone(); + } else if (value instanceof int[] ints) { + return ints.clone(); + } else if (value instanceof long[] longs) { + return longs.clone(); + } // else: fall through to throw + } + + throw new IllegalArgumentException("Unknown type: " + value.getClass()); + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperBlockFlatteningV1450.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperBlockFlatteningV1450.java new file mode 100644 index 0000000000000000000000000000000000000000..f632da9870305e96d51f7b5abd33749a4a15916d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperBlockFlatteningV1450.java @@ -0,0 +1,1829 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.helpers; + +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.nbt.NBTMapType; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.minecraft.nbt.TagParser; +import java.util.HashMap; +import java.util.Map; + +public final class HelperBlockFlatteningV1450 { + + protected static final MapType[] FLATTENED_BY_ID = new MapType[4096]; + protected static final MapType[] BLOCK_DEFAULTS = new MapType[4096]; + + private static final Object2IntOpenHashMap 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 IDENTITY_ENSURE = new HashMap<>(); + + public static MapType parseTag(final String blockstate) { + try { + final MapType ret = new NBTMapType(TagParser.parseCompoundFully(blockstate.replace('\'', '"'))); + + synchronized (IDENTITY_ENSURE) { + final MapType identity = IDENTITY_ENSURE.putIfAbsent(ret, ret); + + return identity == null ? ret : identity; + } + + } catch (final Exception ex) { + throw new RuntimeException("Exception parsing " + blockstate, ex); + } + } + + private static void register(final int id, final String flattened, final String... preFlattenings) { + final MapType flattenedNBT = parseTag(flattened); + if (FLATTENED_BY_ID[id] != null) { + throw new RuntimeException("Mapping already exists for id " + id); + } + FLATTENED_BY_ID[id] = flattenedNBT; + + // it's important that we register ids from smallest to largest, so that + // the default is going to be correct + final int block = id >> 4; + if (BLOCK_DEFAULTS[block] == null) { + BLOCK_DEFAULTS[block] = flattenedNBT; + } + + for (final String preFlattening : preFlattenings) { + final MapType preFlatteningNBT = parseTag(preFlattening); + final String name = preFlatteningNBT.getString("Name"); + if (name == null) { + throw new RuntimeException("Name does not exist for pre flattenings for id " + id); + } + + // putIfAbsent so we default to the lowest id, which is going to be the block default + ID_BY_OLD_NAME.putIfAbsent(name, id); + ID_BY_OLD_NBT.put(preFlatteningNBT, id); + } + } + + private static void finalizeMaps() { + for(int i = 0; i < FLATTENED_BY_ID.length; ++i) { + if (FLATTENED_BY_ID[i] == null) { + FLATTENED_BY_ID[i] = BLOCK_DEFAULTS[i >> 4]; + } + } + } + + public static MapType flattenNBT(final MapType old) { + final int id = ID_BY_OLD_NBT.getInt(old); + final MapType ret = getNBTForIdRaw(id); + + return ret == null ? old : ret; + } + + public static String getNewBlockName(final String old) { + final int id = ID_BY_OLD_NAME.getInt(old); + final MapType ret = getNBTForIdRaw(id); + return ret == null ? old : ret.getString("Name"); + } + + public static String getNameForId(final int block) { + final MapType nbt = getNBTForIdRaw(block); + return nbt == null ? "minecraft:air" : nbt.getString("Name"); + } + + protected static MapType getNBTForIdRaw(final int block) { + return block >= 0 && block < FLATTENED_BY_ID.length ? FLATTENED_BY_ID[block] : null; + } + + public static MapType getNBTForId(final int block) { + MapType ret = getNBTForIdRaw(block); + return ret == null ? FLATTENED_BY_ID[0] : ret; + } + + private HelperBlockFlatteningV1450() {} + + static { + ID_BY_OLD_NBT.defaultReturnValue(-1); + register(0, "{Name:'minecraft:air'}", "{Name:'minecraft:air'}"); + register(16, "{Name:'minecraft:stone'}", "{Name:'minecraft:stone',Properties:{variant:'stone'}}"); + register(17, "{Name:'minecraft:granite'}", "{Name:'minecraft:stone',Properties:{variant:'granite'}}"); + register(18, "{Name:'minecraft:polished_granite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_granite'}}"); + register(19, "{Name:'minecraft:diorite'}", "{Name:'minecraft:stone',Properties:{variant:'diorite'}}"); + register(20, "{Name:'minecraft:polished_diorite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_diorite'}}"); + register(21, "{Name:'minecraft:andesite'}", "{Name:'minecraft:stone',Properties:{variant:'andesite'}}"); + register(22, "{Name:'minecraft:polished_andesite'}", "{Name:'minecraft:stone',Properties:{variant:'smooth_andesite'}}"); + register(32, "{Name:'minecraft:grass_block',Properties:{snowy:'false'}}", "{Name:'minecraft:grass',Properties:{snowy:'false'}}", "{Name:'minecraft:grass',Properties:{snowy:'true'}}"); + register(48, "{Name:'minecraft:dirt'}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'dirt'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'dirt'}}"); + register(49, "{Name:'minecraft:coarse_dirt'}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'coarse_dirt'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'coarse_dirt'}}"); + register(50, "{Name:'minecraft:podzol',Properties:{snowy:'false'}}", "{Name:'minecraft:dirt',Properties:{snowy:'false',variant:'podzol'}}", "{Name:'minecraft:dirt',Properties:{snowy:'true',variant:'podzol'}}"); + register(64, "{Name:'minecraft:cobblestone'}", "{Name:'minecraft:cobblestone'}"); + register(80, "{Name:'minecraft:oak_planks'}", "{Name:'minecraft:planks',Properties:{variant:'oak'}}"); + register(81, "{Name:'minecraft:spruce_planks'}", "{Name:'minecraft:planks',Properties:{variant:'spruce'}}"); + register(82, "{Name:'minecraft:birch_planks'}", "{Name:'minecraft:planks',Properties:{variant:'birch'}}"); + register(83, "{Name:'minecraft:jungle_planks'}", "{Name:'minecraft:planks',Properties:{variant:'jungle'}}"); + register(84, "{Name:'minecraft:acacia_planks'}", "{Name:'minecraft:planks',Properties:{variant:'acacia'}}"); + register(85, "{Name:'minecraft:dark_oak_planks'}", "{Name:'minecraft:planks',Properties:{variant:'dark_oak'}}"); + register(96, "{Name:'minecraft:oak_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'oak'}}"); + register(97, "{Name:'minecraft:spruce_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'spruce'}}"); + register(98, "{Name:'minecraft:birch_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'birch'}}"); + register(99, "{Name:'minecraft:jungle_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'jungle'}}"); + register(100, "{Name:'minecraft:acacia_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'acacia'}}"); + register(101, "{Name:'minecraft:dark_oak_sapling',Properties:{stage:'0'}}", "{Name:'minecraft:sapling',Properties:{stage:'0',type:'dark_oak'}}"); + register(104, "{Name:'minecraft:oak_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'oak'}}"); + register(105, "{Name:'minecraft:spruce_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'spruce'}}"); + register(106, "{Name:'minecraft:birch_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'birch'}}"); + register(107, "{Name:'minecraft:jungle_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'jungle'}}"); + register(108, "{Name:'minecraft:acacia_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'acacia'}}"); + register(109, "{Name:'minecraft:dark_oak_sapling',Properties:{stage:'1'}}", "{Name:'minecraft:sapling',Properties:{stage:'1',type:'dark_oak'}}"); + register(112, "{Name:'minecraft:bedrock'}", "{Name:'minecraft:bedrock'}"); + register(128, "{Name:'minecraft:water',Properties:{level:'0'}}", "{Name:'minecraft:flowing_water',Properties:{level:'0'}}"); + register(129, "{Name:'minecraft:water',Properties:{level:'1'}}", "{Name:'minecraft:flowing_water',Properties:{level:'1'}}"); + register(130, "{Name:'minecraft:water',Properties:{level:'2'}}", "{Name:'minecraft:flowing_water',Properties:{level:'2'}}"); + register(131, "{Name:'minecraft:water',Properties:{level:'3'}}", "{Name:'minecraft:flowing_water',Properties:{level:'3'}}"); + register(132, "{Name:'minecraft:water',Properties:{level:'4'}}", "{Name:'minecraft:flowing_water',Properties:{level:'4'}}"); + register(133, "{Name:'minecraft:water',Properties:{level:'5'}}", "{Name:'minecraft:flowing_water',Properties:{level:'5'}}"); + register(134, "{Name:'minecraft:water',Properties:{level:'6'}}", "{Name:'minecraft:flowing_water',Properties:{level:'6'}}"); + register(135, "{Name:'minecraft:water',Properties:{level:'7'}}", "{Name:'minecraft:flowing_water',Properties:{level:'7'}}"); + register(136, "{Name:'minecraft:water',Properties:{level:'8'}}", "{Name:'minecraft:flowing_water',Properties:{level:'8'}}"); + register(137, "{Name:'minecraft:water',Properties:{level:'9'}}", "{Name:'minecraft:flowing_water',Properties:{level:'9'}}"); + register(138, "{Name:'minecraft:water',Properties:{level:'10'}}", "{Name:'minecraft:flowing_water',Properties:{level:'10'}}"); + register(139, "{Name:'minecraft:water',Properties:{level:'11'}}", "{Name:'minecraft:flowing_water',Properties:{level:'11'}}"); + register(140, "{Name:'minecraft:water',Properties:{level:'12'}}", "{Name:'minecraft:flowing_water',Properties:{level:'12'}}"); + register(141, "{Name:'minecraft:water',Properties:{level:'13'}}", "{Name:'minecraft:flowing_water',Properties:{level:'13'}}"); + register(142, "{Name:'minecraft:water',Properties:{level:'14'}}", "{Name:'minecraft:flowing_water',Properties:{level:'14'}}"); + register(143, "{Name:'minecraft:water',Properties:{level:'15'}}", "{Name:'minecraft:flowing_water',Properties:{level:'15'}}"); + register(144, "{Name:'minecraft:water',Properties:{level:'0'}}", "{Name:'minecraft:water',Properties:{level:'0'}}"); + register(145, "{Name:'minecraft:water',Properties:{level:'1'}}", "{Name:'minecraft:water',Properties:{level:'1'}}"); + register(146, "{Name:'minecraft:water',Properties:{level:'2'}}", "{Name:'minecraft:water',Properties:{level:'2'}}"); + register(147, "{Name:'minecraft:water',Properties:{level:'3'}}", "{Name:'minecraft:water',Properties:{level:'3'}}"); + register(148, "{Name:'minecraft:water',Properties:{level:'4'}}", "{Name:'minecraft:water',Properties:{level:'4'}}"); + register(149, "{Name:'minecraft:water',Properties:{level:'5'}}", "{Name:'minecraft:water',Properties:{level:'5'}}"); + register(150, "{Name:'minecraft:water',Properties:{level:'6'}}", "{Name:'minecraft:water',Properties:{level:'6'}}"); + register(151, "{Name:'minecraft:water',Properties:{level:'7'}}", "{Name:'minecraft:water',Properties:{level:'7'}}"); + register(152, "{Name:'minecraft:water',Properties:{level:'8'}}", "{Name:'minecraft:water',Properties:{level:'8'}}"); + register(153, "{Name:'minecraft:water',Properties:{level:'9'}}", "{Name:'minecraft:water',Properties:{level:'9'}}"); + register(154, "{Name:'minecraft:water',Properties:{level:'10'}}", "{Name:'minecraft:water',Properties:{level:'10'}}"); + register(155, "{Name:'minecraft:water',Properties:{level:'11'}}", "{Name:'minecraft:water',Properties:{level:'11'}}"); + register(156, "{Name:'minecraft:water',Properties:{level:'12'}}", "{Name:'minecraft:water',Properties:{level:'12'}}"); + register(157, "{Name:'minecraft:water',Properties:{level:'13'}}", "{Name:'minecraft:water',Properties:{level:'13'}}"); + register(158, "{Name:'minecraft:water',Properties:{level:'14'}}", "{Name:'minecraft:water',Properties:{level:'14'}}"); + register(159, "{Name:'minecraft:water',Properties:{level:'15'}}", "{Name:'minecraft:water',Properties:{level:'15'}}"); + register(160, "{Name:'minecraft:lava',Properties:{level:'0'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'0'}}"); + register(161, "{Name:'minecraft:lava',Properties:{level:'1'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'1'}}"); + register(162, "{Name:'minecraft:lava',Properties:{level:'2'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'2'}}"); + register(163, "{Name:'minecraft:lava',Properties:{level:'3'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'3'}}"); + register(164, "{Name:'minecraft:lava',Properties:{level:'4'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'4'}}"); + register(165, "{Name:'minecraft:lava',Properties:{level:'5'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'5'}}"); + register(166, "{Name:'minecraft:lava',Properties:{level:'6'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'6'}}"); + register(167, "{Name:'minecraft:lava',Properties:{level:'7'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'7'}}"); + register(168, "{Name:'minecraft:lava',Properties:{level:'8'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'8'}}"); + register(169, "{Name:'minecraft:lava',Properties:{level:'9'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'9'}}"); + register(170, "{Name:'minecraft:lava',Properties:{level:'10'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'10'}}"); + register(171, "{Name:'minecraft:lava',Properties:{level:'11'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'11'}}"); + register(172, "{Name:'minecraft:lava',Properties:{level:'12'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'12'}}"); + register(173, "{Name:'minecraft:lava',Properties:{level:'13'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'13'}}"); + register(174, "{Name:'minecraft:lava',Properties:{level:'14'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'14'}}"); + register(175, "{Name:'minecraft:lava',Properties:{level:'15'}}", "{Name:'minecraft:flowing_lava',Properties:{level:'15'}}"); + register(176, "{Name:'minecraft:lava',Properties:{level:'0'}}", "{Name:'minecraft:lava',Properties:{level:'0'}}"); + register(177, "{Name:'minecraft:lava',Properties:{level:'1'}}", "{Name:'minecraft:lava',Properties:{level:'1'}}"); + register(178, "{Name:'minecraft:lava',Properties:{level:'2'}}", "{Name:'minecraft:lava',Properties:{level:'2'}}"); + register(179, "{Name:'minecraft:lava',Properties:{level:'3'}}", "{Name:'minecraft:lava',Properties:{level:'3'}}"); + register(180, "{Name:'minecraft:lava',Properties:{level:'4'}}", "{Name:'minecraft:lava',Properties:{level:'4'}}"); + register(181, "{Name:'minecraft:lava',Properties:{level:'5'}}", "{Name:'minecraft:lava',Properties:{level:'5'}}"); + register(182, "{Name:'minecraft:lava',Properties:{level:'6'}}", "{Name:'minecraft:lava',Properties:{level:'6'}}"); + register(183, "{Name:'minecraft:lava',Properties:{level:'7'}}", "{Name:'minecraft:lava',Properties:{level:'7'}}"); + register(184, "{Name:'minecraft:lava',Properties:{level:'8'}}", "{Name:'minecraft:lava',Properties:{level:'8'}}"); + register(185, "{Name:'minecraft:lava',Properties:{level:'9'}}", "{Name:'minecraft:lava',Properties:{level:'9'}}"); + register(186, "{Name:'minecraft:lava',Properties:{level:'10'}}", "{Name:'minecraft:lava',Properties:{level:'10'}}"); + register(187, "{Name:'minecraft:lava',Properties:{level:'11'}}", "{Name:'minecraft:lava',Properties:{level:'11'}}"); + register(188, "{Name:'minecraft:lava',Properties:{level:'12'}}", "{Name:'minecraft:lava',Properties:{level:'12'}}"); + register(189, "{Name:'minecraft:lava',Properties:{level:'13'}}", "{Name:'minecraft:lava',Properties:{level:'13'}}"); + register(190, "{Name:'minecraft:lava',Properties:{level:'14'}}", "{Name:'minecraft:lava',Properties:{level:'14'}}"); + register(191, "{Name:'minecraft:lava',Properties:{level:'15'}}", "{Name:'minecraft:lava',Properties:{level:'15'}}"); + register(192, "{Name:'minecraft:sand'}", "{Name:'minecraft:sand',Properties:{variant:'sand'}}"); + register(193, "{Name:'minecraft:red_sand'}", "{Name:'minecraft:sand',Properties:{variant:'red_sand'}}"); + register(208, "{Name:'minecraft:gravel'}", "{Name:'minecraft:gravel'}"); + register(224, "{Name:'minecraft:gold_ore'}", "{Name:'minecraft:gold_ore'}"); + register(240, "{Name:'minecraft:iron_ore'}", "{Name:'minecraft:iron_ore'}"); + register(256, "{Name:'minecraft:coal_ore'}", "{Name:'minecraft:coal_ore'}"); + register(272, "{Name:'minecraft:oak_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'oak'}}"); + register(273, "{Name:'minecraft:spruce_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'spruce'}}"); + register(274, "{Name:'minecraft:birch_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'birch'}}"); + register(275, "{Name:'minecraft:jungle_log',Properties:{axis:'y'}}", "{Name:'minecraft:log',Properties:{axis:'y',variant:'jungle'}}"); + register(276, "{Name:'minecraft:oak_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'oak'}}"); + register(277, "{Name:'minecraft:spruce_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'spruce'}}"); + register(278, "{Name:'minecraft:birch_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'birch'}}"); + register(279, "{Name:'minecraft:jungle_log',Properties:{axis:'x'}}", "{Name:'minecraft:log',Properties:{axis:'x',variant:'jungle'}}"); + register(280, "{Name:'minecraft:oak_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'oak'}}"); + register(281, "{Name:'minecraft:spruce_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'spruce'}}"); + register(282, "{Name:'minecraft:birch_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'birch'}}"); + register(283, "{Name:'minecraft:jungle_log',Properties:{axis:'z'}}", "{Name:'minecraft:log',Properties:{axis:'z',variant:'jungle'}}"); + register(284, "{Name:'minecraft:oak_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'oak'}}"); + register(285, "{Name:'minecraft:spruce_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'spruce'}}"); + register(286, "{Name:'minecraft:birch_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'birch'}}"); + register(287, "{Name:'minecraft:jungle_bark'}", "{Name:'minecraft:log',Properties:{axis:'none',variant:'jungle'}}"); + register(288, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'oak'}}"); + register(289, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'spruce'}}"); + register(290, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'birch'}}"); + register(291, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'true',variant:'jungle'}}"); + register(292, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'oak'}}"); + register(293, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'spruce'}}"); + register(294, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'birch'}}"); + register(295, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'false',decayable:'false',variant:'jungle'}}"); + register(296, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'oak'}}"); + register(297, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'spruce'}}"); + register(298, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'birch'}}"); + register(299, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'true',variant:'jungle'}}"); + register(300, "{Name:'minecraft:oak_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'oak'}}"); + register(301, "{Name:'minecraft:spruce_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'spruce'}}"); + register(302, "{Name:'minecraft:birch_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'birch'}}"); + register(303, "{Name:'minecraft:jungle_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves',Properties:{check_decay:'true',decayable:'false',variant:'jungle'}}"); + register(304, "{Name:'minecraft:sponge'}", "{Name:'minecraft:sponge',Properties:{wet:'false'}}"); + register(305, "{Name:'minecraft:wet_sponge'}", "{Name:'minecraft:sponge',Properties:{wet:'true'}}"); + register(320, "{Name:'minecraft:glass'}", "{Name:'minecraft:glass'}"); + register(336, "{Name:'minecraft:lapis_ore'}", "{Name:'minecraft:lapis_ore'}"); + register(352, "{Name:'minecraft:lapis_block'}", "{Name:'minecraft:lapis_block'}"); + register(368, "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'false'}}"); + register(369, "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'false'}}"); + register(370, "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'false'}}"); + register(371, "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'false'}}"); + register(372, "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'false'}}"); + register(373, "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'false'}}", "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'false'}}"); + register(376, "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'down',triggered:'true'}}"); + register(377, "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'up',triggered:'true'}}"); + register(378, "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'north',triggered:'true'}}"); + register(379, "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'south',triggered:'true'}}"); + register(380, "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'west',triggered:'true'}}"); + register(381, "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'true'}}", "{Name:'minecraft:dispenser',Properties:{facing:'east',triggered:'true'}}"); + register(384, "{Name:'minecraft:sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'sandstone'}}"); + register(385, "{Name:'minecraft:chiseled_sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'chiseled_sandstone'}}"); + register(386, "{Name:'minecraft:cut_sandstone'}", "{Name:'minecraft:sandstone',Properties:{type:'smooth_sandstone'}}"); + register(400, "{Name:'minecraft:note_block'}", "{Name:'minecraft:noteblock'}"); + register(416, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'true',part:'foot'}}"); + register(417, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'true',part:'foot'}}"); + register(418, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'true',part:'foot'}}"); + register(419, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'false',part:'foot'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'true',part:'foot'}}"); + register(424, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'false',part:'head'}}"); + register(425, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'false',part:'head'}}"); + register(426, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'false',part:'head'}}"); + register(427, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'false',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'false',part:'head'}}"); + register(428, "{Name:'minecraft:red_bed',Properties:{facing:'south',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'south',occupied:'true',part:'head'}}"); + register(429, "{Name:'minecraft:red_bed',Properties:{facing:'west',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'west',occupied:'true',part:'head'}}"); + register(430, "{Name:'minecraft:red_bed',Properties:{facing:'north',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'north',occupied:'true',part:'head'}}"); + register(431, "{Name:'minecraft:red_bed',Properties:{facing:'east',occupied:'true',part:'head'}}", "{Name:'minecraft:bed',Properties:{facing:'east',occupied:'true',part:'head'}}"); + register(432, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'north_south'}}"); + register(433, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'east_west'}}"); + register(434, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_east'}}"); + register(435, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_west'}}"); + register(436, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_north'}}"); + register(437, "{Name:'minecraft:powered_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'false',shape:'ascending_south'}}"); + register(440, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'north_south'}}"); + register(441, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'east_west'}}"); + register(442, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_east'}}"); + register(443, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_west'}}"); + register(444, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_north'}}"); + register(445, "{Name:'minecraft:powered_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:golden_rail',Properties:{powered:'true',shape:'ascending_south'}}"); + register(448, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'north_south'}}"); + register(449, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'east_west'}}"); + register(450, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_east'}}"); + register(451, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_west'}}"); + register(452, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_north'}}"); + register(453, "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'false',shape:'ascending_south'}}"); + register(456, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'north_south'}}"); + register(457, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'east_west'}}"); + register(458, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_east'}}"); + register(459, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_west'}}"); + register(460, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_north'}}"); + register(461, "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:detector_rail',Properties:{powered:'true',shape:'ascending_south'}}"); + register(464, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'down'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'down'}}"); + register(465, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'up'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'up'}}"); + register(466, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'north'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'north'}}"); + register(467, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'south'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'south'}}"); + register(468, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'west'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'west'}}"); + register(469, "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'east'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'false',facing:'east'}}"); + register(472, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'down'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'down'}}"); + register(473, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'up'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'up'}}"); + register(474, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'north'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'north'}}"); + register(475, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'south'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'south'}}"); + register(476, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'west'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'west'}}"); + register(477, "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'east'}}", "{Name:'minecraft:sticky_piston',Properties:{extended:'true',facing:'east'}}"); + register(480, "{Name:'minecraft:cobweb'}", "{Name:'minecraft:web'}"); + register(496, "{Name:'minecraft:dead_bush'}", "{Name:'minecraft:tallgrass',Properties:{type:'dead_bush'}}"); + register(497, "{Name:'minecraft:grass'}", "{Name:'minecraft:tallgrass',Properties:{type:'tall_grass'}}"); + register(498, "{Name:'minecraft:fern'}", "{Name:'minecraft:tallgrass',Properties:{type:'fern'}}"); + register(512, "{Name:'minecraft:dead_bush'}", "{Name:'minecraft:deadbush'}"); + register(528, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'down'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'down'}}"); + register(529, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'up'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'up'}}"); + register(530, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'north'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'north'}}"); + register(531, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'south'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'south'}}"); + register(532, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'west'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'west'}}"); + register(533, "{Name:'minecraft:piston',Properties:{extended:'false',facing:'east'}}", "{Name:'minecraft:piston',Properties:{extended:'false',facing:'east'}}"); + register(536, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'down'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'down'}}"); + register(537, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'up'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'up'}}"); + register(538, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'north'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'north'}}"); + register(539, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'south'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'south'}}"); + register(540, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'west'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'west'}}"); + register(541, "{Name:'minecraft:piston',Properties:{extended:'true',facing:'east'}}", "{Name:'minecraft:piston',Properties:{extended:'true',facing:'east'}}"); + register(544, "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'true',type:'normal'}}"); + register(545, "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'true',type:'normal'}}"); + register(546, "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'true',type:'normal'}}"); + register(547, "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'true',type:'normal'}}"); + register(548, "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'true',type:'normal'}}"); + register(549, "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'normal'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'true',type:'normal'}}"); + register(552, "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'down',short:'true',type:'sticky'}}"); + register(553, "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'up',short:'true',type:'sticky'}}"); + register(554, "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'north',short:'true',type:'sticky'}}"); + register(555, "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'south',short:'true',type:'sticky'}}"); + register(556, "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'west',short:'true',type:'sticky'}}"); + register(557, "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'false',type:'sticky'}}", "{Name:'minecraft:piston_head',Properties:{facing:'east',short:'true',type:'sticky'}}"); + register(560, "{Name:'minecraft:white_wool'}", "{Name:'minecraft:wool',Properties:{color:'white'}}"); + register(561, "{Name:'minecraft:orange_wool'}", "{Name:'minecraft:wool',Properties:{color:'orange'}}"); + register(562, "{Name:'minecraft:magenta_wool'}", "{Name:'minecraft:wool',Properties:{color:'magenta'}}"); + register(563, "{Name:'minecraft:light_blue_wool'}", "{Name:'minecraft:wool',Properties:{color:'light_blue'}}"); + register(564, "{Name:'minecraft:yellow_wool'}", "{Name:'minecraft:wool',Properties:{color:'yellow'}}"); + register(565, "{Name:'minecraft:lime_wool'}", "{Name:'minecraft:wool',Properties:{color:'lime'}}"); + register(566, "{Name:'minecraft:pink_wool'}", "{Name:'minecraft:wool',Properties:{color:'pink'}}"); + register(567, "{Name:'minecraft:gray_wool'}", "{Name:'minecraft:wool',Properties:{color:'gray'}}"); + register(568, "{Name:'minecraft:light_gray_wool'}", "{Name:'minecraft:wool',Properties:{color:'silver'}}"); + register(569, "{Name:'minecraft:cyan_wool'}", "{Name:'minecraft:wool',Properties:{color:'cyan'}}"); + register(570, "{Name:'minecraft:purple_wool'}", "{Name:'minecraft:wool',Properties:{color:'purple'}}"); + register(571, "{Name:'minecraft:blue_wool'}", "{Name:'minecraft:wool',Properties:{color:'blue'}}"); + register(572, "{Name:'minecraft:brown_wool'}", "{Name:'minecraft:wool',Properties:{color:'brown'}}"); + register(573, "{Name:'minecraft:green_wool'}", "{Name:'minecraft:wool',Properties:{color:'green'}}"); + register(574, "{Name:'minecraft:red_wool'}", "{Name:'minecraft:wool',Properties:{color:'red'}}"); + register(575, "{Name:'minecraft:black_wool'}", "{Name:'minecraft:wool',Properties:{color:'black'}}"); + register(576, "{Name:'minecraft:moving_piston',Properties:{facing:'down',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'down',type:'normal'}}"); + register(577, "{Name:'minecraft:moving_piston',Properties:{facing:'up',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'up',type:'normal'}}"); + register(578, "{Name:'minecraft:moving_piston',Properties:{facing:'north',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'north',type:'normal'}}"); + register(579, "{Name:'minecraft:moving_piston',Properties:{facing:'south',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'south',type:'normal'}}"); + register(580, "{Name:'minecraft:moving_piston',Properties:{facing:'west',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'west',type:'normal'}}"); + register(581, "{Name:'minecraft:moving_piston',Properties:{facing:'east',type:'normal'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'east',type:'normal'}}"); + register(584, "{Name:'minecraft:moving_piston',Properties:{facing:'down',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'down',type:'sticky'}}"); + register(585, "{Name:'minecraft:moving_piston',Properties:{facing:'up',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'up',type:'sticky'}}"); + register(586, "{Name:'minecraft:moving_piston',Properties:{facing:'north',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'north',type:'sticky'}}"); + register(587, "{Name:'minecraft:moving_piston',Properties:{facing:'south',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'south',type:'sticky'}}"); + register(588, "{Name:'minecraft:moving_piston',Properties:{facing:'west',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'west',type:'sticky'}}"); + register(589, "{Name:'minecraft:moving_piston',Properties:{facing:'east',type:'sticky'}}", "{Name:'minecraft:piston_extension',Properties:{facing:'east',type:'sticky'}}"); + register(592, "{Name:'minecraft:dandelion'}", "{Name:'minecraft:yellow_flower',Properties:{type:'dandelion'}}"); + register(608, "{Name:'minecraft:poppy'}", "{Name:'minecraft:red_flower',Properties:{type:'poppy'}}"); + register(609, "{Name:'minecraft:blue_orchid'}", "{Name:'minecraft:red_flower',Properties:{type:'blue_orchid'}}"); + register(610, "{Name:'minecraft:allium'}", "{Name:'minecraft:red_flower',Properties:{type:'allium'}}"); + register(611, "{Name:'minecraft:azure_bluet'}", "{Name:'minecraft:red_flower',Properties:{type:'houstonia'}}"); + register(612, "{Name:'minecraft:red_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'red_tulip'}}"); + register(613, "{Name:'minecraft:orange_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'orange_tulip'}}"); + register(614, "{Name:'minecraft:white_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'white_tulip'}}"); + register(615, "{Name:'minecraft:pink_tulip'}", "{Name:'minecraft:red_flower',Properties:{type:'pink_tulip'}}"); + register(616, "{Name:'minecraft:oxeye_daisy'}", "{Name:'minecraft:red_flower',Properties:{type:'oxeye_daisy'}}"); + register(624, "{Name:'minecraft:brown_mushroom'}", "{Name:'minecraft:brown_mushroom'}"); + register(640, "{Name:'minecraft:red_mushroom'}", "{Name:'minecraft:red_mushroom'}"); + register(656, "{Name:'minecraft:gold_block'}", "{Name:'minecraft:gold_block'}"); + register(672, "{Name:'minecraft:iron_block'}", "{Name:'minecraft:iron_block'}"); + register(688, "{Name:'minecraft:stone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'stone'}}"); + register(689, "{Name:'minecraft:sandstone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'sandstone'}}"); + register(690, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'wood_old'}}"); + register(691, "{Name:'minecraft:cobblestone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'cobblestone'}}"); + register(692, "{Name:'minecraft:brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'brick'}}"); + register(693, "{Name:'minecraft:stone_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'stone_brick'}}"); + register(694, "{Name:'minecraft:nether_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'nether_brick'}}"); + register(695, "{Name:'minecraft:quartz_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'false',variant:'quartz'}}"); + register(696, "{Name:'minecraft:smooth_stone'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'stone'}}"); + register(697, "{Name:'minecraft:smooth_sandstone'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'sandstone'}}"); + register(698, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'wood_old'}}"); + register(699, "{Name:'minecraft:cobblestone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'cobblestone'}}"); + register(700, "{Name:'minecraft:brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'brick'}}"); + register(701, "{Name:'minecraft:stone_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'stone_brick'}}"); + register(702, "{Name:'minecraft:nether_brick_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'nether_brick'}}"); + register(703, "{Name:'minecraft:smooth_quartz'}", "{Name:'minecraft:double_stone_slab',Properties:{seamless:'true',variant:'quartz'}}"); + register(704, "{Name:'minecraft:stone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'stone'}}"); + register(705, "{Name:'minecraft:sandstone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'sandstone'}}"); + register(706, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'wood_old'}}"); + register(707, "{Name:'minecraft:cobblestone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'cobblestone'}}"); + register(708, "{Name:'minecraft:brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'brick'}}"); + register(709, "{Name:'minecraft:stone_brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'stone_brick'}}"); + register(710, "{Name:'minecraft:nether_brick_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'nether_brick'}}"); + register(711, "{Name:'minecraft:quartz_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab',Properties:{half:'bottom',variant:'quartz'}}"); + register(712, "{Name:'minecraft:stone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'stone'}}"); + register(713, "{Name:'minecraft:sandstone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'sandstone'}}"); + register(714, "{Name:'minecraft:petrified_oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'wood_old'}}"); + register(715, "{Name:'minecraft:cobblestone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'cobblestone'}}"); + register(716, "{Name:'minecraft:brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'brick'}}"); + register(717, "{Name:'minecraft:stone_brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'stone_brick'}}"); + register(718, "{Name:'minecraft:nether_brick_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'nether_brick'}}"); + register(719, "{Name:'minecraft:quartz_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab',Properties:{half:'top',variant:'quartz'}}"); + register(720, "{Name:'minecraft:bricks'}", "{Name:'minecraft:brick_block'}"); + register(736, "{Name:'minecraft:tnt',Properties:{unstable:'false'}}", "{Name:'minecraft:tnt',Properties:{explode:'false'}}"); + register(737, "{Name:'minecraft:tnt',Properties:{unstable:'true'}}", "{Name:'minecraft:tnt',Properties:{explode:'true'}}"); + register(752, "{Name:'minecraft:bookshelf'}", "{Name:'minecraft:bookshelf'}"); + register(768, "{Name:'minecraft:mossy_cobblestone'}", "{Name:'minecraft:mossy_cobblestone'}"); + register(784, "{Name:'minecraft:obsidian'}", "{Name:'minecraft:obsidian'}"); + register(801, "{Name:'minecraft:wall_torch',Properties:{facing:'east'}}", "{Name:'minecraft:torch',Properties:{facing:'east'}}"); + register(802, "{Name:'minecraft:wall_torch',Properties:{facing:'west'}}", "{Name:'minecraft:torch',Properties:{facing:'west'}}"); + register(803, "{Name:'minecraft:wall_torch',Properties:{facing:'south'}}", "{Name:'minecraft:torch',Properties:{facing:'south'}}"); + register(804, "{Name:'minecraft:wall_torch',Properties:{facing:'north'}}", "{Name:'minecraft:torch',Properties:{facing:'north'}}"); + register(805, "{Name:'minecraft:torch'}", "{Name:'minecraft:torch',Properties:{facing:'up'}}"); + register(816, "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'0',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(817, "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'1',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(818, "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'2',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(819, "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'3',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(820, "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'4',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(821, "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'5',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(822, "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'6',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(823, "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'7',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(824, "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'8',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(825, "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'9',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(826, "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'10',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(827, "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'11',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(828, "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'12',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(829, "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'13',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(830, "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'14',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(831, "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:fire',Properties:{age:'15',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(832, "{Name:'minecraft:mob_spawner'}", "{Name:'minecraft:mob_spawner'}"); + register(848, "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(849, "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(850, "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(851, "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(852, "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(853, "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(854, "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(855, "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(866, "{Name:'minecraft:chest',Properties:{facing:'north',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'north'}}"); + register(867, "{Name:'minecraft:chest',Properties:{facing:'south',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'south'}}"); + register(868, "{Name:'minecraft:chest',Properties:{facing:'west',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'west'}}"); + register(869, "{Name:'minecraft:chest',Properties:{facing:'east',type:'single'}}", "{Name:'minecraft:chest',Properties:{facing:'east'}}"); + register(880, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'0',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'0',south:'up',west:'up'}}"); + register(881, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'1',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'1',south:'up',west:'up'}}"); + register(882, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'2',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'2',south:'up',west:'up'}}"); + register(883, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'3',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'3',south:'up',west:'up'}}"); + register(884, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'4',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'4',south:'up',west:'up'}}"); + register(885, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'5',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'5',south:'up',west:'up'}}"); + register(886, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'6',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'6',south:'up',west:'up'}}"); + register(887, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'7',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'7',south:'up',west:'up'}}"); + register(888, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'8',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'8',south:'up',west:'up'}}"); + register(889, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'9',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'9',south:'up',west:'up'}}"); + register(890, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'10',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'10',south:'up',west:'up'}}"); + register(891, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'11',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'11',south:'up',west:'up'}}"); + register(892, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'12',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'12',south:'up',west:'up'}}"); + register(893, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'13',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'13',south:'up',west:'up'}}"); + register(894, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'14',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'14',south:'up',west:'up'}}"); + register(895, "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'none',north:'up',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'side',north:'up',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'none',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'side',power:'15',south:'up',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'none',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'side',west:'up'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'none'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'side'}}", "{Name:'minecraft:redstone_wire',Properties:{east:'up',north:'up',power:'15',south:'up',west:'up'}}"); + register(896, "{Name:'minecraft:diamond_ore'}", "{Name:'minecraft:diamond_ore'}"); + register(912, "{Name:'minecraft:diamond_block'}", "{Name:'minecraft:diamond_block'}"); + register(928, "{Name:'minecraft:crafting_table'}", "{Name:'minecraft:crafting_table'}"); + register(944, "{Name:'minecraft:wheat',Properties:{age:'0'}}", "{Name:'minecraft:wheat',Properties:{age:'0'}}"); + register(945, "{Name:'minecraft:wheat',Properties:{age:'1'}}", "{Name:'minecraft:wheat',Properties:{age:'1'}}"); + register(946, "{Name:'minecraft:wheat',Properties:{age:'2'}}", "{Name:'minecraft:wheat',Properties:{age:'2'}}"); + register(947, "{Name:'minecraft:wheat',Properties:{age:'3'}}", "{Name:'minecraft:wheat',Properties:{age:'3'}}"); + register(948, "{Name:'minecraft:wheat',Properties:{age:'4'}}", "{Name:'minecraft:wheat',Properties:{age:'4'}}"); + register(949, "{Name:'minecraft:wheat',Properties:{age:'5'}}", "{Name:'minecraft:wheat',Properties:{age:'5'}}"); + register(950, "{Name:'minecraft:wheat',Properties:{age:'6'}}", "{Name:'minecraft:wheat',Properties:{age:'6'}}"); + register(951, "{Name:'minecraft:wheat',Properties:{age:'7'}}", "{Name:'minecraft:wheat',Properties:{age:'7'}}"); + register(960, "{Name:'minecraft:farmland',Properties:{moisture:'0'}}", "{Name:'minecraft:farmland',Properties:{moisture:'0'}}"); + register(961, "{Name:'minecraft:farmland',Properties:{moisture:'1'}}", "{Name:'minecraft:farmland',Properties:{moisture:'1'}}"); + register(962, "{Name:'minecraft:farmland',Properties:{moisture:'2'}}", "{Name:'minecraft:farmland',Properties:{moisture:'2'}}"); + register(963, "{Name:'minecraft:farmland',Properties:{moisture:'3'}}", "{Name:'minecraft:farmland',Properties:{moisture:'3'}}"); + register(964, "{Name:'minecraft:farmland',Properties:{moisture:'4'}}", "{Name:'minecraft:farmland',Properties:{moisture:'4'}}"); + register(965, "{Name:'minecraft:farmland',Properties:{moisture:'5'}}", "{Name:'minecraft:farmland',Properties:{moisture:'5'}}"); + register(966, "{Name:'minecraft:farmland',Properties:{moisture:'6'}}", "{Name:'minecraft:farmland',Properties:{moisture:'6'}}"); + register(967, "{Name:'minecraft:farmland',Properties:{moisture:'7'}}", "{Name:'minecraft:farmland',Properties:{moisture:'7'}}"); + register(978, "{Name:'minecraft:furnace',Properties:{facing:'north',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'north'}}"); + register(979, "{Name:'minecraft:furnace',Properties:{facing:'south',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'south'}}"); + register(980, "{Name:'minecraft:furnace',Properties:{facing:'west',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'west'}}"); + register(981, "{Name:'minecraft:furnace',Properties:{facing:'east',lit:'false'}}", "{Name:'minecraft:furnace',Properties:{facing:'east'}}"); + register(994, "{Name:'minecraft:furnace',Properties:{facing:'north',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'north'}}"); + register(995, "{Name:'minecraft:furnace',Properties:{facing:'south',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'south'}}"); + register(996, "{Name:'minecraft:furnace',Properties:{facing:'west',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'west'}}"); + register(997, "{Name:'minecraft:furnace',Properties:{facing:'east',lit:'true'}}", "{Name:'minecraft:lit_furnace',Properties:{facing:'east'}}"); + register(1008, "{Name:'minecraft:sign',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'0'}}"); + register(1009, "{Name:'minecraft:sign',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'1'}}"); + register(1010, "{Name:'minecraft:sign',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'2'}}"); + register(1011, "{Name:'minecraft:sign',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'3'}}"); + register(1012, "{Name:'minecraft:sign',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'4'}}"); + register(1013, "{Name:'minecraft:sign',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'5'}}"); + register(1014, "{Name:'minecraft:sign',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'6'}}"); + register(1015, "{Name:'minecraft:sign',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'7'}}"); + register(1016, "{Name:'minecraft:sign',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'8'}}"); + register(1017, "{Name:'minecraft:sign',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'9'}}"); + register(1018, "{Name:'minecraft:sign',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'10'}}"); + register(1019, "{Name:'minecraft:sign',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'11'}}"); + register(1020, "{Name:'minecraft:sign',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'12'}}"); + register(1021, "{Name:'minecraft:sign',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'13'}}"); + register(1022, "{Name:'minecraft:sign',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'14'}}"); + register(1023, "{Name:'minecraft:sign',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'15'}}"); + register(1024, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1025, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1026, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1027, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1028, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1029, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1030, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1031, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1032, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1033, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(1034, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(1035, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:wooden_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(1036, "{Name:'minecraft:oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1037, "{Name:'minecraft:oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1038, "{Name:'minecraft:oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1039, "{Name:'minecraft:oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1042, "{Name:'minecraft:ladder',Properties:{facing:'north'}}", "{Name:'minecraft:ladder',Properties:{facing:'north'}}"); + register(1043, "{Name:'minecraft:ladder',Properties:{facing:'south'}}", "{Name:'minecraft:ladder',Properties:{facing:'south'}}"); + register(1044, "{Name:'minecraft:ladder',Properties:{facing:'west'}}", "{Name:'minecraft:ladder',Properties:{facing:'west'}}"); + register(1045, "{Name:'minecraft:ladder',Properties:{facing:'east'}}", "{Name:'minecraft:ladder',Properties:{facing:'east'}}"); + register(1056, "{Name:'minecraft:rail',Properties:{shape:'north_south'}}", "{Name:'minecraft:rail',Properties:{shape:'north_south'}}"); + register(1057, "{Name:'minecraft:rail',Properties:{shape:'east_west'}}", "{Name:'minecraft:rail',Properties:{shape:'east_west'}}"); + register(1058, "{Name:'minecraft:rail',Properties:{shape:'ascending_east'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_east'}}"); + register(1059, "{Name:'minecraft:rail',Properties:{shape:'ascending_west'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_west'}}"); + register(1060, "{Name:'minecraft:rail',Properties:{shape:'ascending_north'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_north'}}"); + register(1061, "{Name:'minecraft:rail',Properties:{shape:'ascending_south'}}", "{Name:'minecraft:rail',Properties:{shape:'ascending_south'}}"); + register(1062, "{Name:'minecraft:rail',Properties:{shape:'south_east'}}", "{Name:'minecraft:rail',Properties:{shape:'south_east'}}"); + register(1063, "{Name:'minecraft:rail',Properties:{shape:'south_west'}}", "{Name:'minecraft:rail',Properties:{shape:'south_west'}}"); + register(1064, "{Name:'minecraft:rail',Properties:{shape:'north_west'}}", "{Name:'minecraft:rail',Properties:{shape:'north_west'}}"); + register(1065, "{Name:'minecraft:rail',Properties:{shape:'north_east'}}", "{Name:'minecraft:rail',Properties:{shape:'north_east'}}"); + register(1072, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(1073, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(1074, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(1075, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(1076, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(1077, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(1078, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(1079, "{Name:'minecraft:cobblestone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(1090, "{Name:'minecraft:wall_sign',Properties:{facing:'north'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'north'}}"); + register(1091, "{Name:'minecraft:wall_sign',Properties:{facing:'south'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'south'}}"); + register(1092, "{Name:'minecraft:wall_sign',Properties:{facing:'west'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'west'}}"); + register(1093, "{Name:'minecraft:wall_sign',Properties:{facing:'east'}}", "{Name:'minecraft:wall_sign',Properties:{facing:'east'}}"); + register(1104, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'down_x',powered:'false'}}"); + register(1105, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'east',powered:'false'}}"); + register(1106, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'west',powered:'false'}}"); + register(1107, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'south',powered:'false'}}"); + register(1108, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'north',powered:'false'}}"); + register(1109, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'up_z',powered:'false'}}"); + register(1110, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'west',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'up_x',powered:'false'}}"); + register(1111, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:lever',Properties:{facing:'down_z',powered:'false'}}"); + register(1112, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'down_x',powered:'true'}}"); + register(1113, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'east',powered:'true'}}"); + register(1114, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'west',powered:'true'}}"); + register(1115, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'south',powered:'true'}}"); + register(1116, "{Name:'minecraft:lever',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'north',powered:'true'}}"); + register(1117, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'up_z',powered:'true'}}"); + register(1118, "{Name:'minecraft:lever',Properties:{face:'floor',facing:'west',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'up_x',powered:'true'}}"); + register(1119, "{Name:'minecraft:lever',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:lever',Properties:{facing:'down_z',powered:'true'}}"); + register(1120, "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'false'}}", "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'false'}}"); + register(1121, "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'true'}}", "{Name:'minecraft:stone_pressure_plate',Properties:{powered:'true'}}"); + register(1136, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1137, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1138, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1139, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(1140, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1141, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1142, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1143, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(1144, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1145, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(1146, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(1147, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(1148, "{Name:'minecraft:iron_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1149, "{Name:'minecraft:iron_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1150, "{Name:'minecraft:iron_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1151, "{Name:'minecraft:iron_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(1152, "{Name:'minecraft:oak_pressure_plate',Properties:{powered:'false'}}", "{Name:'minecraft:wooden_pressure_plate',Properties:{powered:'false'}}"); + register(1153, "{Name:'minecraft:oak_pressure_plate',Properties:{powered:'true'}}", "{Name:'minecraft:wooden_pressure_plate',Properties:{powered:'true'}}"); + register(1168, "{Name:'minecraft:redstone_ore',Properties:{lit:'false'}}", "{Name:'minecraft:redstone_ore'}"); + register(1184, "{Name:'minecraft:redstone_ore',Properties:{lit:'true'}}", "{Name:'minecraft:lit_redstone_ore'}"); + register(1201, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'east',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'east'}}"); + register(1202, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'west',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'west'}}"); + register(1203, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'south',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'south'}}"); + register(1204, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'north',lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'north'}}"); + register(1205, "{Name:'minecraft:redstone_torch',Properties:{lit:'false'}}", "{Name:'minecraft:unlit_redstone_torch',Properties:{facing:'up'}}"); + register(1217, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'east',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'east'}}"); + register(1218, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'west',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'west'}}"); + register(1219, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'south',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'south'}}"); + register(1220, "{Name:'minecraft:redstone_wall_torch',Properties:{facing:'north',lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'north'}}"); + register(1221, "{Name:'minecraft:redstone_torch',Properties:{lit:'true'}}", "{Name:'minecraft:redstone_torch',Properties:{facing:'up'}}"); + register(1232, "{Name:'minecraft:stone_button',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'down',powered:'false'}}"); + register(1233, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'east',powered:'false'}}"); + register(1234, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'west',powered:'false'}}"); + register(1235, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'south',powered:'false'}}"); + register(1236, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'north',powered:'false'}}"); + register(1237, "{Name:'minecraft:stone_button',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:stone_button',Properties:{facing:'up',powered:'false'}}"); + register(1240, "{Name:'minecraft:stone_button',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'down',powered:'true'}}"); + register(1241, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'east',powered:'true'}}"); + register(1242, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'west',powered:'true'}}"); + register(1243, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'south',powered:'true'}}"); + register(1244, "{Name:'minecraft:stone_button',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'north',powered:'true'}}"); + register(1245, "{Name:'minecraft:stone_button',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:stone_button',Properties:{facing:'up',powered:'true'}}"); + register(1248, "{Name:'minecraft:snow',Properties:{layers:'1'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'1'}}"); + register(1249, "{Name:'minecraft:snow',Properties:{layers:'2'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'2'}}"); + register(1250, "{Name:'minecraft:snow',Properties:{layers:'3'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'3'}}"); + register(1251, "{Name:'minecraft:snow',Properties:{layers:'4'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'4'}}"); + register(1252, "{Name:'minecraft:snow',Properties:{layers:'5'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'5'}}"); + register(1253, "{Name:'minecraft:snow',Properties:{layers:'6'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'6'}}"); + register(1254, "{Name:'minecraft:snow',Properties:{layers:'7'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'7'}}"); + register(1255, "{Name:'minecraft:snow',Properties:{layers:'8'}}", "{Name:'minecraft:snow_layer',Properties:{layers:'8'}}"); + register(1264, "{Name:'minecraft:ice'}", "{Name:'minecraft:ice'}"); + register(1280, "{Name:'minecraft:snow_block'}", "{Name:'minecraft:snow'}"); + register(1296, "{Name:'minecraft:cactus',Properties:{age:'0'}}", "{Name:'minecraft:cactus',Properties:{age:'0'}}"); + register(1297, "{Name:'minecraft:cactus',Properties:{age:'1'}}", "{Name:'minecraft:cactus',Properties:{age:'1'}}"); + register(1298, "{Name:'minecraft:cactus',Properties:{age:'2'}}", "{Name:'minecraft:cactus',Properties:{age:'2'}}"); + register(1299, "{Name:'minecraft:cactus',Properties:{age:'3'}}", "{Name:'minecraft:cactus',Properties:{age:'3'}}"); + register(1300, "{Name:'minecraft:cactus',Properties:{age:'4'}}", "{Name:'minecraft:cactus',Properties:{age:'4'}}"); + register(1301, "{Name:'minecraft:cactus',Properties:{age:'5'}}", "{Name:'minecraft:cactus',Properties:{age:'5'}}"); + register(1302, "{Name:'minecraft:cactus',Properties:{age:'6'}}", "{Name:'minecraft:cactus',Properties:{age:'6'}}"); + register(1303, "{Name:'minecraft:cactus',Properties:{age:'7'}}", "{Name:'minecraft:cactus',Properties:{age:'7'}}"); + register(1304, "{Name:'minecraft:cactus',Properties:{age:'8'}}", "{Name:'minecraft:cactus',Properties:{age:'8'}}"); + register(1305, "{Name:'minecraft:cactus',Properties:{age:'9'}}", "{Name:'minecraft:cactus',Properties:{age:'9'}}"); + register(1306, "{Name:'minecraft:cactus',Properties:{age:'10'}}", "{Name:'minecraft:cactus',Properties:{age:'10'}}"); + register(1307, "{Name:'minecraft:cactus',Properties:{age:'11'}}", "{Name:'minecraft:cactus',Properties:{age:'11'}}"); + register(1308, "{Name:'minecraft:cactus',Properties:{age:'12'}}", "{Name:'minecraft:cactus',Properties:{age:'12'}}"); + register(1309, "{Name:'minecraft:cactus',Properties:{age:'13'}}", "{Name:'minecraft:cactus',Properties:{age:'13'}}"); + register(1310, "{Name:'minecraft:cactus',Properties:{age:'14'}}", "{Name:'minecraft:cactus',Properties:{age:'14'}}"); + register(1311, "{Name:'minecraft:cactus',Properties:{age:'15'}}", "{Name:'minecraft:cactus',Properties:{age:'15'}}"); + register(1312, "{Name:'minecraft:clay'}", "{Name:'minecraft:clay'}"); + register(1328, "{Name:'minecraft:sugar_cane',Properties:{age:'0'}}", "{Name:'minecraft:reeds',Properties:{age:'0'}}"); + register(1329, "{Name:'minecraft:sugar_cane',Properties:{age:'1'}}", "{Name:'minecraft:reeds',Properties:{age:'1'}}"); + register(1330, "{Name:'minecraft:sugar_cane',Properties:{age:'2'}}", "{Name:'minecraft:reeds',Properties:{age:'2'}}"); + register(1331, "{Name:'minecraft:sugar_cane',Properties:{age:'3'}}", "{Name:'minecraft:reeds',Properties:{age:'3'}}"); + register(1332, "{Name:'minecraft:sugar_cane',Properties:{age:'4'}}", "{Name:'minecraft:reeds',Properties:{age:'4'}}"); + register(1333, "{Name:'minecraft:sugar_cane',Properties:{age:'5'}}", "{Name:'minecraft:reeds',Properties:{age:'5'}}"); + register(1334, "{Name:'minecraft:sugar_cane',Properties:{age:'6'}}", "{Name:'minecraft:reeds',Properties:{age:'6'}}"); + register(1335, "{Name:'minecraft:sugar_cane',Properties:{age:'7'}}", "{Name:'minecraft:reeds',Properties:{age:'7'}}"); + register(1336, "{Name:'minecraft:sugar_cane',Properties:{age:'8'}}", "{Name:'minecraft:reeds',Properties:{age:'8'}}"); + register(1337, "{Name:'minecraft:sugar_cane',Properties:{age:'9'}}", "{Name:'minecraft:reeds',Properties:{age:'9'}}"); + register(1338, "{Name:'minecraft:sugar_cane',Properties:{age:'10'}}", "{Name:'minecraft:reeds',Properties:{age:'10'}}"); + register(1339, "{Name:'minecraft:sugar_cane',Properties:{age:'11'}}", "{Name:'minecraft:reeds',Properties:{age:'11'}}"); + register(1340, "{Name:'minecraft:sugar_cane',Properties:{age:'12'}}", "{Name:'minecraft:reeds',Properties:{age:'12'}}"); + register(1341, "{Name:'minecraft:sugar_cane',Properties:{age:'13'}}", "{Name:'minecraft:reeds',Properties:{age:'13'}}"); + register(1342, "{Name:'minecraft:sugar_cane',Properties:{age:'14'}}", "{Name:'minecraft:reeds',Properties:{age:'14'}}"); + register(1343, "{Name:'minecraft:sugar_cane',Properties:{age:'15'}}", "{Name:'minecraft:reeds',Properties:{age:'15'}}"); + register(1344, "{Name:'minecraft:jukebox',Properties:{has_record:'false'}}", "{Name:'minecraft:jukebox',Properties:{has_record:'false'}}"); + register(1345, "{Name:'minecraft:jukebox',Properties:{has_record:'true'}}", "{Name:'minecraft:jukebox',Properties:{has_record:'true'}}"); + register(1360, "{Name:'minecraft:oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(1376, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'south'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'south'}}"); + register(1377, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'west'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'west'}}"); + register(1378, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'north'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'north'}}"); + register(1379, "{Name:'minecraft:carved_pumpkin',Properties:{facing:'east'}}", "{Name:'minecraft:pumpkin',Properties:{facing:'east'}}"); + register(1392, "{Name:'minecraft:netherrack'}", "{Name:'minecraft:netherrack'}"); + register(1408, "{Name:'minecraft:soul_sand'}", "{Name:'minecraft:soul_sand'}"); + register(1424, "{Name:'minecraft:glowstone'}", "{Name:'minecraft:glowstone'}"); + register(1441, "{Name:'minecraft:portal',Properties:{axis:'x'}}", "{Name:'minecraft:portal',Properties:{axis:'x'}}"); + register(1442, "{Name:'minecraft:portal',Properties:{axis:'z'}}", "{Name:'minecraft:portal',Properties:{axis:'z'}}"); + register(1456, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'south'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'south'}}"); + register(1457, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'west'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'west'}}"); + register(1458, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'north'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'north'}}"); + register(1459, "{Name:'minecraft:jack_o_lantern',Properties:{facing:'east'}}", "{Name:'minecraft:lit_pumpkin',Properties:{facing:'east'}}"); + register(1472, "{Name:'minecraft:cake',Properties:{bites:'0'}}", "{Name:'minecraft:cake',Properties:{bites:'0'}}"); + register(1473, "{Name:'minecraft:cake',Properties:{bites:'1'}}", "{Name:'minecraft:cake',Properties:{bites:'1'}}"); + register(1474, "{Name:'minecraft:cake',Properties:{bites:'2'}}", "{Name:'minecraft:cake',Properties:{bites:'2'}}"); + register(1475, "{Name:'minecraft:cake',Properties:{bites:'3'}}", "{Name:'minecraft:cake',Properties:{bites:'3'}}"); + register(1476, "{Name:'minecraft:cake',Properties:{bites:'4'}}", "{Name:'minecraft:cake',Properties:{bites:'4'}}"); + register(1477, "{Name:'minecraft:cake',Properties:{bites:'5'}}", "{Name:'minecraft:cake',Properties:{bites:'5'}}"); + register(1478, "{Name:'minecraft:cake',Properties:{bites:'6'}}", "{Name:'minecraft:cake',Properties:{bites:'6'}}"); + register(1488, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'south',locked:'true'}}"); + register(1489, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'west',locked:'true'}}"); + register(1490, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'north',locked:'true'}}"); + register(1491, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'1',facing:'east',locked:'true'}}"); + register(1492, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'south',locked:'true'}}"); + register(1493, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'west',locked:'true'}}"); + register(1494, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'north',locked:'true'}}"); + register(1495, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'2',facing:'east',locked:'true'}}"); + register(1496, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'south',locked:'true'}}"); + register(1497, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'west',locked:'true'}}"); + register(1498, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'north',locked:'true'}}"); + register(1499, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'3',facing:'east',locked:'true'}}"); + register(1500, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'south',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'south',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'south',locked:'true'}}"); + register(1501, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'west',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'west',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'west',locked:'true'}}"); + register(1502, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'north',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'north',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'north',locked:'true'}}"); + register(1503, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'east',locked:'false',powered:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'east',locked:'false'}}", "{Name:'minecraft:unpowered_repeater',Properties:{delay:'4',facing:'east',locked:'true'}}"); + register(1504, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'south',locked:'true'}}"); + register(1505, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'west',locked:'true'}}"); + register(1506, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'north',locked:'true'}}"); + register(1507, "{Name:'minecraft:repeater',Properties:{delay:'1',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'1',facing:'east',locked:'true'}}"); + register(1508, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'south',locked:'true'}}"); + register(1509, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'west',locked:'true'}}"); + register(1510, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'north',locked:'true'}}"); + register(1511, "{Name:'minecraft:repeater',Properties:{delay:'2',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'2',facing:'east',locked:'true'}}"); + register(1512, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'south',locked:'true'}}"); + register(1513, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'west',locked:'true'}}"); + register(1514, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'north',locked:'true'}}"); + register(1515, "{Name:'minecraft:repeater',Properties:{delay:'3',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'3',facing:'east',locked:'true'}}"); + register(1516, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'south',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'south',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'south',locked:'true'}}"); + register(1517, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'west',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'west',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'west',locked:'true'}}"); + register(1518, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'north',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'north',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'north',locked:'true'}}"); + register(1519, "{Name:'minecraft:repeater',Properties:{delay:'4',facing:'east',locked:'false',powered:'true'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'east',locked:'false'}}", "{Name:'minecraft:powered_repeater',Properties:{delay:'4',facing:'east',locked:'true'}}"); + register(1520, "{Name:'minecraft:white_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'white'}}"); + register(1521, "{Name:'minecraft:orange_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'orange'}}"); + register(1522, "{Name:'minecraft:magenta_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'magenta'}}"); + register(1523, "{Name:'minecraft:light_blue_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'light_blue'}}"); + register(1524, "{Name:'minecraft:yellow_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'yellow'}}"); + register(1525, "{Name:'minecraft:lime_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'lime'}}"); + register(1526, "{Name:'minecraft:pink_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'pink'}}"); + register(1527, "{Name:'minecraft:gray_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'gray'}}"); + register(1528, "{Name:'minecraft:light_gray_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'silver'}}"); + register(1529, "{Name:'minecraft:cyan_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'cyan'}}"); + register(1530, "{Name:'minecraft:purple_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'purple'}}"); + register(1531, "{Name:'minecraft:blue_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'blue'}}"); + register(1532, "{Name:'minecraft:brown_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'brown'}}"); + register(1533, "{Name:'minecraft:green_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'green'}}"); + register(1534, "{Name:'minecraft:red_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'red'}}"); + register(1535, "{Name:'minecraft:black_stained_glass'}", "{Name:'minecraft:stained_glass',Properties:{color:'black'}}"); + register(1536, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}"); + register(1537, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}"); + register(1538, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}"); + register(1539, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}"); + register(1540, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}"); + register(1541, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}"); + register(1542, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}"); + register(1543, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}"); + register(1544, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'top',open:'false'}}"); + register(1545, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'top',open:'false'}}"); + register(1546, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'top',open:'false'}}"); + register(1547, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'top',open:'false'}}"); + register(1548, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'north',half:'top',open:'true'}}"); + register(1549, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'south',half:'top',open:'true'}}"); + register(1550, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'west',half:'top',open:'true'}}"); + register(1551, "{Name:'minecraft:oak_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}", "{Name:'minecraft:trapdoor',Properties:{facing:'east',half:'top',open:'true'}}"); + register(1552, "{Name:'minecraft:infested_stone'}", "{Name:'minecraft:monster_egg',Properties:{variant:'stone'}}"); + register(1553, "{Name:'minecraft:infested_cobblestone'}", "{Name:'minecraft:monster_egg',Properties:{variant:'cobblestone'}}"); + register(1554, "{Name:'minecraft:infested_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'stone_brick'}}"); + register(1555, "{Name:'minecraft:infested_mossy_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'mossy_brick'}}"); + register(1556, "{Name:'minecraft:infested_cracked_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'cracked_brick'}}"); + register(1557, "{Name:'minecraft:infested_chiseled_stone_bricks'}", "{Name:'minecraft:monster_egg',Properties:{variant:'chiseled_brick'}}"); + register(1568, "{Name:'minecraft:stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'stonebrick'}}"); + register(1569, "{Name:'minecraft:mossy_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'mossy_stonebrick'}}"); + register(1570, "{Name:'minecraft:cracked_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'cracked_stonebrick'}}"); + register(1571, "{Name:'minecraft:chiseled_stone_bricks'}", "{Name:'minecraft:stonebrick',Properties:{variant:'chiseled_stonebrick'}}"); + register(1584, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_inside'}}"); + register(1585, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north_west'}}"); + register(1586, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north'}}"); + register(1587, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'north_east'}}"); + register(1588, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'west'}}"); + register(1589, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'center'}}"); + register(1590, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'east'}}"); + register(1591, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south_west'}}"); + register(1592, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south'}}"); + register(1593, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'true',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'south_east'}}"); + register(1594, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'false',down:'false'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'stem'}}"); + register(1595, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1596, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1597, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1598, "{Name:'minecraft:brown_mushroom_block',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_outside'}}"); + register(1599, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:brown_mushroom_block',Properties:{variant:'all_stem'}}"); + register(1600, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_inside'}}"); + register(1601, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north_west'}}"); + register(1602, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north'}}"); + register(1603, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'north_east'}}"); + register(1604, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'west'}}"); + register(1605, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'center'}}"); + register(1606, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'true',south:'false',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'east'}}"); + register(1607, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'true',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south_west'}}"); + register(1608, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south'}}"); + register(1609, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'true',south:'true',west:'false',up:'true',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'south_east'}}"); + register(1610, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'false',down:'false'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'stem'}}"); + register(1611, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1612, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1613, "{Name:'minecraft:red_mushroom_block',Properties:{north:'false',east:'false',south:'false',west:'false',up:'false',down:'false'}}"); + register(1614, "{Name:'minecraft:red_mushroom_block',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_outside'}}"); + register(1615, "{Name:'minecraft:mushroom_stem',Properties:{north:'true',east:'true',south:'true',west:'true',up:'true',down:'true'}}", "{Name:'minecraft:red_mushroom_block',Properties:{variant:'all_stem'}}"); + register(1616, "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:iron_bars',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(1632, "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:glass_pane',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(1648, "{Name:'minecraft:melon_block'}", "{Name:'minecraft:melon_block'}"); + register(1664, "{Name:'minecraft:pumpkin_stem',Properties:{age:'0'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'0',facing:'west'}}"); + register(1665, "{Name:'minecraft:pumpkin_stem',Properties:{age:'1'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'1',facing:'west'}}"); + register(1666, "{Name:'minecraft:pumpkin_stem',Properties:{age:'2'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'2',facing:'west'}}"); + register(1667, "{Name:'minecraft:pumpkin_stem',Properties:{age:'3'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'3',facing:'west'}}"); + register(1668, "{Name:'minecraft:pumpkin_stem',Properties:{age:'4'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'4',facing:'west'}}"); + register(1669, "{Name:'minecraft:pumpkin_stem',Properties:{age:'5'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'5',facing:'west'}}"); + register(1670, "{Name:'minecraft:pumpkin_stem',Properties:{age:'6'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'6',facing:'west'}}"); + register(1671, "{Name:'minecraft:pumpkin_stem',Properties:{age:'7'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'east'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'north'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'south'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'up'}}", "{Name:'minecraft:pumpkin_stem',Properties:{age:'7',facing:'west'}}"); + register(1680, "{Name:'minecraft:melon_stem',Properties:{age:'0'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'0',facing:'west'}}"); + register(1681, "{Name:'minecraft:melon_stem',Properties:{age:'1'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'1',facing:'west'}}"); + register(1682, "{Name:'minecraft:melon_stem',Properties:{age:'2'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'2',facing:'west'}}"); + register(1683, "{Name:'minecraft:melon_stem',Properties:{age:'3'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'3',facing:'west'}}"); + register(1684, "{Name:'minecraft:melon_stem',Properties:{age:'4'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'4',facing:'west'}}"); + register(1685, "{Name:'minecraft:melon_stem',Properties:{age:'5'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'5',facing:'west'}}"); + register(1686, "{Name:'minecraft:melon_stem',Properties:{age:'6'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'6',facing:'west'}}"); + register(1687, "{Name:'minecraft:melon_stem',Properties:{age:'7'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'east'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'north'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'south'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'up'}}", "{Name:'minecraft:melon_stem',Properties:{age:'7',facing:'west'}}"); + register(1696, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'false'}}"); + register(1697, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'false'}}"); + register(1698, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'false',up:'true',west:'true'}}"); + register(1699, "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'false',south:'true',up:'true',west:'true'}}"); + register(1700, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'false'}}"); + register(1701, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'false'}}"); + register(1702, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'false',up:'true',west:'true'}}"); + register(1703, "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'false',north:'true',south:'true',up:'true',west:'true'}}"); + register(1704, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'false'}}"); + register(1705, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'false'}}"); + register(1706, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'false',up:'true',west:'true'}}"); + register(1707, "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'false',south:'true',up:'true',west:'true'}}"); + register(1708, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'false'}}"); + register(1709, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'false'}}"); + register(1710, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'false',up:'true',west:'true'}}"); + register(1711, "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:vine',Properties:{east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(1712, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(1713, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(1714, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(1715, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(1716, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(1717, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(1718, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(1719, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(1720, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(1721, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(1722, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(1723, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(1724, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(1725, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(1726, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(1727, "{Name:'minecraft:oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(1728, "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(1729, "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(1730, "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(1731, "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(1732, "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(1733, "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(1734, "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(1735, "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(1744, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(1745, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(1746, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(1747, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(1748, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(1749, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(1750, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(1751, "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:stone_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(1760, "{Name:'minecraft:mycelium',Properties:{snowy:'false'}}", "{Name:'minecraft:mycelium',Properties:{snowy:'false'}}", "{Name:'minecraft:mycelium',Properties:{snowy:'true'}}"); + register(1776, "{Name:'minecraft:lily_pad'}", "{Name:'minecraft:waterlily'}"); + register(1792, "{Name:'minecraft:nether_bricks'}", "{Name:'minecraft:nether_brick'}"); + register(1808, "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:nether_brick_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(1824, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(1825, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(1826, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(1827, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(1828, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(1829, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(1830, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(1831, "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:nether_brick_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(1840, "{Name:'minecraft:nether_wart',Properties:{age:'0'}}", "{Name:'minecraft:nether_wart',Properties:{age:'0'}}"); + register(1841, "{Name:'minecraft:nether_wart',Properties:{age:'1'}}", "{Name:'minecraft:nether_wart',Properties:{age:'1'}}"); + register(1842, "{Name:'minecraft:nether_wart',Properties:{age:'2'}}", "{Name:'minecraft:nether_wart',Properties:{age:'2'}}"); + register(1843, "{Name:'minecraft:nether_wart',Properties:{age:'3'}}", "{Name:'minecraft:nether_wart',Properties:{age:'3'}}"); + register(1856, "{Name:'minecraft:enchanting_table'}", "{Name:'minecraft:enchanting_table'}"); + register(1872, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'false'}}"); + register(1873, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'false'}}"); + register(1874, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'false'}}"); + register(1875, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'false'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'false'}}"); + register(1876, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'false',has_bottle_2:'true'}}"); + register(1877, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'false',has_bottle_2:'true'}}"); + register(1878, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'false',has_bottle_1:'true',has_bottle_2:'true'}}"); + register(1879, "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'true'}}", "{Name:'minecraft:brewing_stand',Properties:{has_bottle_0:'true',has_bottle_1:'true',has_bottle_2:'true'}}"); + register(1888, "{Name:'minecraft:cauldron',Properties:{level:'0'}}", "{Name:'minecraft:cauldron',Properties:{level:'0'}}"); + register(1889, "{Name:'minecraft:cauldron',Properties:{level:'1'}}", "{Name:'minecraft:cauldron',Properties:{level:'1'}}"); + register(1890, "{Name:'minecraft:cauldron',Properties:{level:'2'}}", "{Name:'minecraft:cauldron',Properties:{level:'2'}}"); + register(1891, "{Name:'minecraft:cauldron',Properties:{level:'3'}}", "{Name:'minecraft:cauldron',Properties:{level:'3'}}"); + register(1904, "{Name:'minecraft:end_portal'}", "{Name:'minecraft:end_portal'}"); + register(1920, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'south'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'south'}}"); + register(1921, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'west'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'west'}}"); + register(1922, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'north'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'north'}}"); + register(1923, "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'east'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'false',facing:'east'}}"); + register(1924, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'south'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'south'}}"); + register(1925, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'west'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'west'}}"); + register(1926, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'north'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'north'}}"); + register(1927, "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'east'}}", "{Name:'minecraft:end_portal_frame',Properties:{eye:'true',facing:'east'}}"); + register(1936, "{Name:'minecraft:end_stone'}", "{Name:'minecraft:end_stone'}"); + register(1952, "{Name:'minecraft:dragon_egg'}", "{Name:'minecraft:dragon_egg'}"); + register(1968, "{Name:'minecraft:redstone_lamp',Properties:{lit:'false'}}", "{Name:'minecraft:redstone_lamp'}"); + register(1984, "{Name:'minecraft:redstone_lamp',Properties:{lit:'true'}}", "{Name:'minecraft:lit_redstone_lamp'}"); + register(2000, "{Name:'minecraft:oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'oak'}}"); + register(2001, "{Name:'minecraft:spruce_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'spruce'}}"); + register(2002, "{Name:'minecraft:birch_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'birch'}}"); + register(2003, "{Name:'minecraft:jungle_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'jungle'}}"); + register(2004, "{Name:'minecraft:acacia_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'acacia'}}"); + register(2005, "{Name:'minecraft:dark_oak_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_wooden_slab',Properties:{variant:'dark_oak'}}"); + register(2016, "{Name:'minecraft:oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'oak'}}"); + register(2017, "{Name:'minecraft:spruce_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'spruce'}}"); + register(2018, "{Name:'minecraft:birch_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'birch'}}"); + register(2019, "{Name:'minecraft:jungle_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'jungle'}}"); + register(2020, "{Name:'minecraft:acacia_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'acacia'}}"); + register(2021, "{Name:'minecraft:dark_oak_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'bottom',variant:'dark_oak'}}"); + register(2024, "{Name:'minecraft:oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'oak'}}"); + register(2025, "{Name:'minecraft:spruce_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'spruce'}}"); + register(2026, "{Name:'minecraft:birch_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'birch'}}"); + register(2027, "{Name:'minecraft:jungle_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'jungle'}}"); + register(2028, "{Name:'minecraft:acacia_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'acacia'}}"); + register(2029, "{Name:'minecraft:dark_oak_slab',Properties:{type:'top'}}", "{Name:'minecraft:wooden_slab',Properties:{half:'top',variant:'dark_oak'}}"); + register(2032, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'south'}}"); + register(2033, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'west'}}"); + register(2034, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'north'}}"); + register(2035, "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'0',facing:'east'}}"); + register(2036, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'south'}}"); + register(2037, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'west'}}"); + register(2038, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'north'}}"); + register(2039, "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'1',facing:'east'}}"); + register(2040, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'south'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'south'}}"); + register(2041, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'west'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'west'}}"); + register(2042, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'north'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'north'}}"); + register(2043, "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'east'}}", "{Name:'minecraft:cocoa',Properties:{age:'2',facing:'east'}}"); + register(2048, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2049, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2050, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2051, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2052, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2053, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2054, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2055, "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2064, "{Name:'minecraft:emerald_ore'}", "{Name:'minecraft:emerald_ore'}"); + register(2082, "{Name:'minecraft:ender_chest',Properties:{facing:'north'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'north'}}"); + register(2083, "{Name:'minecraft:ender_chest',Properties:{facing:'south'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'south'}}"); + register(2084, "{Name:'minecraft:ender_chest',Properties:{facing:'west'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'west'}}"); + register(2085, "{Name:'minecraft:ender_chest',Properties:{facing:'east'}}", "{Name:'minecraft:ender_chest',Properties:{facing:'east'}}"); + register(2096, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'false'}}"); + register(2097, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'false'}}"); + register(2098, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'false'}}"); + register(2099, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'false'}}"); + register(2100, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'false'}}"); + register(2101, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'false'}}"); + register(2102, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'false'}}"); + register(2103, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'false'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'false'}}"); + register(2104, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'south',powered:'true'}}"); + register(2105, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'west',powered:'true'}}"); + register(2106, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'north',powered:'true'}}"); + register(2107, "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'false',facing:'east',powered:'true'}}"); + register(2108, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'south',powered:'true'}}"); + register(2109, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'west',powered:'true'}}"); + register(2110, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'north',powered:'true'}}"); + register(2111, "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'true'}}", "{Name:'minecraft:tripwire_hook',Properties:{attached:'true',facing:'east',powered:'true'}}"); + register(2112, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'true'}}"); + register(2113, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'true'}}"); + register(2114, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}"); + register(2115, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}"); + register(2116, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'false',south:'true',west:'true'}}"); + register(2117, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'true',north:'true',powered:'true',south:'true',west:'true'}}"); + register(2118, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'false',south:'false',west:'false'}}"); + register(2119, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'false',east:'false',north:'false',powered:'true',south:'false',west:'false'}}"); + register(2120, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'true'}}"); + register(2121, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'true'}}"); + register(2122, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}"); + register(2123, "{Name:'minecraft:tripwire',Properties:{attached:'false',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}"); + register(2124, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'false',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'false',south:'true',west:'true'}}"); + register(2125, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'true',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'false',powered:'true',south:'true',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'false',west:'true'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'false'}}", "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'true',north:'true',powered:'true',south:'true',west:'true'}}"); + register(2126, "{Name:'minecraft:tripwire',Properties:{attached:'true',disarmed:'true',east:'false',north:'false',powered:'false',south:'false',west:'false'}}"); + register(2128, "{Name:'minecraft:emerald_block'}", "{Name:'minecraft:emerald_block'}"); + register(2144, "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2145, "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2146, "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2147, "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2148, "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2149, "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2150, "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2151, "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:spruce_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2160, "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2161, "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2162, "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2163, "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2164, "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2165, "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2166, "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2167, "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:birch_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2176, "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2177, "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2178, "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2179, "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2180, "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2181, "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2182, "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2183, "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:jungle_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2192, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'down'}}"); + register(2193, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'up'}}"); + register(2194, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'north'}}"); + register(2195, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'south'}}"); + register(2196, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'west'}}"); + register(2197, "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:command_block',Properties:{conditional:'false',facing:'east'}}"); + register(2200, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'down'}}"); + register(2201, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'up'}}"); + register(2202, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'north'}}"); + register(2203, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'south'}}"); + register(2204, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'west'}}"); + register(2205, "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:command_block',Properties:{conditional:'true',facing:'east'}}"); + register(2208, "{Name:'minecraft:beacon'}", "{Name:'minecraft:beacon'}"); + register(2224, "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'cobblestone',west:'true'}}"); + register(2225, "{Name:'minecraft:mossy_cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'false',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'false',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'false',up:'true',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'false',variant:'mossy_cobblestone',west:'true'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'false'}}", "{Name:'minecraft:cobblestone_wall',Properties:{east:'true',north:'true',south:'true',up:'true',variant:'mossy_cobblestone',west:'true'}}"); + // There are a few changes made to flower pot here, notably handling how legacy data is handled. + // The TE itself should contain the target item and from there the proper state can be determined. However, there are + // blocks that do not contain a TE. So we need to make sure there is a default to fall on. + // I simply followed the legacy handling from BlockFlowerPot from 1.8.8 to find what legacy data mapped to what. + // It's better than defaulting everything to a cactus. + register(2240, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'0'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'0'}}"); + register(2241, "{Name:'minecraft:potted_poppy'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'1'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'1'}}"); + register(2242, "{Name:'minecraft:potted_dandelion'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'2'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'2'}}"); + register(2243, "{Name:'minecraft:potted_oak_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'3'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'3'}}"); + register(2244, "{Name:'minecraft:potted_spruce_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'4'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'4'}}"); + register(2245, "{Name:'minecraft:potted_birch_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'5'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'5'}}"); + register(2246, "{Name:'minecraft:potted_jungle_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'6'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'6'}}"); + register(2247, "{Name:'minecraft:potted_red_mushroom'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'7'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'7'}}"); + register(2248, "{Name:'minecraft:potted_brown_mushroom'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'8'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'8'}}"); + register(2249, "{Name:'minecraft:potted_cactus'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'9'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'9'}}"); + register(2250, "{Name:'minecraft:potted_dead_bush'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'10'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'10'}}"); + register(2251, "{Name:'minecraft:potted_fern'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'11'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'11'}}"); + register(2252, "{Name:'minecraft:potted_acacia_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'12'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'12'}}"); + register(2253, "{Name:'minecraft:potted_dark_oak_sapling'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'13'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'13'}}"); + register(2254, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'14'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'14'}}"); + register(2255, "{Name:'minecraft:flower_pot'}", "{Name:'minecraft:flower_pot',Properties:{contents:'acacia_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'allium',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'birch_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'blue_orchid',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'cactus',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dandelion',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dark_oak_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'dead_bush',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'empty',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'fern',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'houstonia',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'jungle_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_brown',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'mushroom_red',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oak_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'orange_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'oxeye_daisy',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'pink_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'red_tulip',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'rose',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'spruce_sapling',legacy_data:'15'}}", "{Name:'minecraft:flower_pot',Properties:{contents:'white_tulip',legacy_data:'15'}}"); + register(2256, "{Name:'minecraft:carrots',Properties:{age:'0'}}", "{Name:'minecraft:carrots',Properties:{age:'0'}}"); + register(2257, "{Name:'minecraft:carrots',Properties:{age:'1'}}", "{Name:'minecraft:carrots',Properties:{age:'1'}}"); + register(2258, "{Name:'minecraft:carrots',Properties:{age:'2'}}", "{Name:'minecraft:carrots',Properties:{age:'2'}}"); + register(2259, "{Name:'minecraft:carrots',Properties:{age:'3'}}", "{Name:'minecraft:carrots',Properties:{age:'3'}}"); + register(2260, "{Name:'minecraft:carrots',Properties:{age:'4'}}", "{Name:'minecraft:carrots',Properties:{age:'4'}}"); + register(2261, "{Name:'minecraft:carrots',Properties:{age:'5'}}", "{Name:'minecraft:carrots',Properties:{age:'5'}}"); + register(2262, "{Name:'minecraft:carrots',Properties:{age:'6'}}", "{Name:'minecraft:carrots',Properties:{age:'6'}}"); + register(2263, "{Name:'minecraft:carrots',Properties:{age:'7'}}", "{Name:'minecraft:carrots',Properties:{age:'7'}}"); + register(2272, "{Name:'minecraft:potatoes',Properties:{age:'0'}}", "{Name:'minecraft:potatoes',Properties:{age:'0'}}"); + register(2273, "{Name:'minecraft:potatoes',Properties:{age:'1'}}", "{Name:'minecraft:potatoes',Properties:{age:'1'}}"); + register(2274, "{Name:'minecraft:potatoes',Properties:{age:'2'}}", "{Name:'minecraft:potatoes',Properties:{age:'2'}}"); + register(2275, "{Name:'minecraft:potatoes',Properties:{age:'3'}}", "{Name:'minecraft:potatoes',Properties:{age:'3'}}"); + register(2276, "{Name:'minecraft:potatoes',Properties:{age:'4'}}", "{Name:'minecraft:potatoes',Properties:{age:'4'}}"); + register(2277, "{Name:'minecraft:potatoes',Properties:{age:'5'}}", "{Name:'minecraft:potatoes',Properties:{age:'5'}}"); + register(2278, "{Name:'minecraft:potatoes',Properties:{age:'6'}}", "{Name:'minecraft:potatoes',Properties:{age:'6'}}"); + register(2279, "{Name:'minecraft:potatoes',Properties:{age:'7'}}", "{Name:'minecraft:potatoes',Properties:{age:'7'}}"); + register(2288, "{Name:'minecraft:oak_button',Properties:{face:'ceiling',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'down',powered:'false'}}"); + register(2289, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'east',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'east',powered:'false'}}"); + register(2290, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'west',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'west',powered:'false'}}"); + register(2291, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'south',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'south',powered:'false'}}"); + register(2292, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'north',powered:'false'}}"); + register(2293, "{Name:'minecraft:oak_button',Properties:{face:'floor',facing:'north',powered:'false'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'up',powered:'false'}}"); + register(2296, "{Name:'minecraft:oak_button',Properties:{face:'ceiling',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'down',powered:'true'}}"); + register(2297, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'east',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'east',powered:'true'}}"); + register(2298, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'west',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'west',powered:'true'}}"); + register(2299, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'south',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'south',powered:'true'}}"); + register(2300, "{Name:'minecraft:oak_button',Properties:{face:'wall',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'north',powered:'true'}}"); + register(2301, "{Name:'minecraft:oak_button',Properties:{face:'floor',facing:'north',powered:'true'}}", "{Name:'minecraft:wooden_button',Properties:{facing:'up',powered:'true'}}"); + register(2304, "{Name:'%%FILTER_ME%%',Properties:{facing:'down',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'down',nodrop:'false'}}"); + register(2305, "{Name:'%%FILTER_ME%%',Properties:{facing:'up',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'up',nodrop:'false'}}"); + register(2306, "{Name:'%%FILTER_ME%%',Properties:{facing:'north',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'north',nodrop:'false'}}"); + register(2307, "{Name:'%%FILTER_ME%%',Properties:{facing:'south',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'south',nodrop:'false'}}"); + register(2308, "{Name:'%%FILTER_ME%%',Properties:{facing:'west',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'west',nodrop:'false'}}"); + register(2309, "{Name:'%%FILTER_ME%%',Properties:{facing:'east',nodrop:'false'}}", "{Name:'minecraft:skull',Properties:{facing:'east',nodrop:'false'}}"); + register(2312, "{Name:'%%FILTER_ME%%',Properties:{facing:'down',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'down',nodrop:'true'}}"); + register(2313, "{Name:'%%FILTER_ME%%',Properties:{facing:'up',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'up',nodrop:'true'}}"); + register(2314, "{Name:'%%FILTER_ME%%',Properties:{facing:'north',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'north',nodrop:'true'}}"); + register(2315, "{Name:'%%FILTER_ME%%',Properties:{facing:'south',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'south',nodrop:'true'}}"); + register(2316, "{Name:'%%FILTER_ME%%',Properties:{facing:'west',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'west',nodrop:'true'}}"); + register(2317, "{Name:'%%FILTER_ME%%',Properties:{facing:'east',nodrop:'true'}}", "{Name:'minecraft:skull',Properties:{facing:'east',nodrop:'true'}}"); + register(2320, "{Name:'minecraft:anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'south'}}"); + register(2321, "{Name:'minecraft:anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'west'}}"); + register(2322, "{Name:'minecraft:anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'north'}}"); + register(2323, "{Name:'minecraft:anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'0',facing:'east'}}"); + register(2324, "{Name:'minecraft:chipped_anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'south'}}"); + register(2325, "{Name:'minecraft:chipped_anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'west'}}"); + register(2326, "{Name:'minecraft:chipped_anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'north'}}"); + register(2327, "{Name:'minecraft:chipped_anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'1',facing:'east'}}"); + register(2328, "{Name:'minecraft:damaged_anvil',Properties:{facing:'south'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'south'}}"); + register(2329, "{Name:'minecraft:damaged_anvil',Properties:{facing:'west'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'west'}}"); + register(2330, "{Name:'minecraft:damaged_anvil',Properties:{facing:'north'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'north'}}"); + register(2331, "{Name:'minecraft:damaged_anvil',Properties:{facing:'east'}}", "{Name:'minecraft:anvil',Properties:{damage:'2',facing:'east'}}"); + register(2338, "{Name:'minecraft:trapped_chest',Properties:{facing:'north',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'north'}}"); + register(2339, "{Name:'minecraft:trapped_chest',Properties:{facing:'south',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'south'}}"); + register(2340, "{Name:'minecraft:trapped_chest',Properties:{facing:'west',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'west'}}"); + register(2341, "{Name:'minecraft:trapped_chest',Properties:{facing:'east',type:'single'}}", "{Name:'minecraft:trapped_chest',Properties:{facing:'east'}}"); + register(2352, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'0'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'0'}}"); + register(2353, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'1'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'1'}}"); + register(2354, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'2'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'2'}}"); + register(2355, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'3'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'3'}}"); + register(2356, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'4'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'4'}}"); + register(2357, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'5'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'5'}}"); + register(2358, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'6'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'6'}}"); + register(2359, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'7'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'7'}}"); + register(2360, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'8'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'8'}}"); + register(2361, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'9'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'9'}}"); + register(2362, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'10'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'10'}}"); + register(2363, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'11'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'11'}}"); + register(2364, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'12'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'12'}}"); + register(2365, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'13'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'13'}}"); + register(2366, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'14'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'14'}}"); + register(2367, "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'15'}}", "{Name:'minecraft:light_weighted_pressure_plate',Properties:{power:'15'}}"); + register(2368, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'0'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'0'}}"); + register(2369, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'1'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'1'}}"); + register(2370, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'2'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'2'}}"); + register(2371, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'3'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'3'}}"); + register(2372, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'4'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'4'}}"); + register(2373, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'5'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'5'}}"); + register(2374, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'6'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'6'}}"); + register(2375, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'7'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'7'}}"); + register(2376, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'8'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'8'}}"); + register(2377, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'9'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'9'}}"); + register(2378, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'10'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'10'}}"); + register(2379, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'11'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'11'}}"); + register(2380, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'12'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'12'}}"); + register(2381, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'13'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'13'}}"); + register(2382, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'14'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'14'}}"); + register(2383, "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'15'}}", "{Name:'minecraft:heavy_weighted_pressure_plate',Properties:{power:'15'}}"); + register(2384, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}"); + register(2385, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}"); + register(2386, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}"); + register(2387, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}"); + register(2388, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}"); + register(2389, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}"); + register(2390, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}"); + register(2391, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}"); + register(2392, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}"); + register(2393, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}"); + register(2394, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}"); + register(2395, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}"); + register(2396, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}"); + register(2397, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}"); + register(2398, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}"); + register(2399, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}", "{Name:'minecraft:unpowered_comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}"); + register(2400, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'compare',powered:'false'}}"); + register(2401, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'compare',powered:'false'}}"); + register(2402, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'compare',powered:'false'}}"); + register(2403, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'compare',powered:'false'}}"); + register(2404, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'subtract',powered:'false'}}"); + register(2405, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'subtract',powered:'false'}}"); + register(2406, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'subtract',powered:'false'}}"); + register(2407, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'subtract',powered:'false'}}"); + register(2408, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'compare',powered:'true'}}"); + register(2409, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'compare',powered:'true'}}"); + register(2410, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'compare',powered:'true'}}"); + register(2411, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'compare',powered:'true'}}"); + register(2412, "{Name:'minecraft:comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'south',mode:'subtract',powered:'true'}}"); + register(2413, "{Name:'minecraft:comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'west',mode:'subtract',powered:'true'}}"); + register(2414, "{Name:'minecraft:comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'north',mode:'subtract',powered:'true'}}"); + register(2415, "{Name:'minecraft:comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}", "{Name:'minecraft:powered_comparator',Properties:{facing:'east',mode:'subtract',powered:'true'}}"); + register(2416, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'0'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'0'}}"); + register(2417, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'1'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'1'}}"); + register(2418, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'2'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'2'}}"); + register(2419, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'3'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'3'}}"); + register(2420, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'4'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'4'}}"); + register(2421, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'5'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'5'}}"); + register(2422, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'6'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'6'}}"); + register(2423, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'7'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'7'}}"); + register(2424, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'8'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'8'}}"); + register(2425, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'9'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'9'}}"); + register(2426, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'10'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'10'}}"); + register(2427, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'11'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'11'}}"); + register(2428, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'12'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'12'}}"); + register(2429, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'13'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'13'}}"); + register(2430, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'14'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'14'}}"); + register(2431, "{Name:'minecraft:daylight_detector',Properties:{inverted:'false',power:'15'}}", "{Name:'minecraft:daylight_detector',Properties:{power:'15'}}"); + register(2432, "{Name:'minecraft:redstone_block'}", "{Name:'minecraft:redstone_block'}"); + register(2448, "{Name:'minecraft:nether_quartz_ore'}", "{Name:'minecraft:quartz_ore'}"); + register(2464, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'down'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'down'}}"); + register(2466, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'north'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'north'}}"); + register(2467, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'south'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'south'}}"); + register(2468, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'west'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'west'}}"); + register(2469, "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'east'}}", "{Name:'minecraft:hopper',Properties:{enabled:'true',facing:'east'}}"); + register(2472, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'down'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'down'}}"); + register(2474, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'north'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'north'}}"); + register(2475, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'south'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'south'}}"); + register(2476, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'west'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'west'}}"); + register(2477, "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'east'}}", "{Name:'minecraft:hopper',Properties:{enabled:'false',facing:'east'}}"); + register(2480, "{Name:'minecraft:quartz_block'}", "{Name:'minecraft:quartz_block',Properties:{variant:'default'}}"); + register(2481, "{Name:'minecraft:chiseled_quartz_block'}", "{Name:'minecraft:quartz_block',Properties:{variant:'chiseled'}}"); + register(2482, "{Name:'minecraft:quartz_pillar',Properties:{axis:'y'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_y'}}"); + register(2483, "{Name:'minecraft:quartz_pillar',Properties:{axis:'x'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_x'}}"); + register(2484, "{Name:'minecraft:quartz_pillar',Properties:{axis:'z'}}", "{Name:'minecraft:quartz_block',Properties:{variant:'lines_z'}}"); + register(2496, "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2497, "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2498, "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2499, "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2500, "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2501, "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2502, "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2503, "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:quartz_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2512, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'north_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'north_south'}}"); + register(2513, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'east_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'east_west'}}"); + register(2514, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_east'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_east'}}"); + register(2515, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_west'}}"); + register(2516, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_north'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_north'}}"); + register(2517, "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'false',shape:'ascending_south'}}"); + register(2520, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'north_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'north_south'}}"); + register(2521, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'east_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'east_west'}}"); + register(2522, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_east'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_east'}}"); + register(2523, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_west'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_west'}}"); + register(2524, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_north'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_north'}}"); + register(2525, "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_south'}}", "{Name:'minecraft:activator_rail',Properties:{powered:'true',shape:'ascending_south'}}"); + register(2528, "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'false'}}"); + register(2529, "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'false'}}"); + register(2530, "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'false'}}"); + register(2531, "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'false'}}"); + register(2532, "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'false'}}"); + register(2533, "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'false'}}", "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'false'}}"); + register(2536, "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'down',triggered:'true'}}"); + register(2537, "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'up',triggered:'true'}}"); + register(2538, "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'north',triggered:'true'}}"); + register(2539, "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'south',triggered:'true'}}"); + register(2540, "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'west',triggered:'true'}}"); + register(2541, "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'true'}}", "{Name:'minecraft:dropper',Properties:{facing:'east',triggered:'true'}}"); + register(2544, "{Name:'minecraft:white_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'white'}}"); + register(2545, "{Name:'minecraft:orange_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'orange'}}"); + register(2546, "{Name:'minecraft:magenta_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'magenta'}}"); + register(2547, "{Name:'minecraft:light_blue_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'light_blue'}}"); + register(2548, "{Name:'minecraft:yellow_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'yellow'}}"); + register(2549, "{Name:'minecraft:lime_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'lime'}}"); + register(2550, "{Name:'minecraft:pink_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'pink'}}"); + register(2551, "{Name:'minecraft:gray_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'gray'}}"); + register(2552, "{Name:'minecraft:light_gray_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'silver'}}"); + register(2553, "{Name:'minecraft:cyan_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'cyan'}}"); + register(2554, "{Name:'minecraft:purple_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'purple'}}"); + register(2555, "{Name:'minecraft:blue_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'blue'}}"); + register(2556, "{Name:'minecraft:brown_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'brown'}}"); + register(2557, "{Name:'minecraft:green_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'green'}}"); + register(2558, "{Name:'minecraft:red_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'red'}}"); + register(2559, "{Name:'minecraft:black_terracotta'}", "{Name:'minecraft:stained_hardened_clay',Properties:{color:'black'}}"); + register(2560, "{Name:'minecraft:white_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'white',east:'true',north:'true',south:'true',west:'true'}}"); + register(2561, "{Name:'minecraft:orange_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'orange',east:'true',north:'true',south:'true',west:'true'}}"); + register(2562, "{Name:'minecraft:magenta_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'magenta',east:'true',north:'true',south:'true',west:'true'}}"); + register(2563, "{Name:'minecraft:light_blue_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'light_blue',east:'true',north:'true',south:'true',west:'true'}}"); + register(2564, "{Name:'minecraft:yellow_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'yellow',east:'true',north:'true',south:'true',west:'true'}}"); + register(2565, "{Name:'minecraft:lime_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'lime',east:'true',north:'true',south:'true',west:'true'}}"); + register(2566, "{Name:'minecraft:pink_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'pink',east:'true',north:'true',south:'true',west:'true'}}"); + register(2567, "{Name:'minecraft:gray_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'gray',east:'true',north:'true',south:'true',west:'true'}}"); + register(2568, "{Name:'minecraft:light_gray_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'silver',east:'true',north:'true',south:'true',west:'true'}}"); + register(2569, "{Name:'minecraft:cyan_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'cyan',east:'true',north:'true',south:'true',west:'true'}}"); + register(2570, "{Name:'minecraft:purple_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'purple',east:'true',north:'true',south:'true',west:'true'}}"); + register(2571, "{Name:'minecraft:blue_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'blue',east:'true',north:'true',south:'true',west:'true'}}"); + register(2572, "{Name:'minecraft:brown_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'brown',east:'true',north:'true',south:'true',west:'true'}}"); + register(2573, "{Name:'minecraft:green_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'green',east:'true',north:'true',south:'true',west:'true'}}"); + register(2574, "{Name:'minecraft:red_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'red',east:'true',north:'true',south:'true',west:'true'}}"); + register(2575, "{Name:'minecraft:black_stained_glass_pane',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:stained_glass_pane',Properties:{color:'black',east:'true',north:'true',south:'true',west:'true'}}"); + register(2576, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'true',variant:'acacia'}}"); + register(2577, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'false',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'true',variant:'dark_oak'}}"); + register(2580, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'false',variant:'acacia'}}"); + register(2581, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'false',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'false',decayable:'false',variant:'dark_oak'}}"); + register(2584, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'true',variant:'acacia'}}"); + register(2585, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'true',decayable:'true'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'true',variant:'dark_oak'}}"); + register(2588, "{Name:'minecraft:acacia_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'false',variant:'acacia'}}"); + register(2589, "{Name:'minecraft:dark_oak_leaves',Properties:{check_decay:'true',decayable:'false'}}", "{Name:'minecraft:leaves2',Properties:{check_decay:'true',decayable:'false',variant:'dark_oak'}}"); + register(2592, "{Name:'minecraft:acacia_log',Properties:{axis:'y'}}", "{Name:'minecraft:log2',Properties:{axis:'y',variant:'acacia'}}"); + register(2593, "{Name:'minecraft:dark_oak_log',Properties:{axis:'y'}}", "{Name:'minecraft:log2',Properties:{axis:'y',variant:'dark_oak'}}"); + register(2596, "{Name:'minecraft:acacia_log',Properties:{axis:'x'}}", "{Name:'minecraft:log2',Properties:{axis:'x',variant:'acacia'}}"); + register(2597, "{Name:'minecraft:dark_oak_log',Properties:{axis:'x'}}", "{Name:'minecraft:log2',Properties:{axis:'x',variant:'dark_oak'}}"); + register(2600, "{Name:'minecraft:acacia_log',Properties:{axis:'z'}}", "{Name:'minecraft:log2',Properties:{axis:'z',variant:'acacia'}}"); + register(2601, "{Name:'minecraft:dark_oak_log',Properties:{axis:'z'}}", "{Name:'minecraft:log2',Properties:{axis:'z',variant:'dark_oak'}}"); + register(2604, "{Name:'minecraft:acacia_bark'}", "{Name:'minecraft:log2',Properties:{axis:'none',variant:'acacia'}}"); + register(2605, "{Name:'minecraft:dark_oak_bark'}", "{Name:'minecraft:log2',Properties:{axis:'none',variant:'dark_oak'}}"); + register(2608, "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2609, "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2610, "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2611, "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2612, "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2613, "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2614, "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2615, "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:acacia_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2624, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2625, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2626, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2627, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2628, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2629, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2630, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2631, "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:dark_oak_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2640, "{Name:'minecraft:slime_block'}", "{Name:'minecraft:slime'}"); + register(2656, "{Name:'minecraft:barrier'}", "{Name:'minecraft:barrier'}"); + register(2672, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'false'}}"); + register(2673, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'false'}}"); + register(2674, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'false'}}"); + register(2675, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'false'}}"); + register(2676, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'bottom',open:'true'}}"); + register(2677, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'bottom',open:'true'}}"); + register(2678, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'bottom',open:'true'}}"); + register(2679, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'bottom',open:'true'}}"); + register(2680, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'false'}}"); + register(2681, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'false'}}"); + register(2682, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'false'}}"); + register(2683, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'false'}}"); + register(2684, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'north',half:'top',open:'true'}}"); + register(2685, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'south',half:'top',open:'true'}}"); + register(2686, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'west',half:'top',open:'true'}}"); + register(2687, "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}", "{Name:'minecraft:iron_trapdoor',Properties:{facing:'east',half:'top',open:'true'}}"); + register(2688, "{Name:'minecraft:prismarine'}", "{Name:'minecraft:prismarine',Properties:{variant:'prismarine'}}"); + register(2689, "{Name:'minecraft:prismarine_bricks'}", "{Name:'minecraft:prismarine',Properties:{variant:'prismarine_bricks'}}"); + register(2690, "{Name:'minecraft:dark_prismarine'}", "{Name:'minecraft:prismarine',Properties:{variant:'dark_prismarine'}}"); + register(2704, "{Name:'minecraft:sea_lantern'}", "{Name:'minecraft:sea_lantern'}"); + register(2720, "{Name:'minecraft:hay_block',Properties:{axis:'y'}}", "{Name:'minecraft:hay_block',Properties:{axis:'y'}}"); + register(2724, "{Name:'minecraft:hay_block',Properties:{axis:'x'}}", "{Name:'minecraft:hay_block',Properties:{axis:'x'}}"); + register(2728, "{Name:'minecraft:hay_block',Properties:{axis:'z'}}", "{Name:'minecraft:hay_block',Properties:{axis:'z'}}"); + register(2736, "{Name:'minecraft:white_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'white'}}"); + register(2737, "{Name:'minecraft:orange_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'orange'}}"); + register(2738, "{Name:'minecraft:magenta_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'magenta'}}"); + register(2739, "{Name:'minecraft:light_blue_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'light_blue'}}"); + register(2740, "{Name:'minecraft:yellow_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'yellow'}}"); + register(2741, "{Name:'minecraft:lime_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'lime'}}"); + register(2742, "{Name:'minecraft:pink_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'pink'}}"); + register(2743, "{Name:'minecraft:gray_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'gray'}}"); + register(2744, "{Name:'minecraft:light_gray_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'silver'}}"); + register(2745, "{Name:'minecraft:cyan_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'cyan'}}"); + register(2746, "{Name:'minecraft:purple_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'purple'}}"); + register(2747, "{Name:'minecraft:blue_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'blue'}}"); + register(2748, "{Name:'minecraft:brown_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'brown'}}"); + register(2749, "{Name:'minecraft:green_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'green'}}"); + register(2750, "{Name:'minecraft:red_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'red'}}"); + register(2751, "{Name:'minecraft:black_carpet'}", "{Name:'minecraft:carpet',Properties:{color:'black'}}"); + register(2752, "{Name:'minecraft:terracotta'}", "{Name:'minecraft:hardened_clay'}"); + register(2768, "{Name:'minecraft:coal_block'}", "{Name:'minecraft:coal_block'}"); + register(2784, "{Name:'minecraft:packed_ice'}", "{Name:'minecraft:packed_ice'}"); + register(2800, "{Name:'minecraft:sunflower',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'sunflower'}}"); + register(2801, "{Name:'minecraft:lilac',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'syringa'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'syringa'}}"); + register(2802, "{Name:'minecraft:tall_grass',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_grass'}}"); + register(2803, "{Name:'minecraft:large_fern',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_fern'}}"); + register(2804, "{Name:'minecraft:rose_bush',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'double_rose'}}"); + register(2805, "{Name:'minecraft:peony',Properties:{half:'lower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'lower',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'lower',variant:'paeonia'}}"); + register(2808, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'south',half:'upper',variant:'syringa'}}"); + register(2809, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'west',half:'upper',variant:'syringa'}}"); + register(2810, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'north',half:'upper',variant:'syringa'}}"); + register(2811, "{Name:'minecraft:peony',Properties:{half:'upper'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_fern'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_grass'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'double_rose'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'paeonia'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'sunflower'}}", "{Name:'minecraft:double_plant',Properties:{facing:'east',half:'upper',variant:'syringa'}}"); + register(2816, "{Name:'minecraft:white_banner',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'0'}}"); + register(2817, "{Name:'minecraft:white_banner',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'1'}}"); + register(2818, "{Name:'minecraft:white_banner',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'2'}}"); + register(2819, "{Name:'minecraft:white_banner',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'3'}}"); + register(2820, "{Name:'minecraft:white_banner',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'4'}}"); + register(2821, "{Name:'minecraft:white_banner',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'5'}}"); + register(2822, "{Name:'minecraft:white_banner',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'6'}}"); + register(2823, "{Name:'minecraft:white_banner',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'7'}}"); + register(2824, "{Name:'minecraft:white_banner',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'8'}}"); + register(2825, "{Name:'minecraft:white_banner',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'9'}}"); + register(2826, "{Name:'minecraft:white_banner',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'10'}}"); + register(2827, "{Name:'minecraft:white_banner',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'11'}}"); + register(2828, "{Name:'minecraft:white_banner',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'12'}}"); + register(2829, "{Name:'minecraft:white_banner',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'13'}}"); + register(2830, "{Name:'minecraft:white_banner',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'14'}}"); + register(2831, "{Name:'minecraft:white_banner',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_banner',Properties:{rotation:'15'}}"); + register(2834, "{Name:'minecraft:white_wall_banner',Properties:{facing:'north'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'north'}}"); + register(2835, "{Name:'minecraft:white_wall_banner',Properties:{facing:'south'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'south'}}"); + register(2836, "{Name:'minecraft:white_wall_banner',Properties:{facing:'west'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'west'}}"); + register(2837, "{Name:'minecraft:white_wall_banner',Properties:{facing:'east'}}", "{Name:'minecraft:wall_banner',Properties:{facing:'east'}}"); + register(2848, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'0'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'0'}}"); + register(2849, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'1'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'1'}}"); + register(2850, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'2'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'2'}}"); + register(2851, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'3'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'3'}}"); + register(2852, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'4'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'4'}}"); + register(2853, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'5'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'5'}}"); + register(2854, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'6'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'6'}}"); + register(2855, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'7'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'7'}}"); + register(2856, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'8'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'8'}}"); + register(2857, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'9'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'9'}}"); + register(2858, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'10'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'10'}}"); + register(2859, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'11'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'11'}}"); + register(2860, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'12'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'12'}}"); + register(2861, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'13'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'13'}}"); + register(2862, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'14'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'14'}}"); + register(2863, "{Name:'minecraft:daylight_detector',Properties:{inverted:'true',power:'15'}}", "{Name:'minecraft:daylight_detector_inverted',Properties:{power:'15'}}"); + register(2864, "{Name:'minecraft:red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'red_sandstone'}}"); + register(2865, "{Name:'minecraft:chiseled_red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'chiseled_red_sandstone'}}"); + register(2866, "{Name:'minecraft:cut_red_sandstone'}", "{Name:'minecraft:red_sandstone',Properties:{type:'smooth_red_sandstone'}}"); + register(2880, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(2881, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(2882, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(2883, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(2884, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(2885, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(2886, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(2887, "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:red_sandstone_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(2896, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'double'}}", "{Name:'minecraft:double_stone_slab2',Properties:{seamless:'false',variant:'red_sandstone'}}"); + register(2904, "{Name:'minecraft:smooth_red_sandstone'}", "{Name:'minecraft:double_stone_slab2',Properties:{seamless:'true',variant:'red_sandstone'}}"); + register(2912, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:stone_slab2',Properties:{half:'bottom',variant:'red_sandstone'}}"); + register(2920, "{Name:'minecraft:red_sandstone_slab',Properties:{type:'top'}}", "{Name:'minecraft:stone_slab2',Properties:{half:'top',variant:'red_sandstone'}}"); + register(2928, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2929, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2930, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2931, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2932, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2933, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2934, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2935, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(2936, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(2937, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(2938, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(2939, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(2940, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(2941, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(2942, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(2943, "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(2944, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2945, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2946, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2947, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2948, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2949, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2950, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2951, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(2952, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(2953, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(2954, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(2955, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(2956, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(2957, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(2958, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(2959, "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:birch_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(2960, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2961, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2962, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2963, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2964, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2965, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2966, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2967, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(2968, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(2969, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(2970, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(2971, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(2972, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(2973, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(2974, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(2975, "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(2976, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2977, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2978, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2979, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2980, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2981, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2982, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2983, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(2984, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(2985, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(2986, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(2987, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(2988, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(2989, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(2990, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(2991, "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(2992, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'false'}}"); + register(2993, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'false'}}"); + register(2994, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'false'}}"); + register(2995, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'false'}}"); + register(2996, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'false'}}"); + register(2997, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'false'}}"); + register(2998, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'false'}}"); + register(2999, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'false'}}"); + register(3000, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'false',powered:'true'}}"); + register(3001, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'false',powered:'true'}}"); + register(3002, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'false',powered:'true'}}"); + register(3003, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'false',powered:'true'}}"); + register(3004, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'south',in_wall:'true',open:'true',powered:'true'}}"); + register(3005, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'west',in_wall:'true',open:'true',powered:'true'}}"); + register(3006, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'north',in_wall:'true',open:'true',powered:'true'}}"); + register(3007, "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'false',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_fence_gate',Properties:{facing:'east',in_wall:'true',open:'true',powered:'true'}}"); + register(3008, "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:spruce_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3024, "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:birch_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3040, "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:jungle_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3056, "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:dark_oak_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3072, "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'false',north:'true',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'false',south:'true',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'false',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'false',west:'true'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'true',west:'false'}}", "{Name:'minecraft:acacia_fence',Properties:{east:'true',north:'true',south:'true',west:'true'}}"); + register(3088, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3089, "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3090, "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3091, "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3092, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3093, "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3094, "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3095, "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3096, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3097, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3098, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3099, "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:spruce_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3104, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3105, "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3106, "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3107, "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3108, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3109, "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3110, "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3111, "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3112, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3113, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3114, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3115, "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:birch_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3120, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3121, "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3122, "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3123, "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3124, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3125, "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3126, "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3127, "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3128, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3129, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3130, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3131, "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:jungle_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3136, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3137, "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3138, "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3139, "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3140, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3141, "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3142, "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3143, "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3144, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3145, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3146, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3147, "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:acacia_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3152, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3153, "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3154, "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3155, "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'false',powered:'true'}}"); + register(3156, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3157, "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3158, "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3159, "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'lower',hinge:'right',open:'true',powered:'true'}}"); + register(3160, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'false'}}"); + register(3161, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'false'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'false'}}"); + register(3162, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'left',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'left',open:'true',powered:'true'}}"); + register(3163, "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'east',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'north',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'south',half:'upper',hinge:'right',open:'true',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'false',powered:'true'}}", "{Name:'minecraft:dark_oak_door',Properties:{facing:'west',half:'upper',hinge:'right',open:'true',powered:'true'}}"); + register(3168, "{Name:'minecraft:end_rod',Properties:{facing:'down'}}", "{Name:'minecraft:end_rod',Properties:{facing:'down'}}"); + register(3169, "{Name:'minecraft:end_rod',Properties:{facing:'up'}}", "{Name:'minecraft:end_rod',Properties:{facing:'up'}}"); + register(3170, "{Name:'minecraft:end_rod',Properties:{facing:'north'}}", "{Name:'minecraft:end_rod',Properties:{facing:'north'}}"); + register(3171, "{Name:'minecraft:end_rod',Properties:{facing:'south'}}", "{Name:'minecraft:end_rod',Properties:{facing:'south'}}"); + register(3172, "{Name:'minecraft:end_rod',Properties:{facing:'west'}}", "{Name:'minecraft:end_rod',Properties:{facing:'west'}}"); + register(3173, "{Name:'minecraft:end_rod',Properties:{facing:'east'}}", "{Name:'minecraft:end_rod',Properties:{facing:'east'}}"); + register(3184, "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'false',east:'true',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'false',north:'true',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'false',south:'true',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'false',up:'true',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'false',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'false',west:'true'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'true',west:'false'}}", "{Name:'minecraft:chorus_plant',Properties:{down:'true',east:'true',north:'true',south:'true',up:'true',west:'true'}}"); + register(3200, "{Name:'minecraft:chorus_flower',Properties:{age:'0'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'0'}}"); + register(3201, "{Name:'minecraft:chorus_flower',Properties:{age:'1'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'1'}}"); + register(3202, "{Name:'minecraft:chorus_flower',Properties:{age:'2'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'2'}}"); + register(3203, "{Name:'minecraft:chorus_flower',Properties:{age:'3'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'3'}}"); + register(3204, "{Name:'minecraft:chorus_flower',Properties:{age:'4'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'4'}}"); + register(3205, "{Name:'minecraft:chorus_flower',Properties:{age:'5'}}", "{Name:'minecraft:chorus_flower',Properties:{age:'5'}}"); + register(3216, "{Name:'minecraft:purpur_block'}", "{Name:'minecraft:purpur_block'}"); + register(3232, "{Name:'minecraft:purpur_pillar',Properties:{axis:'y'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'y'}}"); + register(3236, "{Name:'minecraft:purpur_pillar',Properties:{axis:'x'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'x'}}"); + register(3240, "{Name:'minecraft:purpur_pillar',Properties:{axis:'z'}}", "{Name:'minecraft:purpur_pillar',Properties:{axis:'z'}}"); + register(3248, "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'bottom',shape:'straight'}}"); + register(3249, "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'bottom',shape:'straight'}}"); + register(3250, "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'bottom',shape:'straight'}}"); + register(3251, "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'bottom',shape:'straight'}}"); + register(3252, "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'east',half:'top',shape:'straight'}}"); + register(3253, "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'west',half:'top',shape:'straight'}}"); + register(3254, "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'south',half:'top',shape:'straight'}}"); + register(3255, "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'inner_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'inner_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'outer_left'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'outer_right'}}", "{Name:'minecraft:purpur_stairs',Properties:{facing:'north',half:'top',shape:'straight'}}"); + register(3264, "{Name:'minecraft:purpur_slab',Properties:{type:'double'}}", "{Name:'minecraft:purpur_double_slab',Properties:{variant:'default'}}"); + register(3280, "{Name:'minecraft:purpur_slab',Properties:{type:'bottom'}}", "{Name:'minecraft:purpur_slab',Properties:{half:'bottom',variant:'default'}}"); + register(3288, "{Name:'minecraft:purpur_slab',Properties:{type:'top'}}", "{Name:'minecraft:purpur_slab',Properties:{half:'top',variant:'default'}}"); + register(3296, "{Name:'minecraft:end_stone_bricks'}", "{Name:'minecraft:end_bricks'}"); + register(3312, "{Name:'minecraft:beetroots',Properties:{age:'0'}}", "{Name:'minecraft:beetroots',Properties:{age:'0'}}"); + register(3313, "{Name:'minecraft:beetroots',Properties:{age:'1'}}", "{Name:'minecraft:beetroots',Properties:{age:'1'}}"); + register(3314, "{Name:'minecraft:beetroots',Properties:{age:'2'}}", "{Name:'minecraft:beetroots',Properties:{age:'2'}}"); + register(3315, "{Name:'minecraft:beetroots',Properties:{age:'3'}}", "{Name:'minecraft:beetroots',Properties:{age:'3'}}"); + register(3328, "{Name:'minecraft:grass_path'}", "{Name:'minecraft:grass_path'}"); + register(3344, "{Name:'minecraft:end_gateway'}", "{Name:'minecraft:end_gateway'}"); + register(3360, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'down'}}"); + register(3361, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'up'}}"); + register(3362, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'north'}}"); + register(3363, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'south'}}"); + register(3364, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'west'}}"); + register(3365, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'false',facing:'east'}}"); + register(3368, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'down'}}"); + register(3369, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'up'}}"); + register(3370, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'north'}}"); + register(3371, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'south'}}"); + register(3372, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'west'}}"); + register(3373, "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:repeating_command_block',Properties:{conditional:'true',facing:'east'}}"); + register(3376, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'down'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'down'}}"); + register(3377, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'up'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'up'}}"); + register(3378, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'north'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'north'}}"); + register(3379, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'south'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'south'}}"); + register(3380, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'west'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'west'}}"); + register(3381, "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'east'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'false',facing:'east'}}"); + register(3384, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'down'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'down'}}"); + register(3385, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'up'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'up'}}"); + register(3386, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'north'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'north'}}"); + register(3387, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'south'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'south'}}"); + register(3388, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'west'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'west'}}"); + register(3389, "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'east'}}", "{Name:'minecraft:chain_command_block',Properties:{conditional:'true',facing:'east'}}"); + register(3392, "{Name:'minecraft:frosted_ice',Properties:{age:'0'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'0'}}"); + register(3393, "{Name:'minecraft:frosted_ice',Properties:{age:'1'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'1'}}"); + register(3394, "{Name:'minecraft:frosted_ice',Properties:{age:'2'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'2'}}"); + register(3395, "{Name:'minecraft:frosted_ice',Properties:{age:'3'}}", "{Name:'minecraft:frosted_ice',Properties:{age:'3'}}"); + register(3408, "{Name:'minecraft:magma_block'}", "{Name:'minecraft:magma'}"); + register(3424, "{Name:'minecraft:nether_wart_block'}", "{Name:'minecraft:nether_wart_block'}"); + register(3440, "{Name:'minecraft:red_nether_bricks'}", "{Name:'minecraft:red_nether_brick'}"); + register(3456, "{Name:'minecraft:bone_block',Properties:{axis:'y'}}", "{Name:'minecraft:bone_block',Properties:{axis:'y'}}"); + register(3460, "{Name:'minecraft:bone_block',Properties:{axis:'x'}}", "{Name:'minecraft:bone_block',Properties:{axis:'x'}}"); + register(3464, "{Name:'minecraft:bone_block',Properties:{axis:'z'}}", "{Name:'minecraft:bone_block',Properties:{axis:'z'}}"); + register(3472, "{Name:'minecraft:structure_void'}", "{Name:'minecraft:structure_void'}"); + register(3488, "{Name:'minecraft:observer',Properties:{facing:'down',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'down',powered:'false'}}"); + register(3489, "{Name:'minecraft:observer',Properties:{facing:'up',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'up',powered:'false'}}"); + register(3490, "{Name:'minecraft:observer',Properties:{facing:'north',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'north',powered:'false'}}"); + register(3491, "{Name:'minecraft:observer',Properties:{facing:'south',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'south',powered:'false'}}"); + register(3492, "{Name:'minecraft:observer',Properties:{facing:'west',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'west',powered:'false'}}"); + register(3493, "{Name:'minecraft:observer',Properties:{facing:'east',powered:'false'}}", "{Name:'minecraft:observer',Properties:{facing:'east',powered:'false'}}"); + register(3496, "{Name:'minecraft:observer',Properties:{facing:'down',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'down',powered:'true'}}"); + register(3497, "{Name:'minecraft:observer',Properties:{facing:'up',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'up',powered:'true'}}"); + register(3498, "{Name:'minecraft:observer',Properties:{facing:'north',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'north',powered:'true'}}"); + register(3499, "{Name:'minecraft:observer',Properties:{facing:'south',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'south',powered:'true'}}"); + register(3500, "{Name:'minecraft:observer',Properties:{facing:'west',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'west',powered:'true'}}"); + register(3501, "{Name:'minecraft:observer',Properties:{facing:'east',powered:'true'}}", "{Name:'minecraft:observer',Properties:{facing:'east',powered:'true'}}"); + register(3504, "{Name:'minecraft:white_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'down'}}"); + register(3505, "{Name:'minecraft:white_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'up'}}"); + register(3506, "{Name:'minecraft:white_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'north'}}"); + register(3507, "{Name:'minecraft:white_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'south'}}"); + register(3508, "{Name:'minecraft:white_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'west'}}"); + register(3509, "{Name:'minecraft:white_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:white_shulker_box',Properties:{facing:'east'}}"); + register(3520, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'down'}}"); + register(3521, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'up'}}"); + register(3522, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'north'}}"); + register(3523, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'south'}}"); + register(3524, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'west'}}"); + register(3525, "{Name:'minecraft:orange_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:orange_shulker_box',Properties:{facing:'east'}}"); + register(3536, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'down'}}"); + register(3537, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'up'}}"); + register(3538, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'north'}}"); + register(3539, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'south'}}"); + register(3540, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'west'}}"); + register(3541, "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:magenta_shulker_box',Properties:{facing:'east'}}"); + register(3552, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'down'}}"); + register(3553, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'up'}}"); + register(3554, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'north'}}"); + register(3555, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'south'}}"); + register(3556, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'west'}}"); + register(3557, "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:light_blue_shulker_box',Properties:{facing:'east'}}"); + register(3568, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'down'}}"); + register(3569, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'up'}}"); + register(3570, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'north'}}"); + register(3571, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'south'}}"); + register(3572, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'west'}}"); + register(3573, "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:yellow_shulker_box',Properties:{facing:'east'}}"); + register(3584, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'down'}}"); + register(3585, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'up'}}"); + register(3586, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'north'}}"); + register(3587, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'south'}}"); + register(3588, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'west'}}"); + register(3589, "{Name:'minecraft:lime_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:lime_shulker_box',Properties:{facing:'east'}}"); + register(3600, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'down'}}"); + register(3601, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'up'}}"); + register(3602, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'north'}}"); + register(3603, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'south'}}"); + register(3604, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'west'}}"); + register(3605, "{Name:'minecraft:pink_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:pink_shulker_box',Properties:{facing:'east'}}"); + register(3616, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'down'}}"); + register(3617, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'up'}}"); + register(3618, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'north'}}"); + register(3619, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'south'}}"); + register(3620, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'west'}}"); + register(3621, "{Name:'minecraft:gray_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:gray_shulker_box',Properties:{facing:'east'}}"); + register(3632, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'down'}}"); + register(3633, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'up'}}"); + register(3634, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'north'}}"); + register(3635, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'south'}}"); + register(3636, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'west'}}"); + register(3637, "{Name:'minecraft:light_gray_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:silver_shulker_box',Properties:{facing:'east'}}"); + register(3648, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'down'}}"); + register(3649, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'up'}}"); + register(3650, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'north'}}"); + register(3651, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'south'}}"); + register(3652, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'west'}}"); + register(3653, "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:cyan_shulker_box',Properties:{facing:'east'}}"); + register(3664, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'down'}}"); + register(3665, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'up'}}"); + register(3666, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'north'}}"); + register(3667, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'south'}}"); + register(3668, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'west'}}"); + register(3669, "{Name:'minecraft:purple_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:purple_shulker_box',Properties:{facing:'east'}}"); + register(3680, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'down'}}"); + register(3681, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'up'}}"); + register(3682, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'north'}}"); + register(3683, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'south'}}"); + register(3684, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'west'}}"); + register(3685, "{Name:'minecraft:blue_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:blue_shulker_box',Properties:{facing:'east'}}"); + register(3696, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'down'}}"); + register(3697, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'up'}}"); + register(3698, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'north'}}"); + register(3699, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'south'}}"); + register(3700, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'west'}}"); + register(3701, "{Name:'minecraft:brown_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:brown_shulker_box',Properties:{facing:'east'}}"); + register(3712, "{Name:'minecraft:green_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'down'}}"); + register(3713, "{Name:'minecraft:green_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'up'}}"); + register(3714, "{Name:'minecraft:green_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'north'}}"); + register(3715, "{Name:'minecraft:green_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'south'}}"); + register(3716, "{Name:'minecraft:green_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'west'}}"); + register(3717, "{Name:'minecraft:green_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:green_shulker_box',Properties:{facing:'east'}}"); + register(3728, "{Name:'minecraft:red_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'down'}}"); + register(3729, "{Name:'minecraft:red_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'up'}}"); + register(3730, "{Name:'minecraft:red_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'north'}}"); + register(3731, "{Name:'minecraft:red_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'south'}}"); + register(3732, "{Name:'minecraft:red_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'west'}}"); + register(3733, "{Name:'minecraft:red_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:red_shulker_box',Properties:{facing:'east'}}"); + register(3744, "{Name:'minecraft:black_shulker_box',Properties:{facing:'down'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'down'}}"); + register(3745, "{Name:'minecraft:black_shulker_box',Properties:{facing:'up'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'up'}}"); + register(3746, "{Name:'minecraft:black_shulker_box',Properties:{facing:'north'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'north'}}"); + register(3747, "{Name:'minecraft:black_shulker_box',Properties:{facing:'south'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'south'}}"); + register(3748, "{Name:'minecraft:black_shulker_box',Properties:{facing:'west'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'west'}}"); + register(3749, "{Name:'minecraft:black_shulker_box',Properties:{facing:'east'}}", "{Name:'minecraft:black_shulker_box',Properties:{facing:'east'}}"); + register(3760, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'south'}}"); + register(3761, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'west'}}"); + register(3762, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'north'}}"); + register(3763, "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:white_glazed_terracotta',Properties:{facing:'east'}}"); + register(3776, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'south'}}"); + register(3777, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'west'}}"); + register(3778, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'north'}}"); + register(3779, "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:orange_glazed_terracotta',Properties:{facing:'east'}}"); + register(3792, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'south'}}"); + register(3793, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'west'}}"); + register(3794, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'north'}}"); + register(3795, "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:magenta_glazed_terracotta',Properties:{facing:'east'}}"); + register(3808, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'south'}}"); + register(3809, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'west'}}"); + register(3810, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'north'}}"); + register(3811, "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:light_blue_glazed_terracotta',Properties:{facing:'east'}}"); + register(3824, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'south'}}"); + register(3825, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'west'}}"); + register(3826, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'north'}}"); + register(3827, "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:yellow_glazed_terracotta',Properties:{facing:'east'}}"); + register(3840, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'south'}}"); + register(3841, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'west'}}"); + register(3842, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'north'}}"); + register(3843, "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:lime_glazed_terracotta',Properties:{facing:'east'}}"); + register(3856, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'south'}}"); + register(3857, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'west'}}"); + register(3858, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'north'}}"); + register(3859, "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:pink_glazed_terracotta',Properties:{facing:'east'}}"); + register(3872, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'south'}}"); + register(3873, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'west'}}"); + register(3874, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'north'}}"); + register(3875, "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:gray_glazed_terracotta',Properties:{facing:'east'}}"); + register(3888, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'south'}}"); + register(3889, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'west'}}"); + register(3890, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'north'}}"); + register(3891, "{Name:'minecraft:light_gray_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:silver_glazed_terracotta',Properties:{facing:'east'}}"); + register(3904, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'south'}}"); + register(3905, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'west'}}"); + register(3906, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'north'}}"); + register(3907, "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:cyan_glazed_terracotta',Properties:{facing:'east'}}"); + register(3920, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'south'}}"); + register(3921, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'west'}}"); + register(3922, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'north'}}"); + register(3923, "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:purple_glazed_terracotta',Properties:{facing:'east'}}"); + register(3936, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'south'}}"); + register(3937, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'west'}}"); + register(3938, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'north'}}"); + register(3939, "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:blue_glazed_terracotta',Properties:{facing:'east'}}"); + register(3952, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'south'}}"); + register(3953, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'west'}}"); + register(3954, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'north'}}"); + register(3955, "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:brown_glazed_terracotta',Properties:{facing:'east'}}"); + register(3968, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'south'}}"); + register(3969, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'west'}}"); + register(3970, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'north'}}"); + register(3971, "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:green_glazed_terracotta',Properties:{facing:'east'}}"); + register(3984, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'south'}}"); + register(3985, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'west'}}"); + register(3986, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'north'}}"); + register(3987, "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:red_glazed_terracotta',Properties:{facing:'east'}}"); + register(4000, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'south'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'south'}}"); + register(4001, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'west'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'west'}}"); + register(4002, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'north'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'north'}}"); + register(4003, "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'east'}}", "{Name:'minecraft:black_glazed_terracotta',Properties:{facing:'east'}}"); + register(4016, "{Name:'minecraft:white_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'white'}}"); + register(4017, "{Name:'minecraft:orange_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'orange'}}"); + register(4018, "{Name:'minecraft:magenta_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'magenta'}}"); + register(4019, "{Name:'minecraft:light_blue_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'light_blue'}}"); + register(4020, "{Name:'minecraft:yellow_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'yellow'}}"); + register(4021, "{Name:'minecraft:lime_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'lime'}}"); + register(4022, "{Name:'minecraft:pink_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'pink'}}"); + register(4023, "{Name:'minecraft:gray_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'gray'}}"); + register(4024, "{Name:'minecraft:light_gray_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'silver'}}"); + register(4025, "{Name:'minecraft:cyan_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'cyan'}}"); + register(4026, "{Name:'minecraft:purple_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'purple'}}"); + register(4027, "{Name:'minecraft:blue_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'blue'}}"); + register(4028, "{Name:'minecraft:brown_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'brown'}}"); + register(4029, "{Name:'minecraft:green_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'green'}}"); + register(4030, "{Name:'minecraft:red_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'red'}}"); + register(4031, "{Name:'minecraft:black_concrete'}", "{Name:'minecraft:concrete',Properties:{color:'black'}}"); + register(4032, "{Name:'minecraft:white_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'white'}}"); + register(4033, "{Name:'minecraft:orange_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'orange'}}"); + register(4034, "{Name:'minecraft:magenta_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'magenta'}}"); + register(4035, "{Name:'minecraft:light_blue_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'light_blue'}}"); + register(4036, "{Name:'minecraft:yellow_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'yellow'}}"); + register(4037, "{Name:'minecraft:lime_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'lime'}}"); + register(4038, "{Name:'minecraft:pink_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'pink'}}"); + register(4039, "{Name:'minecraft:gray_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'gray'}}"); + register(4040, "{Name:'minecraft:light_gray_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'silver'}}"); + register(4041, "{Name:'minecraft:cyan_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'cyan'}}"); + register(4042, "{Name:'minecraft:purple_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'purple'}}"); + register(4043, "{Name:'minecraft:blue_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'blue'}}"); + register(4044, "{Name:'minecraft:brown_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'brown'}}"); + register(4045, "{Name:'minecraft:green_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'green'}}"); + register(4046, "{Name:'minecraft:red_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'red'}}"); + register(4047, "{Name:'minecraft:black_concrete_powder'}", "{Name:'minecraft:concrete_powder',Properties:{color:'black'}}"); + register(4080, "{Name:'minecraft:structure_block',Properties:{mode:'save'}}", "{Name:'minecraft:structure_block',Properties:{mode:'save'}}"); + register(4081, "{Name:'minecraft:structure_block',Properties:{mode:'load'}}", "{Name:'minecraft:structure_block',Properties:{mode:'load'}}"); + register(4082, "{Name:'minecraft:structure_block',Properties:{mode:'corner'}}", "{Name:'minecraft:structure_block',Properties:{mode:'corner'}}"); + register(4083, "{Name:'minecraft:structure_block',Properties:{mode:'data'}}", "{Name:'minecraft:structure_block',Properties:{mode:'data'}}"); + finalizeMaps(); + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperItemNameV102.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperItemNameV102.java new file mode 100644 index 0000000000000000000000000000000000000000..86f6aa3e3fa886976809f350fc5eb16f6a026ed9 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperItemNameV102.java @@ -0,0 +1,533 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.helpers; + +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public final class HelperItemNameV102 { + + // This class is responsible for mapping the id -> string update in itemstacks and potions + + private static final Int2ObjectOpenHashMap 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/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperSpawnEggNameV105.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperSpawnEggNameV105.java new file mode 100644 index 0000000000000000000000000000000000000000..bcc586cb68148fd960dd685eecce853169a92ed5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/HelperSpawnEggNameV105.java @@ -0,0 +1,77 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.helpers; + +public final class HelperSpawnEggNameV105 { + + private static final String[] ID_TO_STRING = new String[256]; + static { + ID_TO_STRING[1] = "Item"; + ID_TO_STRING[2] = "XPOrb"; + ID_TO_STRING[7] = "ThrownEgg"; + ID_TO_STRING[8] = "LeashKnot"; + ID_TO_STRING[9] = "Painting"; + ID_TO_STRING[10] = "Arrow"; + ID_TO_STRING[11] = "Snowball"; + ID_TO_STRING[12] = "Fireball"; + ID_TO_STRING[13] = "SmallFireball"; + ID_TO_STRING[14] = "ThrownEnderpearl"; + ID_TO_STRING[15] = "EyeOfEnderSignal"; + ID_TO_STRING[16] = "ThrownPotion"; + ID_TO_STRING[17] = "ThrownExpBottle"; + ID_TO_STRING[18] = "ItemFrame"; + ID_TO_STRING[19] = "WitherSkull"; + ID_TO_STRING[20] = "PrimedTnt"; + ID_TO_STRING[21] = "FallingSand"; + ID_TO_STRING[22] = "FireworksRocketEntity"; + ID_TO_STRING[23] = "TippedArrow"; + ID_TO_STRING[24] = "SpectralArrow"; + ID_TO_STRING[25] = "ShulkerBullet"; + ID_TO_STRING[26] = "DragonFireball"; + ID_TO_STRING[30] = "ArmorStand"; + ID_TO_STRING[41] = "Boat"; + ID_TO_STRING[42] = "MinecartRideable"; + ID_TO_STRING[43] = "MinecartChest"; + ID_TO_STRING[44] = "MinecartFurnace"; + ID_TO_STRING[45] = "MinecartTNT"; + ID_TO_STRING[46] = "MinecartHopper"; + ID_TO_STRING[47] = "MinecartSpawner"; + ID_TO_STRING[40] = "MinecartCommandBlock"; + ID_TO_STRING[50] = "Creeper"; + ID_TO_STRING[51] = "Skeleton"; + ID_TO_STRING[52] = "Spider"; + ID_TO_STRING[53] = "Giant"; + ID_TO_STRING[54] = "Zombie"; + ID_TO_STRING[55] = "Slime"; + ID_TO_STRING[56] = "Ghast"; + ID_TO_STRING[57] = "PigZombie"; + ID_TO_STRING[58] = "Enderman"; + ID_TO_STRING[59] = "CaveSpider"; + ID_TO_STRING[60] = "Silverfish"; + ID_TO_STRING[61] = "Blaze"; + ID_TO_STRING[62] = "LavaSlime"; + ID_TO_STRING[63] = "EnderDragon"; + ID_TO_STRING[64] = "WitherBoss"; + ID_TO_STRING[65] = "Bat"; + ID_TO_STRING[66] = "Witch"; + ID_TO_STRING[67] = "Endermite"; + ID_TO_STRING[68] = "Guardian"; + ID_TO_STRING[69] = "Shulker"; + ID_TO_STRING[90] = "Pig"; + ID_TO_STRING[91] = "Sheep"; + ID_TO_STRING[92] = "Cow"; + ID_TO_STRING[93] = "Chicken"; + ID_TO_STRING[94] = "Squid"; + ID_TO_STRING[95] = "Wolf"; + ID_TO_STRING[96] = "MushroomCow"; + ID_TO_STRING[97] = "SnowMan"; + ID_TO_STRING[98] = "Ozelot"; + ID_TO_STRING[99] = "VillagerGolem"; + ID_TO_STRING[100] = "EntityHorse"; + ID_TO_STRING[101] = "Rabbit"; + ID_TO_STRING[120] = "Villager"; + ID_TO_STRING[200] = "EnderCrystal"; + } + + public static String getSpawnNameFromId(final short id) { + return ID_TO_STRING[id & 255]; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..1c0483b72f45f8c98e19237579bfdf5915001768 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/helpers/RenameHelper.java @@ -0,0 +1,108 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.helpers; + +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +public final class RenameHelper { + + // assumes no two or more entries are renamed to a single value, otherwise result will be only one of them will win + // and there is no defined winner in such a case + public static void renameKeys(final MapType data, final Function 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 boolean renameSingle(final MapType data, final String fromKey, final String toKey) { + if (data == null) { + return false; + } + + final Object value = data.getGeneric(fromKey); + if (value != null) { + data.remove(fromKey); + data.setGeneric(toKey, value); + return true; + } + return false; + } + + public static void renameString(final MapType data, final String key, final Function 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.getListUnchecked(listPath); + if (list == null) { + return; + } + + for (int i = 0, len = list.size(); i < len; ++i) { + RenameHelper.renameString(list.getMap(i, null), mapPath, renamer); + } + } + + private RenameHelper() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/itemname/ConverterAbstractItemRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemname/ConverterAbstractItemRename.java new file mode 100644 index 0000000000000000000000000000000000000000..94569f0ccff0d3a09eafd4ba73572d9db0a0ac5b --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemname/ConverterAbstractItemRename.java @@ -0,0 +1,18 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.itemname; + +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import java.util.function.Function; + +public final class ConverterAbstractItemRename { + + private ConverterAbstractItemRename() {} + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java new file mode 100644 index 0000000000000000000000000000000000000000..0244aab4905fc2b88abff344c2b2ab753d4b335e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterEnchantmentsRename.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.itemstack; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import java.util.function.Function; + +public final class ConverterEnchantmentsRename extends DataConverter { + + 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 = (final String input) -> { + return renamer.apply(NamespaceUtil.correctNamespace(input)); + }; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + + if (tag == null) { + return null; + } + + RenameHelper.renameListMapItems(tag, "Enchantments", "id", this.renamer); + RenameHelper.renameListMapItems(tag, "StoredEnchantments", "id", this.renamer); + + return null; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenItemStack.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenItemStack.java new file mode 100644 index 0000000000000000000000000000000000000000..eca9a58f43ac80f2fd3c8179d2790dae737951f7 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenItemStack.java @@ -0,0 +1,460 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.itemstack; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; +import com.mojang.logging.LogUtils; +import org.slf4j.Logger; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public final class ConverterFlattenItemStack extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenSpawnEgg.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenSpawnEgg.java new file mode 100644 index 0000000000000000000000000000000000000000..32d498fac143f40124dc69fa0cf566f1ac33545c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterFlattenSpawnEgg.java @@ -0,0 +1,87 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.itemstack; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.HashMap; +import java.util.Map; + +public final class ConverterFlattenSpawnEgg extends DataConverter { + + 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:ender_dragon", "minecraft:ender_dragon_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:enderman", "minecraft:enderman_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:endermite", "minecraft:endermite_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:evocation_illager", "minecraft:evocation_illager_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:ghast", "minecraft:ghast_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:guardian", "minecraft:guardian_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:horse", "minecraft:horse_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:husk", "minecraft:husk_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:iron_golem", "minecraft:iron_golem_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:llama", "minecraft:llama_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:magma_cube", "minecraft:magma_cube_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:mooshroom", "minecraft:mooshroom_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:mule", "minecraft:mule_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:ocelot", "minecraft:ocelot_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:pufferfish", "minecraft:pufferfish_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:parrot", "minecraft:parrot_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:pig", "minecraft:pig_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:polar_bear", "minecraft:polar_bear_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:rabbit", "minecraft:rabbit_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:sheep", "minecraft:sheep_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:shulker", "minecraft:shulker_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:silverfish", "minecraft:silverfish_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:skeleton", "minecraft:skeleton_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:skeleton_horse", "minecraft:skeleton_horse_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:slime", "minecraft:slime_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:snow_golem", "minecraft:snow_golem_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:spider", "minecraft:spider_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:squid", "minecraft:squid_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:stray", "minecraft:stray_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:turtle", "minecraft:turtle_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:vex", "minecraft:vex_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:villager", "minecraft:villager_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:vindication_illager", "minecraft:vindication_illager_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:witch", "minecraft:witch_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:wither", "minecraft:wither_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:wither_skeleton", "minecraft:wither_skeleton_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:wolf", "minecraft:wolf_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:zombie", "minecraft:zombie_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:zombie_horse", "minecraft:zombie_horse_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:zombie_pigman", "minecraft:zombie_pigman_spawn_egg"); + ENTITY_ID_TO_NEW_EGG_ID.put("minecraft:zombie_villager", "minecraft:zombie_villager_spawn_egg"); + } + + public ConverterFlattenSpawnEgg(final int version, final int versionStep) { + super(version, versionStep); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType entityTag = tag.getMap("EntityTag"); + if (entityTag == null) { + return null; + } + + final String id = entityTag.getString("id"); + if (id != null) { + data.setString("id", ENTITY_ID_TO_NEW_EGG_ID.getOrDefault(id, "minecraft:pig_spawn_egg")); + } + + return null; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java new file mode 100644 index 0000000000000000000000000000000000000000..d5c5b711406f63a3e35ae7e5bfbf1d306bee4f1c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java @@ -0,0 +1,1244 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.itemstack; + +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.minecraft.versions.V3818; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import net.minecraft.util.Mth; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public final class ConverterItemStackToDataComponents { + + private static final int TOOLTIP_FLAG_HIDE_ENCHANTMENTS = 1 << 0; + private static final int TOOLTIP_FLAG_HIDE_MODIFIERS = 1 << 1; + private static final int TOOLTIP_FLAG_HIDE_UNBREAKABLE = 1 << 2; + private static final int TOOLTIP_FLAG_HIDE_CAN_DESTROY = 1 << 3; + private static final int TOOLTIP_FLAG_HIDE_CAN_PLACE = 1 << 4; + private static final int TOOLTIP_FLAG_HIDE_ADDITIONAL = 1 << 5; + private static final int TOOLTIP_FLAG_HIDE_DYE = 1 << 6; + private static final int TOOLTIP_FLAG_HIDE_UPGRADES = 1 << 7; + + private static final int DEFAULT_LEATHER_COLOUR = (160 << 16) | (101 << 8) | (64 << 0); // r, g, b + + private static final String[] BUCKETED_MOB_TAGS = new String[] { + "NoAI", + "Silent", + "NoGravity", + "Glowing", + "Invulnerable", + "Health", + "Age", + "Variant", + "HuntingCooldown", + "BucketVariantTag" + }; + private static final Set BOOLEAN_BLOCK_STATE_PROPERTIES = new HashSet<>( + Arrays.asList( + "attached", + "bottom", + "conditional", + "disarmed", + "drag", + "enabled", + "extended", + "eye", + "falling", + "hanging", + "has_bottle_0", + "has_bottle_1", + "has_bottle_2", + "has_record", + "has_book", + "inverted", + "in_wall", + "lit", + "locked", + "occupied", + "open", + "persistent", + "powered", + "short", + "signal_fire", + "snowy", + "triggered", + "unstable", + "waterlogged", + "berries", + "bloom", + "shrieking", + "can_summon", + "up", + "down", + "north", + "east", + "south", + "west", + "slot_0_occupied", + "slot_1_occupied", + "slot_2_occupied", + "slot_3_occupied", + "slot_4_occupied", + "slot_5_occupied", + "cracked", + "crafting" + ) + ); + private static final String[] MAP_DECORATION_CONVERSION_TABLE = new String[34]; + static { + MAP_DECORATION_CONVERSION_TABLE[0] = "player"; + MAP_DECORATION_CONVERSION_TABLE[1] = "frame"; + MAP_DECORATION_CONVERSION_TABLE[2] = "red_marker"; + MAP_DECORATION_CONVERSION_TABLE[3] = "blue_marker"; + MAP_DECORATION_CONVERSION_TABLE[4] = "target_x"; + MAP_DECORATION_CONVERSION_TABLE[5] = "target_point"; + MAP_DECORATION_CONVERSION_TABLE[6] = "player_off_map"; + MAP_DECORATION_CONVERSION_TABLE[7] = "player_off_limits"; + MAP_DECORATION_CONVERSION_TABLE[8] = "mansion"; + MAP_DECORATION_CONVERSION_TABLE[9] = "monument"; + MAP_DECORATION_CONVERSION_TABLE[10] = "banner_white"; + MAP_DECORATION_CONVERSION_TABLE[11] = "banner_orange"; + MAP_DECORATION_CONVERSION_TABLE[12] = "banner_magenta"; + MAP_DECORATION_CONVERSION_TABLE[13] = "banner_light_blue"; + MAP_DECORATION_CONVERSION_TABLE[14] = "banner_yellow"; + MAP_DECORATION_CONVERSION_TABLE[15] = "banner_lime"; + MAP_DECORATION_CONVERSION_TABLE[16] = "banner_pink"; + MAP_DECORATION_CONVERSION_TABLE[17] = "banner_gray"; + MAP_DECORATION_CONVERSION_TABLE[18] = "banner_light_gray"; + MAP_DECORATION_CONVERSION_TABLE[19] = "banner_cyan"; + MAP_DECORATION_CONVERSION_TABLE[20] = "banner_purple"; + MAP_DECORATION_CONVERSION_TABLE[21] = "banner_blue"; + MAP_DECORATION_CONVERSION_TABLE[22] = "banner_brown"; + MAP_DECORATION_CONVERSION_TABLE[23] = "banner_green"; + MAP_DECORATION_CONVERSION_TABLE[24] = "banner_red"; + MAP_DECORATION_CONVERSION_TABLE[25] = "banner_black"; + MAP_DECORATION_CONVERSION_TABLE[26] = "red_x"; + MAP_DECORATION_CONVERSION_TABLE[27] = "village_desert"; + MAP_DECORATION_CONVERSION_TABLE[28] = "village_plains"; + MAP_DECORATION_CONVERSION_TABLE[29] = "village_savanna"; + MAP_DECORATION_CONVERSION_TABLE[30] = "village_snowy"; + MAP_DECORATION_CONVERSION_TABLE[31] = "village_taiga"; + MAP_DECORATION_CONVERSION_TABLE[32] = "jungle_temple"; + MAP_DECORATION_CONVERSION_TABLE[33] = "swamp_hut"; + } + + private static String convertMapDecorationId(final int type) { + return type >= 0 && type < MAP_DECORATION_CONVERSION_TABLE.length ? MAP_DECORATION_CONVERSION_TABLE[type] : MAP_DECORATION_CONVERSION_TABLE[0]; + } + + private static void convertBlockStateProperties(final MapType properties) { + // convert values stored as boolean/integer to string + for (final String key : properties.keys()) { + final Object value = properties.getGeneric(key); + if (value instanceof Number number) { + if (BOOLEAN_BLOCK_STATE_PROPERTIES.contains(key)) { + properties.setString(key, Boolean.toString(number.byteValue() != (byte)0)); + } else { + properties.setString(key, number.toString()); + } + } + } + } + + private static void convertTileEntity(final MapType tileEntity, final TransientItemStack transientItem) { + final Object lock = tileEntity.getGeneric("Lock"); + if (lock != null) { + tileEntity.remove("Lock"); + transientItem.componentSetGeneric("minecraft:lock", lock); + } + + final Object lootTable = tileEntity.getGeneric("LootTable"); + if (lootTable != null) { + final MapType containerLoot = tileEntity.getTypeUtil().createEmptyMap(); + transientItem.componentSetMap("minecraft:container_loot", containerLoot); + + containerLoot.setGeneric("loot_table", lootTable); + + final long seed = tileEntity.getLong("LootTableSeed", 0L); + if (seed != 0L) { + containerLoot.setLong("seed", seed); + } + + tileEntity.remove("LootTable"); + tileEntity.remove("LootTableSeed"); + } + + final String id = NamespaceUtil.correctNamespace(tileEntity.getString("id", "")); + + switch (id) { + case "minecraft:skull": { + final Object noteBlockSound = tileEntity.getGeneric("note_block_sound"); + if (noteBlockSound != null) { + tileEntity.remove("note_block_sound"); + transientItem.componentSetGeneric("minecraft:note_block_sound", noteBlockSound); + } + + break; + } + case "minecraft:decorated_pot": { + final Object sherds = tileEntity.getGeneric("sherds"); + if (sherds != null) { + tileEntity.remove("sherds"); + transientItem.componentSetGeneric("minecraft:pot_decorations", sherds); + } + + final Object item = tileEntity.getGeneric("item"); + if (item != null) { + tileEntity.remove("item"); + + final ListType container = tileEntity.getTypeUtil().createEmptyList(); + transientItem.componentSetList("minecraft:container", container); + + final MapType wrappedItem = tileEntity.getTypeUtil().createEmptyMap(); + container.addMap(wrappedItem); + + wrappedItem.setInt("slot", 0); + wrappedItem.setGeneric("item", item); + } + + break; + } + case "minecraft:banner": { + final Object patterns = tileEntity.getGeneric("patterns"); + if (patterns != null) { + tileEntity.remove("patterns"); + + transientItem.componentSetGeneric("minecraft:banner_patterns", patterns); + } + + final Number base = tileEntity.getNumber("Base"); + if (base != null) { + tileEntity.remove("Base"); + + transientItem.componentSetString("minecraft:base_color", V3818.getBannerColour(base.intValue())); + } + + break; + } + + case "minecraft:shulker_box": + case "minecraft:chest": + case "minecraft:trapped_chest": + case "minecraft:furnace": + case "minecraft:ender_chest": + case "minecraft:dispenser": + case "minecraft:dropper": + case "minecraft:brewing_stand": + case "minecraft:hopper": + case "minecraft:barrel": + case "minecraft:smoker": + case "minecraft:blast_furnace": + case "minecraft:campfire": + case "minecraft:chiseled_bookshelf": + case "minecraft:crafter": { + final ListType items = tileEntity.getList("Items", ObjectType.MAP); + tileEntity.remove("Items"); + if (items != null && items.size() > 0) { + transientItem.componentSetList("minecraft:container", items); + + for (int i = 0, len = items.size(); i < len; ++i) { + final MapType item = items.getMap(i); + final int slot = (int)item.getByte("Slot", (byte)0) & 0xFF; + item.remove("Slot"); + + final MapType wrappedItem = item.getTypeUtil().createEmptyMap(); + items.setMap(i, wrappedItem); + + wrappedItem.setInt("slot", slot); + wrappedItem.setMap("item", item); + } + } + + break; + } + + case "minecraft:beehive": { + final Object bees = tileEntity.getGeneric("bees"); + if (bees != null) { + tileEntity.remove("bees"); + + transientItem.componentSetGeneric("minecraft:bees", bees); + } + break; + } + } + } + + private static void convertEnchantments(final TransientItemStack transientItem, final TypeUtil type, + final String tagKey, final String componentKey, + final boolean hideToolTip) { + final ListType enchantments = transientItem.tagRemoveList(tagKey, ObjectType.MAP); + if (enchantments == null || enchantments.size() == 0) { + if (hideToolTip) { + final MapType newEnchants = type.createEmptyMap(); + transientItem.componentSetMap(componentKey, newEnchants); + + newEnchants.setMap("levels", type.createEmptyMap()); + newEnchants.setBoolean("show_in_tooltip", false); + } + } else { + final MapType newEnchantments = type.createEmptyMap(); + + for (int i = 0, len = enchantments.size(); i < len; ++i) { + final MapType enchantment = enchantments.getMap(i); + + final String id = enchantment.getString("id"); + final Number level = enchantment.getNumber("lvl"); + + if (id == null || level == null) { + continue; + } + + newEnchantments.setInt(id, Mth.clamp(level.intValue(), 0, 0xFF)); + } + + if (!newEnchantments.isEmpty() || hideToolTip) { + final MapType newEnchants = type.createEmptyMap(); + transientItem.componentSetMap(componentKey, newEnchants); + + newEnchants.setMap("levels", newEnchantments); + if (hideToolTip) { + newEnchants.setBoolean("show_in_tooltip", false); + } + } + } + + if (enchantments != null && enchantments.size() == 0) { + transientItem.componentSetBoolean("minecraft:enchantment_glint_override", true); + } + } + + private static void convertDisplay(final TransientItemStack transientItem, final TypeUtil type, final int flags) { + final MapType display = transientItem.tag.getMap("display"); + + if (display != null) { + final Object name = display.getGeneric("Name"); + if (name != null) { + display.remove("Name"); + + transientItem.componentSetGeneric("minecraft:custom_name", name); + } + + final Object lore = display.getGeneric("Lore"); + if (lore != null) { + display.remove("Lore"); + + transientItem.componentSetGeneric("minecraft:lore", lore); + } + } + + final Number color = display == null ? null : display.getNumber("color"); + final boolean hideDye = (flags & TOOLTIP_FLAG_HIDE_DYE) != 0; + + if (hideDye || color != null) { + if (color != null) { + display.remove("color"); + } + + final MapType dyedColor = type.createEmptyMap(); + transientItem.componentSetMap("minecraft:dyed_color", dyedColor); + + dyedColor.setInt("rgb", color == null ? DEFAULT_LEATHER_COLOUR : color.intValue()); + if (hideDye) { + dyedColor.setBoolean("show_in_tooltip", false); + } + } + + final Object locName = display == null ? null : display.getGeneric("LocName"); + if (locName != null) { + display.remove("LocName"); + + if (locName instanceof String locNameString) { + transientItem.componentSetString("minecraft:item_name", ComponentUtils.createTranslatableComponent(locNameString)); + } + } + + if (display != null && "minecraft:filled_map".equals(transientItem.id)) { + final Object mapColor = display.getGeneric("MapColor"); + if (mapColor != null) { + display.remove("MapColor"); + + transientItem.componentSetGeneric("minecraft:map_color", mapColor); + } + } + + // mirror behavior of fixSubTag + if (display != null && display.isEmpty()) { + transientItem.tagRemoveMap("display"); + } + } + + public static MapType convertBlockStatePredicate(final String value, final TypeUtil type) { + final int propertyStart = value.indexOf('['); + final int nbtStart = value.indexOf('{'); + int blockNameEnd = value.length(); + + if (propertyStart != -1) { + blockNameEnd = propertyStart; + } + if (nbtStart != -1) { + blockNameEnd = Math.min(blockNameEnd, nbtStart); + } + + final MapType ret = type.createEmptyMap(); + + final String blockName = value.substring(0, blockNameEnd); + + // string is fine here, the underlying type accepts string AND list under the same name... + ret.setString("blocks", blockName.trim()); + + if (propertyStart != -1) { + // unlike DFU, set the fromIndex so that on malformed data we do not IOOBE + final int propertyEnd = value.indexOf(']', propertyStart + 1); + if (propertyEnd != -1) { + final MapType state = type.createEmptyMap(); + ret.setMap("state", state); + + for (final String property : value.substring(propertyStart + 1, propertyEnd).split(",")) { + final int separatorIdx = property.indexOf('='); + if (separatorIdx == -1) { + continue; + } + + final String propertyKey = property.substring(0, separatorIdx).trim(); + final String propertyValue = property.substring(separatorIdx + 1); + + state.setString(propertyKey, propertyValue); + } + } + } + + if (nbtStart != -1) { + // unlike DFU, set the fromIndex so that on malformed data we do not IOOBE + final int nbtEnd = value.indexOf('}', nbtStart + 1); + if (nbtEnd != -1) { + // note: want to include { and } + ret.setString("nbt", value.substring(nbtStart, nbtEnd + 1)); + } + } + + return ret; + } + + private static void convertBlockStatePredicates(final TransientItemStack item, final TypeUtil type, + final String tagKey, final String componentKey, + final boolean hideInTooltip) { + final ListType blocks = item.tagRemoveListUnchecked(tagKey); + if (blocks == null) { + return; + } + + final MapType blockPredicates = type.createEmptyMap(); + item.componentSetMap(componentKey, blockPredicates); + + if (hideInTooltip) { + blockPredicates.setBoolean("show_in_tooltip", false); + } + + final ListType predicates = type.createEmptyList(); + blockPredicates.setList("predicates", predicates); + + for (int i = 0, len = blocks.size(); i < len; ++i) { + final Object block = blocks.getGeneric(i); + if (!(block instanceof String blockString)) { + // cannot type error here, if block is not a string then nothing in `blocks` is as they have the same type + predicates.addGeneric(block); + continue; + } + + final MapType predicate = convertBlockStatePredicate(blockString, type); + + predicates.addMap(predicate); + } + } + + private static void convertAdventureMode(final TransientItemStack item, final TypeUtil type, final int flags) { + convertBlockStatePredicates( + item, type, "CanDestroy", "minecraft:can_break", + (flags & TOOLTIP_FLAG_HIDE_CAN_DESTROY) != 0 + ); + convertBlockStatePredicates( + item, type, "CanPlaceOn", "minecraft:can_place_on", + (flags & TOOLTIP_FLAG_HIDE_CAN_PLACE) != 0 + ); + } + + private static void copy(final MapType src, final String srcKey, final MapType dst, final String dstKey) { + if (src == null || dst == null) { + return; + } + + final Object srcValue = src.getGeneric(srcKey); + if (srcValue != null) { + dst.setGeneric(dstKey, srcValue); + } + } + + private static MapType convertAttribute(final Object inputGeneric, final TypeUtil type) { + final MapType input = inputGeneric instanceof MapType casted ? (MapType)casted : null; + + final MapType ret = type.createEmptyMap(); + ret.setString("name", ""); + ret.setDouble("amount", 0.0); + ret.setString("operation", "add_value"); + + copy(input, "AttributeName", ret, "type"); + copy(input, "Slot", ret, "slot"); + copy(input, "UUID", ret, "uuid"); + copy(input, "Name", ret, "name"); + copy(input, "Amount", ret, "amount"); + + // note: no type check on hasKey + if (input != null && input.hasKey("Operation")) { + final String operation; + switch (input.getInt("Operation", 0)) { + case 1: { + operation = "add_multiplied_base"; + break; + } + case 2: { + operation = "add_multiplied_total"; + break; + } + default: { + operation = "add_value"; + break; + } + } + ret.setString("operation", operation); + } + + return ret; + } + + private static void convertAttributes(final TransientItemStack item, final TypeUtil type, final int flags) { + final ListType attributes = item.tagRemoveListUnchecked("AttributeModifiers"); + final ListType newAttributes = type.createEmptyList(); + + if (attributes != null) { + for (int i = 0, len = attributes.size(); i < len; ++i) { + newAttributes.addMap(convertAttribute(attributes.getGeneric(i), type)); + } + } + + if (newAttributes.size() > 0) { + final MapType newModifiers = type.createEmptyMap(); + item.componentSetMap("minecraft:attribute_modifiers", newModifiers); + + newModifiers.setList("modifiers", newAttributes); + + final boolean hideModifiers = (flags & TOOLTIP_FLAG_HIDE_MODIFIERS) != 0; + if (hideModifiers) { + newModifiers.setBoolean("show_in_tooltip", false); + } + } + } + + private static void convertMap(final TransientItemStack item, final TypeUtil type) { + item.tagMigrateToComponent("map", "minecraft:map_id"); + + final ListType decorations = item.tagRemoveListUnchecked("Decorations"); + if (decorations != null) { + final MapType newDecorations = type.createEmptyMap(); + + for (int i = 0, len = decorations.size(); i < len; ++i) { + final Object decorationGeneric = decorations.getGeneric(i); + + final MapType decoration = decorationGeneric instanceof MapType casted ? (MapType)casted : null; + + final String id = decoration == null ? "" : decoration.getString("id", ""); + if (newDecorations.hasKey(id)) { + // note: never replace existing decorations by id + continue; + } + + final int typeId = decoration == null ? 0 : decoration.getInt("type", 0); + final double x = decoration == null ? 0.0 : decoration.getDouble("x", 0.0); + final double z = decoration == null ? 0.0 : decoration.getDouble("z", 0.0); + final float rot = decoration == null ? 0.0f : (float)decoration.getDouble("rot", 0.0); + + final MapType newDecoration = type.createEmptyMap(); + newDecorations.setMap(id, newDecoration); + + newDecoration.setString("type", convertMapDecorationId(typeId)); + newDecoration.setDouble("x", x); + newDecoration.setDouble("z", z); + newDecoration.setFloat("rotation", rot); + } + + if (!newDecorations.isEmpty()) { + item.componentSetMap("minecraft:map_decorations", newDecorations); + } + } + } + + private static void convertPotion(final TransientItemStack item, final TypeUtil type) { + final MapType potionContents = type.createEmptyMap(); + + final String potion = item.tagRemoveString("Potion"); + + if (potion != null && !"minecraft:empty".equals(potion)) { + potionContents.setString("potion", potion); + } + + item.migrateTagTo("CustomPotionColor", potionContents, "custom_color"); + item.migrateTagTo("custom_potion_effects", potionContents, "custom_effects"); + + if (!potionContents.isEmpty()) { + item.componentSetMap("minecraft:potion_contents", potionContents); + } + } + + private static MapType makeFilteredText(final String raw, final String filtered, final TypeUtil type) { + final MapType ret = type.createEmptyMap(); + + ret.setString("raw", raw); + if (filtered != null) { + ret.setString("filtered", filtered); + } + + return ret; + } + + private static ListType convertBookPages(final TransientItemStack item, final TypeUtil type) { + final ListType oldPages = item.tagRemoveListUnchecked("pages"); + + final MapType filteredPages = item.tagRemoveMap("filtered_pages"); + + if (oldPages == null || oldPages.size() == 0) { + return null; + } + + final ListType ret = type.createEmptyList(); + + for (int i = 0, len = oldPages.size(); i < len; ++i) { + final String page = oldPages.getGeneric(i) instanceof String str ? str : ""; + final String filtered = filteredPages == null ? null : filteredPages.getString(Integer.toString(i)); + + ret.addMap(makeFilteredText(page, filtered, type)); + } + + return ret; + } + + private static void convertWritableBook(final TransientItemStack item, final TypeUtil type) { + final ListType pages = convertBookPages(item, type); + if (pages != null) { + final MapType bookContent = type.createEmptyMap(); + item.componentSetMap("minecraft:writable_book_content", bookContent); + + bookContent.setList("pages", pages); + } + } + + private static void convertWrittenBook(final TransientItemStack item, final TypeUtil type) { + final ListType pages = convertBookPages(item, type); + + final MapType bookContent = type.createEmptyMap(); + item.componentSetMap("minecraft:written_book_content", bookContent); + if (pages != null) { + bookContent.setList("pages", pages); + } + + final String title = item.tagRemoveString("title", ""); + final String filteredTitle = item.tagRemoveString("filtered_title"); + + bookContent.setMap("title", makeFilteredText(title, filteredTitle, type)); + + bookContent.setString("author", item.tagRemoveString("author", "")); + item.migrateTagTo("resolved", bookContent, "resolved"); + item.migrateTagTo("generation", bookContent, "generation"); + } + + private static void convertMobBucket(final TransientItemStack item, final TypeUtil type) { + final MapType bucketEntityData = type.createEmptyMap(); + + for (final String oldKey : BUCKETED_MOB_TAGS) { + item.migrateTagTo(oldKey, bucketEntityData, oldKey); + } + + if (!bucketEntityData.isEmpty()) { + item.componentSetMap("minecraft:bucket_entity_data", bucketEntityData); + } + } + + private static void convertCompass(final TransientItemStack item, final TypeUtil type) { + final Object lodestonePos = item.tagRemoveGeneric("LodestonePos"); + final Object lodestoneDim = item.tagRemoveGeneric("LodestoneDimension"); + + if (lodestonePos == null && lodestoneDim == null) { + return; + } + + final MapType lodestoneTracker = type.createEmptyMap(); + item.componentSetMap("minecraft:lodestone_tracker", lodestoneTracker); + + if (lodestonePos != null && lodestoneDim != null) { + final MapType target = type.createEmptyMap(); + lodestoneTracker.setMap("target", target); + + target.setGeneric("pos", lodestonePos); + target.setGeneric("dimension", lodestoneDim); + } + + final boolean tracked = item.tagRemoveBoolean("LodestoneTracked", true); + if (!tracked) { + lodestoneTracker.setBoolean("tracked", false); + } + } + + private static void convertFireworkExplosion(final Object inputGeneric) { + if (!(inputGeneric instanceof MapType)) { + return; + } + + final MapType input = (MapType)inputGeneric; + + RenameHelper.renameSingle(input, "Colors", "colors"); + RenameHelper.renameSingle(input, "FadeColors", "fade_colors"); + RenameHelper.renameSingle(input, "Trail", "has_trail"); + RenameHelper.renameSingle(input, "Flicker", "has_twinkle"); + + final int type = input.getInt("Type", 0); + input.remove("Type"); + + final String newType; + switch (type) { + case 1: { + newType = "large_ball"; + break; + } + case 2: { + newType = "star"; + break; + } + case 3: { + newType = "creeper"; + break; + } + case 4: { + newType = "burst"; + break; + } + default: { + newType = "small_ball"; + break; + } + } + + input.setString("shape", newType); + } + + private static void convertFireworkRocket(final TransientItemStack item, final TypeUtil type) { + // adhere to fixSubTag(true) behavior + final Object fireworksGeneric = item.tag.getGeneric("Fireworks"); + if (fireworksGeneric == null) { + return; + } + + if (!(fireworksGeneric instanceof MapType)) { + final MapType newFireworks = type.createEmptyMap(); + item.componentSetMap("minecraft:fireworks", newFireworks); + + newFireworks.setList("explosions", type.createEmptyList()); + newFireworks.setByte("flight_duration", (byte)0); + + return; + } + + final MapType fireworks = (MapType)fireworksGeneric; + + final MapType newFireworks = type.createEmptyMap(); + item.componentSetMap("minecraft:fireworks", newFireworks); + + final int flight = fireworks.getInt("Flight", 0); + newFireworks.setByte("flight_duration", (byte)flight); + + final ListType explosions = fireworks.getListUnchecked("Explosions", type.createEmptyList()); + newFireworks.setList("explosions", explosions); + + for (int i = 0, len = explosions.size(); i < len; ++i) { + convertFireworkExplosion(explosions.getGeneric(i)); + } + + fireworks.remove("Explosions"); + fireworks.remove("Flight"); + if (fireworks.isEmpty()) { + item.tag.remove("Fireworks"); + } + } + + private static Object copyGeneric(final Object value, final TypeUtil type) { + if (value == null || value instanceof Number || value instanceof String) { + return value; + } + if (value instanceof MapType mapType) { + return mapType.copy(); + } + if (value instanceof ListType listType) { + return listType.copy(); + } + // rest of the cases can take the slow path + + final ListType dummy = type.createEmptyList(); + dummy.addGeneric(value); + + return dummy.copy().getGeneric(0); + } + + private static void convertFireworkStar(final TransientItemStack item, final TypeUtil type) { + // note: adhere to fixSubTag(true) behavior + final Object explosionGeneric = item.tag.getGeneric("Explosion"); + if (explosionGeneric == null) { + return; + } + + if (!(explosionGeneric instanceof MapType)) { + // important that we copy the generic value when not moving it + item.componentSetGeneric("minecraft:firework_explosion", copyGeneric(explosionGeneric, type)); + return; + } + + final MapType explosion = (MapType)explosionGeneric; + + final MapType explosionCopy = explosion.copy(); + item.componentSetGeneric("minecraft:firework_explosion", explosionCopy); + convertFireworkExplosion(explosionCopy); + + explosion.remove("Type"); + explosion.remove("Colors"); + explosion.remove("FadeColors"); + explosion.remove("Trail"); + explosion.remove("Flicker"); + + if (explosion.isEmpty()) { + item.tag.remove("Explosion"); + } + } + + private static boolean isValidPlayerName(final String name) { + if (name.length() > 16) { + return false; + } + + for (int i = 0, len = name.length(); i < len; ++i) { + final char character = name.charAt(i); + if (character <= 0x20 || character >= 0x7F) { // printable ascii + return false; + } + } + + return true; + } + + private static ListType convertProperties(final MapType properties, final TypeUtil type) { + final ListType ret = type.createEmptyList(); + + for (final String propertyKey : properties.keys()) { + final ListType propertyValues = properties.getListUnchecked(propertyKey); + + if (propertyValues == null) { + continue; + } + + for (int i = 0, len = propertyValues.size(); i < len; ++i) { + final MapType property = propertyValues.getGeneric(i) instanceof MapType casted ? (MapType)casted : null; + + final String value = property == null ? "" : property.getString("Value", ""); + final String signature = property == null ? null : property.getString("Signature"); + + final MapType newProperty = type.createEmptyMap(); + ret.addMap(newProperty); + + newProperty.setString("name", propertyKey); + newProperty.setString("value", value); + if (signature != null) { + newProperty.setString("signature", signature); + } + } + } + + return ret; + } + + public static MapType convertProfile(final Object inputGeneric, final TypeUtil type) { + final MapType ret = type.createEmptyMap(); + + if (inputGeneric instanceof String name) { + if (!isValidPlayerName(name)) { + return ret; + } + + ret.setString("name", name); + + return ret; + } + + final MapType input = inputGeneric instanceof MapType casted ? (MapType)casted : null; + + final String name = input == null ? "" : input.getString("Name", ""); + + if (isValidPlayerName(name)) { + ret.setString("name", name); + } + + final Object id = input == null ? null : input.getGeneric("Id"); + + if (id != null) { + ret.setGeneric("id", id); + } + + final MapType properties = input == null ? null : input.getMap("Properties"); + if (properties != null && !properties.isEmpty()) { + ret.setList("properties", convertProperties(properties, type)); + } + + return ret; + } + + private static void convertSukll(final TransientItemStack item, final TypeUtil type) { + final Object skullOwnerGeneric = item.tagRemoveGeneric("SkullOwner"); + if (skullOwnerGeneric == null) { + return; + } + + item.componentSetMap("minecraft:profile", convertProfile(skullOwnerGeneric, type)); + } + + // input is unmodified + public static MapType convertItem(final MapType input) { + if (!input.hasKey("id", ObjectType.STRING) || !input.hasKey("Count", ObjectType.NUMBER)) { + return input.copy(); + } + + final TypeUtil type = input.getTypeUtil(); + + final TransientItemStack item = new TransientItemStack(input); + + item.tagMigrateToComponent("Damage", "minecraft:damage", 0); + item.tagMigrateToComponent("RepairCost", "minecraft:repair_cost", 0); + item.tagMigrateToComponent("CustomModelData", "minecraft:custom_model_data"); + + final MapType blockStateProperties = item.tagRemoveMap("BlockStateTag"); + if (blockStateProperties != null) { + item.componentSetMap("minecraft:block_state", blockStateProperties); + convertBlockStateProperties(blockStateProperties); + } + + item.tagMigrateToComponent("EntityTag", "minecraft:entity_data"); + + final MapType tileEntityTag = item.tagRemoveMap("BlockEntityTag"); + if (tileEntityTag != null) { + convertTileEntity(tileEntityTag, item); + + if (tileEntityTag.size() > 1 || (tileEntityTag.size() == 1 && !tileEntityTag.hasKey("id"))) { + item.componentSetMap("minecraft:block_entity_data", tileEntityTag); + } + } + + final int flags = item.tagRemoveInt("HideFlags", 0); + + if (item.tagRemoveInt("Unbreakable", 0) != 0) { + final MapType unbreakable = type.createEmptyMap(); + item.componentSetMap("minecraft:unbreakable", unbreakable); + if ((flags & TOOLTIP_FLAG_HIDE_UNBREAKABLE) != 0) { + unbreakable.setBoolean("show_in_tooltip", false); + } + } + + convertEnchantments( + item, type, "Enchantments", "minecraft:enchantments", + (flags & TOOLTIP_FLAG_HIDE_ENCHANTMENTS) != 0 + ); + + convertDisplay(item, type, flags); + convertAdventureMode(item, type, flags); + convertAttributes(item, type, flags); + + final Object trim = item.tagRemoveGeneric("Trim"); + if (trim != null) { + // note: DFU set does nothing if not map + if ((flags & TOOLTIP_FLAG_HIDE_UPGRADES) != 0 && trim instanceof MapType) { + ((MapType)trim).setBoolean("show_in_tooltip", false); + } + + item.componentSetGeneric("minecraft:trim", trim); + } + + if ((flags & TOOLTIP_FLAG_HIDE_ADDITIONAL) != 0) { + item.componentSetMap("minecraft:hide_additional_tooltip", type.createEmptyMap()); + } + + switch (item.id) { + case "minecraft:enchanted_book": { + convertEnchantments( + item, type, "StoredEnchantments", "minecraft:stored_enchantments", + (flags & TOOLTIP_FLAG_HIDE_ADDITIONAL) != 0 + ); + break; + } + case "minecraft:crossbow": { + item.tagRemoveGeneric("Charged"); + item.tagMigrateNonEmptyListToComponent("ChargedProjectiles", "minecraft:charged_projectiles"); + break; + } + case "minecraft:bundle": { + item.tagMigrateNonEmptyListToComponent("Items", "minecraft:bundle_contents"); + break; + } + case "minecraft:filled_map": { + convertMap(item, type); + break; + } + case "minecraft:potion": + case "minecraft:splash_potion": + case "minecraft:lingering_potion": + case "minecraft:tipped_arrow": { + convertPotion(item, type); + break; + } + case "minecraft:writable_book": { + convertWritableBook(item, type); + break; + } + case "minecraft:written_book": { + convertWrittenBook(item, type); + break; + } + case "minecraft:suspicious_stew": { + item.tagMigrateToComponent("effects", "minecraft:suspicious_stew_effects"); + break; + } + case "minecraft:debug_stick": { + item.tagMigrateToComponent("DebugProperty", "minecraft:debug_stick_state"); + break; + } + case "minecraft:pufferfish_bucket": + case "minecraft:salmon_bucket": + case "minecraft:cod_bucket": + case "minecraft:tropical_fish_bucket": + case "minecraft:axolotl_bucket": + case "minecraft:tadpole_bucket": { + convertMobBucket(item, type); + break; + } + case "minecraft:goat_horn": { + item.tagMigrateToComponent("instrument", "minecraft:instrument"); + break; + } + case "minecraft:knowledge_book": { + item.tagMigrateToComponent("Recipes", "minecraft:recipes"); + break; + } + case "minecraft:compass": { + convertCompass(item, type); + break; + } + case "minecraft:firework_rocket": { + convertFireworkRocket(item, type); + break; + } + case "minecraft:firework_star": { + convertFireworkStar(item, type); + break; + } + case "minecraft:player_head": { + convertSukll(item, type); + break; + } + } + + return item.serialize(); + } + + private ConverterItemStackToDataComponents() {} + + private static final class TransientItemStack { + + private final String id; + private final int count; + + private final MapType components; + private final MapType tag; + private final MapType root; + + public TransientItemStack(final MapType root) { + this.id = root.getString("id"); + this.count = root.getInt("Count"); + + final TypeUtil type = root.getTypeUtil(); + + this.components = type.createEmptyMap(); + + final MapType rootCopy = root.copy(); + + final MapType tag = rootCopy.getMap("tag"); + + rootCopy.remove("id"); + rootCopy.remove("Count"); + rootCopy.remove("tag"); + + this.tag = tag == null ? type.createEmptyMap() : tag; + + this.root = rootCopy; + } + + public void migrateTagTo(final String tagKey, final MapType dst, final String dstKey) { + final Object value = this.tag.getGeneric(tagKey); + + if (value != null) { + this.tag.remove(tagKey); + + dst.setGeneric(dstKey, value); + } + } + + public String tagRemoveString(final String key) { + final String ret = this.tag.getString(key); + + this.tag.remove(key); + + return ret; + } + + public String tagRemoveString(final String key, final String dfl) { + final String ret = this.tag.getString(key, dfl); + + this.tag.remove(key); + + return ret; + } + + public ListType tagRemoveListUnchecked(final String key) { + final ListType ret = this.tag.getListUnchecked(key); + + this.tag.remove(key); + + return ret; + } + + public ListType tagRemoveList(final String key, final ObjectType listType) { + final ListType ret = this.tag.getList(key, listType); + + this.tag.remove(key); + + return ret; + } + + public MapType tagRemoveMap(final String key) { + final MapType ret = this.tag.getMap(key); + + this.tag.remove(key); + + return ret; + } + + public boolean tagRemoveBoolean(final String key, final boolean dfl) { + final boolean ret = this.tag.getBoolean(key, dfl); + + this.tag.remove(key); + + return ret; + } + + public int tagRemoveInt(final String key, final int dfl) { + final int ret = this.tag.getInt(key, dfl); + + this.tag.remove(key); + + return ret; + } + + public Object tagRemoveGeneric(final String key) { + final Object ret = this.tag.getGeneric(key); + + if (ret != null) { + this.tag.remove(key); + return ret; + } + + return ret; + } + + public void tagMigrateToComponent(final String tagKey, final String componentKey) { + final Object value = this.tag.getGeneric(tagKey); + if (value != null) { + this.tag.remove(tagKey); + + this.components.setGeneric(componentKey, value); + } + } + + public void tagMigrateNonEmptyListToComponent(final String tagKey, final String componentKey) { + final Object value = this.tag.getGeneric(tagKey); + if (value != null) { + this.tag.remove(tagKey); + + if (!(value instanceof ListType list) || list.size() > 0) { + this.components.setGeneric(componentKey, value); + } + } + } + + public void tagMigrateToComponent(final String tagKey, final String componentKey, final int defaultComponent) { + final int value = this.tag.getInt(tagKey, defaultComponent); + this.tag.remove(tagKey); + + if (value != defaultComponent) { + this.components.setGeneric(componentKey, value); + } + } + + public void componentSetBoolean(final String key, final boolean value) { + this.components.setBoolean(key, value); + } + + public void componentSetString(final String key, final String value) { + this.components.setString(key, value); + } + + public void componentSetList(final String key, final ListType value) { + this.components.setList(key, value); + } + + public void componentSetMap(final String key, final MapType value) { + this.components.setMap(key, value); + } + + public void componentSetGeneric(final String key, final Object value) { + this.components.setGeneric(key, value); + } + + public MapType serialize() { + final MapType ret = this.components.getTypeUtil().createEmptyMap(); + + ret.setString("id", this.id); + ret.setInt("count", this.count); + if (!this.tag.isEmpty()) { + this.components.setMap("minecraft:custom_data", this.tag); + } + + if (!this.components.isEmpty()) { + ret.setMap("components", this.components); + } + + // merge root to ret, with entries in ret taking priority + if (!this.root.isEmpty()) { + for (final String key : this.root.keys()) { + if (ret.hasKey(key)) { + continue; + } + + ret.setGeneric(key, this.root.getGeneric(key)); + } + } + + return ret; + } + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/leveldat/ConverterRemoveFeatureFlag.java b/ca/spottedleaf/dataconverter/minecraft/converters/leveldat/ConverterRemoveFeatureFlag.java new file mode 100644 index 0000000000000000000000000000000000000000..d47f922b2dd1a92be1d128df16a81983eddc2ac2 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/leveldat/ConverterRemoveFeatureFlag.java @@ -0,0 +1,46 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.leveldat; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import java.util.Set; + +public final class ConverterRemoveFeatureFlag extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/options/ConverterAbstractOptionsRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/options/ConverterAbstractOptionsRename.java new file mode 100644 index 0000000000000000000000000000000000000000..3b6341eb7cd843749f377684c14cbb81043660bc --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/options/ConverterAbstractOptionsRename.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.options; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.ArrayList; +import java.util.function.Function; + +public final class ConverterAbstractOptionsRename { + + private ConverterAbstractOptionsRename() {} + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/particle/ConverterParticleToNBT.java b/ca/spottedleaf/dataconverter/minecraft/converters/particle/ConverterParticleToNBT.java new file mode 100644 index 0000000000000000000000000000000000000000..e02fac460178e5aef15f330de88253c019e492b6 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/particle/ConverterParticleToNBT.java @@ -0,0 +1,270 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.particle; + +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import ca.spottedleaf.dataconverter.types.nbt.NBTMapType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.logging.LogUtils; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; +import net.minecraft.util.Mth; +import org.slf4j.Logger; + +public final class ConverterParticleToNBT { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static CompoundTag parseNBT(final String flat) { + try { + return TagParser.parseCompoundFully(flat); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse nbt: " + flat, ex); + return null; + } + } + + private static void convertItem(final MapType nbt, final String data) { + final MapType itemNBT = nbt.getTypeUtil().createEmptyMap(); + nbt.setMap("item", itemNBT); + itemNBT.setInt("Count", 1); + + final int nbtStart = data.indexOf('{'); + if (nbtStart == -1) { + // assume data is item name + itemNBT.setString("id", NamespaceUtil.correctNamespace(data)); + return; + } + // itemname{tagNBT} + itemNBT.setString("id", NamespaceUtil.correctNamespace(data.substring(0, nbtStart))); + + final CompoundTag tag = parseNBT(data.substring(nbtStart)); + if (tag != null) { + // do we need to worry about type conversion? + itemNBT.setMap("tag", new NBTMapType(tag)); + } + } + + private static MapType parseProperties(final String input, final TypeUtil type) { + final MapType ret = type.createEmptyMap(); + try { + // format: [p1=v1, p2=v2, p3=v3, ...] + final StringReader reader = new StringReader(input); + + reader.expect('['); + reader.skipWhitespace(); + + if (reader.canRead() && reader.peek() != ']') { + while (reader.canRead()) { + final String property = reader.readString(); + + reader.skipWhitespace(); + reader.expect('='); + reader.skipWhitespace(); + + final String value = reader.readString(); + ret.setString(property, value); + + reader.skipWhitespace(); + if (reader.canRead()) { + if (reader.peek() != ',') { + // invalid character or ']' + break; + } + + // skip ',' and move onto next entry + reader.skip(); + } + + reader.skipWhitespace(); + } + } + + reader.expect(']'); + return ret; + } catch (final Exception ex) { + LOGGER.warn("Failed to parse block properties: " + input, ex); + return null; + } + } + + private static void convertBlock(final MapType nbt, final String data) { + final MapType blockNBT = nbt.getTypeUtil().createEmptyMap(); + nbt.setMap("block_state", blockNBT); + + final int propertiesStart = data.indexOf('['); + if (propertiesStart == -1) { + // assume data is id + blockNBT.setString("Name", NamespaceUtil.correctNamespace(data)); + return; + } + blockNBT.setString("Name", NamespaceUtil.correctNamespace(data.substring(0, propertiesStart))); + + // blockname{properties} + final MapType properties = parseProperties(data.substring(propertiesStart), nbt.getTypeUtil()); + if (properties != null && !properties.isEmpty()) { + blockNBT.setMap("Properties", properties); + } + } + + private static ListType parseFloatVector(final StringReader reader, final TypeUtil type) throws CommandSyntaxException { + final float x = reader.readFloat(); + + reader.expect(' '); + final float y = reader.readFloat(); + + reader.expect(' '); + final float z = reader.readFloat(); + + final ListType ret = type.createEmptyList(); + ret.addFloat(x); + ret.addFloat(y); + ret.addFloat(z); + + return ret; + } + + private static void convertDust(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final ListType color = parseFloatVector(reader, nbt.getTypeUtil()); + + reader.expect(' '); + final float scale = reader.readFloat(); + + nbt.setList("color", color); + nbt.setFloat("scale", scale); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse dust particle: " + data, ex); + } + } + + private static void convertColorDust(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final ListType fromColor = parseFloatVector(reader, nbt.getTypeUtil()); + + reader.expect(' '); + final float scale = reader.readFloat(); + + reader.expect(' '); + final ListType toColor = parseFloatVector(reader, nbt.getTypeUtil()); + + nbt.setList("from_color", fromColor); + nbt.setFloat("scale", scale); + nbt.setList("to_color", toColor); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse color transition dust particle: " + data, ex); + } + } + + private static void convertSculk(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final float roll = reader.readFloat(); + + nbt.setFloat("roll", roll); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse sculk particle: " + data, ex); + } + } + + private static void convertVibration(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final double posX = reader.readDouble(); + + reader.expect(' '); + final double posY = reader.readDouble(); + + reader.expect(' '); + final double posZ = reader.readDouble(); + + reader.expect(' '); + final int arrival = reader.readInt(); + + nbt.setInt("arrival_in_ticks", arrival); + + final MapType destination = nbt.getTypeUtil().createEmptyMap(); + nbt.setMap("destination", destination); + + destination.setString("type", "minecraft:block"); + + final ListType pos = nbt.getTypeUtil().createEmptyList(); + destination.setList("pos", pos); + + pos.addInt(Mth.floor(posX)); + pos.addInt(Mth.floor(posY)); + pos.addInt(Mth.floor(posZ)); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse vibration particle: " + data, ex); + } + } + + private static void convertShriek(final MapType nbt, final String data) { + try { + final StringReader reader = new StringReader(data); + + final int delay = reader.readInt(); + + nbt.setInt("delay", delay); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse shriek particle: " + data, ex); + } + } + + public static MapType convert(final String flat, final TypeUtil type) { + final String[] split = flat.split(" ", 2); + final String name = NamespaceUtil.correctNamespace(split[0]); + + final MapType ret = type.createEmptyMap(); + ret.setString("type", name); + + if (split.length > 1) { + final String data = split[1]; + switch (name) { + case "minecraft:item": { + convertItem(ret, data); + break; + } + case "minecraft:block": + case "minecraft:block_marker": + case "minecraft:falling_dust": + case "minecraft:dust_pillar": { + convertBlock(ret, data); + break; + } + case "minecraft:dust": { + convertDust(ret, data); + break; + } + case "minecraft:dust_color_transition": { + convertColorDust(ret, data); + break; + } + case "minecraft:sculk_charge": { + convertSculk(ret, data); + break; + } + case "minecraft:vibration": { + convertVibration(ret, data); + break; + } + case "minecraft:shriek": { + convertShriek(ret, data); + break; + } + } + } + + return ret; + } + + private ConverterParticleToNBT() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterAbstractPOIRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterAbstractPOIRename.java new file mode 100644 index 0000000000000000000000000000000000000000..cdd60c91796691b79e4848a5565616351474f453 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterAbstractPOIRename.java @@ -0,0 +1,53 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.poi; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import java.util.function.Function; + +public final class ConverterAbstractPOIRename { + + private ConverterAbstractPOIRename() {} + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterPoiDelete.java b/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterPoiDelete.java new file mode 100644 index 0000000000000000000000000000000000000000..c61537e7ebef1c48d65a302ab174ef41847560a8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/poi/ConverterPoiDelete.java @@ -0,0 +1,53 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.poi; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import java.util.function.Predicate; + +public final class ConverterPoiDelete extends DataConverter { + + 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/ca/spottedleaf/dataconverter/minecraft/converters/recipe/ConverterAbstractRecipeRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/recipe/ConverterAbstractRecipeRename.java new file mode 100644 index 0000000000000000000000000000000000000000..8f35cbbd78a629712f9ae3cd5d180269f015a11d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/recipe/ConverterAbstractRecipeRename.java @@ -0,0 +1,18 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.recipe; + +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import java.util.function.Function; + +public final class ConverterAbstractRecipeRename { + + private ConverterAbstractRecipeRename() {} + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterAbstractStatsRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterAbstractStatsRename.java new file mode 100644 index 0000000000000000000000000000000000000000..2468ebedfabfb93f9b8d398d77e70d019b9a3dfa --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterAbstractStatsRename.java @@ -0,0 +1,66 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.stats; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.ArrayList; +import java.util.function.Function; + +public final class ConverterAbstractStatsRename { + + private ConverterAbstractStatsRename() {} + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterFlattenStats.java b/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterFlattenStats.java new file mode 100644 index 0000000000000000000000000000000000000000..f8a5d9e4d8fb0f1b3c2fed900fa1d52e2d25f5ec --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/stats/ConverterFlattenStats.java @@ -0,0 +1,321 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.stats; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450; +import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterFlattenItemStack; +import ca.spottedleaf.dataconverter.minecraft.versions.V1451; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import org.apache.commons.lang3.StringUtils; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public final class ConverterFlattenStats { + + private static final int VERSION = MCVersions.V17W47A; + private static final int VERSION_STEP = 6; + + private static final Set 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 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 makeObjectiveConverter() { + return new DataConverter<>(VERSION, VERSION_STEP) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertCriteriaName(data, "CriteriaName"); + + // We also need to update CriteriaType that is created by the data hook in V1451, + // otherwise that data hook will overwrite our CriteriaName + final MapType criteriaType = data.getMap("CriteriaType"); + if (criteriaType != null) { + if ("_special".equals(criteriaType.getString("type"))) { + convertCriteriaName(criteriaType, "id"); + } + } + + return null; + } + + private void convertCriteriaName(final MapType data, final String key) { + final String criteriaName = data.getString(key); + + if (criteriaName == null) { + return; + } + + if (SPECIAL_OBJECTIVE_CRITERIA.contains(criteriaName)) { + return; + } + + final StatType converted = convertLegacyKey(criteriaName); + data.setString(key, converted == null ? "dummy" : V1451.packWithDot(converted.category()) + ":" + V1451.packWithDot(converted.key())); + } + }; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/converters/tileentity/ConverterAbstractTileEntityRename.java b/ca/spottedleaf/dataconverter/minecraft/converters/tileentity/ConverterAbstractTileEntityRename.java new file mode 100644 index 0000000000000000000000000000000000000000..9b82500851430bbe55669d83602931edbc2fa973 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/converters/tileentity/ConverterAbstractTileEntityRename.java @@ -0,0 +1,34 @@ +package ca.spottedleaf.dataconverter.minecraft.converters.tileentity; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.function.Function; + +public final class ConverterAbstractTileEntityRename { + + public static void register(final int version, final Function 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/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java new file mode 100644 index 0000000000000000000000000000000000000000..48f5e7950a27995f16787d4eaaa7dc10182a10c8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/DynamicDataType.java @@ -0,0 +1,132 @@ +package ca.spottedleaf.dataconverter.minecraft.datatypes; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataHook; +import ca.spottedleaf.dataconverter.converters.datatypes.DataType; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCVersionRegistry; +import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap; +import java.util.ArrayList; +import java.util.List; + +public class DynamicDataType extends DataType { + + 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()); + final boolean sort = !this.structureConverters.isEmpty() + && DataConverter.LOWEST_VERSION_COMPARATOR.compare(this.structureConverters.getLast(), converter) > 0; + this.structureConverters.add(converter); + if (sort) { + this.structureConverters.sort(DataConverter.LOWEST_VERSION_COMPARATOR); + } + } + + public void addStructureWalker(final int minVersion, final DataWalker 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/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java new file mode 100644 index 0000000000000000000000000000000000000000..35ae849cb57e2e6b54f5607e8bacdc43448ae6a1 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/IDDataType.java @@ -0,0 +1,170 @@ +package ca.spottedleaf.dataconverter.minecraft.datatypes; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataHook; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCVersionRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class IDDataType extends MCDataType { + + protected final Map>>> walkersById = new HashMap<>(); + + public IDDataType(final String name) { + super(name); + } + + public void addConverterForId(final String id, final DataConverter converter) { + this.addStructureConverter(new DataConverter<>(converter.getToVersion(), converter.getVersionStep()) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!id.equals(data.getString("id"))) { + return null; + } + return converter.convert(data, sourceVersion, toVersion); + } + }); + } + + public boolean hasWalkers(final String id) { + return this.walkersById.containsKey(id); + } + + public void addWalker(final int minVersion, final String id, final DataWalker 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> 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 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> 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/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java new file mode 100644 index 0000000000000000000000000000000000000000..e1f7c0d7fd80556941bbba8018aa85e7c896b630 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCDataType.java @@ -0,0 +1,133 @@ +package ca.spottedleaf.dataconverter.minecraft.datatypes; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataHook; +import ca.spottedleaf.dataconverter.converters.datatypes.DataType; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCVersionRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap; +import java.util.ArrayList; +import java.util.List; + +public class MCDataType extends DataType { + + public final String name; + + protected final ArrayList> structureConverters = new ArrayList<>(); + protected final Long2ObjectArraySortedMap>> structureWalkers = new Long2ObjectArraySortedMap<>(); + protected final Long2ObjectArraySortedMap>> structureHooks = new Long2ObjectArraySortedMap<>(); + + public MCDataType(final String name) { + this.name = name; + } + + public void addStructureConverter(final DataConverter converter) { + MCVersionRegistry.checkVersion(converter.getEncodedVersion()); + final boolean sort = !this.structureConverters.isEmpty() + && DataConverter.LOWEST_VERSION_COMPARATOR.compare(this.structureConverters.getLast(), converter) > 0; + this.structureConverters.add(converter); + if (sort) { + this.structureConverters.sort(DataConverter.LOWEST_VERSION_COMPARATOR); + } + } + + public void addStructureWalker(final int minVersion, final DataWalker 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 MapType convert(MapType data, final long fromVersion, final long toVersion) { + MapType 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 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> 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/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java new file mode 100644 index 0000000000000000000000000000000000000000..4888b386d0e7f0237c2fe416e9034658cba0f1b0 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCTypeRegistry.java @@ -0,0 +1,367 @@ +package ca.spottedleaf.dataconverter.minecraft.datatypes; + +import ca.spottedleaf.dataconverter.minecraft.versions.*; +import com.mojang.logging.LogUtils; +import org.slf4j.Logger; +import java.text.DecimalFormat; + +public final class MCTypeRegistry { + + private static final Logger LOGGER = LogUtils.getLogger(); + + public static final MCDataType LEVEL = new MCDataType("Level"); + public static final MCDataType LIGHTWEIGHT_LEVEL = new MCDataType("LightweightLevel"); + public static final MCDataType PLAYER = new MCDataType("Player"); + public static final MCDataType CHUNK = new MCDataType("Chunk"); + public static final MCDataType HOTBAR = new MCDataType("CreativeHotbar"); + public static final MCDataType OPTIONS = new MCDataType("Options"); + public static final MCDataType STRUCTURE = new MCDataType("Structure"); + public static final MCDataType STATS = new MCDataType("Stats"); + public static final MCDataType ADVANCEMENTS = new MCDataType("Advancements"); + public static final MCDataType POI_CHUNK = new MCDataType("PoiChunk"); + public static final MCDataType ENTITY_CHUNK = new MCDataType("EntityChunk"); + public static final IDDataType TILE_ENTITY = new IDDataType("TileEntity"); + public static final IDDataType ITEM_STACK = new IDDataType("ItemStack"); + public static final MCDataType BLOCK_STATE = new MCDataType("BlockState"); + public static final MCValueType FLAT_BLOCK_STATE = new MCValueType("FlatBlockState"); + public static final MCDataType DATA_COMPONENTS = new MCDataType("DataComponents"); + public static final MCDataType VILLAGER_TRADE = new MCDataType("VillagerTrade"); + public static final DynamicDataType PARTICLE = new DynamicDataType("Particle"); + public static final MCValueType ENTITY_NAME = new MCValueType("EntityName"); + public static final IDDataType ENTITY = new IDDataType("Entity"); + public static final MCValueType BLOCK_NAME = new MCValueType("BlockName"); + public static final MCValueType ITEM_NAME = new MCValueType("ItemName"); + public static final MCDataType UNTAGGED_SPAWNER = new MCDataType("Spawner"); + public static final MCDataType STRUCTURE_FEATURE = new MCDataType("StructureFeature"); + public static final MCDataType OBJECTIVE = new MCDataType("Objective"); + public static final MCDataType TEAM = new MCDataType("Team"); + public static final MCValueType RECIPE = new MCValueType("RecipeName"); + public static final MCValueType BIOME = new MCValueType("Biome"); + public static final MCDataType WORLD_GEN_SETTINGS = new MCDataType("WorldGenSettings"); + public static final MCValueType GAME_EVENT_NAME = new MCValueType("GameEventName"); + // NOTE: Prior to V165, TEXT_COMPONENT _also_ mark plain strings (not components!) to be converted to json format. + // So, great care should be taken to ensure that when dealing with versions up to and including V165 that BOTH formats + // of JSON and plain text are parsed properly. + // As a result, we differ from Vanilla's schemas to ensure that legacy data converts correctly. + public static final DynamicDataType TEXT_COMPONENT = new DynamicDataType("TextComponent"); + public static final MCDataType ENTITY_EQUIPMENT = new MCDataType("EntityEquipment"); + + public static final MCValueType MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST = new MCValueType("MultiNoiseBiomeSourceParameterList"); + + public static final MCDataType SAVED_DATA_RANDOM_SEQUENCES = new MCDataType("SavedData/RandomSequences"); + public static final MCDataType SAVED_DATA_SCOREBOARD = new MCDataType("SavedData/Scoreboard"); + public static final MCDataType SAVED_DATA_STRUCTURE_FEATURE_INDICES = new MCDataType("SavedData/StructureFeatureIndices"); + public static final MCDataType SAVED_DATA_MAP_DATA = new MCDataType("SavedData/MapData"); + public static final MCDataType SAVED_DATA_RAIDS = new MCDataType("SavedData/Raids"); + public static final MCDataType SAVED_DATA_COMMAND_STORAGE = new MCDataType("SavedData/CommandStorage"); + public static final MCDataType SAVED_DATA_MAP_INDEX = new MCDataType("SavedData/IdCounts"); + public static final MCDataType SAVED_DATA_TICKETS = new MCDataType("SavedData/Tickets"); + + public static final DynamicDataType DATACONVERTER_CUSTOM_TYPE_COMMAND = new DynamicDataType("DC_Custom/Command"); + + static { + LOGGER.info("Initialising converters for DataConverter..."); + + final long start = System.nanoTime(); + try { + registerAll(); + } catch (final Throwable thr) { + LOGGER.error(LogUtils.FATAL_MARKER, "Failed to register data converters", thr); + throw new RuntimeException(thr); + } + final long end = System.nanoTime(); + + final DecimalFormat oneDecimalFormat = new DecimalFormat("#,##0.0"); + + LOGGER.info("Finished initialising converters for DataConverter in " + oneDecimalFormat.format((double)(end - start) / 1.0E6) + "ms"); + } + + public static void init() {} + + private static void registerAll() { + // General notes: + // - Structure converters run before everything. + // - ID specific converters run after structure converters. + // - Structure walkers run after id specific converters. + // - ID specific walkers run after structure walkers. + + V99.register(); // all legacy data before converters existed + V100.register(); // first version with version id + V101.register(); + V102.register(); + V105.register(); + V106.register(); + V107.register(); + V108.register(); + V109.register(); + V110.register(); + V111.register(); + V113.register(); + V135.register(); + V143.register(); + V147.register(); + V165.register(); + V501.register(); + V502.register(); + V505.register(); + V700.register(); + V701.register(); + V702.register(); + V703.register(); + V704.register(); + V705.register(); + V804.register(); + V806.register(); + V808.register(); + V813.register(); + V816.register(); + V820.register(); + V1022.register(); + V1125.register(); + // END OF LEGACY DATA CONVERTERS + + // V1.13 + V1344.register(); + V1446.register(); + // START THE FLATTENING + V1450.register(); + V1451.register(); + // END THE FLATTENING + + V1456.register(); + V1458.register(); + V1460.register(); + V1466.register(); + V1470.register(); + V1474.register(); + V1475.register(); + V1480.register(); + // V1481 is adding simple block entity + V1483.register(); + V1484.register(); + V1486.register(); + V1487.register(); + V1488.register(); + V1490.register(); + V1492.register(); + V1494.register(); + V1496.register(); + V1500.register(); + V1501.register(); + V1502.register(); + V1506.register(); + V1510.register(); + V1514.register(); + V1515.register(); + V1624.register(); + // V1.14 + V1800.register(); + V1801.register(); + V1802.register(); + V1803.register(); + V1904.register(); + V1905.register(); + V1906.register(); + V1909.register(); + V1911.register(); + V1914.register(); + V1917.register(); + V1918.register(); + V1920.register(); + V1925.register(); + V1928.register(); + V1929.register(); + V1931.register(); + V1936.register(); + V1946.register(); + V1948.register(); + V1953.register(); + V1955.register(); + V1961.register(); + V1963.register(); + // V1.15 + V2100.register(); + V2202.register(); + V2209.register(); + V2211.register(); + V2218.register(); + // V1.16 + V2501.register(); + V2502.register(); + V2503.register(); + V2505.register(); + V2508.register(); + V2509.register(); + V2511.register(); + V2514.register(); + V2516.register(); + V2518.register(); + V2519.register(); + V2522.register(); + V2523.register(); + V2527.register(); + V2528.register(); + V2529.register(); + V2531.register(); + V2533.register(); + V2535.register(); + V2537.register(); + V2538.register(); + V2550.register(); + V2551.register(); + V2552.register(); + V2553.register(); + V2558.register(); + V2568.register(); + // V1.17 + // WARN: Mojang registers V2671 under 2571, but that version predates 1.16.5? So it looks like a typo... + // I changed it to 2671, just so that it's after 1.16.5, but even then this looks misplaced... Thankfully this is + // the first datafixer, and all it does is add a walker, so I think even if the version here is just wrong it will + // work. + V2671.register(); + V2679.register(); + V2680.register(); + V2684.register(); + V2686.register(); + V2688.register(); + V2690.register(); + V2691.register(); + V2693.register(); + V2696.register(); + V2700.register(); + V2701.register(); + V2702.register(); + // In reference to V2671, why the fuck is goat being registered again? For this obvious reason, V2704 is absent. + V2707.register(); + V2710.register(); + V2717.register(); + // V1.18 + V2825.register(); + V2831.register(); + V2832.register(); + V2833.register(); + V2838.register(); + V2841.register(); + V2842.register(); + V2843.register(); + V2846.register(); + V2852.register(); + V2967.register(); + V2970.register(); + // V1.19 + // V3076 is registering a simple tile entity (sculk_catalyst) + V3077.register(); + V3078.register(); + V3081.register(); + V3082.register(); + V3083.register(); + V3084.register(); + V3086.register(); + V3087.register(); + V3088.register(); + V3090.register(); + V3093.register(); + V3094.register(); + V3097.register(); + V3108.register(); + V3201.register(); + V3202.register(); + V3203.register(); + V3204.register(); + V3209.register(); + V3214.register(); + V3319.register(); + V3322.register(); + V3325.register(); + V3326.register(); + V3327.register(); + V3328.register(); + // V1.20 + V3438.register(); + V3439.register(); + V3440.register(); + V3441.register(); + V3447.register(); + V3448.register(); + V3450.register(); + V3451.register(); + V3459.register(); + V3564.register(); + V3565.register(); + V3566.register(); + V3568.register(); + V3682.register(); + V3683.register(); + V3685.register(); + V3689.register(); + V3692.register(); + // V1.20.5 + V3799.register(); + V3800.register(); + V3803.register(); + V3807.register(); + V3808.register(); + V3809.register(); + V3812.register(); + V3813.register(); + V3814.register(); + V3816.register(); + V3818.register(); + V3820.register(); + V3825.register(); + V3828.register(); + V3833.register(); + // V1.21 + V3938.register(); + V3939.register(); + V3943.register(); + V3945.register(); + // V1.21.2 + V4054.register(); + V4055.register(); + V4057.register(); + V4059.register(); + V4061.register(); + V4064.register(); + V4067.register(); + V4068.register(); + V4070.register(); + V4071.register(); + // V1.21.3 + V4081.register(); + // V1.21.4 + V4173.register(); + V4175.register(); + V4176.register(); + V4180.register(); + V4181.register(); + V4185.register(); + V4187.register(); + // V1.21.5 + V4290.register(); + V4291.register(); + V4292.register(); + V4293.register(); + V4294.register(); + V4295.register(); + V4296.register(); + V4297.register(); + V4299.register(); + V4300.register(); + V4301.register(); + V4302.register(); + V4303.register(); + V4305.register(); + V4306.register(); + V4307.register(); + V4309.register(); + V4311.register(); + V4312.register(); + V4314.register(); + V4420.register(); + V4421.register(); + V4424.register(); + } + + private MCTypeRegistry() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java new file mode 100644 index 0000000000000000000000000000000000000000..c2598db6f73019e2730622e8156b71196bfe0ee5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/datatypes/MCValueType.java @@ -0,0 +1,90 @@ +package ca.spottedleaf.dataconverter.minecraft.datatypes; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataHook; +import ca.spottedleaf.dataconverter.converters.datatypes.DataType; +import ca.spottedleaf.dataconverter.minecraft.MCVersionRegistry; +import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap; +import java.util.ArrayList; +import java.util.List; + +public class MCValueType extends DataType { + + 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()); + final boolean sort = !this.converters.isEmpty() + && DataConverter.LOWEST_VERSION_COMPARATOR.compare(this.converters.getLast(), converter) > 0; + this.converters.add(converter); + if (sort) { + this.converters.sort(DataConverter.LOWEST_VERSION_COMPARATOR); + } + } + + @Override + public Object convert(final Object data, final long fromVersion, final long toVersion) { + Object ret = null; + final List> 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/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookEnforceNamespacedID.java b/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookEnforceNamespacedID.java new file mode 100644 index 0000000000000000000000000000000000000000..a0d5bdfce1e7f433ee3bb984814315a157fa3c15 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookEnforceNamespacedID.java @@ -0,0 +1,29 @@ +package ca.spottedleaf.dataconverter.minecraft.hooks; + +import ca.spottedleaf.dataconverter.converters.datatypes.DataHook; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; + +public class DataHookEnforceNamespacedID implements DataHook { + + private final String path; + + public DataHookEnforceNamespacedID() { + this("id"); + } + + public DataHookEnforceNamespacedID(final String path) { + this.path = path; + } + + @Override + public MapType preHook(final MapType data, final long fromVersion, final long toVersion) { + NamespaceUtil.enforceForPath(data, this.path); + return null; + } + + @Override + public MapType postHook(final MapType data, final long fromVersion, final long toVersion) { + return null; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookValueTypeEnforceNamespaced.java b/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookValueTypeEnforceNamespaced.java new file mode 100644 index 0000000000000000000000000000000000000000..8467d4849f9988da3d79620337be8e12815fa4ff --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/hooks/DataHookValueTypeEnforceNamespaced.java @@ -0,0 +1,20 @@ +package ca.spottedleaf.dataconverter.minecraft.hooks; + +import ca.spottedleaf.dataconverter.converters.datatypes.DataHook; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; + +public class DataHookValueTypeEnforceNamespaced implements DataHook { + + @Override + public Object preHook(final Object data, final long fromVersion, final long toVersion) { + if (data instanceof String string) { + return NamespaceUtil.correctNamespaceOrNull(string); + } + return null; + } + + @Override + public Object postHook(final Object data, final long fromVersion, final long toVersion) { + return null; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java b/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..17ded002b5546de8be4a5238c20ccfda460a98bb --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/util/ComponentUtils.java @@ -0,0 +1,82 @@ +package ca.spottedleaf.dataconverter.minecraft.util; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; +import net.minecraft.util.GsonHelper; + +public final class ComponentUtils { + + public static final String EMPTY = createPlainTextComponent(""); + + public static String createPlainTextComponent(final String text) { + final JsonObject ret = new JsonObject(); + + ret.addProperty("text", text); + + return GsonHelper.toStableString(ret); + } + + public static String createTranslatableComponent(final String key) { + final JsonObject ret = new JsonObject(); + + ret.addProperty("translate", key); + + return GsonHelper.toStableString(ret); + } + + public static String retrieveTranslationString(final String possibleJson) { + if (possibleJson == null) { + return null; + } + + try { + final JsonElement element = JsonParser.parseString(possibleJson); + + if (element instanceof JsonObject object) { + final JsonElement translation = object.get("translate"); + if (translation instanceof JsonPrimitive primitive) { + return primitive.getAsString(); + } + } + + return null; + } catch (final Exception ex) { + return null; + } + } + + public static String convertFromLenient(final String input) { + if (input == null) { + return input; + } + + if (input.isEmpty() || input.equals("null")) { + return EMPTY; + } + + final char firstCharacter = input.charAt(0); + final char lastCharacter = input.charAt(input.length() - 1); + if ((firstCharacter == '"' && lastCharacter == '"') + || (firstCharacter == '{' && lastCharacter == '}') + || (firstCharacter == '[' && lastCharacter == ']')) { + try { + final JsonElement json = JsonParser.parseString(input); + + if (json.isJsonPrimitive()) { + return createPlainTextComponent(json.getAsString()); + } + + return GsonHelper.toStableString(json); + } catch (final JsonParseException ignored) { + // fall through to plain text + } + } + + return createPlainTextComponent(input); + } + + private ComponentUtils() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/util/StringWalker.java b/ca/spottedleaf/dataconverter/minecraft/util/StringWalker.java new file mode 100644 index 0000000000000000000000000000000000000000..4e1add641c092b241b48e93732dab4ef646eafc3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/util/StringWalker.java @@ -0,0 +1,78 @@ +package ca.spottedleaf.dataconverter.minecraft.util; + +public final class StringWalker { + + public final String string; + private int index; // index of next value to return + private final int maxIndex; // exclusive + + public StringWalker(final String string) { + this(string, 0); + } + + public StringWalker(final String string, final int index) { + this(string, index, string.length()); + } + + public StringWalker(final String string, final int index, final int maxIndex) { + this.string = string; + this.index = index; + this.maxIndex = maxIndex; + + if (maxIndex < 0 || maxIndex > string.length()) { + throw new IllegalArgumentException("Max index out of string range"); + } + + if (index < 0 || index > maxIndex) { + throw new IllegalArgumentException("Index out of string range"); + } + } + + public int getIndex() { + return this.index; + } + + public void setIndex(final int to) { + this.index = to; + } + + private void checkNext() { + if (!this.hasNext()) { + throw this.parseFail(this.getIndex(), "Expecting more input"); + } + } + + public boolean hasNext() { + return this.index < this.maxIndex; + } + + public char next() { + return this.string.charAt(this.index++); + } + + public char peek() { + return this.string.charAt(this.index); + } + + public void advance() { + ++this.index; + } + + public void skipWhitespace() { + while (this.hasNext() || Character.isWhitespace(this.peek())) { + this.advance(); + } + } + + public boolean skipIf(final char c) { + if (this.hasNext() && this.peek() == c) { + this.advance(); + return true; + } + return false; + } + + public IllegalStateException parseFail(final int index, final String reason) { + return new IllegalStateException("At column " + index + ": " + reason); + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/util/Version.java b/ca/spottedleaf/dataconverter/minecraft/util/Version.java new file mode 100644 index 0000000000000000000000000000000000000000..c289ec6b7f6d199182ffdfb1cd95a1746bfd6e76 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/util/Version.java @@ -0,0 +1,12 @@ +package ca.spottedleaf.dataconverter.minecraft.util; + +import net.minecraft.SharedConstants; + +public final class Version { + + public static int getCurrentVersion() { + return SharedConstants.getCurrentVersion().dataVersion().version(); + } + + private Version() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V100.java b/ca/spottedleaf/dataconverter/minecraft/versions/V100.java new file mode 100644 index 0000000000000000000000000000000000000000..166953878ce7df4317a40ad274f56ecd3f7214cc --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V100.java @@ -0,0 +1,124 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.block_name.DataWalkerBlockNames; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V100 { + + private static final int VERSION = MCVersions.V15W32A; + + public static void register() { + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType equipment = data.getList("Equipment", ObjectType.MAP); + data.remove("Equipment"); + + if (equipment != null) { + if (equipment.size() > 0 && data.getListUnchecked("HandItems") == null) { + final ListType handItems = Types.NBT.createEmptyList(); + data.setList("HandItems", handItems); + handItems.addMap(equipment.getMap(0)); + handItems.addMap(Types.NBT.createEmptyMap()); + } + + if (equipment.size() > 1 && data.getListUnchecked("ArmorItems") == null) { + final ListType armorItems = Types.NBT.createEmptyList(); + data.setList("ArmorItems", armorItems); + for (int i = 1; i < Math.min(equipment.size(), 5); ++i) { + armorItems.addMap(equipment.getMap(i)); + } + } + } + + final ListType dropChances = data.getList("DropChances", ObjectType.FLOAT); + data.remove("DropChances"); + + if (dropChances != null) { + if (data.getListUnchecked("HandDropChances") == null) { + final ListType handDropChances = Types.NBT.createEmptyList(); + data.setList("HandDropChances", handDropChances); + if (0 < dropChances.size()) { + handDropChances.addFloat(dropChances.getFloat(0)); + } else { + handDropChances.addFloat(0.0F); + } + handDropChances.addFloat(0.0F); + } + + if (data.getListUnchecked("ArmorDropChances") == null) { + final ListType armorDropChances = Types.NBT.createEmptyList(); + data.setList("ArmorDropChances", armorDropChances); + for (int i = 1; i < 5; ++i) { + if (i < dropChances.size()) { + armorDropChances.addFloat(dropChances.getFloat(i)); + } else { + armorDropChances.addFloat(0.0F); + } + } + } + } + + return null; + } + }); + MCTypeRegistry.ENTITY_EQUIPMENT.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "ArmorItems", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "HandItems", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, data, "body_armor_item", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, data, "saddle", fromVersion, toVersion); + + return null; + }); + + //registerMob("ArmorStand"); // changed to simple in 1.21.5 + //registerMob("Creeper"); // changed to simple in 1.21.5 + //registerMob("Skeleton"); // changed to simple in 1.21.5 + //registerMob("Spider"); // changed to simple in 1.21.5 + //registerMob("Giant"); // changed to simple in 1.21.5 + //registerMob("Zombie"); // changed to simple in 1.21.5 + //registerMob("Slime"); // changed to simple in 1.21.5 + //registerMob("Ghast"); // changed to simple in 1.21.5 + //registerMob("PigZombie"); // changed to simple in 1.21.5 + // Enderman is now identical to V99 due to moving equipment to base in 1.21.5 + //registerMob("CaveSpider"); // changed to simple in 1.21.5 + //registerMob("Silverfish"); // changed to simple in 1.21.5 + //registerMob("Blaze"); // changed to simple in 1.21.5 + //registerMob("LavaSlime"); // changed to simple in 1.21.5 + //registerMob("EnderDragon"); // changed to simple in 1.21.5 + //registerMob("WitherBoss"); // changed to simple in 1.21.5 + //registerMob("Bat"); // changed to simple in 1.21.5 + //registerMob("Witch"); // changed to simple in 1.21.5 + //registerMob("Endermite"); // changed to simple in 1.21.5 + //registerMob("Guardian"); // changed to simple in 1.21.5 + //registerMob("Pig"); // changed to simple in 1.21.5 + //registerMob("Sheep"); // changed to simple in 1.21.5 + //registerMob("Cow"); // changed to simple in 1.21.5 + //registerMob("Chicken"); // changed to simple in 1.21.5 + //registerMob("Squid"); // changed to simple in 1.21.5 + //registerMob("Wolf"); // changed to simple in 1.21.5 + //registerMob("MushroomCow"); // changed to simple in 1.21.5 + //registerMob("SnowMan"); // changed to simple in 1.21.5 + //registerMob("Ozelot"); // changed to simple in 1.21.5 + //registerMob("VillagerGolem"); // changed to simple in 1.21.5 + // EntityHorse is now identical to V99 due to moving equipment to base in 1.21.5 + //registerMob("Rabbit"); // changed to simple in 1.21.5 + // Villager is now identical to V99 due to moving equipment to base in 1.21.5 + //registerMob("Shulker"); // changed to simple in 1.21.5 + // AreaEffectCloud is now identical to V99 due to moving equipment to base in 1.21.5 + + // Moved to V99 in 1.21.5 + } + + private V100() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V101.java b/ca/spottedleaf/dataconverter/minecraft/versions/V101.java new file mode 100644 index 0000000000000000000000000000000000000000..787f09af1338483fdb820806f94680c7e5db7d7c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V101.java @@ -0,0 +1,46 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V101 { + + private static final int VERSION = MCVersions.V15W32A + 1; + + private static void updateLine(final MapType data, final String path) { + final String textString = data.getString(path); + + if (textString == null) { + return; + } + + data.setString(path, ComponentUtils.convertFromLenient(textString)); + } + + public static void register() { + // Mojang Removed in 1.21.5, replaced in V165 - although we should not be modifying old converters unless + // we need to (the conversion is the same) + MCTypeRegistry.TILE_ENTITY.addConverterForId("Sign", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateLine(data, "Text1"); + updateLine(data, "Text2"); + updateLine(data, "Text3"); + updateLine(data, "Text4"); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("Villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setBoolean("CanPickUpLoot", true); + return null; + } + }); + } + + private V101() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V102.java b/ca/spottedleaf/dataconverter/minecraft/versions/V102.java new file mode 100644 index 0000000000000000000000000000000000000000..b9f23288d9cc912eccd07418e38cd6ffcdf65360 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V102.java @@ -0,0 +1,86 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperItemNameV102; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; +import com.mojang.logging.LogUtils; +import org.slf4j.Logger; + +public final class V102 { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static final int VERSION = MCVersions.V15W32A + 2; + + public static void register() { + // V102 -> V15W32A + 2 + // V102 schema only modifies ITEM_STACK to have only a string ID, but our ITEM_NAME is generic (int or String) so we don't + // actually need to update the walker + + MCTypeRegistry.ITEM_NAME.addConverter(new DataConverter<>(VERSION) { + @Override + public Object convert(final Object data, final long sourceVersion, final long toVersion) { + if (!(data instanceof Number)) { + return null; + } + final int id = ((Number)data).intValue(); + final String remap = HelperItemNameV102.getNameFromId(id); + if (remap == null) { + LOGGER.warn("Unknown legacy integer id (V102) " + id); + } + return remap == null ? HelperItemNameV102.getNameFromId(0) : remap; + } + }); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey("id", ObjectType.NUMBER)) { + return null; + } + + final int id = data.getInt("id"); + + String remap = HelperItemNameV102.getNameFromId(id); + if (remap == null) { + LOGGER.warn("Unknown legacy integer id (V102) " + id); + remap = HelperItemNameV102.getNameFromId(0); + } + + data.setString("id", remap); + + return null; + } + }); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:potion", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final short damage = data.getShort("Damage"); + if (damage != 0) { + data.setShort("Damage", (short)0); + } + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + data.setMap("tag", tag); + } + + if (!tag.hasKey("Potion", ObjectType.STRING)) { + final String converted = HelperItemNameV102.getPotionNameFromId(damage); + tag.setString("Potion", converted == null ? "minecraft:water" : converted); + if ((damage & 16384) == 16384) { + data.setString("id", "minecraft:splash_potion"); + } + } + + return null; + } + }); + } + + private V102() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java new file mode 100644 index 0000000000000000000000000000000000000000..dab97581780d0d3156335fe0fbb84ea0823c5585 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1022.java @@ -0,0 +1,43 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1022 { + + private static final int VERSION = MCVersions.V17W06A; + + public static void register() { + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("RootVehicle"), "Entity", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "ender_pearls", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "EnderItems", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityLeft", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityRight", fromVersion, toVersion); + + final MapType recipeBook = data.getMap("recipeBook"); + if (recipeBook != null) { + WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "recipes", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "toBeDisplayed", fromVersion, toVersion); + } + + return null; + }); + + MCTypeRegistry.HOTBAR.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + for (final String key : data.keys()) { + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, key, fromVersion, toVersion); + } + + return null; + }); + } + + private V1022() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V105.java b/ca/spottedleaf/dataconverter/minecraft/versions/V105.java new file mode 100644 index 0000000000000000000000000000000000000000..072c64eda648496ceee300abaff62c8b64a84219 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V105.java @@ -0,0 +1,49 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperSpawnEggNameV105; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V105 { + + private static final int VERSION = MCVersions.V15W32C + 1; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:spawn_egg", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + } + + final short damage = data.getShort("Damage"); + if (damage != 0) { + data.setShort("Damage", (short)0); + } + + MapType entityTag = tag.getMap("EntityTag"); + if (entityTag == null) { + entityTag = Types.NBT.createEmptyMap(); + } + + if (!entityTag.hasKey("id", ObjectType.STRING)) { + final String converted = HelperSpawnEggNameV105.getSpawnNameFromId(damage); + if (converted != null) { + entityTag.setString("id", converted); + tag.setMap("EntityTag", entityTag); + data.setMap("tag", tag); + } + } + + return null; + } + }); + } + + private V105() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V106.java b/ca/spottedleaf/dataconverter/minecraft/versions/V106.java new file mode 100644 index 0000000000000000000000000000000000000000..025488260309ea2816b6513338a0aba21fd6f9e3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V106.java @@ -0,0 +1,83 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V106 { + + private static final int VERSION = MCVersions.V15W32C + 2; + + public static void register() { + // V106 -> V15W32C + 2 + + MCTypeRegistry.UNTAGGED_SPAWNER.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // While all converters for spawners check the id for this version, we don't because spawners exist in minecarts. ooops! Loading a chunk + // with a minecart spawner from 1.7.10 in 1.16.5 vanilla will fail to convert! Clearly there was a mistake in how they + // used and applied spawner converters. In anycase, do not check the id - we are not guaranteed to be a tile + // entity. We can be a regular old minecart spawner. And we know we are a spawner because this is only called from data walkers. + + final String entityId = data.getString("EntityId"); + if (entityId != null) { + data.remove("EntityId"); + MapType spawnData = data.getMap("SpawnData"); + if (spawnData == null) { + spawnData = Types.NBT.createEmptyMap(); + data.setMap("SpawnData", spawnData); + } + spawnData.setString("id", entityId.isEmpty() ? "Pig" : entityId); + } + + final ListType spawnPotentials = data.getList("SpawnPotentials", ObjectType.MAP); + if (spawnPotentials != null) { + for (int i = 0, len = spawnPotentials.size(); i < len; ++i) { + // convert to standard entity format (it's not a coincidence a walker for spawners is only added + // in this version) + final MapType spawn = spawnPotentials.getMap(i); + final String spawnType = spawn.getString("Type"); + if (spawnType == null) { + continue; + } + spawn.remove("Type"); + + MapType properties = spawn.getMap("Properties"); + if (properties == null) { + properties = Types.NBT.createEmptyMap(); + } else { + spawn.remove("Properties"); + } + + properties.setString("id", spawnType); + + spawn.setMap("Entity", properties); + } + } + + return null; + } + }); + + MCTypeRegistry.UNTAGGED_SPAWNER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final ListType spawnPotentials = data.getList("SpawnPotentials", ObjectType.MAP); + if (spawnPotentials != null) { + for (int i = 0, len = spawnPotentials.size(); i < len; ++i) { + final MapType spawnPotential = spawnPotentials.getMap(i); + WalkerUtils.convert(MCTypeRegistry.ENTITY, spawnPotential, "Entity", fromVersion, toVersion); + } + } + + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "SpawnData", fromVersion, toVersion); + + return null; + }); + } + + private V106() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V107.java b/ca/spottedleaf/dataconverter/minecraft/versions/V107.java new file mode 100644 index 0000000000000000000000000000000000000000..1b845e6df83694de203181382094c6c30684c0cc --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V107.java @@ -0,0 +1,43 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V107 { + + private static final int VERSION = MCVersions.V15W32C + 3; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("Minecart", new DataConverter<>(VERSION) { + protected final String[] MINECART_IDS = new String[] { + "MinecartRideable", // 0 + "MinecartChest", // 1 + "MinecartFurnace", // 2 + "MinecartTNT", // 3 + "MinecartSpawner", // 4 + "MinecartHopper", // 5 + "MinecartCommandBlock" // 6 + }; + // Vanilla does not use all of the IDs here. The legacy (pre DFU) code does, so I'm going to use them. + // No harm in catching more cases here. + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + String newId = "MinecartRideable"; // dfl + final int type = data.getInt("Type"); + data.remove("Type"); + + if (type >= 0 && type < MINECART_IDS.length) { + newId = MINECART_IDS[type]; + } + data.setString("id", newId); + + return null; + } + }); + } + + private V107() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V108.java b/ca/spottedleaf/dataconverter/minecraft/versions/V108.java new file mode 100644 index 0000000000000000000000000000000000000000..19246f5219896f018b2e6a6adfcadce95a795f59 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V108.java @@ -0,0 +1,46 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import com.mojang.logging.LogUtils; +import org.slf4j.Logger; +import java.util.UUID; + +public final class V108 { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static final int VERSION = MCVersions.V15W32C + 4; + + public static void register() { + // Convert String UUID into UUIDMost and UUIDLeast + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String uuidString = data.getString("UUID"); + + if (uuidString == null) { + return null; + } + data.remove("UUID"); + + final UUID uuid; + try { + uuid = UUID.fromString(uuidString); + } catch (final Exception ex) { + LOGGER.warn("Failed to parse UUID for legacy entity (V108): " + uuidString, ex); + return null; + } + + data.setLong("UUIDMost", uuid.getMostSignificantBits()); + data.setLong("UUIDLeast", uuid.getLeastSignificantBits()); + + return null; + } + }); + } + + private V108() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V109.java b/ca/spottedleaf/dataconverter/minecraft/versions/V109.java new file mode 100644 index 0000000000000000000000000000000000000000..05e54a7f716899060aae56be20e8b3764bc97081 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V109.java @@ -0,0 +1,41 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V109 { + + private static final int VERSION = MCVersions.V15W32C + 5; + + public static void register() { + // Converts health to be in float, and cleans up whatever the hell was going on with HealF and Health... + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number healF = data.getNumber("HealF"); + final Number heal = data.getNumber("Health"); + + final float newHealth; + + if (healF != null) { + data.remove("HealF"); + newHealth = healF.floatValue(); + } else { + if (heal == null) { + return null; + } + + newHealth = heal.floatValue(); + } + + data.setFloat("Health", newHealth); + + return null; + } + }); + } + + private V109() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V110.java b/ca/spottedleaf/dataconverter/minecraft/versions/V110.java new file mode 100644 index 0000000000000000000000000000000000000000..11db20648cf877eacaa2a39e62fa66daad3a79bb --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V110.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V110 { + + private static final int VERSION = MCVersions.V15W32C + 6; + + public static void register() { + // Moves the Saddle boolean to be an actual saddle item. Note: The data walker for the SaddleItem exists + // in V99, it doesn't need to be added here. + MCTypeRegistry.ENTITY.addConverterForId("EntityHorse", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.getBoolean("Saddle") || data.hasKey("SaddleItem", ObjectType.MAP)) { + return null; + } + + final MapType saddleItem = Types.NBT.createEmptyMap(); + data.remove("Saddle"); + data.setMap("SaddleItem", saddleItem); + + saddleItem.setString("id", "minecraft:saddle"); + saddleItem.setByte("Count", (byte)1); + saddleItem.setShort("Damage", (short)0); + + return null; + } + }); + } + + private V110() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V111.java b/ca/spottedleaf/dataconverter/minecraft/versions/V111.java new file mode 100644 index 0000000000000000000000000000000000000000..9eaf34660e1b42ab99d06d43d86cda13a69448ae --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V111.java @@ -0,0 +1,64 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V111 { + + private static final int VERSION = MCVersions.V15W33B; + + public static void register() { + final EntityRotationFix rotationFix = new EntityRotationFix(VERSION); + MCTypeRegistry.ENTITY.addConverterForId("Painting", rotationFix); + MCTypeRegistry.ENTITY.addConverterForId("ItemFrame", rotationFix); + } + + private V111() {} + + protected static final class EntityRotationFix extends DataConverter { + + private static final int[][] DIRECTIONS = new int[][] { + {0, 0, 1}, + {-1, 0, 0}, + {0, 0, -1}, + {1, 0, 0} + }; + + public EntityRotationFix(final int version) { + super(version); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getNumber("Facing") != null) { + return null; + } + + final Number direction = data.getNumber("Direction"); + final int facing; + if (direction != null) { + data.remove("Direction"); + facing = direction.intValue() % DIRECTIONS.length; + final int[] offsets = DIRECTIONS[facing]; + data.setInt("TileX", data.getInt("TileX") + offsets[0]); + data.setInt("TileY", data.getInt("TileY") + offsets[1]); + data.setInt("TileZ", data.getInt("TileZ") + offsets[2]); + if ("ItemFrame".equals(data.getString("id"))) { + final Number rotation = data.getNumber("ItemRotation"); + if (rotation != null) { + data.setByte("ItemRotation", (byte)(rotation.byteValue() * 2)); + } + } + } else { + facing = data.getByte("Dir") % DIRECTIONS.length; + data.remove("Dir"); + } + + data.setByte("Facing", (byte)facing); + + return null; + } + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1125.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1125.java new file mode 100644 index 0000000000000000000000000000000000000000..ff99e8e263d6fd234bce01c0c02fdb3eb0ff7eaa --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1125.java @@ -0,0 +1,101 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookValueTypeEnforceNamespaced; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V1125 { + + private static final int VERSION = MCVersions.V17W15A; + private static final int BED_BLOCK_ID = 416; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final int chunkX = level.getInt("xPos"); + final int chunkZ = level.getInt("zPos"); + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + ListType tileEntities = level.getList("TileEntities", ObjectType.MAP); + if (tileEntities == null) { + tileEntities = Types.NBT.createEmptyList(); + level.setList("TileEntities", tileEntities); + } + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + final byte sectionY = section.getByte("Y"); + final byte[] blocks = section.getBytes("Blocks"); + + if (blocks == null) { + continue; + } + + for (int blockIndex = 0; blockIndex < blocks.length; ++blockIndex) { + if (BED_BLOCK_ID != ((blocks[blockIndex] & 255) << 4)) { + continue; + } + + final int localX = blockIndex & 15; + final int localZ = (blockIndex >> 4) & 15; + final int localY = (blockIndex >> 8) & 15; + + final MapType newTile = Types.NBT.createEmptyMap(); + newTile.setString("id", "minecraft:bed"); + newTile.setInt("x", localX + (chunkX << 4)); + newTile.setInt("y", localY + (sectionY << 4)); + newTile.setInt("z", localZ + (chunkZ << 4)); + newTile.setShort("color", (short)14); // Red + + tileEntities.addMap(newTile); + } + } + + return null; + } + }); + + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:bed", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getShort("Damage") == 0) { + data.setShort("Damage", (short)14); // Red + } + + return null; + } + }); + + + MCTypeRegistry.ADVANCEMENTS.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertKeys(MCTypeRegistry.BIOME, data.getMap("minecraft:adventure/adventuring_time"), "criteria", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/kill_a_mob"), "criteria", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/kill_all_mobs"), "criteria", fromVersion, toVersion); + WalkerUtils.convertKeys(MCTypeRegistry.ENTITY_NAME, data.getMap("minecraft:adventure/bred_all_animals"), "criteria", fromVersion, toVersion); + + return null; + }); + + // Enforce namespacing for ids + MCTypeRegistry.BIOME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced()); + } + + private V1125() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V113.java b/ca/spottedleaf/dataconverter/minecraft/versions/V113.java new file mode 100644 index 0000000000000000000000000000000000000000..3470afede273da32d98571524817dc1979b3044d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V113.java @@ -0,0 +1,40 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V113 { + + private static final int VERSION = MCVersions.V15W33C + 1; + + private static void checkList(final MapType data, final String id, final int requiredLength) { + final ListType list = data.getList(id, ObjectType.FLOAT); + if (list != null && list.size() == requiredLength) { + for (int i = 0; i < requiredLength; ++i) { + if (list.getFloat(i) != 0.0F) { + return; + } + } + } + + data.remove(id); + } + + public static void register() { + // Removes "HandDropChances" and "ArmorDropChances" if they're empty. + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + checkList(data, "HandDropChances", 2); + checkList(data, "ArmorDropChances", 4); + return null; + } + }); + } + + private V113() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1344.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1344.java new file mode 100644 index 0000000000000000000000000000000000000000..18d5a0f47066b8c92dc13e5b7c441f8c8258c85d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1344.java @@ -0,0 +1,176 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public final class V1344 { + + private static final int VERSION = MCVersions.V1_12_2 + 1; + + private static final Int2ObjectOpenHashMap BUTTON_ID_TO_NAME = new Int2ObjectOpenHashMap<>(); + static { + BUTTON_ID_TO_NAME.put(0, "key.unknown"); + BUTTON_ID_TO_NAME.put(11, "key.0"); + BUTTON_ID_TO_NAME.put(2, "key.1"); + BUTTON_ID_TO_NAME.put(3, "key.2"); + BUTTON_ID_TO_NAME.put(4, "key.3"); + BUTTON_ID_TO_NAME.put(5, "key.4"); + BUTTON_ID_TO_NAME.put(6, "key.5"); + BUTTON_ID_TO_NAME.put(7, "key.6"); + BUTTON_ID_TO_NAME.put(8, "key.7"); + BUTTON_ID_TO_NAME.put(9, "key.8"); + BUTTON_ID_TO_NAME.put(10, "key.9"); + BUTTON_ID_TO_NAME.put(30, "key.a"); + BUTTON_ID_TO_NAME.put(40, "key.apostrophe"); + BUTTON_ID_TO_NAME.put(48, "key.b"); + BUTTON_ID_TO_NAME.put(43, "key.backslash"); + BUTTON_ID_TO_NAME.put(14, "key.backspace"); + BUTTON_ID_TO_NAME.put(46, "key.c"); + BUTTON_ID_TO_NAME.put(58, "key.caps.lock"); + BUTTON_ID_TO_NAME.put(51, "key.comma"); + BUTTON_ID_TO_NAME.put(32, "key.d"); + BUTTON_ID_TO_NAME.put(211, "key.delete"); + BUTTON_ID_TO_NAME.put(208, "key.down"); + BUTTON_ID_TO_NAME.put(18, "key.e"); + BUTTON_ID_TO_NAME.put(207, "key.end"); + BUTTON_ID_TO_NAME.put(28, "key.enter"); + BUTTON_ID_TO_NAME.put(13, "key.equal"); + BUTTON_ID_TO_NAME.put(1, "key.escape"); + BUTTON_ID_TO_NAME.put(33, "key.f"); + BUTTON_ID_TO_NAME.put(59, "key.f1"); + BUTTON_ID_TO_NAME.put(68, "key.f10"); + BUTTON_ID_TO_NAME.put(87, "key.f11"); + BUTTON_ID_TO_NAME.put(88, "key.f12"); + BUTTON_ID_TO_NAME.put(100, "key.f13"); + BUTTON_ID_TO_NAME.put(101, "key.f14"); + BUTTON_ID_TO_NAME.put(102, "key.f15"); + BUTTON_ID_TO_NAME.put(103, "key.f16"); + BUTTON_ID_TO_NAME.put(104, "key.f17"); + BUTTON_ID_TO_NAME.put(105, "key.f18"); + BUTTON_ID_TO_NAME.put(113, "key.f19"); + BUTTON_ID_TO_NAME.put(60, "key.f2"); + BUTTON_ID_TO_NAME.put(61, "key.f3"); + BUTTON_ID_TO_NAME.put(62, "key.f4"); + BUTTON_ID_TO_NAME.put(63, "key.f5"); + BUTTON_ID_TO_NAME.put(64, "key.f6"); + BUTTON_ID_TO_NAME.put(65, "key.f7"); + BUTTON_ID_TO_NAME.put(66, "key.f8"); + BUTTON_ID_TO_NAME.put(67, "key.f9"); + BUTTON_ID_TO_NAME.put(34, "key.g"); + BUTTON_ID_TO_NAME.put(41, "key.grave.accent"); + BUTTON_ID_TO_NAME.put(35, "key.h"); + BUTTON_ID_TO_NAME.put(199, "key.home"); + BUTTON_ID_TO_NAME.put(23, "key.i"); + BUTTON_ID_TO_NAME.put(210, "key.insert"); + BUTTON_ID_TO_NAME.put(36, "key.j"); + BUTTON_ID_TO_NAME.put(37, "key.k"); + BUTTON_ID_TO_NAME.put(82, "key.keypad.0"); + BUTTON_ID_TO_NAME.put(79, "key.keypad.1"); + BUTTON_ID_TO_NAME.put(80, "key.keypad.2"); + BUTTON_ID_TO_NAME.put(81, "key.keypad.3"); + BUTTON_ID_TO_NAME.put(75, "key.keypad.4"); + BUTTON_ID_TO_NAME.put(76, "key.keypad.5"); + BUTTON_ID_TO_NAME.put(77, "key.keypad.6"); + BUTTON_ID_TO_NAME.put(71, "key.keypad.7"); + BUTTON_ID_TO_NAME.put(72, "key.keypad.8"); + BUTTON_ID_TO_NAME.put(73, "key.keypad.9"); + BUTTON_ID_TO_NAME.put(78, "key.keypad.add"); + BUTTON_ID_TO_NAME.put(83, "key.keypad.decimal"); + BUTTON_ID_TO_NAME.put(181, "key.keypad.divide"); + BUTTON_ID_TO_NAME.put(156, "key.keypad.enter"); + BUTTON_ID_TO_NAME.put(141, "key.keypad.equal"); + BUTTON_ID_TO_NAME.put(55, "key.keypad.multiply"); + BUTTON_ID_TO_NAME.put(74, "key.keypad.subtract"); + BUTTON_ID_TO_NAME.put(38, "key.l"); + BUTTON_ID_TO_NAME.put(203, "key.left"); + BUTTON_ID_TO_NAME.put(56, "key.left.alt"); + BUTTON_ID_TO_NAME.put(26, "key.left.bracket"); + BUTTON_ID_TO_NAME.put(29, "key.left.control"); + BUTTON_ID_TO_NAME.put(42, "key.left.shift"); + BUTTON_ID_TO_NAME.put(219, "key.left.win"); + BUTTON_ID_TO_NAME.put(50, "key.m"); + BUTTON_ID_TO_NAME.put(12, "key.minus"); + BUTTON_ID_TO_NAME.put(49, "key.n"); + BUTTON_ID_TO_NAME.put(69, "key.num.lock"); + BUTTON_ID_TO_NAME.put(24, "key.o"); + BUTTON_ID_TO_NAME.put(25, "key.p"); + BUTTON_ID_TO_NAME.put(209, "key.page.down"); + BUTTON_ID_TO_NAME.put(201, "key.page.up"); + BUTTON_ID_TO_NAME.put(197, "key.pause"); + BUTTON_ID_TO_NAME.put(52, "key.period"); + BUTTON_ID_TO_NAME.put(183, "key.print.screen"); + BUTTON_ID_TO_NAME.put(16, "key.q"); + BUTTON_ID_TO_NAME.put(19, "key.r"); + BUTTON_ID_TO_NAME.put(205, "key.right"); + BUTTON_ID_TO_NAME.put(184, "key.right.alt"); + BUTTON_ID_TO_NAME.put(27, "key.right.bracket"); + BUTTON_ID_TO_NAME.put(157, "key.right.control"); + BUTTON_ID_TO_NAME.put(54, "key.right.shift"); + BUTTON_ID_TO_NAME.put(220, "key.right.win"); + BUTTON_ID_TO_NAME.put(31, "key.s"); + BUTTON_ID_TO_NAME.put(70, "key.scroll.lock"); + BUTTON_ID_TO_NAME.put(39, "key.semicolon"); + BUTTON_ID_TO_NAME.put(53, "key.slash"); + BUTTON_ID_TO_NAME.put(57, "key.space"); + BUTTON_ID_TO_NAME.put(20, "key.t"); + BUTTON_ID_TO_NAME.put(15, "key.tab"); + BUTTON_ID_TO_NAME.put(22, "key.u"); + BUTTON_ID_TO_NAME.put(200, "key.up"); + BUTTON_ID_TO_NAME.put(47, "key.v"); + BUTTON_ID_TO_NAME.put(17, "key.w"); + BUTTON_ID_TO_NAME.put(45, "key.x"); + BUTTON_ID_TO_NAME.put(21, "key.y"); + BUTTON_ID_TO_NAME.put(44, "key.z"); + } + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + for (final String key : data.keys()) { + if (!key.startsWith("key_")) { + continue; + } + final String value = data.getString(key); + final int code; + try { + code = Integer.parseInt(value); + } catch (final NumberFormatException ex) { + continue; + } + + final String newEntry; + + if (code < 0) { + final int mouseCode = code + 100; + switch (mouseCode) { + case 0: + newEntry = "key.mouse.left"; + break; + case 1: + newEntry = "key.mouse.right"; + break; + case 2: + newEntry = "key.mouse.middle"; + break; + default: + newEntry = "key.mouse." + (mouseCode + 1); + break; + } + } else { + newEntry = BUTTON_ID_TO_NAME.getOrDefault(code, "key.unknown"); + } + + // No CMEs occur for existing entries in maps. + data.setString(key, newEntry); + } + return null; + } + }); + } + + private V1344() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V135.java b/ca/spottedleaf/dataconverter/minecraft/versions/V135.java new file mode 100644 index 0000000000000000000000000000000000000000..9b6d09980bd1479ca9a4dc275f2abb4cfbecd545 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V135.java @@ -0,0 +1,62 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V135 { + + private static final int VERSION = MCVersions.V15W40B + 1; + + public static void register() { + // In this update they changed the "Riding" value to be "Passengers", which is now a list. So it added + // support for multiple entities riding. Of course, Riding and Passenger are opposites - so it also will + // switch the data layout to be from highest rider to lowest rider, in terms of depth. + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(MapType data, final long sourceVersion, final long toVersion) { + MapType ret = null; + while (data.hasKey("Riding", ObjectType.MAP)) { + final MapType riding = data.getMap("Riding"); + data.remove("Riding"); + + final ListType passengers = Types.NBT.createEmptyList(); + riding.setList("Passengers", passengers); + passengers.addMap(data); + + ret = data = riding; + } + + return ret; + } + }); + + + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, new DataWalkerItemLists("Inventory", "EnderItems")); + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType rootVehicle = data.getMap("RootVehicle"); + if (rootVehicle != null) { + WalkerUtils.convert(MCTypeRegistry.ENTITY, rootVehicle, "Entity", fromVersion, toVersion); + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "ender_pearls", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Passengers", fromVersion, toVersion); + + return MCTypeRegistry.ENTITY_EQUIPMENT.convert(data, fromVersion, toVersion); + }); + + } + + private V135() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V143.java b/ca/spottedleaf/dataconverter/minecraft/versions/V143.java new file mode 100644 index 0000000000000000000000000000000000000000..90889dddd8a510fe69c47413f5fe3ed4a756fedb --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V143.java @@ -0,0 +1,17 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename; + +public final class V143 { + + private static final int VERSION = MCVersions.V15W44B; + + public static void register() { + ConverterAbstractEntityRename.register(VERSION, (final String input) -> { + return "TippedArrow".equals(input) ? "Arrow" : null; + }); + } + + private V143() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1446.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1446.java new file mode 100644 index 0000000000000000000000000000000000000000..8d1d3a5898e87754510e63ce7444286418a077ef --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1446.java @@ -0,0 +1,35 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1446 { + + private static final int VERSION = MCVersions.V17W43B + 1; + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + for (final String key : data.keys()) { + if (!key.startsWith("key_")) { + continue; + } + + final String value = data.getString(key); + + if (value.startsWith("key.mouse") || value.startsWith("scancode.")) { + continue; + } + + data.setString(key, "key.keyboard." + value.substring("key.".length())); + } + return null; + } + }); + } + + private V1446() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1450.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1450.java new file mode 100644 index 0000000000000000000000000000000000000000..7f2e0b6c1f75c61230d138a2fa4328dd9cc99eab --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1450.java @@ -0,0 +1,24 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1450 { + + private static final int VERSION = MCVersions.V17W46A + 1; + + public static void register() { + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType ret = HelperBlockFlatteningV1450.flattenNBT(data); + return ret == data ? null : ret.copy(); // copy to avoid problems with later state datafixers + } + }); + } + + private V1450() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java new file mode 100644 index 0000000000000000000000000000000000000000..1856060ba8124c36fd64c816921a4b908fec2bfd --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1451.java @@ -0,0 +1,518 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataHook; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterFlattenChunk; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperBlockFlatteningV1450; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperItemNameV102; +import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterFlattenItemStack; +import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterFlattenSpawnEgg; +import ca.spottedleaf.dataconverter.minecraft.converters.stats.ConverterFlattenStats; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterFlattenEntity; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.minecraft.walkers.tile_entity.DataWalkerTileEntities; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import com.google.common.base.Splitter; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.datafix.fixes.BlockStateData; +import net.minecraft.util.datafix.fixes.EntityBlockStateFix; +import org.apache.commons.lang3.math.NumberUtils; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +public final class V1451 { + + private static final int VERSION = MCVersions.V17W47A; + + public static String packWithDot(final String string) { + final ResourceLocation resourceLocation = ResourceLocation.tryParse(string); + return resourceLocation != null ? resourceLocation.getNamespace() + "." + resourceLocation.getPath() : string; + } + + public static void register() { + // V0 + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, 0, "minecraft:trapped_chest", new DataWalkerItemLists("Items")); + + // V1 + MCTypeRegistry.CHUNK.addStructureConverter(new ConverterFlattenChunk()); + + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, 1, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion); + + final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP); + if (tileTicks != null) { + for (int i = 0, len = tileTicks.size(); i < len; ++i) { + final MapType tileTick = tileTicks.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion); + } + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section, "Palette", fromVersion, toVersion); + } + } + + return null; + }); + + // V2 + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:piston", new DataConverter<>(VERSION, 2) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int blockId = data.getInt("blockId"); + final int blockData = data.getInt("blockData") & 15; + + data.remove("blockId"); + data.remove("blockData"); + + data.setMap("blockState", HelperBlockFlatteningV1450.getNBTForId((blockId << 4) | blockData).copy()); // copy to avoid problems with later state datafixers + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, 2, "minecraft:piston", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "blockState")); + + // V3 + ConverterFlattenEntity.register(); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:filled_map", new DataConverter<>(VERSION, 3) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + data.setMap("tag", tag); + } + + if (!tag.hasKey("map", ObjectType.NUMBER)) { // This if is from CB. as usual, no documentation from CB. I'm guessing it just wants to avoid possibly overwriting it. seems fine. + tag.setInt("map", data.getInt("Damage")); + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:potion", new DataWalkerItems("Potion")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:arrow", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:enderman", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "carriedBlockState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:falling_block", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "BlockState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:falling_block", new DataWalkerTileEntities("TileEntityData")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:spectral_arrow", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:chest_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:chest_minecart", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:commandblock_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:commandblock_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "LastOutput")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:furnace_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:hopper_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:hopper_minecart", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:spawner_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:spawner_minecart", (final MapType data, final long fromVersion, final long toVersion) -> { + return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion); + }); + MCTypeRegistry.ENTITY.addWalker(VERSION, 3, "minecraft:tnt_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "DisplayState")); + + // V4 + MCTypeRegistry.BLOCK_NAME.addConverter(new DataConverter<>(VERSION, 4) { + @Override + public Object convert(final Object data, final long sourceVersion, final long toVersion) { + if (data instanceof Number) { + return HelperBlockFlatteningV1450.getNameForId(((Number)data).intValue()); + } else if (data instanceof String) { + return HelperBlockFlatteningV1450.getNewBlockName((String)data); // structure hook ensured data is namespaced + } + return null; + } + }); + MCTypeRegistry.ITEM_STACK.addStructureConverter(new ConverterFlattenItemStack()); + + // V5 + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:spawn_egg", new ConverterFlattenSpawnEgg(VERSION, 5)); + /* This datafixer has been disabled because the collar colour handler did not change from 1.12 -> 1.13 at all. + // So clearly somebody fucked up. This fixes wolf colours incorrectly converting between versions + MCTypeRegistry.ENTITY.addConverterForId("minecraft:wolf", new DataConverter<>(VERSION, 5) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number colour = data.getNumber("CollarColor"); + + if (colour != null) { + data.setByte("CollarColor", (byte)(15 - colour.intValue())); + } + + return null; + } + }); + */ + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION, 5) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number base = data.getNumber("Base"); + if (base != null) { + data.setInt("Base", 15 - base.intValue()); + } + + final ListType patterns = data.getList("Patterns", ObjectType.MAP); + if (patterns != null) { + for (int i = 0, len = patterns.size(); i < len; ++i) { + final MapType pattern = patterns.getMap(i); + final Number colour = pattern.getNumber("Color"); + if (colour != null) { + pattern.setInt("Color", 15 - colour.intValue()); + } + } + } + + return null; + } + }); + MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION, 5) { + private final Splitter SPLITTER = Splitter.on(';').limit(5); + private final Splitter LAYER_SPLITTER = Splitter.on(','); + private final Splitter OLD_AMOUNT_SPLITTER = Splitter.on('x').limit(2); + private final Splitter AMOUNT_SPLITTER = Splitter.on('*').limit(2); + private final Splitter BLOCK_SPLITTER = Splitter.on(':').limit(3); + + // idk man i just copy and pasted this one + private String fixGeneratorSettings(final String generatorSettings) { + if (generatorSettings.isEmpty()) { + return "minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;1;village"; + } else { + Iterator 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.bySeparator(criteriaName.substring(0, index), '.').toString(); + id = ResourceLocation.bySeparator(criteriaName.substring(index + 1), '.').toString(); + } catch (final Exception ex) { + type = "_special"; + id = criteriaName; + } + } + } else { + type = null; + id = null; + } + + if (type != null && id != null) { + final MapType criteriaType = Types.NBT.createEmptyMap(); + data.setMap("CriteriaType", criteriaType); + + criteriaType.setString("type", type); + criteriaType.setString("id", id); + } + + return null; + } + + @Override + public MapType postHook(final MapType data, final long fromVersion, final long toVersion) { + // repack + final MapType criteriaType = data.getMap("CriteriaType"); + + final String newName; + if (criteriaType == null) { + newName = null; + } else { + final String type = criteriaType.getString("type"); + final String id = criteriaType.getString("id"); + if (type != null && id != null) { + if ("_special".equals(type)) { + newName = id; + } else { + newName = packWithDot(type) + ":" + packWithDot(id); + } + } else { + newName = null; + } + } + + if (newName != null) { + data.remove("CriteriaType"); + data.setString("CriteriaName", newName); + } + + return null; + } + }); + + MCTypeRegistry.OBJECTIVE.addStructureWalker(VERSION, 6, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "DisplayName", fromVersion, toVersion); + + final MapType criteriaType = data.getMap("CriteriaType"); + if (criteriaType == null) { + return null; + } + + final String type = criteriaType.getString("type"); + + if (type == null) { + return null; + } + + switch (type) { + case "minecraft:mined": { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, criteriaType, "id", fromVersion, toVersion); + break; + } + + case "minecraft:crafted": + case "minecraft:used": + case "minecraft:broken": + case "minecraft:picked_up": + case "minecraft:dropped": { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, criteriaType, "id", fromVersion, toVersion); + break; + } + + case "minecraft:killed": + case "minecraft:killed_by": { + WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, criteriaType, "id", fromVersion, toVersion); + break; + } + } + + return null; + }); + + + // V7 + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION, 7) { + private static void convertToBlockState(final MapType data, final String path) { + final Number number = data.getNumber(path); + if (number == null) { + return; + } + + data.setMap(path, HelperBlockFlatteningV1450.getNBTForId(number.intValue() << 4).copy()); // copy to avoid problems with later state datafixers + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType children = data.getList("Children", ObjectType.MAP); + if (children == null) { + return null; + } + + for (int i = 0, len = children.size(); i < len; ++i) { + final MapType child = children.getMap(i); + + final String id = child.getString("id"); + + switch (id) { + case "ViF": + convertToBlockState(child, "CA"); + convertToBlockState(child, "CB"); + break; + case "ViDF": + convertToBlockState(child, "CA"); + convertToBlockState(child, "CB"); + convertToBlockState(child, "CC"); + convertToBlockState(child, "CD"); + break; + } + } + + return null; + } + }); + + // convert villagers to trade with pumpkins and not the carved pumpkin + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION, 7) { + private static void convertPumpkin(final MapType data, final String path) { + final MapType item = data.getMap(path); + if (item == null) { + return; + } + + final String id = item.getString("id"); + + if (id.equals("minecraft:carved_pumpkin")) { + item.setString("id", "minecraft:pumpkin"); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType offers = data.getMap("Offers"); + if (offers != null) { + final ListType recipes = offers.getList("Recipes", ObjectType.MAP); + if (recipes != null) { + for (int i = 0, len = recipes.size(); i < len; ++i) { + final MapType recipe = recipes.getMap(i); + + convertPumpkin(recipe, "buy"); + convertPumpkin(recipe, "buyB"); + convertPumpkin(recipe, "sell"); + } + } + } + return null; + } + }); + + MCTypeRegistry.STRUCTURE_FEATURE.addStructureWalker(VERSION, 7, (final MapType data, final long fromVersion, final long toVersion) -> { + final ListType list = data.getListUnchecked("Children"); + if (list == null) { + return null; + } + + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType child = list.getMap(i, null); + if (child == null) { + continue; + } + + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CA", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CB", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CC", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CD", fromVersion, toVersion); + } + + return null; + }); + } + + private V1451() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1456.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1456.java new file mode 100644 index 0000000000000000000000000000000000000000..1ea9da33a49891da1e12fd1e870118c6e74c7464 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1456.java @@ -0,0 +1,37 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1456 { + + private static final int VERSION = MCVersions.V17W49B + 1; + + private static byte direction2dTo3d(final byte old) { + switch (old) { + case 0: + return 3; + case 1: + return 4; + case 2: + default: + return 2; + case 3: + return 5; + } + } + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:item_frame", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setByte("Facing", direction2dTo3d(data.getByte("Facing"))); + return null; + } + }); + } + + private V1456() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java new file mode 100644 index 0000000000000000000000000000000000000000..84104a80ee0c0b408dda258a84cdca8c03997093 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1458.java @@ -0,0 +1,142 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1458 { + + public static final int VERSION = MCVersions.V17W50A + 1; + + public static MapType updateCustomName(final MapType data) { + final String customName = data.getString("CustomName", ""); + + if (customName.isEmpty()) { + data.remove("CustomName"); + } else { + data.setString("CustomName", ComponentUtils.createPlainTextComponent(customName)); + } + + return null; + } + + static void named(final int version, final String id) { + MCTypeRegistry.TILE_ENTITY.addWalker(version, id, new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "CustomName")); + } + + static void namedInventory(final int version, final String id) { + named(version, id); + MCTypeRegistry.TILE_ENTITY.addWalker(version, id, new DataWalkerItemLists("Items")); + } + + public static void register() { + // From CB + MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + return updateCustomName(data); + } + }); + + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if ("minecraft:commandblock_minecart".equals(data.getString("id"))) { + return null; + } + + return updateCustomName(data); + } + }); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType display = tag.getMap("display"); + if (display == null) { + return null; + } + + final String name = display.getString("Name"); + if (name != null) { + display.setString("Name", ComponentUtils.createPlainTextComponent(name)); + } /* In 1.20.5, Mojang removed this branch (ItemCustomNameToComponentFix) */ /*else { + final String localisedName = display.getString("LocName"); + if (localisedName != null) { + display.setString("Name", ComponentUtils.createTranslatableComponent(localisedName)); + display.remove("LocName"); + } + }*/ + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if ("minecraft:command_block".equals(data.getString("id"))) { + return null; + } + + return updateCustomName(data); + } + }); + + MCTypeRegistry.ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Passengers", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "CustomName", fromVersion, toVersion); + + return MCTypeRegistry.ENTITY_EQUIPMENT.convert(data, fromVersion, toVersion); + }); + + // Note: This is not present in Vanilla, but since we have the converter from CB it makes sense that we + // would walk the CustomName field for Player if we are converting it + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("RootVehicle"), "Entity", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "ender_pearls", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "EnderItems", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityLeft", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityRight", fromVersion, toVersion); + + final MapType recipeBook = data.getMap("recipeBook"); + if (recipeBook != null) { + WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "recipes", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "toBeDisplayed", fromVersion, toVersion); + } + + // "From CB" + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "CustomName", fromVersion, toVersion); + + return null; + }); + + named(VERSION, "minecraft:beacon"); + named(VERSION, "minecraft:banner"); + namedInventory(VERSION, "minecraft:brewing_stand"); + namedInventory(VERSION, "minecraft:chest"); + namedInventory(VERSION, "minecraft:trapped_chest"); + namedInventory(VERSION, "minecraft:dispenser"); + namedInventory(VERSION, "minecraft:dropper"); + named(VERSION, "minecraft:enchanting_table"); + namedInventory(VERSION, "minecraft:furnace"); + namedInventory(VERSION, "minecraft:hopper"); + namedInventory(VERSION, "minecraft:shulker_box"); + } + + private V1458() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1460.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1460.java new file mode 100644 index 0000000000000000000000000000000000000000..dca03108730af672445463326aabc156e6ae16ca --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1460.java @@ -0,0 +1,45 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.block_name.DataWalkerBlockNames; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import net.minecraft.resources.ResourceLocation; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public final class V1460 { + + private static final Map MOTIVE_REMAP = new HashMap<>(); + + static { + MOTIVE_REMAP.put("donkeykong", "donkey_kong"); + MOTIVE_REMAP.put("burningskull", "burning_skull"); + MOTIVE_REMAP.put("skullandroses", "skull_and_roses"); + } + + private static final int VERSION = MCVersions.V18W01A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:painting", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + String motive = data.getString("Motive"); + if (motive != null) { + motive = motive.toLowerCase(Locale.ROOT); + data.setString("Motive", NamespaceUtil.correctNamespace(MOTIVE_REMAP.getOrDefault(motive, motive))); + } + return null; + } + }); + + // No idea why so many type redefines exist here in Vanilla. nothing about the data structure changed, it's literally a copy of + // the existing types. + } + + private V1460() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1466.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1466.java new file mode 100644 index 0000000000000000000000000000000000000000..b4d308812e8b86cca7a0fde5db133b5357895959 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1466.java @@ -0,0 +1,142 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V1466 { + + private static final int VERSION = MCVersions.V18W06A; + + private static short packOffsetCoordinates(final int x, final int y, final int z) { + return (short)((x & 15) | ((y & 15) << 4) | ((z & 15) << 8)); + } + + public static void register() { + // There is a rather critical change I've made to this converter: changing the chunk status determination. + // In Vanilla, this is determined by whether the terrain has been populated and whether the chunk is lit. + // For reference, here is the full status progression (at the time of 18w06a): + // empty -> base -> carved -> decorated -> lighted -> mobs_spawned -> finalized -> fullchunk -> postprocessed + // So one of those must be picked. + // If the chunk is lit and terrain is populated, the Vanilla converter will set the status to "mobs_spawned." + // If it is anything else, it will be "empty" + // I've changed it to the following: if terrain is populated, it is set to at least decorated. If it is populated + // and lit, it is set to "mobs_spawned" + // But what if it is not populated? If it is not populated, ignore the lit field - obviously that's just broken. + // It can't be lit and not populated. + // Let's take a look at chunk generation logic for a chunk that is not populated, or even near a populated chunk. + // It actually will generate a chunk up to the "carved" stage. It generates the base terrain, (i.e using noise + // to figure out where stone is, dirt, grass) and it will generate caves. Nothing else though. No populators. + // So "carved" is the correct stage to use, not empty. Setting it to empty would clobber chunk data, when we don't + // need to. If it is populated, at least set it to decorated. If it is lit and populated, set it to mobs_spawned. Else, + // it is carved. + // This change also fixes the random light check "bug" (really this is Mojang's fault for fucking up the status conversion here) + // caused by spigot, which would not set the lit value for some chunks. Now those chunks will not be regenerated. + + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final boolean terrainPopulated = level.getBoolean("TerrainPopulated"); + final boolean lightPopulated = level.getBoolean("LightPopulated") || level.getNumber("LightPopulated") == null; + final String newStatus = !terrainPopulated ? "carved" : (lightPopulated ? "mobs_spawned" : "decorated"); + + level.setString("Status", newStatus); + level.setBoolean("hasLegacyStructureData", true); + + // convert biome byte[] into int[] + final byte[] biomes = level.getBytes("Biomes"); + if (biomes != null) { + final int[] newBiomes = new int[256]; + for (int i = 0, len = Math.min(newBiomes.length, biomes.length); i < len; ++i) { + newBiomes[i] = biomes[i] & 255; + } + level.setInts("Biomes", newBiomes); + } + + // ProtoChunks have their own dedicated tick list, so we must convert the TileTicks to that. + final ListType ticks = level.getList("TileTicks", ObjectType.MAP); + if (ticks != null) { + final ListType sections = Types.NBT.createEmptyList(); + final ListType[] sectionAccess = new ListType[16]; + for (int i = 0; i < sectionAccess.length; ++i) { + sections.addList(sectionAccess[i] = Types.NBT.createEmptyList()); + } + level.setList("ToBeTicked", sections); + + for (int i = 0, len = ticks.size(); i < len; ++i) { + final MapType tick = ticks.getMap(i); + + final int x = tick.getInt("x"); + final int y = tick.getInt("y"); + final int z = tick.getInt("z"); + final short coordinate = packOffsetCoordinates(x, y, z); + + sectionAccess[y >> 4].addShort(coordinate); + } + } + + return null; + } + }); + + + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion); + + final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP); + if (tileTicks != null) { + for (int i = 0, len = tileTicks.size(); i < len; ++i) { + final MapType tileTick = tileTicks.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion); + } + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section, "Palette", fromVersion, toVersion); + } + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, level.getMap("Structures"), "Starts", fromVersion, toVersion); + + return null; + }); + MCTypeRegistry.STRUCTURE_FEATURE.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final ListType list = data.getList("Children", ObjectType.MAP); + if (list != null) { + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType child = list.getMap(i); + + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CA", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CB", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CC", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, child, "CD", fromVersion, toVersion); + } + } + + WalkerUtils.convert(MCTypeRegistry.BIOME, data, "biome", fromVersion, toVersion); + + return null; + }); + } + + private V1466() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V147.java b/ca/spottedleaf/dataconverter/minecraft/versions/V147.java new file mode 100644 index 0000000000000000000000000000000000000000..02df67a0bb6d7dc3f7e6b7de5c0978295661c72f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V147.java @@ -0,0 +1,26 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V147 { + + private static final int VERSION = MCVersions.V15W46A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("ArmorStand", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getBoolean("Silent") && !data.getBoolean("Marker")) { + data.remove("Silent"); + } + + return null; + } + }); + } + + private V147() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java new file mode 100644 index 0000000000000000000000000000000000000000..42cf72340be7e1ef84f794a569f2f00e5e56429e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1470.java @@ -0,0 +1,27 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; + +public final class V1470 { + + private static final int VERSION = MCVersions.V18W08A; + + public static void register() { + //registerMob("minecraft:turtle"); // is now simple in 1.21.5 + //registerMob("minecraft:cod_mob"); // is now simple in 1.21.5 + //registerMob("minecraft:tropical_fish"); // is now simple in 1.21.5 + //registerMob("minecraft:salmon_mob"); // is now simple in 1.21.5 + //registerMob("minecraft:puffer_fish"); // is now simple in 1.21.5 + //registerMob("minecraft:phantom"); // is now simple in 1.21.5 + //registerMob("minecraft:dolphin"); // is now simple in 1.21.5 + //registerMob("minecraft:drowned"); // is now simple in 1.21.5 + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trident", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trident", new DataWalkerItems("Trident")); + } + + private V1470() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1474.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1474.java new file mode 100644 index 0000000000000000000000000000000000000000..244baa4f38102ecbfdb7fe0b14bf0be1816a59a2 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1474.java @@ -0,0 +1,34 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1474 { + + private static final int VERSION = MCVersions.V18W10B; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getInt("Color") == 10) { + data.setByte("Color", (byte)16); + } + return null; + } + }); + // data hooks ensure the inputs are namespaced + ConverterAbstractBlockRename.register(VERSION, (final String old) -> { + return "minecraft:purple_shulker_box".equals(old) ? "minecraft:shulker_box" : null; + }); + ConverterAbstractItemRename.register(VERSION, (final String old) -> { + return "minecraft:purple_shulker_box".equals(old) ? "minecraft:shulker_box" : null; + }); + } + + private V1474() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1475.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1475.java new file mode 100644 index 0000000000000000000000000000000000000000..2ae50eea847671f3995688901c79caf520440d7a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1475.java @@ -0,0 +1,22 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V1475 { + + private static final int VERSION = MCVersions.V18W10B + 1; + + public static void register() { + ConverterAbstractBlockRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:flowing_water", "minecraft:water", + "minecraft:flowing_lava", "minecraft:lava" + ) + )::get); + } + + private V1475() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1480.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1480.java new file mode 100644 index 0000000000000000000000000000000000000000..7180c1168bffb9fe70d18fe7414a5372518413a8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1480.java @@ -0,0 +1,45 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1480 { + + private static final int VERSION = MCVersions.V18W14A + 1; + + public static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V1483.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1483.java new file mode 100644 index 0000000000000000000000000000000000000000..56d9babebba8b8ba6be07ea413e9c04ffea84023 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1483.java @@ -0,0 +1,30 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V1483 { + + private static final int VERSION = MCVersions.V18W16A; + + public static void register() { + ConverterAbstractEntityRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:puffer_fish", "minecraft:pufferfish" + ) + )::get); + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:puffer_fish_spawn_egg", "minecraft:pufferfish_spawn_egg" + ) + )::get); + + MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:puffer_fish", "minecraft:pufferfish"); + } + + private V1483() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1484.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1484.java new file mode 100644 index 0000000000000000000000000000000000000000..cdc8ab8b0e1fc88cba8fd1d3000180288fe8d5fd --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1484.java @@ -0,0 +1,75 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1484 { + + private static final int VERSION = MCVersions.V18W19A; + + public static void register() { + final Map renamed = new HashMap<>( + ImmutableMap.of( + "minecraft:sea_grass", "minecraft:seagrass", + "minecraft:tall_sea_grass", "minecraft:tall_seagrass" + ) + ); + + ConverterAbstractItemRename.register(VERSION, renamed::get); + ConverterAbstractBlockRename.register(VERSION, renamed::get); + + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final MapType heightmaps = level.getMap("Heightmaps"); + + if (heightmaps == null) { + return null; + } + + final Object liquid = heightmaps.getGeneric("LIQUID"); + if (liquid != null) { + heightmaps.remove("LIQUID"); + heightmaps.setGeneric("WORLD_SURFACE_WG", liquid); + } + + final Object solid = heightmaps.getGeneric("SOLID"); + if (solid != null) { + heightmaps.remove("SOLID"); + heightmaps.setGeneric("OCEAN_FLOOR_WG", solid); + heightmaps.setGeneric("OCEAN_FLOOR", solid); + } + + final Object light = heightmaps.getGeneric("LIGHT"); + if (light != null) { + heightmaps.remove("LIGHT"); + heightmaps.setGeneric("LIGHT_BLOCKING", light); + } + + final Object rain = heightmaps.getGeneric("RAIN"); + if (rain != null) { + heightmaps.remove("RAIN"); + heightmaps.setGeneric("MOTION_BLOCKING", rain); + heightmaps.setGeneric("MOTION_BLOCKING_NO_LEAVES", rain); + } + + return null; + } + }); + } + + private V1484() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1486.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1486.java new file mode 100644 index 0000000000000000000000000000000000000000..a9e42da41064ea293a71dbf2d681a857b2e1812e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1486.java @@ -0,0 +1,39 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1486 { + + private static final int VERSION = MCVersions.V18W19B + 1; + + public static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V1487.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1487.java new file mode 100644 index 0000000000000000000000000000000000000000..884049818efdf273443fb3d1c2d7250564fbdbf7 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1487.java @@ -0,0 +1,27 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1487 { + + private static final int VERSION = MCVersions.V18W19B + 2; + + public static void register() { + final Map remap = new HashMap<>( + ImmutableMap.of( + "minecraft:prismarine_bricks_slab", "minecraft:prismarine_brick_slab", + "minecraft:prismarine_bricks_stairs", "minecraft:prismarine_brick_stairs" + ) + ); + + ConverterAbstractItemRename.register(VERSION, remap::get); + ConverterAbstractBlockRename.register(VERSION, remap::get); + } + + private V1487() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1488.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1488.java new file mode 100644 index 0000000000000000000000000000000000000000..a291dc5b9dbc4362038fcfb6fbb0de405b693c11 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1488.java @@ -0,0 +1,99 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import com.google.common.collect.ImmutableMap; + +import java.util.HashMap; + +public final class V1488 { + + private static final int VERSION = MCVersions.V18W19B + 3; + + private static boolean isIglooPiece(final MapType piece) { + return "Iglu".equals(piece.getString("id")); + } + + public static void register() { + ConverterAbstractBlockRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:kelp_top", "minecraft:kelp", + "minecraft:kelp", "minecraft:kelp_plant" + ) + )::get); + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:kelp_top", "minecraft:kelp" + ) + )::get); + + // Don't ask me why in V1458 they wrote the converter to NOT do command blocks and THEN in THIS version + // to ONLY do command blocks. I don't know. + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:command_block", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + return V1458.updateCustomName(data); + } + }); + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:commandblock_minecart", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + return V1458.updateCustomName(data); + } + }); + + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType children = data.getList("Children", ObjectType.MAP); + boolean isIgloo; + if (children != null) { + isIgloo = true; + for (int i = 0, len = children.size(); i < len; ++i) { + if (!isIglooPiece(children.getMap(i))) { + isIgloo = false; + break; + } + } + } else { + isIgloo = false; + } + + if (isIgloo) { + data.remove("Children"); + data.setString("id", "Igloo"); + return null; + } + + if (children != null) { + for (int i = 0; i < children.size();) { + final MapType child = children.getMap(i); + if (isIglooPiece(child)) { + children.remove(i); + continue; + } + ++i; + } + } + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:command_block", + new DataWalkerTypePaths<>(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, "Command") + ); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:command_block", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "CustomName", "LastOutput")); + } + + private V1488() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1490.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1490.java new file mode 100644 index 0000000000000000000000000000000000000000..1e99de15732bdd283835a9531f76e29ddab91f46 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1490.java @@ -0,0 +1,30 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; + +import java.util.HashMap; + +public final class V1490 { + + private static final int VERSION = MCVersions.V18W20A + 1; + + public static void register() { + ConverterAbstractBlockRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:melon_block", "minecraft:melon" + ) + )::get); + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:melon_block", "minecraft:melon", + "minecraft:melon", "minecraft:melon_slice", + "minecraft:speckled_melon", "minecraft:glistering_melon_slice" + ) + )::get); + } + + private V1490() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1492.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1492.java new file mode 100644 index 0000000000000000000000000000000000000000..aa18e481f2d54d20784fe6af27846ec0d297f9c1 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1492.java @@ -0,0 +1,151 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import com.google.common.collect.ImmutableMap; +import com.mojang.datafixers.util.Pair; + +public final class V1492 { + + private static final ImmutableMap>> 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/ca/spottedleaf/dataconverter/minecraft/versions/V1494.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1494.java new file mode 100644 index 0000000000000000000000000000000000000000..ef35ea5c1e471794721bd26834db14ea63ddd17f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1494.java @@ -0,0 +1,88 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public final class V1494 { + + private static final int VERSION = MCVersions.V18W20C + 1; + + private static final Int2ObjectOpenHashMap ENCH_ID_TO_NAME = new Int2ObjectOpenHashMap<>(); + static { + ENCH_ID_TO_NAME.put(0, "minecraft:protection"); + ENCH_ID_TO_NAME.put(1, "minecraft:fire_protection"); + ENCH_ID_TO_NAME.put(2, "minecraft:feather_falling"); + ENCH_ID_TO_NAME.put(3, "minecraft:blast_protection"); + ENCH_ID_TO_NAME.put(4, "minecraft:projectile_protection"); + ENCH_ID_TO_NAME.put(5, "minecraft:respiration"); + ENCH_ID_TO_NAME.put(6, "minecraft:aqua_affinity"); + ENCH_ID_TO_NAME.put(7, "minecraft:thorns"); + ENCH_ID_TO_NAME.put(8, "minecraft:depth_strider"); + ENCH_ID_TO_NAME.put(9, "minecraft:frost_walker"); + ENCH_ID_TO_NAME.put(10, "minecraft:binding_curse"); + ENCH_ID_TO_NAME.put(16, "minecraft:sharpness"); + ENCH_ID_TO_NAME.put(17, "minecraft:smite"); + ENCH_ID_TO_NAME.put(18, "minecraft:bane_of_arthropods"); + ENCH_ID_TO_NAME.put(19, "minecraft:knockback"); + ENCH_ID_TO_NAME.put(20, "minecraft:fire_aspect"); + ENCH_ID_TO_NAME.put(21, "minecraft:looting"); + ENCH_ID_TO_NAME.put(22, "minecraft:sweeping"); + ENCH_ID_TO_NAME.put(32, "minecraft:efficiency"); + ENCH_ID_TO_NAME.put(33, "minecraft:silk_touch"); + ENCH_ID_TO_NAME.put(34, "minecraft:unbreaking"); + ENCH_ID_TO_NAME.put(35, "minecraft:fortune"); + ENCH_ID_TO_NAME.put(48, "minecraft:power"); + ENCH_ID_TO_NAME.put(49, "minecraft:punch"); + ENCH_ID_TO_NAME.put(50, "minecraft:flame"); + ENCH_ID_TO_NAME.put(51, "minecraft:infinity"); + ENCH_ID_TO_NAME.put(61, "minecraft:luck_of_the_sea"); + ENCH_ID_TO_NAME.put(62, "minecraft:lure"); + ENCH_ID_TO_NAME.put(65, "minecraft:loyalty"); + ENCH_ID_TO_NAME.put(66, "minecraft:impaling"); + ENCH_ID_TO_NAME.put(67, "minecraft:riptide"); + ENCH_ID_TO_NAME.put(68, "minecraft:channeling"); + ENCH_ID_TO_NAME.put(70, "minecraft:mending"); + ENCH_ID_TO_NAME.put(71, "minecraft:vanishing_curse"); + } + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final ListType enchants = tag.getList("ench", ObjectType.MAP); + if (enchants != null) { + tag.remove("ench"); + tag.setList("Enchantments", enchants); + + for (int i = 0, len = enchants.size(); i < len; ++i) { + final MapType enchant = enchants.getMap(i); + enchant.setString("id", ENCH_ID_TO_NAME.getOrDefault(enchant.getInt("id"), "null")); + } + } + + final ListType storedEnchants = tag.getList("StoredEnchantments", ObjectType.MAP); + if (storedEnchants != null) { + for (int i = 0, len = storedEnchants.size(); i < len; ++i) { + final MapType enchant = storedEnchants.getMap(i); + enchant.setString("id", ENCH_ID_TO_NAME.getOrDefault(enchant.getInt("id"), "null")); + } + } + + + return null; + } + }); + } + + private V1494() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1496.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1496.java new file mode 100644 index 0000000000000000000000000000000000000000..4b34a890a96b67cd14fc576a051f6f69f1697e93 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1496.java @@ -0,0 +1,370 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import com.mojang.datafixers.DataFixUtils; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntIterator; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.minecraft.util.datafix.PackedBitStorage; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public final class V1496 { + + private static final int VERSION = MCVersions.V18W21B; + + private static final int[][] DIRECTIONS = new int[][] { + new int[] {-1, 0, 0}, + new int[] {1, 0, 0}, + new int[] {0, -1, 0}, + new int[] {0, 1, 0}, + new int[] {0, 0, -1}, + new int[] {0, 0, 1} + }; + + private static final Object2IntOpenHashMap 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/ca/spottedleaf/dataconverter/minecraft/versions/V1500.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1500.java new file mode 100644 index 0000000000000000000000000000000000000000..3ee4c5cab7e8020b3432ef9f614f92c1dda5606e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1500.java @@ -0,0 +1,23 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1500 { + + private static final int VERSION = MCVersions.V18W22C + 1; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("DUMMY", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setBoolean("keepPacked", true); + return null; + } + }); + } + + private V1500() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1501.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1501.java new file mode 100644 index 0000000000000000000000000000000000000000..dbfb51b74c54a9a479de49ecb295854fc69aef64 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1501.java @@ -0,0 +1,78 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1501 { + + private static final int VERSION = MCVersions.V1_13_PRE1; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V1502.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1502.java new file mode 100644 index 0000000000000000000000000000000000000000..cd07718649f0e2ca66f1ec3b0aba81611333ba09 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1502.java @@ -0,0 +1,77 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.recipe.ConverterAbstractRecipeRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1502 { + + private static final int VERSION = MCVersions.V1_13_PRE2; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java new file mode 100644 index 0000000000000000000000000000000000000000..36e32a8ff987e4006784c5cba369c736903fa222 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1506.java @@ -0,0 +1,221 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; +import ca.spottedleaf.dataconverter.types.json.JsonMapType; +import ca.spottedleaf.dataconverter.types.json.JsonTypeUtil; +import ca.spottedleaf.dataconverter.types.nbt.NBTMapType; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.gson.JsonParser; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.DynamicOps; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.util.GsonHelper; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.stream.Collectors; + +public final class V1506 { + + private static final int VERSION = MCVersions.V1_13_PRE4 + 2; + + static final Map MAP = new HashMap<>(); + static { + MAP.put("0", "minecraft:ocean"); + MAP.put("1", "minecraft:plains"); + MAP.put("2", "minecraft:desert"); + MAP.put("3", "minecraft:mountains"); + MAP.put("4", "minecraft:forest"); + MAP.put("5", "minecraft:taiga"); + MAP.put("6", "minecraft:swamp"); + MAP.put("7", "minecraft:river"); + MAP.put("8", "minecraft:nether"); + MAP.put("9", "minecraft:the_end"); + MAP.put("10", "minecraft:frozen_ocean"); + MAP.put("11", "minecraft:frozen_river"); + MAP.put("12", "minecraft:snowy_tundra"); + MAP.put("13", "minecraft:snowy_mountains"); + MAP.put("14", "minecraft:mushroom_fields"); + MAP.put("15", "minecraft:mushroom_field_shore"); + MAP.put("16", "minecraft:beach"); + MAP.put("17", "minecraft:desert_hills"); + MAP.put("18", "minecraft:wooded_hills"); + MAP.put("19", "minecraft:taiga_hills"); + MAP.put("20", "minecraft:mountain_edge"); + MAP.put("21", "minecraft:jungle"); + MAP.put("22", "minecraft:jungle_hills"); + MAP.put("23", "minecraft:jungle_edge"); + MAP.put("24", "minecraft:deep_ocean"); + MAP.put("25", "minecraft:stone_shore"); + MAP.put("26", "minecraft:snowy_beach"); + MAP.put("27", "minecraft:birch_forest"); + MAP.put("28", "minecraft:birch_forest_hills"); + MAP.put("29", "minecraft:dark_forest"); + MAP.put("30", "minecraft:snowy_taiga"); + MAP.put("31", "minecraft:snowy_taiga_hills"); + MAP.put("32", "minecraft:giant_tree_taiga"); + MAP.put("33", "minecraft:giant_tree_taiga_hills"); + MAP.put("34", "minecraft:wooded_mountains"); + MAP.put("35", "minecraft:savanna"); + MAP.put("36", "minecraft:savanna_plateau"); + MAP.put("37", "minecraft:badlands"); + MAP.put("38", "minecraft:wooded_badlands_plateau"); + MAP.put("39", "minecraft:badlands_plateau"); + MAP.put("40", "minecraft:small_end_islands"); + MAP.put("41", "minecraft:end_midlands"); + MAP.put("42", "minecraft:end_highlands"); + MAP.put("43", "minecraft:end_barrens"); + MAP.put("44", "minecraft:warm_ocean"); + MAP.put("45", "minecraft:lukewarm_ocean"); + MAP.put("46", "minecraft:cold_ocean"); + MAP.put("47", "minecraft:deep_warm_ocean"); + MAP.put("48", "minecraft:deep_lukewarm_ocean"); + MAP.put("49", "minecraft:deep_cold_ocean"); + MAP.put("50", "minecraft:deep_frozen_ocean"); + MAP.put("127", "minecraft:the_void"); + MAP.put("129", "minecraft:sunflower_plains"); + MAP.put("130", "minecraft:desert_lakes"); + MAP.put("131", "minecraft:gravelly_mountains"); + MAP.put("132", "minecraft:flower_forest"); + MAP.put("133", "minecraft:taiga_mountains"); + MAP.put("134", "minecraft:swamp_hills"); + MAP.put("140", "minecraft:ice_spikes"); + MAP.put("149", "minecraft:modified_jungle"); + MAP.put("151", "minecraft:modified_jungle_edge"); + MAP.put("155", "minecraft:tall_birch_forest"); + MAP.put("156", "minecraft:tall_birch_hills"); + MAP.put("157", "minecraft:dark_forest_hills"); + MAP.put("158", "minecraft:snowy_taiga_mountains"); + MAP.put("160", "minecraft:giant_spruce_taiga"); + MAP.put("161", "minecraft:giant_spruce_taiga_hills"); + MAP.put("162", "minecraft:modified_gravelly_mountains"); + MAP.put("163", "minecraft:shattered_savanna"); + MAP.put("164", "minecraft:shattered_savanna_plateau"); + MAP.put("165", "minecraft:eroded_badlands"); + MAP.put("166", "minecraft:modified_wooded_badlands_plateau"); + MAP.put("167", "minecraft:modified_badlands_plateau"); + } + + public static void register() { + MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String generatorOptions = data.getString("generatorOptions"); + final String generatorName = data.getString("generatorName"); + if ("flat".equalsIgnoreCase(generatorName)) { + data.setMap("generatorOptions", V1506.convert(generatorOptions == null ? "" : generatorOptions)); + } else if ("buffet".equalsIgnoreCase(generatorName) && generatorOptions != null) { + data.setGeneric("generatorOptions", Types.JSON.convertFromBaseToGeneric(JsonParser.parseString(generatorOptions), data.getTypeUtil())); + } + return null; + } + }); + } + + private static MapType convert(final String param0) { + final Dynamic 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/ca/spottedleaf/dataconverter/minecraft/versions/V1510.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1510.java new file mode 100644 index 0000000000000000000000000000000000000000..dfc9d1e89983c73e06ce3c8a22c29f49af4a935c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1510.java @@ -0,0 +1,111 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.converters.recipe.ConverterAbstractRecipeRename; +import ca.spottedleaf.dataconverter.minecraft.converters.stats.ConverterAbstractStatsRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1510 { + + public static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V1514.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1514.java new file mode 100644 index 0000000000000000000000000000000000000000..308c29fece597117694b759b72b5161a43d160cf --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1514.java @@ -0,0 +1,68 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1514 { + + private static final int VERSION = MCVersions.V1_13_PRE7 + 1; + + public static void register() { + MCTypeRegistry.OBJECTIVE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String displayName = data.getString("DisplayName"); + if (displayName == null) { + return null; + } + + final String update = ComponentUtils.createPlainTextComponent(displayName); + + data.setString("DisplayName", update); + + return null; + } + }); + + MCTypeRegistry.TEAM.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String displayName = data.getString("DisplayName"); + if (displayName == null) { + return null; + } + + final String update = ComponentUtils.createPlainTextComponent(displayName); + + data.setString("DisplayName", update); + + return null; + } + }); + + MCTypeRegistry.OBJECTIVE.addStructureConverter(new DataConverter<>(VERSION) { + private static String getRenderType(String string) { + return string.equals("health") ? "hearts" : "integer"; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String renderType = data.getString("RenderType"); + if (renderType != null) { + return null; + } + + final String criteriaName = data.getString("CriteriaName", ""); + + data.setString("RenderType", getRenderType(criteriaName)); + + return null; + } + }); + } + + private V1514() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1515.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1515.java new file mode 100644 index 0000000000000000000000000000000000000000..d2093732e06ddccdd8a34bbfcaee6ede3aae96d0 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1515.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1515 { + + private static final int VERSION = MCVersions.V1_13_PRE7 + 2; + + public static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V1624.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1624.java new file mode 100644 index 0000000000000000000000000000000000000000..d1df382e095032950a1dc4c256b62b39b9fe96a4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1624.java @@ -0,0 +1,110 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import com.mojang.logging.LogUtils; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import org.slf4j.Logger; + +public final class V1624 { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static final int VERSION = MCVersions.V18W32A + 1; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + final IntOpenHashSet positionsToLook = new IntOpenHashSet(); + + for (int i = 0, len = sections.size(); i < len; ++i) { + final TrappedChestSection section = new TrappedChestSection(sections.getMap(i)); + if (section.isSkippable()) { + continue; + } + + for (int index = 0; index < 4096; ++index) { + if (section.isTrappedChest(section.getBlock(index))) { + positionsToLook.add(section.getSectionY() << 12 | index); + } + } + } + + final int chunkX = level.getInt("xPos"); + final int chunkZ = level.getInt("zPos"); + + final ListType tileEntities = level.getList("TileEntities", ObjectType.MAP); + + if (tileEntities != null) { + for (int i = 0, len = tileEntities.size(); i < len; ++i) { + final MapType tile = tileEntities.getMap(i); + + final int x = tile.getInt("x"); + final int y = tile.getInt("y"); + final int z = tile.getInt("z"); + + final int index = V1496.getIndex(x - (chunkX << 4), y, z - (chunkZ << 4)); + if (!positionsToLook.contains(index)) { + continue; + } + + final String id = tile.getString("id"); + if (!"minecraft:chest".equals(id)) { + LOGGER.warn("Block Entity ({},{},{}) was expected to be a chest (V1624)", x, y, z); + } + + tile.setString("id", "minecraft:trapped_chest"); + } + } + + return null; + } + }); + } + + private V1624() {} + + public static final class TrappedChestSection extends V1496.Section { + + private IntOpenHashSet chestIds; + + public TrappedChestSection(final MapType section) { + super(section); + } + + @Override + protected boolean initSkippable() { + this.chestIds = new IntOpenHashSet(); + + for (int i = 0; i < this.palette.size(); ++i) { + final MapType blockState = this.palette.getMap(i); + final String name = blockState.getString("Name"); + if ("minecraft:trapped_chest".equals(name)) { + this.chestIds.add(i); + } + } + + return this.chestIds.isEmpty(); + } + + public boolean isTrappedChest(final int id) { + return this.chestIds.contains(id); + } + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V165.java b/ca/spottedleaf/dataconverter/minecraft/versions/V165.java new file mode 100644 index 0000000000000000000000000000000000000000..c4476d08e1c0103a1f0beeb5144061aab01f5077 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V165.java @@ -0,0 +1,45 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V165 { + + private static final int VERSION = MCVersions.V1_9_PRE2; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"minecraft:written_book".equals(data.getString("id"))) { + return null; + } + + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final ListType pages = tag.getList("pages", ObjectType.STRING); + if (pages == null) { + return null; + } + + for (int i = 0, len = pages.size(); i < len; ++i) { + final String page = pages.getString(i); + + pages.setString(i, ComponentUtils.convertFromLenient(page)); + } + + return null; + } + }); + } + + private V165() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java new file mode 100644 index 0000000000000000000000000000000000000000..90967b33222ba7052d036c19cf08ca84a7dc7ef4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1800.java @@ -0,0 +1,31 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1800 { + + private static final int VERSION = MCVersions.V1_13_2 + 169; + + public static final Map 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() + ); + + public static void register() { + ConverterAbstractItemRename.register(VERSION, RENAMED_ITEM_IDS::get); + + //registerMob("minecraft:panda"); // simple as of 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:pillager", new DataWalkerItemLists("Inventory")); + } + + private V1800() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java new file mode 100644 index 0000000000000000000000000000000000000000..e47ebb269f6e579274e2f1172c9180172e1064f7 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1801.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V1801 { + + private static final int VERSION = MCVersions.V1_13_2 + 170; + + public static void register() { + //registerMob("minecraft:illager_beast"); // changed to simple in 1.21.5 + } + + private V1801() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1802.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1802.java new file mode 100644 index 0000000000000000000000000000000000000000..aeae0c62efa1e189fe4b0da585c8a2a101bb5ede --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1802.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V1802 { + + private static final int VERSION = MCVersions.V1_13_2 + 171; + + public static void register() { + ConverterAbstractBlockRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:stone_slab", "minecraft:smooth_stone_slab", + "minecraft:sign", "minecraft:oak_sign", "minecraft:wall_sign", "minecraft:oak_wall_sign" + ) + )::get); + ConverterAbstractItemRename.register(VERSION, new HashMap<>(ImmutableMap.of( + "minecraft:stone_slab", "minecraft:smooth_stone_slab", + "minecraft:sign", "minecraft:oak_sign" + ) + )::get); + } + + private V1802() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1803.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1803.java new file mode 100644 index 0000000000000000000000000000000000000000..e12ae00288dcfc955d205b225dd8c5cf53d7afcb --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1803.java @@ -0,0 +1,46 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V1803 { + + public static final int VERSION = MCVersions.V1_13_2 + 172; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + + if (tag == null) { + return null; + } + + final MapType display = tag.getMap("display"); + + if (display == null) { + return null; + } + + final ListType lore = display.getList("Lore", ObjectType.STRING); + if (lore == null) { + return null; + } + + for (int i = 0, len = lore.size(); i < len; ++i) { + lore.setString(i, ComponentUtils.createPlainTextComponent(lore.getString(i))); + } + + return null; + } + }); + } + + private V1803() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1904.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1904.java new file mode 100644 index 0000000000000000000000000000000000000000..b4b1bdaddb5a9ee6fc6e1bb6a1df09cbcd6fdf86 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1904.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1904 { + + private static final int VERSION = MCVersions.V18W43C + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:ocelot", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int catType = data.getInt("CatType"); + + if (catType == 0) { + final String owner = data.getString("Owner"); + final String ownerUUID = data.getString("OwnerUUID"); + if ((owner != null && owner.length() > 0) || (ownerUUID != null && ownerUUID.length() > 0)) { + data.setBoolean("Trusting", true); + } + } else if (catType > 0 && catType < 4) { + data.setString("id", "minecraft:cat"); + data.setString("OwnerUUID", data.getString("OwnerUUID", "")); + } + + return null; + } + }); + + //registerMob("minecraft:cat"); // changed to simple in 1.21.5 + } + + private V1904() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1905.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1905.java new file mode 100644 index 0000000000000000000000000000000000000000..feba11bb1c4c3aeee4dcfbe51f4ca15d35c2d542 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1905.java @@ -0,0 +1,34 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1905 { + + private static final int VERSION = MCVersions.V18W43C + 2; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final String status = level.getString("Status"); + + if ("postprocessed".equals(status)) { + level.setString("Status", "fullchunk"); + } + + return null; + } + }); + } + + private V1905() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java new file mode 100644 index 0000000000000000000000000000000000000000..fd60eb21ae8ced56a28b2515bd33a59f1eea44fd --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1906.java @@ -0,0 +1,21 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; + +public final class V1906 { + + private static final int VERSION = MCVersions.V18W43C + 3; + + public static void register() { + V1458.namedInventory(VERSION, "minecraft:barrel"); + V1458.namedInventory(VERSION, "minecraft:smoker"); + V1458.namedInventory(VERSION, "minecraft:blast_furnace"); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:lectern", new DataWalkerItems("Book")); + } + + private V1906() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1909.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1909.java new file mode 100644 index 0000000000000000000000000000000000000000..ede4d0bfc0fe0e4a3a6fb906037a4c964baac6e6 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1909.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; + +public final class V1909 { + + private static final int VERSION = MCVersions.V18W45A + 1; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:jigsaw", new DataWalkerTypePaths<>(MCTypeRegistry.FLAT_BLOCK_STATE, "final_state")); + } + + private V1909() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1911.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1911.java new file mode 100644 index 0000000000000000000000000000000000000000..db9981030c0d4d826ba595d8465825023acfce20 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1911.java @@ -0,0 +1,49 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V1911 { + + private static final int VERSION = MCVersions.V18W46A + 1; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V1914.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1914.java new file mode 100644 index 0000000000000000000000000000000000000000..fad451b5dd46774fe086f2459ff88077a900a15a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1914.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1914 { + + private static final int VERSION = MCVersions.V18W48A; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:chest", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String lootTable = data.getString("LootTable"); + + if ("minecraft:chests/village_blacksmith".equals(lootTable)) { + data.setString("LootTable", "minecraft:chests/village/village_weaponsmith"); + } + + return null; + } + }); + } + + private V1914() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1917.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1917.java new file mode 100644 index 0000000000000000000000000000000000000000..51c0dee566eb1220c1544591655f30d0f4fd49b8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1917.java @@ -0,0 +1,25 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1917 { + + private static final int VERSION = MCVersions.V18W49A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:cat", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getInt("CatType") == 9) { + data.setInt("CatType", 10); + } + return null; + } + }); + } + + private V1917() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1918.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1918.java new file mode 100644 index 0000000000000000000000000000000000000000..74fab9ff2379fae494f48a19804b154c3162519c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1918.java @@ -0,0 +1,65 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V1918 { + + private static final int VERSION = MCVersions.V18W49A + 2; + + private static String getProfessionString(final int professionId, final int careerId) { + if (professionId == 0) { + if (careerId == 2) { + return "minecraft:fisherman"; + } else if (careerId == 3) { + return "minecraft:shepherd"; + } else { + return careerId == 4 ? "minecraft:fletcher" : "minecraft:farmer"; + } + } else if (professionId == 1) { + return careerId == 2 ? "minecraft:cartographer" : "minecraft:librarian"; + } else if (professionId == 2) { + return "minecraft:cleric"; + } else if (professionId == 3) { + if (careerId == 2) { + return "minecraft:weaponsmith"; + } else { + return careerId == 3 ? "minecraft:toolsmith" : "minecraft:armorer"; + } + } else if (professionId == 4) { + return careerId == 2 ? "minecraft:leatherworker" : "minecraft:butcher"; + } else { + return professionId == 5 ? "minecraft:nitwit" : "minecraft:none"; + } + } + + public static void register() { + final DataConverter converter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int profession = data.getInt("Profession"); + final int career = data.getInt("Career"); + final int careerLevel = data.getInt("CareerLevel", 1); + data.remove("Profession"); + data.remove("Career"); + data.remove("CareerLevel"); + + final MapType villagerData = Types.NBT.createEmptyMap(); + data.setMap("VillagerData", villagerData); + villagerData.setString("type", "minecraft:plains"); + villagerData.setString("profession", getProfessionString(profession, career)); + villagerData.setInt("level", careerLevel); + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", converter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", converter); + } + + private V1918() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1920.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1920.java new file mode 100644 index 0000000000000000000000000000000000000000..74f06a170cad432383a314b06833f9334a9cbd6c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1920.java @@ -0,0 +1,75 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; + +public final class V1920 { + + private static final int VERSION = MCVersions.V18W50A + 1; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final MapType structures = level.getMap("Structures"); + if (structures == null) { + return null; + } + + final MapType starts = structures.getMap("Starts"); + if (starts != null) { + final MapType village = starts.getMap("New_Village"); + if (village != null) { + starts.remove("New_Village"); + starts.setMap("Village", village); + } else { + starts.remove("Village"); + } + } + + final MapType references = structures.getMap("References"); + if (references != null) { + final MapType newVillage = references.getMap("New_Village"); + // I believe Mojang had a typo here, removing Village from references only made sense + // if the new village didn't exist. DFU removes it whether or not it exists, but still relocates + // New_Village to Village first. It doesn't make sense to me to relocate it just to remove it, so it + // must be a typo. + if (newVillage == null) { + references.remove("Village"); + } else { + references.remove("New_Village"); + references.setMap("Village", newVillage); + } + } + + return null; + } + }); + + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + + if ("minecraft:new_village".equals(NamespaceUtil.correctNamespace(id))) { + data.setString("id", "minecraft:village"); + } + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:campfire", new DataWalkerItemLists("Items")); + } + + private V1920() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1925.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1925.java new file mode 100644 index 0000000000000000000000000000000000000000..8bc7155c186fdf52cc6c3ff45f04f9374bb9c87e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1925.java @@ -0,0 +1,35 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V1925 { + + private static final int VERSION = MCVersions.V19W03C + 1; + + public static void register() { + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + if (data == null) { + final MapType ret = Types.NBT.createEmptyMap(); + ret.setMap("data", root); + + return ret; + } + return null; + } + }); + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, root.getMap("data"), "banners", "Name", fromVersion, toVersion); + return null; + }); + } + + private V1925() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java new file mode 100644 index 0000000000000000000000000000000000000000..e43f828bb527e449e5c46c6da8ac980106e4940c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1928.java @@ -0,0 +1,29 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V1928 { + + private static final int VERSION = MCVersions.V19W04B + 1; + + public static void register() { + ConverterAbstractEntityRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:illager_beast", "minecraft:ravager" + ) + )::get); + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:illager_beast_spawn_egg", "minecraft:ravager_spawn_egg" + ) + )::get); + + //registerMob("minecraft:ravager"); // changed to simple in 1.21.5 + } + + private V1928() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java new file mode 100644 index 0000000000000000000000000000000000000000..cf63fd07bdb1736f5367d4fd217159d3aa383e6e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1929.java @@ -0,0 +1,32 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1929 { + + private static final int VERSION = MCVersions.V19W04B + 2; + + public static void register() { + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:wandering_trader", (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trader_llama", (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, data, "SaddleItem", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, data, "DecorItem", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Items", fromVersion, toVersion); + + return null; + }); + } + + private V1929() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java new file mode 100644 index 0000000000000000000000000000000000000000..06f467533d4139886510b61fd8aa6a190d4eb59c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1931.java @@ -0,0 +1,15 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V1931 { + + private static final int VERSION = MCVersions.V19W06A; + + public static void register() { + //registerMob("minecraft:fox"); // changed to simple in 1.21.5 + } + + private V1931() {} + +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1936.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1936.java new file mode 100644 index 0000000000000000000000000000000000000000..c6f99547735f0056609de2fd7c9e69c439c8a271 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1936.java @@ -0,0 +1,37 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1936 { + + private static final int VERSION = MCVersions.V19W09A + 1; + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String chatOpacity = data.getString("chatOpacity"); + if (chatOpacity != null) { + // Vanilla uses createDouble here, but options is always string -> string. I presume they made + // a mistake with this converter. + data.setString("textBackgroundOpacity", Double.toString(calculateBackground(chatOpacity))); + } + return null; + } + }); + } + + private static double calculateBackground(final String opacity) { + try { + final double d = 0.9D * Double.parseDouble(opacity) + 0.1D; + return d / 2.0D; + } catch (final NumberFormatException ex) { + return 0.5D; + } + } + + private V1936() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1946.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1946.java new file mode 100644 index 0000000000000000000000000000000000000000..2039be46ea37229b07bbfacb16506db7307cc576 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1946.java @@ -0,0 +1,41 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V1946 { + + private static final int VERSION = MCVersions.V19W14B + 1; + + public static void register() { + MCTypeRegistry.POI_CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType sections = Types.NBT.createEmptyMap(); + data.setMap("Sections", sections); + + for (int y = 0; y < 16; ++y) { + final String key = Integer.toString(y); + final Object records = data.getGeneric(key); + + if (records == null) { + continue; + } + + data.remove(key); + + final MapType section = Types.NBT.createEmptyMap(); + section.setGeneric("Records", records); + sections.setMap(key, section); + } + + return null; + } + }); + } + + private V1946() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1948.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1948.java new file mode 100644 index 0000000000000000000000000000000000000000..b879d83bf8fa3b99ecdda552a71b4936ca93e7ce --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1948.java @@ -0,0 +1,39 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1948 { + + private static final int VERSION = MCVersions.V1_14_PRE2; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:white_banner", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType display = tag.getMap("display"); + if (display == null) { + return null; + } + + final String name = display.getString("Name"); + if (name == null) { + return null; + } + + display.setString("Name", name.replace("\"translate\":\"block.minecraft.illager_banner\"", "\"translate\":\"block.minecraft.ominous_banner\"")); + + return null; + } + }); + } + + private V1948() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1953.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1953.java new file mode 100644 index 0000000000000000000000000000000000000000..3178487686defc7d30afe4f5bc3043da569bafae --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1953.java @@ -0,0 +1,26 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1953 { + + private static final int VERSION = MCVersions.V1_14 + 1; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String name = data.getString("CustomName"); + if (name != null) { + data.setString("CustomName", name.replace("\"translate\":\"block.minecraft.illager_banner\"", "\"translate\":\"block.minecraft.ominous_banner\"")); + } + return null; + } + }); + } + + private V1953() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1955.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1955.java new file mode 100644 index 0000000000000000000000000000000000000000..701c426b4aa3b35a490ebab734c3d4bd50ea10af --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1955.java @@ -0,0 +1,93 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import net.minecraft.util.Mth; + +public final class V1955 { + + private static final int VERSION = MCVersions.V1_14_1_PRE1; + + private static final int[] LEVEL_XP_THRESHOLDS = new int[] { + 0, + 10, + 50, + 100, + 150 + }; + + private static int getMinXpPerLevel(final int level) { + return LEVEL_XP_THRESHOLDS[Mth.clamp(level - 1, 0, LEVEL_XP_THRESHOLDS.length - 1)]; + } + + private static void addLevel(final MapType data, final int level) { + MapType villagerData = data.getMap("VillagerData"); + if (villagerData == null) { + villagerData = Types.NBT.createEmptyMap(); + data.setMap("VillagerData", villagerData); + } + villagerData.setInt("level", level); + } + + private static void addXpFromLevel(final MapType data, final int level) { + data.setInt("Xp", getMinXpPerLevel(level)); + } + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType villagerData = data.getMap("VillagerData"); + int level = villagerData == null ? 0 : villagerData.getInt("level"); + if (level == 0 || level == 1) { + // count recipes + final MapType offers = data.getMap("Offers"); + final ListType recipes = offers == null ? null : offers.getList("Recipes", ObjectType.MAP); + final int recipeCount; + if (recipes != null) { + recipeCount = recipes.size(); + } else { + recipeCount = 0; + } + + level = Mth.clamp(recipeCount / 2, 1, 5); + if (level > 1) { + addLevel(data, level); + } + } + + if (!data.hasKey("Xp", ObjectType.NUMBER)) { + addXpFromLevel(data, level); + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Number xp = data.getNumber("Xp"); + if (xp == null) { + final int level; + final MapType villagerData = data.getMap("VillagerData"); + if (villagerData == null) { + level = 1; + } else { + level = villagerData.getInt("level", 1); + } + + data.setInt("Xp", getMinXpPerLevel(level)); + } + return null; + } + }); + } + + private V1955() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1961.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1961.java new file mode 100644 index 0000000000000000000000000000000000000000..e49e4c902c6fa6d5794ac0c22508c96d82c6ff7a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1961.java @@ -0,0 +1,29 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V1961 { + + private static final int VERSION = MCVersions.V1_14_2_PRE3 + 1; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + level.remove("isLightOn"); + + return null; + } + }); + } + + private V1961() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V1963.java b/ca/spottedleaf/dataconverter/minecraft/versions/V1963.java new file mode 100644 index 0000000000000000000000000000000000000000..e13c694cd9a992c0129fdec3a3c90ef3dad1ff17 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V1963.java @@ -0,0 +1,39 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V1963 { + + private static final int VERSION = MCVersions.V1_14_2; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType gossips = data.getList("Gossips", ObjectType.MAP); + if (gossips == null) { + return null; + } + + for (int i = 0; i < gossips.size();) { + final MapType gossip = gossips.getMap(i); + if ("golem".equals(gossip.getString("Type"))) { + gossips.remove(i); + continue; + } + + ++i; + } + + return null; + } + }); + } + + private V1963() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java new file mode 100644 index 0000000000000000000000000000000000000000..90d2fcf77e746081043a32503049df7b127e00a7 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2100.java @@ -0,0 +1,47 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename; +import ca.spottedleaf.dataconverter.minecraft.converters.recipe.ConverterAbstractRecipeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2100 { + + private static final int VERSION = MCVersions.V1_14_4 + 124; + private static final Map 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" + ) + ); + + public static void register() { + ConverterAbstractRecipeRename.register(VERSION, RECIPE_RENAMES::get); + ConverterAbstractAdvancementsRename.register(VERSION, ADVANCEMENT_RENAMES::get); + + //registerMob("minecraft:bee"); // changed in 1.21.5 to simple + //registerMob("minecraft:bee_stinger"); // changed in 1.21.5 to simple + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:beehive", (data, fromVersion, toVersion) -> { + final ListType bees = data.getList("Bees", ObjectType.MAP); + if (bees != null) { + for (int i = 0, len = bees.size(); i < len; ++i) { + WalkerUtils.convert(MCTypeRegistry.ENTITY, bees.getMap(i), "EntityData", fromVersion, toVersion); + } + } + + return null; + }); + } + + private V2100() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2202.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2202.java new file mode 100644 index 0000000000000000000000000000000000000000..ce20aaa8ef06c69ec85ddf0e5bdf17f57fa5ce70 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2202.java @@ -0,0 +1,49 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2202 { + + private static final int VERSION = MCVersions.V19W35A + 1; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + final int[] oldBiomes = level.getInts("Biomes"); + + if (oldBiomes == null || oldBiomes.length != 256) { + return null; + } + + final int[] newBiomes = new int[1024]; + level.setInts("Biomes", newBiomes); + + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + int k = (j << 2) + 2; + int l = (i << 2) + 2; + int m = l << 4 | k; + newBiomes[i << 2 | j] = oldBiomes[m]; + } + } + + for (int i = 1; i < 64; ++i) { + System.arraycopy(newBiomes, 0, newBiomes, i * 16, 16); + } + + return null; + } + }); + } + + private V2202() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2209.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2209.java new file mode 100644 index 0000000000000000000000000000000000000000..7439d0e948f144d93a1fa7b57c2b478a54835d6d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2209.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.converters.poi.ConverterAbstractPOIRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2209 { + + private static final int VERSION = MCVersions.V19W40A + 1; + + public static void register() { + final Map renamedIds = new HashMap<>( + ImmutableMap.of( + "minecraft:bee_hive", "minecraft:beehive" + ) + ); + + ConverterAbstractBlockRename.register(VERSION, renamedIds::get); + ConverterAbstractItemRename.register(VERSION, renamedIds::get); + ConverterAbstractPOIRename.register(VERSION, renamedIds::get); + } + + private V2209() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2211.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2211.java new file mode 100644 index 0000000000000000000000000000000000000000..3b888aadf7f4abfd9feff25aa785d84782d14ba0 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2211.java @@ -0,0 +1,31 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V2211 { + + private static final int VERSION = MCVersions.V19W41A + 1; + + public static void register() { + MCTypeRegistry.STRUCTURE_FEATURE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey("references", ObjectType.NUMBER)) { + return null; + } + + final int references = data.getInt("references"); + if (references <= 0) { + data.setInt("references", 1); + } + return null; + } + }); + } + + private V2211() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2218.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2218.java new file mode 100644 index 0000000000000000000000000000000000000000..3fc4c20e117edd06056145d58d822eb5c2c16e61 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2218.java @@ -0,0 +1,33 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2218 { + + private static final int VERSION = MCVersions.V1_15_PRE1; + + public static void register() { + MCTypeRegistry.POI_CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType sections = data.getMap("Sections"); + if (sections == null) { + return null; + } + + for (final String key : sections.keys()) { + final MapType section = sections.getMap(key); + + section.remove("Valid"); + } + + return null; + } + }); + } + + private V2218() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2501.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2501.java new file mode 100644 index 0000000000000000000000000000000000000000..02dec41330c7e463f8b9869752ddae1601ac3763 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2501.java @@ -0,0 +1,67 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V2501 { + + private static final int VERSION = MCVersions.V1_15_2 + 271; + + private static void registerFurnace(final String id) { + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, id, (data, fromVersion, toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Items", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "CustomName", fromVersion, toVersion); + + WalkerUtils.convertKeys(MCTypeRegistry.RECIPE, data, "RecipesUsed", fromVersion, toVersion); + + return null; + }); + } + + public static void register() { + final DataConverter converter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int recipesUsedSize = data.getInt("RecipesUsedSize"); + data.remove("RecipesUsedSize"); + + if (recipesUsedSize <= 0) { + return null; + } + + final MapType newRecipes = Types.NBT.createEmptyMap(); + data.setMap("RecipesUsed", newRecipes); + + for (int i = 0; i < recipesUsedSize; ++i) { + final String recipeKey = data.getString("RecipeLocation" + i); + data.remove("RecipeLocation" + i); + final int recipeAmount = data.getInt("RecipeAmount" + i); + data.remove("RecipeAmount" + i); + + if (i <= 0 || recipeKey == null) { + continue; + } + + newRecipes.setInt(recipeKey, recipeAmount); + } + + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:furnace", converter); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:blast_furnace", converter); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:smoker", converter); + + registerFurnace("minecraft:furnace"); + registerFurnace("minecraft:smoker"); + registerFurnace("minecraft:blast_furnace"); + } + + private V2501() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java new file mode 100644 index 0000000000000000000000000000000000000000..a2f0495c05e670d100cb90d526c1785ab172b5a2 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2502.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V2502 { + + private static final int VERSION = MCVersions.V1_15_2 + 272; + + public static void register() { + //registerMob("minecraft:hoglin"); changed to simple in 1.21.5 + } + + private V2502() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2503.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2503.java new file mode 100644 index 0000000000000000000000000000000000000000..a1fca94f01bc9c18de17e4b40a98c57a4f965f7c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2503.java @@ -0,0 +1,73 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +public final class V2503 { + + private static final int VERSION = MCVersions.V1_15_2 + 273; + + private static final Set WALL_BLOCKS = new HashSet<>( + ImmutableSet.of( + "minecraft:andesite_wall", + "minecraft:brick_wall", + "minecraft:cobblestone_wall", + "minecraft:diorite_wall", + "minecraft:end_stone_brick_wall", + "minecraft:granite_wall", + "minecraft:mossy_cobblestone_wall", + "minecraft:mossy_stone_brick_wall", + "minecraft:nether_brick_wall", + "minecraft:prismarine_wall", + "minecraft:red_nether_brick_wall", + "minecraft:red_sandstone_wall", + "minecraft:sandstone_wall", + "minecraft:stone_brick_wall" + ) + ); + + private static void changeWallProperty(final MapType properties, final String path) { + final String property = properties.getString(path); + if (property != null) { + properties.setString(path, "true".equals(property) ? "low" : "none"); + } + } + + public static void register() { + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!WALL_BLOCKS.contains(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + if (properties == null) { + return null; + } + + changeWallProperty(properties, "east"); + changeWallProperty(properties, "west"); + changeWallProperty(properties, "north"); + changeWallProperty(properties, "south"); + + return null; + } + }); + ConverterAbstractAdvancementsRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:recipes/misc/composter", "minecraft:recipes/decorations/composter" + ) + )::get); + } + + private V2503() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2505.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2505.java new file mode 100644 index 0000000000000000000000000000000000000000..c7c4ddf11e841b23c17fc95fdcb878dffecb07d8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2505.java @@ -0,0 +1,45 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V2505 { + + private static final int VERSION = MCVersions.V20W06A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType brain = data.getMap("Brain"); + if (brain == null) { + return null; + } + + final MapType memories = brain.getMap("memories"); + if (memories == null) { + return null; + } + + for (final String key : memories.keys()) { + final Object value = memories.getGeneric(key); + + final MapType wrapped = Types.NBT.createEmptyMap(); + wrapped.setGeneric("value", value); + + memories.setMap(key, wrapped); + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:piglin", new DataWalkerItemLists("Inventory")); + } + + private V2505() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2508.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2508.java new file mode 100644 index 0000000000000000000000000000000000000000..f9e9d88e4cca15d2d4fdcbc0dbcae4c35c02284a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2508.java @@ -0,0 +1,27 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2508 { + + private static final int VERSION = MCVersions.V20W08A + 1; + + public static void register() { + final Map remap = new HashMap<>( + ImmutableMap.of( + "minecraft:warped_fungi", "minecraft:warped_fungus", + "minecraft:crimson_fungi", "minecraft:crimson_fungus" + ) + ); + + ConverterAbstractBlockRename.register(VERSION, remap::get); + ConverterAbstractItemRename.register(VERSION, remap::get); + } + + private V2508() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java new file mode 100644 index 0000000000000000000000000000000000000000..3c8780f626b10918851a222afd8406d82e3754c0 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2509.java @@ -0,0 +1,29 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V2509 { + + private static final int VERSION = MCVersions.V20W08A + 2; + + public static void register() { + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:zombie_pigman_spawn_egg", "minecraft:zombified_piglin_spawn_egg" + ) + )::get); + ConverterAbstractEntityRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:zombie_pigman", "minecraft:zombified_piglin" + ) + )::get); + + //registerMob("minecraft:zombified_piglin"); // changed to simple in 1.21.5 + } + + private V2509() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java new file mode 100644 index 0000000000000000000000000000000000000000..0fe1e7b2c8c6e197c89643da0f2cda9fcf779dff --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2511.java @@ -0,0 +1,99 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V2511 { + + private static final int VERSION = MCVersions.V20W09A + 1; + + private static int[] createUUIDArray(final long most, final long least) { + return new int[] { + (int)(most >>> 32), + (int)most, + (int)(least >>> 32), + (int)least + }; + } + + private static void setUUID(final MapType data, final long most, final long least) { + if (most != 0L && least != 0L) { + data.setInts("OwnerUUID", createUUIDArray(most, least)); + } + } + + public static void register() { + final DataConverter 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 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 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 arrowConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + setUUID(data, data.getLong("OwnerUUIDMost"), data.getLong("OwnerUUIDLeast")); + + data.remove("OwnerUUIDMost"); + data.remove("OwnerUUIDLeast"); + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:egg", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:ender_pearl", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:experience_bottle", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:snowball", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:potion", throwableConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:potion", potionConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:llama_spit", llamaSpitConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", arrowConverter); + + // Vanilla uses version step 1, but there's no need to add a step here. + // Note: Originally we have had this walker on step 0, as Vanilla accidentally left this walker out + // until 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerItems("Item")); + } + + private V2511() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2514.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2514.java new file mode 100644 index 0000000000000000000000000000000000000000..167109fb53b45901e944ae3eb4a690956fe18e8f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2514.java @@ -0,0 +1,590 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import com.google.common.collect.Sets; +import java.util.Set; +import java.util.UUID; + +public final class V2514 { + + private static final int VERSION = MCVersions.V20W11A + 1; + + private static final Set 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 animalOwnerConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateAnimalOwner(data); + return null; + } + }; + final DataConverter animalConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateAnimal(data); + return null; + } + }; + final DataConverter mobConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateMob(data); + return null; + } + }; + final DataConverter livingEntityConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateLivingEntity(data); + return null; + } + }; + final DataConverter projectileConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateProjectile(data); + return null; + } + }; + for (final String id : ABSTRACT_HORSES) { + MCTypeRegistry.ENTITY.addConverterForId(id, animalOwnerConverter); + } + for (final String id : TAMEABLE_ANIMALS) { + MCTypeRegistry.ENTITY.addConverterForId(id, animalOwnerConverter); + } + for (final String id : ANIMALS) { + MCTypeRegistry.ENTITY.addConverterForId(id, animalConverter); + } + for (final String id : MOBS) { + MCTypeRegistry.ENTITY.addConverterForId(id, mobConverter); + } + for (final String id : LIVING_ENTITIES) { + MCTypeRegistry.ENTITY.addConverterForId(id, livingEntityConverter); + } + for (final String id : PROJECTILES) { + MCTypeRegistry.ENTITY.addConverterForId(id, projectileConverter); + } + + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:bee", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateHurtBy(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombified_piglin", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateHurtBy(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:fox", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateFox(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:item", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateItem(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker_bullet", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateShulkerBullet(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateAreaEffectCloud(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateZombieVillager(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:evoker_fangs", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateEvokerFangs(data); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:piglin", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updatePiglin(data); + return null; + } + }); + + + // Update TE + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:conduit", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + replaceUUIDMLTag(data, "target_uuid", "Target"); + return null; + } + }); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:skull", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType owner = data.getMap("Owner"); + if (owner == null) { + return null; + } + + data.remove("Owner"); + + replaceUUIDString(owner, "Id", "Id"); + + data.setMap("SkullOwner", owner); + + return null; + } + }); + + // Player UUID + MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateLivingEntity(data); + updateEntityUUID(data); + + final MapType rootVehicle = data.getMap("RootVehicle"); + if (rootVehicle == null) { + return null; + } + + replaceUUIDLeastMost(rootVehicle, "Attach", "Attach"); + + return null; + } + }); + + // Level.dat + MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + replaceUUIDString(data, "WanderingTraderId", "WanderingTraderId"); + + final MapType dimensionData = data.getMap("DimensionData"); + if (dimensionData != null) { + for (final String key : dimensionData.keys()) { + final MapType dimension = dimensionData.getMap(key); + + final MapType dragonFight = dimension.getMap("DragonFight"); + if (dragonFight == null) { + continue; + } + + replaceUUIDLeastMost(dragonFight, "DragonUUID", "Dragon"); + } + } + + final MapType customBossEvents = data.getMap("CustomBossEvents"); + if (customBossEvents != null) { + for (final String key : customBossEvents.keys()) { + final MapType customBossEvent = customBossEvents.getMap(key); + + final ListType players = customBossEvent.getList("Players", ObjectType.MAP); + if (players == null) { + continue; + } + + final ListType newPlayers = Types.NBT.createEmptyList(); + customBossEvent.setList("Players", newPlayers); + + for (int i = 0, len = players.size(); i < len; ++i) { + final int[] newUUID = createUUIDFromLongs(players.getMap(i), "M", "L"); + if (newUUID != null) { + newPlayers.addIntArray(newUUID); + } + } + } + } + + return null; + } + }); + + MCTypeRegistry.SAVED_DATA_RAIDS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + final ListType raids = data.getList("Raids", ObjectType.MAP); + if (raids == null) { + return null; + } + + for (int i = 0, len = raids.size(); i < len; ++i) { + final MapType raid = raids.getMap(i); + + final ListType heros = raid.getList("HeroesOfTheVillage", ObjectType.MAP); + + if (heros == null) { + continue; + } + + final ListType newHeros = Types.NBT.createEmptyList(); + raid.setList("HeroesOfTheVillage", newHeros); + + for (int k = 0, klen = heros.size(); k < klen; ++k) { + final MapType uuidOld = heros.getMap(i); + final int[] uuidNew = createUUIDFromLongs(uuidOld, "UUIDMost", "UUIDLeast"); + if (uuidNew != null) { + newHeros.addIntArray(uuidNew); + } + } + } + + return null; + } + }); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + updateAttributeModifiers(tag); + + if ("minecraft:player_head".equals(data.getString("id"))) { + updateSkullOwner(tag); + } + + return null; + } + }); + } + + private static void updateAttributeModifiers(final MapType tag) { + final ListType attributes = tag.getList("AttributeModifiers", ObjectType.MAP); + if (attributes == null) { + return; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + replaceUUIDLeastMost(attributes.getMap(i), "UUID", "UUID"); + } + } + + private static void updateSkullOwner(final MapType tag) { + replaceUUIDString(tag.getMap("SkullOwner"), "Id", "Id"); + } + + private V2514() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2516.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2516.java new file mode 100644 index 0000000000000000000000000000000000000000..50f8e258ecc71e2c7e88ae8ccd83494da9ca9dfd --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2516.java @@ -0,0 +1,37 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V2516 { + + private static final int VERSION = MCVersions.V20W12A + 1; + + public static void register() { + final DataConverter gossipUUIDConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType gossips = data.getList("Gossips", ObjectType.MAP); + + if (gossips == null) { + return null; + } + + for (int i = 0, len = gossips.size(); i < len; ++i) { + V2514.replaceUUIDLeastMost(gossips.getMap(i), "Target", "Target"); + } + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", gossipUUIDConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:zombie_villager", gossipUUIDConverter); + } + + private V2516() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2518.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2518.java new file mode 100644 index 0000000000000000000000000000000000000000..df2c6cd50b2b0bfc062210a48d7e4b25a6cf0cb0 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2518.java @@ -0,0 +1,65 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2518 { + + private static final int VERSION = MCVersions.V20W12A + 3; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java new file mode 100644 index 0000000000000000000000000000000000000000..e270ccada1c13a4c71b227cf0096dc3094ceff6f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2519.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V2519 { + + private static final int VERSION = MCVersions.V20W12A + 4; + + public static void register() { + //registerMob("minecraft:strider"); // changed to simple in 1.21.5 + } + + private V2519() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java new file mode 100644 index 0000000000000000000000000000000000000000..89258da61bccb3668730adad70c0383de001a5a3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2522.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V2522 { + + private static final int VERSION = MCVersions.V20W13B + 1; + + public static void register() { + //registerMob("minecraft:zoglin"); // changed to simple in 1.21.5 + } + + private V2522() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2523.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2523.java new file mode 100644 index 0000000000000000000000000000000000000000..7777d83d63dc177f0bac72290ed2e5c3cbd028be --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2523.java @@ -0,0 +1,41 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.attributes.ConverterAbstractOldAttributesRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2523 { + + private static final int VERSION = MCVersions.V20W13B + 2; + + private static final Map 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() { + ConverterAbstractOldAttributesRename.register(VERSION, RENAMES::get); + } + + private V2523() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2527.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2527.java new file mode 100644 index 0000000000000000000000000000000000000000..00268930307bc539e81ba364d66824f4b0a858b1 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2527.java @@ -0,0 +1,123 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import com.mojang.datafixers.DataFixUtils; +import net.minecraft.util.Mth; + +public final class V2527 { + + private static final int VERSION = MCVersions.V20W16A + 1; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType level = data.getMap("Level"); + + if (level == null) { + return null; + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + final ListType palette = section.getList("Palette", ObjectType.MAP); + + if (palette == null) { + continue; + } + + final int bits = Math.max(4, DataFixUtils.ceillog2(palette.size())); + + if (Mth.isPowerOfTwo(bits)) { + // fits perfectly + continue; + } + + final long[] states = section.getLongs("BlockStates"); + if (states == null) { + // wat + continue; + } + + section.setLongs("BlockStates", addPadding(4096, bits, states)); + } + } + + final MapType heightMaps = level.getMap("Heightmaps"); + if (heightMaps != null) { + for (final String key : heightMaps.keys()) { + final long[] old = heightMaps.getLongs(key); + heightMaps.setLongs(key, addPadding(256, 9, old)); + } + } + + return null; + } + }); + } + + public static long[] addPadding(final int indices, final int bits, final long[] old) { + int k = old.length; + if (k == 0) { + return old; + } else { + long l = (1L << bits) - 1L; + int m = 64 / bits; + int n = (indices + m - 1) / m; + long[] padded = new long[n]; + int o = 0; + int p = 0; + long q = 0L; + int r = 0; + long s = old[0]; + long t = k > 1 ? old[1] : 0L; + + for(int u = 0; u < indices; ++u) { + int v = u * bits; + int w = v >> 6; + int x = (u + 1) * bits - 1 >> 6; + int y = v ^ w << 6; + if (w != r) { + s = t; + t = w + 1 < k ? old[w + 1] : 0L; + r = w; + } + + long ab; + int ac; + if (w == x) { + ab = s >>> y & l; + } else { + ac = 64 - y; + ab = (s >>> y | t << ac) & l; + } + + ac = p + bits; + if (ac >= 64) { + padded[o++] = q; + q = ab; + p = bits; + } else { + q |= ab << p; + p = ac; + } + } + + if (q != 0L) { + padded[o] = q; + } + + return padded; + } + } + + private V2527() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2528.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2528.java new file mode 100644 index 0000000000000000000000000000000000000000..e7197d098b3d6269d3a4fd9be0432d85f0504dfd --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2528.java @@ -0,0 +1,30 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V2528 { + + private static final int VERSION = MCVersions.V20W16A + 2; + + public static void register() { + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:soul_fire_torch", "minecraft:soul_torch", + "minecraft:soul_fire_lantern", "minecraft:soul_lantern" + ) + )::get); + ConverterAbstractBlockRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:soul_fire_torch", "minecraft:soul_torch", + "minecraft:soul_fire_wall_torch", "minecraft:soul_wall_torch", + "minecraft:soul_fire_lantern", "minecraft:soul_lantern" + ) + )::get); + } + + private V2528() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2529.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2529.java new file mode 100644 index 0000000000000000000000000000000000000000..5ea1926080fe5cbf976c3c5886b0e2a2451b252d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2529.java @@ -0,0 +1,25 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2529 { + + private static final int VERSION = MCVersions.V20W17A; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:strider", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getBoolean("NoGravity")) { + data.setBoolean("NoGravity", false); + } + return null; + } + }); + } + + private V2529() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2531.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2531.java new file mode 100644 index 0000000000000000000000000000000000000000..57ceb6e6a67f7fbc94e90c0327da9e353c612877 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2531.java @@ -0,0 +1,63 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2531 { + + private static final int VERSION = MCVersions.V20W17A + 2; + + private static boolean isConnected(final String facing) { + return !"none".equals(facing); + } + + public static void register() { + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"minecraft:redstone_wire".equals(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + + if (properties == null) { + return null; + } + + + final String east = properties.getString("east", "none"); + final String west = properties.getString("west", "none"); + final String north = properties.getString("north", "none"); + final String south = properties.getString("south", "none"); + + final boolean connectedX = isConnected(east) || isConnected(west); + final boolean connectedZ = isConnected(north) || isConnected(south); + + final String newEast = !isConnected(east) && !connectedZ ? "side" : east; + final String newWest = !isConnected(west) && !connectedZ ? "side" : west; + final String newNorth = !isConnected(north) && !connectedX ? "side" : north; + final String newSouth = !isConnected(south) && !connectedX ? "side" : south; + + if (properties.hasKey("east")) { + properties.setString("east", newEast); + } + if (properties.hasKey("west")) { + properties.setString("west", newWest); + } + if (properties.hasKey("north")) { + properties.setString("north", newNorth); + } + if (properties.hasKey("south")) { + properties.setString("south", newSouth); + } + + return null; + } + }); + } + + private V2531() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2533.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2533.java new file mode 100644 index 0000000000000000000000000000000000000000..c89985ccfb271f84888dbe7975a0918d7ef7f38a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2533.java @@ -0,0 +1,42 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V2533 { + + private static final int VERSION = MCVersions.V20W18A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:villager", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType attributes = data.getList("Attributes", ObjectType.MAP); + + if (attributes == null) { + return null; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + final MapType attribute = attributes.getMap(i); + + if (!"generic.follow_range".equals(attribute.getString("Name"))) { + continue; + } + + if (attribute.getDouble("Base") == 16.0) { + attribute.setDouble("Base", 48.0); + } + } + + return null; + } + }); + } + + private V2533() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2535.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2535.java new file mode 100644 index 0000000000000000000000000000000000000000..21d79dfdfc0062bf66a904c66fd1445e953127d6 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2535.java @@ -0,0 +1,34 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V2535 { + + private static final int VERSION = MCVersions.V20W19A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // Mojang uses doubles for whatever reason... rotation is in FLOAT. by using double here + // the entity load will just ignore rotation and set it to 0... + final ListType rotation = data.getList("Rotation", ObjectType.FLOAT); + + if (rotation == null || rotation.size() == 0) { + return null; + } + + rotation.setFloat(0, rotation.getFloat(0) - 180.0F); + + return null; + } + }); + } + + private V2535() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2537.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2537.java new file mode 100644 index 0000000000000000000000000000000000000000..28709ea1eb0e8966321a4a959350778bb2ea5fed --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2537.java @@ -0,0 +1,61 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2537 { + + private static final int VERSION = MCVersions.V20W20B; + + private static void convertDimension(final MapType data, final String path) { + if (data == null) { + return; + } + + final Number dimension = data.getNumber(path); + if (dimension == null) { + return; + } + + final String newDimension; + switch (dimension.intValue()) { + case -1: { + newDimension = "minecraft:the_nether"; + break; + } + case 1: { + newDimension = "minecraft:the_end"; + break; + } + default: { + newDimension = "minecraft:overworld"; + break; + } + } + + data.setString(path, newDimension); + return; + } + + public static void register() { + MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertDimension(data, "Dimension"); + return null; + } + }); + + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + convertDimension(root.getMap("data"), "dimension"); + return null; + } + }); + } + + private V2537() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2538.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2538.java new file mode 100644 index 0000000000000000000000000000000000000000..69097398c3d2b8c04d9adefa2268803bcbaffa32 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2538.java @@ -0,0 +1,43 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2538 { + + private static final int VERSION = MCVersions.V20W20B + 1; + private static final String[] MERGE_KEYS = new String[] { + "RandomSeed", + "generatorName", + "generatorOptions", + "generatorVersion", + "legacy_custom_options", + "MapFeatures", + "BonusChest" + }; + + public static void register() { + MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType worldGenSettings = data.getOrCreateMap("WorldGenSettings"); + + for (final String key : MERGE_KEYS) { + final Object value = data.getGeneric(key); + if (value == null) { + continue; + } + + data.remove(key); + worldGenSettings.setGeneric(key, value); + } + + return null; + } + }); + } + + private V2538() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2550.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2550.java new file mode 100644 index 0000000000000000000000000000000000000000..704ffd7fb6fa965d573040cb4fa2b32d31921aa3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2550.java @@ -0,0 +1,346 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import com.google.common.collect.ImmutableMap; +import org.apache.commons.lang3.math.NumberUtils; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public final class V2550 { + + private static final int VERSION = MCVersions.V20W20B + 13; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V2551.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2551.java new file mode 100644 index 0000000000000000000000000000000000000000..8d31193df65ec1abc6aa26c0fd2dd454316c4f60 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2551.java @@ -0,0 +1,103 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V2551 { + + private static final int VERSION = MCVersions.V20W20B + 14; + + public static void register() { + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType dimensions = data.getMap("dimensions"); + + if (dimensions == null) { + return null; + } + + for (final String dimension : dimensions.keys()) { + final MapType dimensionData = dimensions.getMap(dimension); + if (dimensionData == null) { + continue; + } + + final MapType generator = dimensionData.getMap("generator"); + if (generator == null) { + continue; + } + + final String type = generator.getString("type"); + if (type == null) { + continue; + } + + switch (type) { + case "minecraft:flat": { + final MapType settings = generator.getMap("settings"); + if (settings == null) { + continue; + } + + WalkerUtils.convert(MCTypeRegistry.BIOME, settings, "biome", fromVersion, toVersion); + + final ListType layers = settings.getList("layers", ObjectType.MAP); + if (layers != null) { + for (int i = 0, len = layers.size(); i < len; ++i) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, layers.getMap(i), "block", fromVersion, toVersion); + } + } + + break; + } + case "minecraft:noise": { + final MapType settings = generator.getMap("settings"); + if (settings != null) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_block", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_fluid", fromVersion, toVersion); + } + + final MapType biomeSource = generator.getMap("biome_source"); + if (biomeSource != null) { + final String biomeSourceType = biomeSource.getString("type", ""); + switch (biomeSourceType) { + case "minecraft:fixed": { + WalkerUtils.convert(MCTypeRegistry.BIOME, biomeSource, "biome", fromVersion, toVersion); + break; + } + + case "minecraft:multi_noise": { + // Vanilla's schema is wrong. It should be DSL.fields("biomes", DSL.list(DSL.fields("biome"))) + // But it just contains the list part. That obviously can never be the case, because + // the root object is a compound, not a list. + + final ListType biomes = biomeSource.getList("biomes", ObjectType.MAP); + if (biomes != null) { + for (int i = 0, len = biomes.size(); i < len; ++i) { + WalkerUtils.convert(MCTypeRegistry.BIOME, biomes.getMap(i), "biome", fromVersion, toVersion); + } + } + break; + } + + case "minecraft:checkerboard": { + WalkerUtils.convertList(MCTypeRegistry.BIOME, biomeSource, "biomes", fromVersion, toVersion); + break; + } + } + } + + break; + } + } + } + + return null; + }); + } + + private V2551() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2552.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2552.java new file mode 100644 index 0000000000000000000000000000000000000000..9e6c7dc40d509cf424976831382425ab7eceb024 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2552.java @@ -0,0 +1,22 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V2552 { + + private static final int VERSION = MCVersions.V20W20B + 15; + + public static void register() { + ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.BIOME, new HashMap<>( + ImmutableMap.of( + "minecraft:nether", "minecraft:nether_wastes" + ) + )::get); + } + + private V2552() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2553.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2553.java new file mode 100644 index 0000000000000000000000000000000000000000..f019774923bf08fc0f7dc7cafd5fb66fdd7427f8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2553.java @@ -0,0 +1,77 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2553 { + + private static final int VERSION = MCVersions.V20W20B + 16; + + public static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V2558.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2558.java new file mode 100644 index 0000000000000000000000000000000000000000..cfb17deec6d53fc99a6562dce1fcc2f6dea8e26b --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2558.java @@ -0,0 +1,48 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.options.ConverterAbstractOptionsRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V2558 { + + private static final int VERSION = MCVersions.V1_16_PRE2 + 1; + + public static void register() { + ConverterAbstractOptionsRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "key_key.swapHands", "key_key.swapOffhand" + ) + )::get); + + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + MapType dimensions = data.getMap("dimensions"); + if (dimensions == null) { + dimensions = Types.NBT.createEmptyMap(); + data.setMap("dimensions", dimensions); + } + + if (dimensions.isEmpty()) { + data.setMap("dimensions", recreateSettings(data)); + } + + return null; + } + }); + } + + private static MapType recreateSettings(final MapType data) { + final long seed = data.getLong("seed"); + + return V2550.vanillaLevels(seed, V2550.defaultOverworld(seed), false); + } + + private V2558() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java new file mode 100644 index 0000000000000000000000000000000000000000..a50146d1dba4d62da3bb54a5869ae879f573f0e5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2568.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V2568 { + + private static final int VERSION = MCVersions.V1_16_1 + 1; + + public static void register() { + //registerMob("minecraft:piglin_brute"); // changed to simple in 1.21.5 + } + + private V2568() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java new file mode 100644 index 0000000000000000000000000000000000000000..ad6c4c4427fc17d7ad743115773cb48dad1b415d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2671.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V2671 { + + private static final int VERSION = MCVersions.V1_16_5 + 85; + + public static void register() { + //registerMob("minecraft:goat"); // changed to simple in 1.21.5 + } + + private V2671() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2679.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2679.java new file mode 100644 index 0000000000000000000000000000000000000000..9f8b0cdc05116ebf07eee98e6288b2d7d9eb0e8b --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2679.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2679 { + + private static final int VERSION = MCVersions.V1_16_5 + 93; + + public static void register() { + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"minecraft:cauldron".equals(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + + if (properties == null) { + return null; + } + + if (properties.getString("level", "0").equals("0")) { + data.remove("Properties"); + return null; + } else { + data.setString("Name", "minecraft:water_cauldron"); + return null; + } + } + }); + } + + private V2679() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2680.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2680.java new file mode 100644 index 0000000000000000000000000000000000000000..87cbe1c717635908a30c57028346a1abeb21e6a6 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2680.java @@ -0,0 +1,27 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V2680 { + + private static final int VERSION = MCVersions.V1_16_5 + 94; + + public static void register() { + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:grass_path", "minecraft:dirt_path" + ) + )::get); + ConverterAbstractBlockRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:grass_path", "minecraft:dirt_path" + ) + )::get); + } + + private V2680() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2684.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2684.java new file mode 100644 index 0000000000000000000000000000000000000000..0c996642f561d2471a506a34f5efe6dae5cd1fb3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2684.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.game_event.GameEventListenerWalker; + +public final class V2684 { + + private static final int VERSION = MCVersions.V20W48A + 1; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:sculk_sensor", new GameEventListenerWalker()); + } + + private V2684() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java new file mode 100644 index 0000000000000000000000000000000000000000..4cfb211c6e557a7f2a3535c8430049e4c720eae9 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2686.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V2686 { + + private static final int VERSION = MCVersions.V20W49A + 1; + + public static void register() { + //registerMob("minecraft:axolotl"); // changed to simple in 1.21.5 + } + + private V2686() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2688.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2688.java new file mode 100644 index 0000000000000000000000000000000000000000..f971b5284950db483fb9b80599572b27a59755b5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2688.java @@ -0,0 +1,18 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; + +public final class V2688 { + + private static final int VERSION = MCVersions.V20W51A + 1; + + public static void register() { + //registerMob("minecraft:glow_squid"); // changed to simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:glow_item_frame", new DataWalkerItems("Item")); + } + + private V2688() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2690.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2690.java new file mode 100644 index 0000000000000000000000000000000000000000..39ffcec6e78229dd62abfd42c1ac64c3ccccc6dc --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2690.java @@ -0,0 +1,45 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2690 { + + private static final int VERSION = MCVersions.V21W05A; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V2691.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2691.java new file mode 100644 index 0000000000000000000000000000000000000000..bb87bcedfc2ed8d19b266e925beca0f54b50a0ab --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2691.java @@ -0,0 +1,29 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2691 { + + private static final int VERSION = MCVersions.V21W05A + 1; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V2693.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2693.java new file mode 100644 index 0000000000000000000000000000000000000000..a242e8e9a7a7c80c00ec0d64542b3d7dc3103e24 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2693.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.AddFlagIfAbsent; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V2693 { + + private static final int VERSION = MCVersions.V21W05B + 1; + + public static void register() { + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new AddFlagIfAbsent(VERSION, "has_increased_height_already", false)); + } + + private V2693() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2696.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2696.java new file mode 100644 index 0000000000000000000000000000000000000000..ce568002e54924e001c12271f0bde7183bc23c61 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2696.java @@ -0,0 +1,42 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2696 { + + private static final int VERSION = MCVersions.V21W07A + 1; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V2700.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2700.java new file mode 100644 index 0000000000000000000000000000000000000000..e6a2f29b20aa6d7cd431fc63c2d8ed70dc9a2ab8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2700.java @@ -0,0 +1,22 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V2700 { + + private static final int VERSION = MCVersions.V21W10A + 1; + + public static void register() { + ConverterAbstractBlockRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:cave_vines_head", "minecraft:cave_vines", + "minecraft:cave_vines_body", "minecraft:cave_vines_plant" + ) + )::get); + } + + private V2700() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2701.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2701.java new file mode 100644 index 0000000000000000000000000000000000000000..58535aa2e949bfca9b73bdc1b8f4f5f0a5b4384e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2701.java @@ -0,0 +1,205 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import com.google.common.collect.Sets; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class V2701 { + + private static final int VERSION = MCVersions.V21W10A + 2; + + private static final Pattern INDEX_PATTERN = Pattern.compile("\\[(\\d+)\\]"); + + private static final Set 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/ca/spottedleaf/dataconverter/minecraft/versions/V2702.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2702.java new file mode 100644 index 0000000000000000000000000000000000000000..e8af14493078e2e458d0679404ae6bce46289519 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2702.java @@ -0,0 +1,35 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2702 { + + private static final int VERSION = MCVersions.V21W10A + 3; + + public static void register() { + final DataConverter arrowConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.hasKey("pickup")) { + return null; + } + + final boolean player = data.getBoolean("player", true); + data.remove("player"); + + data.setByte("pickup", player ? (byte)1 : (byte)0); + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", arrowConverter); + } + + private V2702() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java new file mode 100644 index 0000000000000000000000000000000000000000..45c809b9e62437afdf17d47b0bea7b574e4cbd34 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2707.java @@ -0,0 +1,18 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.AddFlagIfAbsent; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V2707 { + + private static final int VERSION = MCVersions.V21W14A + 1; + + public static void register() { + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new AddFlagIfAbsent(VERSION, "has_increased_height_already", true)); + + //registerMob("minecraft:marker"); // changed to simple in 1.21.5 + } + + private V2707() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2710.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2710.java new file mode 100644 index 0000000000000000000000000000000000000000..0967c8c794869a972c1283cab6b3f3cef1d77aec --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2710.java @@ -0,0 +1,21 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.stats.ConverterAbstractStatsRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V2710 { + + private static final int VERSION = MCVersions.V21W15A + 1; + + public static void register() { + ConverterAbstractStatsRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:play_one_minute", "minecraft:play_time" + ) + )::get); + } + + private V2710() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2717.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2717.java new file mode 100644 index 0000000000000000000000000000000000000000..e0d6b2f6b00e0bfce205efa889de1765ef22793a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2717.java @@ -0,0 +1,25 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2717 { + + private static final int VERSION = MCVersions.V1_17_PRE1 + 1; + + public static void register() { + final Map rename = new HashMap<>( + ImmutableMap.of( + "minecraft:azalea_leaves_flowers", "minecraft:flowering_azalea_leaves" + ) + ); + ConverterAbstractItemRename.register(VERSION, rename::get); + ConverterAbstractBlockRename.register(VERSION, rename::get); + } + + private V2717() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2825.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2825.java new file mode 100644 index 0000000000000000000000000000000000000000..cd00c9398791967be6dd10f7183c61902431b27a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2825.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.AddFlagIfAbsent; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V2825 { + + private static final int VERSION = MCVersions.V1_17_1 + 95; + + public static void register() { + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new AddFlagIfAbsent(VERSION, "has_increased_height_already", false)); + } + + private V2825() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2831.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2831.java new file mode 100644 index 0000000000000000000000000000000000000000..a133c1eaf04cbd5a6a701ee2c4ad11553dd84343 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2831.java @@ -0,0 +1,64 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V2831 { + + private static final int VERSION = MCVersions.V1_17_1 + 101; + + public static void register() { + MCTypeRegistry.UNTAGGED_SPAWNER.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "SpawnPotentials", "data", "entity", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.ENTITY, root.getMap("SpawnData"), "entity", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.UNTAGGED_SPAWNER.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType spawnData = root.getMap("SpawnData"); + if (spawnData != null) { + final MapType wrapped = Types.NBT.createEmptyMap(); + root.setMap("SpawnData", wrapped); + + wrapped.setMap("entity", spawnData); + } + + final ListType spawnPotentials = root.getList("SpawnPotentials", ObjectType.MAP); + if (spawnPotentials != null) { + for (int i = 0, len = spawnPotentials.size(); i < len; ++i) { + final MapType spawnPotential = spawnPotentials.getMap(i); + + // new format of weighted list (SpawnPotentials): + // root.data -> data + // root.weight -> weight + + final MapType entity = spawnPotential.getMap("Entity"); + final int weight = spawnPotential.getInt("Weight", 1); + spawnPotential.remove("Entity"); + spawnPotential.remove("Weight"); + spawnPotential.setInt("weight", weight); + + final MapType data = Types.NBT.createEmptyMap(); + spawnPotential.setMap("data", data); + + data.setMap("entity", entity); + } + } + + return null; + } + }); + } + + private V2831() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java new file mode 100644 index 0000000000000000000000000000000000000000..53f8474cdd9331d1cc293c360d3f4f14640eedd3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java @@ -0,0 +1,917 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import com.mojang.logging.LogUtils; +import it.unimi.dsi.fastutil.ints.Int2IntLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntIterator; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.slf4j.Logger; +import java.util.Arrays; +import java.util.BitSet; +import java.util.HashSet; +import java.util.Set; + +public final class V2832 { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static final int VERSION = MCVersions.V1_17_1 + 102; + + private static final String[] BIOMES_BY_ID = new String[256]; // rip datapacks + static { + BIOMES_BY_ID[0] = "minecraft:ocean"; + BIOMES_BY_ID[1] = "minecraft:plains"; + BIOMES_BY_ID[2] = "minecraft:desert"; + BIOMES_BY_ID[3] = "minecraft:mountains"; + BIOMES_BY_ID[4] = "minecraft:forest"; + BIOMES_BY_ID[5] = "minecraft:taiga"; + BIOMES_BY_ID[6] = "minecraft:swamp"; + BIOMES_BY_ID[7] = "minecraft:river"; + BIOMES_BY_ID[8] = "minecraft:nether_wastes"; + BIOMES_BY_ID[9] = "minecraft:the_end"; + BIOMES_BY_ID[10] = "minecraft:frozen_ocean"; + BIOMES_BY_ID[11] = "minecraft:frozen_river"; + BIOMES_BY_ID[12] = "minecraft:snowy_tundra"; + BIOMES_BY_ID[13] = "minecraft:snowy_mountains"; + BIOMES_BY_ID[14] = "minecraft:mushroom_fields"; + BIOMES_BY_ID[15] = "minecraft:mushroom_field_shore"; + BIOMES_BY_ID[16] = "minecraft:beach"; + BIOMES_BY_ID[17] = "minecraft:desert_hills"; + BIOMES_BY_ID[18] = "minecraft:wooded_hills"; + BIOMES_BY_ID[19] = "minecraft:taiga_hills"; + BIOMES_BY_ID[20] = "minecraft:mountain_edge"; + BIOMES_BY_ID[21] = "minecraft:jungle"; + BIOMES_BY_ID[22] = "minecraft:jungle_hills"; + BIOMES_BY_ID[23] = "minecraft:jungle_edge"; + BIOMES_BY_ID[24] = "minecraft:deep_ocean"; + BIOMES_BY_ID[25] = "minecraft:stone_shore"; + BIOMES_BY_ID[26] = "minecraft:snowy_beach"; + BIOMES_BY_ID[27] = "minecraft:birch_forest"; + BIOMES_BY_ID[28] = "minecraft:birch_forest_hills"; + BIOMES_BY_ID[29] = "minecraft:dark_forest"; + BIOMES_BY_ID[30] = "minecraft:snowy_taiga"; + BIOMES_BY_ID[31] = "minecraft:snowy_taiga_hills"; + BIOMES_BY_ID[32] = "minecraft:giant_tree_taiga"; + BIOMES_BY_ID[33] = "minecraft:giant_tree_taiga_hills"; + BIOMES_BY_ID[34] = "minecraft:wooded_mountains"; + BIOMES_BY_ID[35] = "minecraft:savanna"; + BIOMES_BY_ID[36] = "minecraft:savanna_plateau"; + BIOMES_BY_ID[37] = "minecraft:badlands"; + BIOMES_BY_ID[38] = "minecraft:wooded_badlands_plateau"; + BIOMES_BY_ID[39] = "minecraft:badlands_plateau"; + BIOMES_BY_ID[40] = "minecraft:small_end_islands"; + BIOMES_BY_ID[41] = "minecraft:end_midlands"; + BIOMES_BY_ID[42] = "minecraft:end_highlands"; + BIOMES_BY_ID[43] = "minecraft:end_barrens"; + BIOMES_BY_ID[44] = "minecraft:warm_ocean"; + BIOMES_BY_ID[45] = "minecraft:lukewarm_ocean"; + BIOMES_BY_ID[46] = "minecraft:cold_ocean"; + BIOMES_BY_ID[47] = "minecraft:deep_warm_ocean"; + BIOMES_BY_ID[48] = "minecraft:deep_lukewarm_ocean"; + BIOMES_BY_ID[49] = "minecraft:deep_cold_ocean"; + BIOMES_BY_ID[50] = "minecraft:deep_frozen_ocean"; + BIOMES_BY_ID[127] = "minecraft:the_void"; + BIOMES_BY_ID[129] = "minecraft:sunflower_plains"; + BIOMES_BY_ID[130] = "minecraft:desert_lakes"; + BIOMES_BY_ID[131] = "minecraft:gravelly_mountains"; + BIOMES_BY_ID[132] = "minecraft:flower_forest"; + BIOMES_BY_ID[133] = "minecraft:taiga_mountains"; + BIOMES_BY_ID[134] = "minecraft:swamp_hills"; + BIOMES_BY_ID[140] = "minecraft:ice_spikes"; + BIOMES_BY_ID[149] = "minecraft:modified_jungle"; + BIOMES_BY_ID[151] = "minecraft:modified_jungle_edge"; + BIOMES_BY_ID[155] = "minecraft:tall_birch_forest"; + BIOMES_BY_ID[156] = "minecraft:tall_birch_hills"; + BIOMES_BY_ID[157] = "minecraft:dark_forest_hills"; + BIOMES_BY_ID[158] = "minecraft:snowy_taiga_mountains"; + BIOMES_BY_ID[160] = "minecraft:giant_spruce_taiga"; + BIOMES_BY_ID[161] = "minecraft:giant_spruce_taiga_hills"; + BIOMES_BY_ID[162] = "minecraft:modified_gravelly_mountains"; + BIOMES_BY_ID[163] = "minecraft:shattered_savanna"; + BIOMES_BY_ID[164] = "minecraft:shattered_savanna_plateau"; + BIOMES_BY_ID[165] = "minecraft:eroded_badlands"; + BIOMES_BY_ID[166] = "minecraft:modified_wooded_badlands_plateau"; + BIOMES_BY_ID[167] = "minecraft:modified_badlands_plateau"; + BIOMES_BY_ID[168] = "minecraft:bamboo_jungle"; + BIOMES_BY_ID[169] = "minecraft:bamboo_jungle_hills"; + BIOMES_BY_ID[170] = "minecraft:soul_sand_valley"; + BIOMES_BY_ID[171] = "minecraft:crimson_forest"; + BIOMES_BY_ID[172] = "minecraft:warped_forest"; + BIOMES_BY_ID[173] = "minecraft:basalt_deltas"; + BIOMES_BY_ID[174] = "minecraft:dripstone_caves"; + BIOMES_BY_ID[175] = "minecraft:lush_caves"; + BIOMES_BY_ID[177] = "minecraft:meadow"; + BIOMES_BY_ID[178] = "minecraft:grove"; + BIOMES_BY_ID[179] = "minecraft:snowy_slopes"; + BIOMES_BY_ID[180] = "minecraft:snowcapped_peaks"; + BIOMES_BY_ID[181] = "minecraft:lofty_peaks"; + BIOMES_BY_ID[182] = "minecraft:stony_peaks"; + } + + private static final String[] HEIGHTMAP_TYPES = new String[] { + "WORLD_SURFACE_WG", + "WORLD_SURFACE", + "WORLD_SURFACE_IGNORE_SNOW", + "OCEAN_FLOOR_WG", + "OCEAN_FLOOR", + "MOTION_BLOCKING", + "MOTION_BLOCKING_NO_LEAVES" + }; + + private static final Set 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); + + WalkerUtils.convertListPath(MCTypeRegistry.BLOCK_NAME, settings, "layers", "block", fromVersion, toVersion); + + break; + } + case "minecraft:noise": { + final MapType settings = generator.getMap("settings"); + if (settings != null) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_block", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, settings, "default_fluid", fromVersion, toVersion); + } + + final MapType biomeSource = generator.getMap("biome_source"); + if (biomeSource != null) { + final String biomeSourceType = biomeSource.getString("type", ""); + switch (biomeSourceType) { + case "minecraft:fixed": { + WalkerUtils.convert(MCTypeRegistry.BIOME, biomeSource, "biome", fromVersion, toVersion); + break; + } + + case "minecraft:multi_noise": { + WalkerUtils.convert(MCTypeRegistry.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST, biomeSource, "preset", fromVersion, toVersion); + + // Vanilla's schema is _still_ wrong. It should be DSL.fields("biomes", DSL.list(DSL.fields("biome"))) + // But it just contains the list part. That obviously can never be the case, because + // the root object is a compound, not a list. + WalkerUtils.convertListPath(MCTypeRegistry.BIOME, biomeSource, "biomes", "biome", fromVersion, toVersion); + break; + } + + case "minecraft:checkerboard": { + WalkerUtils.convertList(MCTypeRegistry.BIOME, biomeSource, "biomes", fromVersion, toVersion); + break; + } + } + } + + break; + } + } + } + + return null; + }); + + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion); + + final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP); + if (tileTicks != null) { + for (int i = 0, len = tileTicks.size(); i < len; ++i) { + final MapType tileTick = tileTicks.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion); + } + } + + final ListType sections = level.getList("Sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + WalkerUtils.convertList(MCTypeRegistry.BIOME, section.getMap("biomes"), "palette", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section.getMap("block_states"), "palette", fromVersion, toVersion); + } + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, level.getMap("Structures"), "Starts", fromVersion, toVersion); + + return null; + }); + } + + private static void predictChunkStatusBeforeSurface(final MapType level, final Set chunkBlocks) { + final String status = level.getString("Status", "empty"); + if (STATUS_IS_OR_AFTER_SURFACE.contains(status)) { + return; + } + + chunkBlocks.remove("minecraft:air"); + final boolean chunkNotEmpty = !chunkBlocks.isEmpty(); + chunkBlocks.removeAll(BLOCKS_BEFORE_FEATURE_STATUS); + final boolean chunkFeatureStatus = !chunkBlocks.isEmpty(); + + final String update; + if (chunkFeatureStatus) { + update = "liquid_carvers"; + } else if (!"noise".equals(status) && !chunkNotEmpty) { + update = "biomes".equals(status) ? "structure_references" : status; + } else { + update = "noise"; + } + + level.setString("Status", update); + } + + private static MapType getEmptyBlockPalette() { + final MapType airBlockState = Types.NBT.createEmptyMap(); + airBlockState.setString("Name", "minecraft:air"); + + final ListType emptyBlockPalette = Types.NBT.createEmptyList(); + emptyBlockPalette.addMap(airBlockState); + + return V2832.wrapPalette(emptyBlockPalette); + } + + private static void shiftUpgradeData(final MapType upgradeData, final int shift) { + if (upgradeData == null) { + return; + } + + final MapType indices = upgradeData.getMap("Indices"); + if (indices == null) { + return; + } + + RenameHelper.renameKeys(indices, (final String input) -> { + return Integer.toString(Integer.parseInt(input) + shift); + }); + } + + private static void updateChunkData(final MapType level, final boolean wantExtendedHeight, final boolean isAlreadyExtended, + final boolean onNoiseGenerator, final V2841.SimplePaletteReader bottomSection) { + level.remove("Biomes"); + if (!wantExtendedHeight) { + padCarvingMasks(level, 16, 0); + return; + } + + if (isAlreadyExtended) { + padCarvingMasks(level, 24, 0); + return; + } + + offsetHeightmaps(level); + // Difference from DFU: Still convert the Lights data. Just because it's being removed in a later version doesn't mean + // that it should be removed here. + // Generally, converters act only on the current version to bring it to the next. This principle allows the converter + // for the next version to assume that it acts on its current version, not some in-between of the current version + // and some future version that did not exist at the time it was written. This allows converters to be written and tested + // only with knowledge of the current version and the next version. + addEmptyListPadding(level, "Lights"); + addEmptyListPadding(level, "LiquidsToBeTicked"); + addEmptyListPadding(level, "PostProcessing"); + addEmptyListPadding(level, "ToBeTicked"); + shiftUpgradeData(level.getMap("UpgradeData"), 4); // https://bugs.mojang.com/browse/MC-238076 - fixed now, Mojang fix is identical. No change required. + padCarvingMasks(level, 24, 4); + + if (!onNoiseGenerator) { + return; + } + + final String status = level.getString("Status"); + if (status == null || "empty".equals(status)) { + return; + } + + final MapType blendingData = Types.NBT.createEmptyMap(); + level.setMap("blending_data", blendingData); + + blendingData.setBoolean("old_noise", STATUS_IS_OR_AFTER_NOISE.contains(status)); + + if (bottomSection == null) { + return; + } + + final BitSet missingBedrock = new BitSet(256); + boolean hasBedrock = status.equals("noise"); + + for (int z = 0; z <= 15; ++z) { + for (int x = 0; x <= 15; ++x) { + final MapType state = bottomSection.getState(x, 0, z); + final String blockId = V2841.getBlockId(state); + final boolean isBedrock = state != null && "minecraft:bedrock".equals(blockId); + final boolean isAir = state != null && "minecraft:air".equals(blockId); + if (isAir) { + missingBedrock.set((z << 4) | x); + } + + hasBedrock |= isBedrock; + } + } + + if (hasBedrock && missingBedrock.cardinality() != missingBedrock.size()) { + final String targetStatus = "full".equals(status) ? "heightmaps" : status; + + final MapType belowZeroRetrogen = Types.NBT.createEmptyMap(); + level.setMap("below_zero_retrogen", belowZeroRetrogen); + + belowZeroRetrogen.setString("target_status", targetStatus); + belowZeroRetrogen.setLongs("missing_bedrock", missingBedrock.toLongArray()); + + level.setString("Status", "empty"); + } + + level.setBoolean("isLightOn", false); + } + + private static void padCarvingMasks(final MapType level, final int newSize, final int offset) { + final MapType carvingMasks = level.getMap("CarvingMasks"); + if (carvingMasks == null) { + // if empty, DFU still writes + level.setMap("CarvingMasks", Types.NBT.createEmptyMap()); + return; + } + + for (final String key : carvingMasks.keys()) { + final long[] old = BitSet.valueOf(carvingMasks.getBytes(key)).toLongArray(); + final long[] newVal = new long[64 * newSize]; + + System.arraycopy(old, 0, newVal, 64 * offset, old.length); + + carvingMasks.setLongs(key, newVal); // no CME: key exists already + } + } + + private static void addEmptyListPadding(final MapType level, final String path) { + ListType list = level.getListUnchecked(path); + if (list != null && list.size() == 24) { + return; + } + + if (list == null) { + // difference from DFU: Don't create the damn thing! + return; + } + + + // offset the section array to the new format + for (int i = 0; i < 4; ++i) { + // always create new copies, so that modifying one doesn't modify ALL of them! + list.addList(0, Types.NBT.createEmptyList()); // add below + list.addList(Types.NBT.createEmptyList()); // add above + } + } + + private static void offsetHeightmaps(final MapType level) { + final MapType heightmaps = level.getMap("Heightmaps"); + if (heightmaps == null) { + return; + } + + for (final String key : HEIGHTMAP_TYPES) { + offsetHeightmap(heightmaps.getLongs(key)); + } + } + + private static void offsetHeightmap(final long[] heightmap) { + if (heightmap == null) { + return; + } + + // heightmaps are configured to have 9 bits per value, with 256 total values + // heightmaps are also relative to the lowest position + for (int idx = 0, len = heightmap.length; idx < len; ++idx) { + long curr = heightmap[idx]; + long next = 0L; + + for (int objIdx = 0; objIdx + 9 <= 64; objIdx += 9) { + final long value = (curr >> objIdx) & 511L; + if (value != 0L) { + final long offset = Math.min(511L, value + 64L); + + next |= (offset << objIdx); + } + } + + heightmap[idx] = next; + } + } + + private static MapType[] createBiomeSections(final MapType level, final boolean wantExtendedHeight, + final int minSection, final MutableBoolean isAlreadyExtended) { + final MapType[] ret = new MapType[wantExtendedHeight ? 24 : 16]; + + final int[] biomes = level.getInts("Biomes"); + + if (biomes != null && biomes.length == 1536) { // magic value for 24 sections of biomes (24 * 4^3) + isAlreadyExtended.setValue(true); + for (int sectionIndex = 0; sectionIndex < 24; ++sectionIndex) { + ret[sectionIndex] = createBiomeSection(biomes, sectionIndex * 64, -1); // -1 is all 1s + } + } else if (biomes != null && biomes.length == 1024) { // magic value for 24 sections of biomes (16 * 4^3) + for (int sectionY = 0; sectionY < 16; ++sectionY) { + ret[sectionY - minSection] = createBiomeSection(biomes, sectionY * 64, -1); // -1 is all 1s + } + + if (wantExtendedHeight) { + // must set the new sections at top and bottom + final MapType bottomCopy = createBiomeSection(biomes, 0, 15); // just want the biomes at y = 0 + final MapType topCopy = createBiomeSection(biomes, 1008, 15); // just want the biomes at y = 252 + + for (int sectionIndex = 0; sectionIndex < 4; ++sectionIndex) { + ret[sectionIndex] = bottomCopy.copy(); // copy palette so that later possible modifications don't trash all sections + } + + for (int sectionIndex = 20; sectionIndex < 24; ++sectionIndex) { + ret[sectionIndex] = topCopy.copy(); // copy palette so that later possible modifications don't trash all sections + } + } + } else { + final ListType palette = Types.NBT.createEmptyList(); + palette.addString("minecraft:plains"); + + for (int i = 0; i < ret.length; ++i) { + ret[i] = wrapPalette(palette.copy()); // copy palette so that later possible modifications don't trash all sections + } + } + + return ret; + } + + private static MapType createBiomeSection(final int[] biomes, final int offset, final int mask) { + final Int2IntLinkedOpenHashMap paletteId = new Int2IntLinkedOpenHashMap(); + + for (int idx = 0; idx < 64; ++idx) { + final int biome = biomes[offset + (idx & mask)]; + paletteId.putIfAbsent(biome, paletteId.size()); + } + + final ListType paletteString = Types.NBT.createEmptyList(); + for (final IntIterator iterator = paletteId.keySet().iterator(); iterator.hasNext();) { + final int biomeId = iterator.nextInt(); + final String biome = biomeId >= 0 && biomeId < BIOMES_BY_ID.length ? BIOMES_BY_ID[biomeId] : null; + paletteString.addString(biome == null ? "minecraft:plains" : biome); + } + + final int bitsPerObject = ceilLog2(paletteString.size()); + if (bitsPerObject == 0) { + return wrapPalette(paletteString); + } + + // manually create packed integer data + final int objectsPerValue = 64 / bitsPerObject; + final long[] packed = new long[(64 + objectsPerValue - 1) / objectsPerValue]; + + int shift = 0; + int idx = 0; + long curr = 0; + + for (int biome_idx = 0; biome_idx < 64; ++biome_idx) { + final int biome = biomes[offset + (biome_idx & mask)]; + + curr |= ((long)paletteId.get(biome)) << shift; + + shift += bitsPerObject; + + if (shift + bitsPerObject > 64) { // will next write overflow? + // must move to next idx + packed[idx++] = curr; + shift = 0; + curr = 0L; + } + } + + // don't forget to write the last one + if (shift != 0) { + packed[idx] = curr; + } + + return wrapPalette(paletteString, packed); + } + + private static MapType wrapPalette(final ListType palette) { + return wrapPalette(palette, null); + } + + private static MapType wrapPalette(final ListType palette, final long[] blockStates) { + final MapType ret = Types.NBT.createEmptyMap(); + ret.setList("palette", palette); + if (blockStates != null) { + ret.setLongs("data", blockStates); + } + + return ret; + } + + private static MapType wrapPaletteOptimised(final ListType palette, final long[] blockStates) { + if (palette.size() == 1) { + return wrapPalette(palette); + } + + return wrapPalette(palette, blockStates); + } + + public static int ceilLog2(final int value) { + return value == 0 ? 0 : Integer.SIZE - Integer.numberOfLeadingZeros(value - 1); // see doc of numberOfLeadingZeros + } + + private static void updateLayers(final ListType layers) { + if (layers == null) { + return; + } + + layers.addMap(0, createEmptyLayer()); // add at the bottom + } + + private static MapType createEmptyLayer() { + final MapType ret = Types.NBT.createEmptyMap(); + ret.setInt("height", 64); + ret.setString("block", "minecraft:air"); + + return ret; + } + + private V2832() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2833.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2833.java new file mode 100644 index 0000000000000000000000000000000000000000..0db6fcec914d25680ac936cfb67a22f950b66d47 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2833.java @@ -0,0 +1,31 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2833 { + + private static final int VERSION = MCVersions.V1_17_1 + 103; + + public static void register() { + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType dimensions = data.getMap("dimensions"); + + for (final String dimensionKey : dimensions.keys()) { + final MapType dimension = dimensions.getMap(dimensionKey); + if (!dimension.hasKey("type")) { + throw new IllegalStateException("Unable load old custom worlds."); + } + } + + return null; + } + }); + } + + private V2833() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2838.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2838.java new file mode 100644 index 0000000000000000000000000000000000000000..356963228d884a0a74e6d7c9922b4ced627bbfb0 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2838.java @@ -0,0 +1,62 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V2838 { + + private static final int VERSION = MCVersions.V21W40A; + + public static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V2841.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2841.java new file mode 100644 index 0000000000000000000000000000000000000000..52ae7b4dbd1387327cb709c5939fa55cf1f10f7c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2841.java @@ -0,0 +1,210 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import ca.spottedleaf.dataconverter.util.IntegerUtil; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public final class V2841 { + + private static final int VERSION = MCVersions.V21W42A + 1; + + private static final Set 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/ca/spottedleaf/dataconverter/minecraft/versions/V2842.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2842.java new file mode 100644 index 0000000000000000000000000000000000000000..82581d4d4f68842a7def842c50dd94980064e14f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2842.java @@ -0,0 +1,78 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V2842 { + + private static final int VERSION = MCVersions.V21W42A + 2; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType level = root.getMap("Level"); + root.remove("Level"); + + if (!root.isEmpty()) { + for (final String key : root.keys()) { + if (level.hasKey(key)) { + // Don't clobber Level's data + continue; + } + level.setGeneric(key, root.getGeneric(key)); + } + } + + // Rename top level first + RenameHelper.renameSingle(level, "TileEntities", "block_entities"); + RenameHelper.renameSingle(level, "TileTicks", "block_ticks"); + RenameHelper.renameSingle(level, "Entities", "entities"); + RenameHelper.renameSingle(level, "Sections", "sections"); + RenameHelper.renameSingle(level, "Structures", "structures"); + + // 2nd level + final MapType structures = level.getMap("structures"); + if (structures != null) { + RenameHelper.renameSingle(structures, "Starts", "starts"); + } + + return level; // Level is now root tag. + } + }); + + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, data, "block_entities", fromVersion, toVersion); + + final ListType blockTicks = data.getList("block_ticks", ObjectType.MAP); + if (blockTicks != null) { + for (int i = 0, len = blockTicks.size(); i < len; ++i) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, blockTicks.getMap(i), "i", fromVersion, toVersion); + } + } + + final ListType sections = data.getList("sections", ObjectType.MAP); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + WalkerUtils.convertList(MCTypeRegistry.BIOME, section.getMap("biomes"), "palette", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section.getMap("block_states"), "palette", fromVersion, toVersion); + } + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data.getMap("structures"), "starts", fromVersion, toVersion); + + return null; + }); + } + + private V2842() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java new file mode 100644 index 0000000000000000000000000000000000000000..c3e916a84e67d3d9243e5be2ea6985edd17c7151 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2843.java @@ -0,0 +1,101 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import java.util.HashMap; +import java.util.Map; + +public final class V2843 { + + private static final int VERSION = MCVersions.V21W42A + 3; + + public static void register() { + ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.BIOME, + new HashMap<>( + Map.of("minecraft:deep_warm_ocean", "minecraft:warm_ocean") + )::get + ); + + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + private static void moveOutOfBoundTicks(final ListType ticks, final MapType chunkRoot, final int chunkX, final int chunkZ, final String intoKey) { + if (ticks == null) { + return; + } + + ListType outOfBounds = null; + for (int i = 0, len = ticks.size(); i < len; ++i) { + final MapType tick = ticks.getMap(i); + final int x = tick.getInt("x"); + final int z = tick.getInt("z"); + // anything > 1 is lost, anything less than 1 stays. + if (Math.max(Math.abs(chunkX - (x >> 4)), Math.abs(chunkZ - (z >> 4))) == 1) { + // DFU doesn't remove, so neither do we. + if (outOfBounds == null) { + outOfBounds = Types.NBT.createEmptyList(); + } + outOfBounds.addMap(tick.copy()); + } + } + + if (outOfBounds != null) { + MapType upgradeData = chunkRoot.getMap("UpgradeData"); + if (upgradeData == null) { + chunkRoot.setMap("UpgradeData", upgradeData = Types.NBT.createEmptyMap()); + } + upgradeData.setList(intoKey, outOfBounds); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // After renames, so use new names + final int x = data.getInt("xPos"); + final int z = data.getInt("zPos"); + + moveOutOfBoundTicks(data.getList("block_ticks", ObjectType.MAP), data, x, z, "neighbor_block_ticks"); + moveOutOfBoundTicks(data.getList("fluid_ticks", ObjectType.MAP), data, x, z, "neighbor_fluid_ticks"); + + return null; + } + }); + + // DFU is missing schema for UpgradeData block names + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, data, "block_entities", fromVersion, toVersion); + + WalkerUtils.convertListPath(MCTypeRegistry.BLOCK_NAME, data, "block_ticks", "i", fromVersion, toVersion); + + // Even though UpgradeData will retrieve the block from the World when the type no longer exists, + // the type from the world may not match what was actually queued. So, even though it may look like we + // can skip the walker here, we actually don't if we want to be thorough. + WalkerUtils.convertListPath(MCTypeRegistry.BLOCK_NAME, data.getMap("UpgradeData"), "neighbor_block_ticks", "i", fromVersion, toVersion); + + final ListType sections = data.getListUnchecked("sections"); + if (sections != null) { + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i, null); + if (section == null) { + continue; + } + + WalkerUtils.convertList(MCTypeRegistry.BIOME, section.getMap("biomes"), "palette", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, section.getMap("block_states"), "palette", fromVersion, toVersion); + } + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data.getMap("structures"), "starts", fromVersion, toVersion); + + return null; + }); + } + + private V2843() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2846.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2846.java new file mode 100644 index 0000000000000000000000000000000000000000..e32224267d53d82ba15942141a5cb7a19eb380f2 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2846.java @@ -0,0 +1,23 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V2846 { + + private static final int VERSION = MCVersions.V21W44A + 1; + + public static void register() { + ConverterAbstractAdvancementsRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:husbandry/play_jukebox_in_meadows", "minecraft:adventure/play_jukebox_in_meadows", + "minecraft:adventure/caves_and_cliff", "minecraft:adventure/fall_from_world_height", + "minecraft:adventure/ride_strider_in_overworld_lava", "minecraft:nether/ride_strider_in_overworld_lava" + ) + )::get); + } + + private V2846() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2852.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2852.java new file mode 100644 index 0000000000000000000000000000000000000000..843e54be50563a647c946ca032a59a8606f0a246 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2852.java @@ -0,0 +1,31 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2852 { + + private static final int VERSION = MCVersions.V1_18_PRE5 + 1; + + public static void register() { + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType dimensions = data.getMap("dimensions"); + + for (final String dimensionKey : dimensions.keys()) { + final MapType dimension = dimensions.getMap(dimensionKey); + if (!dimension.hasKey("type")) { + throw new IllegalStateException("Unable load old custom worlds."); + } + } + + return null; + } + }); + } + + private V2852() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2967.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2967.java new file mode 100644 index 0000000000000000000000000000000000000000..9f5771a22c25d4c37a7c6181e9f81151bb6fe7aa --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2967.java @@ -0,0 +1,58 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V2967 { + + private static final int VERSION = MCVersions.V22W05A; + + public static void register() { + MCTypeRegistry.WORLD_GEN_SETTINGS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType dimensions = data.getMap("dimensions"); + + if (dimensions == null) { + return null; + } + + for (final String dimension : dimensions.keys()) { + final MapType dimensionData = dimensions.getMap(dimension); + if (dimensionData == null) { + continue; + } + + final MapType generator = dimensionData.getMap("generator"); + if (generator == null) { + continue; + } + + final MapType settings = generator.getMap("settings"); + if (settings == null) { + continue; + } + + final MapType structures = settings.getMap("structures"); + if (structures == null) { + continue; + } + + for (final String structureKey : structures.keys()) { + structures.getMap(structureKey).setString("type", "minecraft:random_spread"); + } + + final MapType stronghold = structures.getMap("stronghold"); + stronghold.setString("type", "minecraft:concentric_rings"); + structures.setMap("minecraft:stronghold", stronghold.copy()); + } + + return null; + } + }); + } + + private V2967() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V2970.java b/ca/spottedleaf/dataconverter/minecraft/versions/V2970.java new file mode 100644 index 0000000000000000000000000000000000000000..9dab902eb5c2d581516c6fab9afa579997c2faa6 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V2970.java @@ -0,0 +1,209 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import com.google.common.collect.ImmutableMap; +import com.mojang.logging.LogUtils; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import org.slf4j.Logger; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public final class V2970 { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static final int VERSION = MCVersions.V22W07A + 1; + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V3077.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3077.java new file mode 100644 index 0000000000000000000000000000000000000000..61d77841d0ce4ecb22922c8777886917ac54e39f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3077.java @@ -0,0 +1,40 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V3077 { + + private static final int VERSION = MCVersions.V1_18_2 + 102; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final boolean isLightOn = data.getBoolean("isLightOn"); + if (isLightOn) { + return null; + } + + final ListType sections = data.getList("sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + section.remove("BlockLight"); + section.remove("SkyLight"); + } + + return null; + } + }); + } + + private V3077() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java new file mode 100644 index 0000000000000000000000000000000000000000..e7e13f2b60c80a04749763e05875212655ff42cf --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3078.java @@ -0,0 +1,19 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.game_event.GameEventListenerWalker; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; + +public final class V3078 { + + private static final int VERSION = MCVersions.V1_18_2 + 103; + + public static void register() { + //registerMob("minecraft:frog"); // changed to simple in 1.21.5 + //registerMob("minecraft:tadpole"); // changed to simple in 1.21.5 + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:sculk_shrieker", new GameEventListenerWalker()); + } + + private V3078() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3081.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3081.java new file mode 100644 index 0000000000000000000000000000000000000000..776b0f7d507e8fa7f62f25bd251c97c86eea3961 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3081.java @@ -0,0 +1,17 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.game_event.GameEventListenerWalker; + +public final class V3081 { + + private static final int VERSION = MCVersions.V22W11A + 1; + + public static void register() { + //registerMob("minecraft:warden"); // changed to simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:warden", new GameEventListenerWalker()); + } + + private V3081() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3082.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3082.java new file mode 100644 index 0000000000000000000000000000000000000000..79768b25a32a5333f8cb6ec6e8c422478a6891df --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3082.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; + +public final class V3082 { + + private static final int VERSION = MCVersions.V22W11A + 2; + + public static void register() { + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:chest_boat", new DataWalkerItemLists("Items")); + } + + private V3082() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java new file mode 100644 index 0000000000000000000000000000000000000000..35df14855a519c6bed1bc01f6b2bda491bf29441 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3083.java @@ -0,0 +1,19 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.game_event.GameEventListenerWalker; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; + +public final class V3083 { + + private static final int VERSION = MCVersions.V22W12A + 1; + + public static void register() { + //registerMob("minecraft:allay"); // changed to simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:allay", new DataWalkerItemLists("Inventory")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:allay", new GameEventListenerWalker()); + } + + private V3083() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3084.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3084.java new file mode 100644 index 0000000000000000000000000000000000000000..6a096226995e89285054b4ab35ed3e14ae4da694 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3084.java @@ -0,0 +1,42 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V3084 { + + private static final int VERSION = MCVersions.V22W12A + 2; + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V3086.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3086.java new file mode 100644 index 0000000000000000000000000000000000000000..f06412a417ba12111c9e8f30b747ed3ad6dcbcb6 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3086.java @@ -0,0 +1,54 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterCriteriaRename; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterEntityToVariant; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import com.google.common.collect.ImmutableMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import java.util.HashMap; +import java.util.Map; + +public final class V3086 { + + private static final int VERSION = MCVersions.V22W13A + 1; + + private static final Int2ObjectOpenHashMap 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/ca/spottedleaf/dataconverter/minecraft/versions/V3087.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3087.java new file mode 100644 index 0000000000000000000000000000000000000000..b296229502491b54f6352ee1f9db0023296b36ec --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3087.java @@ -0,0 +1,24 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterEntityToVariant; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public final class V3087 { + + private static final int VERSION = MCVersions.V22W13A + 2; + + private static final Int2ObjectOpenHashMap FROG_ID_CONVERSION = new Int2ObjectOpenHashMap<>(); + static { + FROG_ID_CONVERSION.put(0, "minecraft:temperate"); + FROG_ID_CONVERSION.put(1, "minecraft:warm"); + FROG_ID_CONVERSION.put(2, "minecraft:cold"); + } + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:frog", new ConverterEntityToVariant(VERSION, "Variant", FROG_ID_CONVERSION::get)); + } + + private V3087() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3088.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3088.java new file mode 100644 index 0000000000000000000000000000000000000000..2752dfd1a7ff896e2ed736846980da5adde6e657 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3088.java @@ -0,0 +1,25 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterAddBlendingData; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V3088 { + + // this class originally targeted 3079 but was changed to target a later version without changing the converter, zero clue why + // this class then targeted 3088 but was changed to target 3441 + // to maintain integrity of the data version, I chose to extract the converter to a separate class and use it in both versions + // the reason it is important to never change old converters once released is that it creates _two_ versions under the same id. + // Consider the case where a user force upgrades their world, but does not load the chunk. Then, consider the case where + // the user does not force upgrade their world. Then, Mojang comes along and makes a decision like this and now both + // players load the chunk - they went through a different conversion process, which ultimately creates two versions. + // Unfortunately this fix doesn't exactly resolve it, as anyone running Mojang's converters will now be different + // from DataConverter's. It's broadly a dumb situation all around that could be avoided if Mojang wasn't being careless here. + private static final int VERSION = MCVersions.V22W14A; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new ConverterAddBlendingData(VERSION)); + } + + private V3088() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3090.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3090.java new file mode 100644 index 0000000000000000000000000000000000000000..e9ad7b4f734ae2c1a19d7a0c5dd7a3cca0e4084f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3090.java @@ -0,0 +1,25 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3090 { + + private static final int VERSION = MCVersions.V22W15A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:painting", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Motive", "variant"); + RenameHelper.renameSingle(data, "Facing", "facing"); + return null; + } + }); + } + + private V3090() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3093.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3093.java new file mode 100644 index 0000000000000000000000000000000000000000..c1cb70feb6815eebe2d2b547cf75841837332240 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3093.java @@ -0,0 +1,24 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3093 { + + private static final int VERSION = MCVersions.V22W17A; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:goat", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setBoolean("HasLeftHorn", true); + data.setBoolean("HasRightHorn", true); + return null; + } + }); + } + + private V3093() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3094.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3094.java new file mode 100644 index 0000000000000000000000000000000000000000..a856d65f411b3fe91eebb429a7dab58dff9520ba --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3094.java @@ -0,0 +1,44 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3094 { + + private static final int VERSION = MCVersions.V22W17A + 1; + + private static final String[] SOUND_VARIANT_TO_INSTRUMENT = new String[] { + "minecraft:ponder_goat_horn", + "minecraft:sing_goat_horn", + "minecraft:seek_goat_horn", + "minecraft:feel_goat_horn", + "minecraft:admire_goat_horn", + "minecraft:call_goat_horn", + "minecraft:yearn_goat_horn", + "minecraft:dream_goat_horn" + }; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:goat_horn", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + + if (tag == null) { + return null; + } + + final int soundVariant = tag.getInt("SoundVariant"); + tag.remove("SoundVariant"); + + tag.setString("instrument", SOUND_VARIANT_TO_INSTRUMENT[soundVariant < 0 || soundVariant >= SOUND_VARIANT_TO_INSTRUMENT.length ? 0 : soundVariant]); + + return null; + } + }); + } + + private V3094() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3097.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3097.java new file mode 100644 index 0000000000000000000000000000000000000000..a86aee0c6acd1afeb647df4c8d27c333a78f1c47 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3097.java @@ -0,0 +1,63 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterCriteriaRename; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterEntityVariantRename; +import ca.spottedleaf.dataconverter.minecraft.converters.poi.ConverterPoiDelete; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public final class V3097 { + + private static final int VERSION = MCVersions.V22W19A + 1; + + public static void register() { + final DataConverter 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/ca/spottedleaf/dataconverter/minecraft/versions/V3108.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3108.java new file mode 100644 index 0000000000000000000000000000000000000000..7393cf136f6753c3d58bdd33d5087a2dc0de7db3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3108.java @@ -0,0 +1,29 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3108 { + + private static final int VERSION = MCVersions.V1_19_1_PRE1 + 1; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType context = data.getMap("__context"); + if ("minecraft:overworld".equals(context == null ? null : context.getString("dimension"))) { + return null; + } + + data.remove("blending_data"); + + return null; + } + }); + } + + private V3108() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3201.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3201.java new file mode 100644 index 0000000000000000000000000000000000000000..bd4b0f27e73e2ea26e1fa2237061055e8a7ded82 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3201.java @@ -0,0 +1,35 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3201 { + + private static final int VERSION = MCVersions.V1_19_2 + 81; + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + private static void fixList(final MapType data, final String target) { + if (data == null) { + return; + } + final String curr = data.getString(target); + if (curr == null) { + return; + } + data.setString(target, curr.replace("\"programer_art\"", "\"programmer_art\"")); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + fixList(data, "resourcePacks"); + fixList(data, "incompatibleResourcePacks"); + return null; + } + }); + } + + private V3201() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3202.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3202.java new file mode 100644 index 0000000000000000000000000000000000000000..697b2fd839312f97877703a8d60b35c59c95ede3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3202.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V3202 { + + private static final int VERSION = MCVersions.V1_19_2 + 82; + + public static void register() { + V99.registerSign(VERSION, "minecraft:hanging_sign"); + } + + private V3202() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java new file mode 100644 index 0000000000000000000000000000000000000000..bc8339de34a9edb1396479d70e5e76757e0264f8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3203.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; + +public final class V3203 { + + private static final int VERSION = MCVersions.V1_19_2 + 83; + + public static void register() { + //registerMob("minecraft:camel"); // changed to simple in 1.21.5 + } + + private V3203() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3204.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3204.java new file mode 100644 index 0000000000000000000000000000000000000000..87053c0c1de258770e7630830307ab484915aad8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3204.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; + +public final class V3204 { + + private static final int VERSION = MCVersions.V1_19_2 + 84; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:chiseled_bookshelf", new DataWalkerItemLists("Items")); + } + + private V3204() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3209.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3209.java new file mode 100644 index 0000000000000000000000000000000000000000..85270a36c5f75b1c6be49e461b302c3339c95750 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3209.java @@ -0,0 +1,18 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterFlattenSpawnEgg; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V3209 { + + private static final int VERSION = MCVersions.V22W45A + 1; + + public static void register() { + // Note: This converter reads entity id from its sub data, but we need no breakpoint because entity ids are not + // remapped this version + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:pig_spawn_egg", new ConverterFlattenSpawnEgg(VERSION, 0)); + } + + private V3209() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3214.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3214.java new file mode 100644 index 0000000000000000000000000000000000000000..c7ef09ed0c145d0e5adef04e9e969c837904c5ce --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3214.java @@ -0,0 +1,30 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3214 { + + private static final int VERSION = MCVersions.V1_19_3_PRE3 + 1; + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String value = data.getString("ao"); + + if ("0".equals(value)) { + data.setString("ao", "false"); + } else if ("1".equals(value) || "2".equals(value)) { + data.setString("ao", "true"); + } + + return null; + } + }); + } + + private V3214() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3319.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3319.java new file mode 100644 index 0000000000000000000000000000000000000000..98944037c86cefb42f89674a2eb1abe20a90c800 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3319.java @@ -0,0 +1,23 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3319 { + + private static final int VERSION = MCVersions.V1_19_3 + 101; + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setString("onboardAccessibility", "false"); + return null; + } + }); + } + + private V3319() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3322.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3322.java new file mode 100644 index 0000000000000000000000000000000000000000..5e09176559a30272ef86754f29265afe686ea2ad --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3322.java @@ -0,0 +1,84 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +import java.util.HashSet; +import java.util.Set; + +public final class V3322 { + + private static final int VERSION = MCVersions.V23W04A + 1; + + private static final Set 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 entityEffectFix = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateEffectList(data, "Effects"); + updateEffectList(data, "ActiveEffects"); + updateEffectList(data, "CustomPotionEffects"); + return null; + } + }; + + MCTypeRegistry.PLAYER.addStructureConverter(entityEffectFix); + MCTypeRegistry.ENTITY.addStructureConverter(entityEffectFix); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + if (!EFFECT_ITEM_TYPES.contains(id)) { + return null; + } + + updateEffectList(data.getMap("tag"), "CustomPotionEffects"); + + return null; + } + }); + } + + private V3322() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3325.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3325.java new file mode 100644 index 0000000000000000000000000000000000000000..eeba493c110f645b8f95e8229a256a6b90e03e85 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3325.java @@ -0,0 +1,19 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; + +public final class V3325 { + + private static final int VERSION = MCVersions.V23W05A + 2; + + public static void register() { + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:item_display", new DataWalkerItems("item")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:block_display", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "block_state")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:text_display", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "text")); + } + + private V3325() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java new file mode 100644 index 0000000000000000000000000000000000000000..9e72885b5f7f15b3a02a99ab3fb054f7f6375aa8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3326.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; + +public final class V3326 { + + private static final int VERSION = MCVersions.V23W06A; + + public static void register() { + //registerMob("minecraft:sniffer"); // changed to simple in 1.21.5 + } + + private V3326() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3327.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3327.java new file mode 100644 index 0000000000000000000000000000000000000000..7051d4f01b6f43f3d435d21d65b83ba702ffda41 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3327.java @@ -0,0 +1,19 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerListPaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; + +public final class V3327 { + + private static final int VERSION = MCVersions.V23W06A + 1; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:decorated_pot", new DataWalkerListPaths<>(MCTypeRegistry.ITEM_NAME, "shards")); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:decorated_pot", new DataWalkerItems("item")); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:suspicious_sand", new DataWalkerItems("item")); + } + + private V3327() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3328.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3328.java new file mode 100644 index 0000000000000000000000000000000000000000..75a3cbc8e6749abd4bceff710d2f7c3ca6df9d70 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3328.java @@ -0,0 +1,15 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V3328 { + + private static final int VERSION = MCVersions.V23W06A + 2; + + public static void register() { + // registers simple entity "minecraft:interaction" + } + + private V3328() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java new file mode 100644 index 0000000000000000000000000000000000000000..203dfd16e37870b549e92ddd1483adeebbdbd9a4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3438.java @@ -0,0 +1,46 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.converters.tileentity.ConverterAbstractTileEntityRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.HashMap; +import java.util.Map; + +public final class V3438 { + + public static final int VERSION = MCVersions.V1_19_4 + 101; + + public static void register() { + // brushable block rename + MCTypeRegistry.TILE_ENTITY.copyWalkers(VERSION, "minecraft:suspicious_sand", "minecraft:brushable_block"); + + ConverterAbstractTileEntityRename.register(VERSION, new HashMap<>(Map.of( + "minecraft:suspicious_sand", "minecraft:brushable_block" + ))::get); + + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:brushable_block", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "loot_table", "LootTable"); + RenameHelper.renameSingle(data, "loot_table_seed", "LootTableSeed"); + return null; + } + }); + + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + Map.of( + "minecraft:pottery_shard_archer", "minecraft:archer_pottery_shard", + "minecraft:pottery_shard_prize", "minecraft:prize_pottery_shard", + "minecraft:pottery_shard_arms_up", "minecraft:arms_up_pottery_shard", + "minecraft:pottery_shard_skull", "minecraft:skull_pottery_shard" + ) + )::get); + } + + private V3438() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java new file mode 100644 index 0000000000000000000000000000000000000000..d449c62b7be3748dfc34c11cf4d929974c9a5191 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3439.java @@ -0,0 +1,119 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3439 { + + private static final int VERSION = MCVersions.V1_19_4 + 102; + + private static void handleSignText(final MapType text, final long fromVersion, final long toVersion) { + if (text == null) { + return; + } + + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, text, "messages", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, text, "filtered_messages", fromVersion, toVersion); + } + + static void registerSign(final int version, final String id) { + MCTypeRegistry.TILE_ENTITY.addWalker(version, id, (final MapType data, final long fromVersion, final long toVersion) -> { + handleSignText(data.getMap("front_text"), fromVersion, toVersion); + handleSignText(data.getMap("back_text"), fromVersion, toVersion); + + return null; + }); + } + + public static void register() { + final DataConverter signTileUpdater = new DataConverter<>(VERSION) { + private static final String DEFAULT_COLOR = "black"; + + private static ListType migrateToList(final MapType root, final String prefix) { + if (root == null) { + return null; + } + + final ListType ret = root.getTypeUtil().createEmptyList(); + + ret.addString(root.getString(prefix.concat("1"), ComponentUtils.EMPTY)); + ret.addString(root.getString(prefix.concat("2"), ComponentUtils.EMPTY)); + ret.addString(root.getString(prefix.concat("3"), ComponentUtils.EMPTY)); + ret.addString(root.getString(prefix.concat("4"), ComponentUtils.EMPTY)); + + return ret; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + // front text + final MapType frontText = data.getTypeUtil().createEmptyMap(); + data.setMap("front_text", frontText); + + final ListType frontMessages = migrateToList(data, "Text"); + frontText.setList("messages", frontMessages); + + ListType frontFilteredMessages = null; + + for (int i = 0; i < 4; ++i) { + final String filtered = data.getString("FilteredText" + i); + if (filtered == null) { + if (frontFilteredMessages != null) { + frontFilteredMessages.addString(frontMessages.getString(i)); + } + continue; + } + + if (frontFilteredMessages == null) { + frontFilteredMessages = data.getTypeUtil().createEmptyList(); + for (int k = 0; k < i; ++k) { + frontFilteredMessages.addString(frontMessages.getString(k)); + } + } + + frontFilteredMessages.addString(filtered); + } + + if (frontFilteredMessages != null) { + frontText.setList("filtered_messages", frontFilteredMessages); + } + + frontText.setString("color", data.getString("Color", DEFAULT_COLOR)); + frontText.setBoolean("has_glowing_text", data.getBoolean("GlowingText", false)); + frontText.setBoolean("_filtered_correct", true); + + // back text + final MapType backText = data.getTypeUtil().createEmptyMap(); + data.setMap("back_text", backText); + + final ListType blankMessages = data.getTypeUtil().createEmptyList(); + backText.setList("messages", blankMessages); + + for (int i = 0; i < 4; ++i) { + blankMessages.addString(ComponentUtils.EMPTY); + } + + backText.setString("color", DEFAULT_COLOR); + backText.setBoolean("has_glowing_text", false); + + // misc + data.setBoolean("is_waxed", false); + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", signTileUpdater); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:hanging_sign", signTileUpdater); + + registerSign(VERSION, "minecraft:sign"); + // in 1.21.6 this was changed to a subversion. I don't see why we need that change. + registerSign(VERSION, "minecraft:hanging_sign"); + } + + private V3439() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java new file mode 100644 index 0000000000000000000000000000000000000000..5cc9844fb342731e997b449e9b711c3b6d8e5762 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3440.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.ConverterAbstractStringValueTypeRename; +import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; +import java.util.Arrays; +import java.util.HashSet; + +public final class V3440 { + + private static final int VERSION = MCVersions.V1_19_4 + 103; + + public static void register() { + // Note: MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST is namespaced string + ConverterAbstractStringValueTypeRename.register(VERSION, MCTypeRegistry.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST, (final String in) -> { + return "minecraft:overworld_update_1_20".equals(NamespaceUtil.correctNamespace(in)) ? "minecraft:overworld" : null; + }); + MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>( + Arrays.asList( + "minecraft:update_1_20" + ) + ))); + } + + private V3440() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3441.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3441.java new file mode 100644 index 0000000000000000000000000000000000000000..2cf41561b4a229ba4d60540f85ba0a8946bb9753 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3441.java @@ -0,0 +1,17 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterAddBlendingData; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V3441 { + + private static final int VERSION = MCVersions.V1_19_4 + 104; + + public static void register() { + // See V3088 for why this converter is duplicated here and in V3088 + MCTypeRegistry.CHUNK.addStructureConverter(new ConverterAddBlendingData(VERSION)); + } + + private V3441() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3447.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3447.java new file mode 100644 index 0000000000000000000000000000000000000000..5db4a5222bf80f01c128d97ec849b89003837beb --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3447.java @@ -0,0 +1,49 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import java.util.HashMap; +import java.util.Map; + +public final class V3447 { + + private static final int VERSION = MCVersions.V23W14A + 2; + + public static void register() { + final String[] targets = new String[] { + "minecraft:angler_pottery_shard", + "minecraft:archer_pottery_shard", + "minecraft:arms_up_pottery_shard", + "minecraft:blade_pottery_shard", + "minecraft:brewer_pottery_shard", + "minecraft:burn_pottery_shard", + "minecraft:danger_pottery_shard", + "minecraft:explorer_pottery_shard", + "minecraft:friend_pottery_shard", + "minecraft:heart_pottery_shard", + "minecraft:heartbreak_pottery_shard", + "minecraft:howl_pottery_shard", + "minecraft:miner_pottery_shard", + "minecraft:mourner_pottery_shard", + "minecraft:plenty_pottery_shard", + "minecraft:prize_pottery_shard", + "minecraft:sheaf_pottery_shard", + "minecraft:shelter_pottery_shard", + "minecraft:skull_pottery_shard", + "minecraft:snort_pottery_shard" + }; + // shard->sherd + final Map rename = new HashMap<>(targets.length); + + for (final String target : targets) { + final String replace = target.replace("_pottery_shard", "_pottery_sherd"); + if (rename.put(target, replace) != null) { + throw new IllegalArgumentException("Duplicate target " + target); + } + } + + ConverterAbstractItemRename.register(VERSION, rename::get); + } + + private V3447() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3448.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3448.java new file mode 100644 index 0000000000000000000000000000000000000000..b9d7e81938320a30fb881a6be9e377aea4c75cec --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3448.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerListPaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3448 { + + private static final int VERSION = MCVersions.V23W14A + 3; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:decorated_pot", new DataWalkerListPaths<>(MCTypeRegistry.ITEM_NAME, "sherds")); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:decorated_pot", new DataWalkerItems("item")); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:decorated_pot", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "shards", "sherds"); + return null; + } + }); + } + + private V3448() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3450.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3450.java new file mode 100644 index 0000000000000000000000000000000000000000..9e7f34a40280a7704c4a4d1c03a7dda8e030aff5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3450.java @@ -0,0 +1,23 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterRenameStatus; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import java.util.HashMap; +import java.util.Map; + +public final class V3450 { + + private static final int VERSION = MCVersions.V23W16A + 1; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new ConverterRenameStatus(VERSION, new HashMap<>( + Map.of( + "minecraft:liquid_carvers", "minecraft:carvers", + "minecraft:heightmaps", "minecraft:spawn" + ) + )::get)); + } + + private V3450() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3451.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3451.java new file mode 100644 index 0000000000000000000000000000000000000000..7383d49edd6998ce93b13e135dcad43145c4e23a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3451.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V3451 { + + private static final int VERSION = MCVersions.V23W16A + 2; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.remove("isLightOn"); + + final ListType sections = data.getList("sections", ObjectType.MAP); + if (sections == null) { + return null; + } + + for (int i = 0, len = sections.size(); i < len; ++i) { + final MapType section = sections.getMap(i); + + section.remove("BlockLight"); + section.remove("SkyLight"); + } + + return null; + } + }); + } + + private V3451() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3459.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3459.java new file mode 100644 index 0000000000000000000000000000000000000000..6ef8c0f17c49405e38f299891c98791905e572de --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3459.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3459 { + + private static final int VERSION = MCVersions.V1_20_PRE5 + 1; + + public static void register() { + MCTypeRegistry.LEVEL.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.hasKey("DragonFight")) { + return null; + } + + final MapType dimensionData = data.getMap("DimensionData"); + if (dimensionData == null) { + return null; + } + + final MapType endData = dimensionData.getMap("1"); + if (endData != null) { + final MapType dragonFight = endData.getMap("DragonFight", endData.getTypeUtil().createEmptyMap()).copy(); + V3807.flattenBlockPos(dragonFight, "ExitPortalLocation"); + data.setMap("DragonFight", dragonFight); + } + + return null; + } + }); + } + + private V3459() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3564.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3564.java new file mode 100644 index 0000000000000000000000000000000000000000..8448981de260b7af33ea8ed62866b6fb95f544e5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3564.java @@ -0,0 +1,94 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V3564 { + + private static final int VERSION = MCVersions.V1_20_1 + 99; + + public static void register() { + final DataConverter converter = new DataConverter<>(VERSION) { + + private static final String[] LEGACY_FIELDS = new String[] { + "Text1", + "Text2", + "Text3", + "Text4", + + "FilteredText1", + "FilteredText2", + "FilteredText3", + "FilteredText4", + + "Color", + + "GlowingText" + }; + + + private static void updateText(final MapType text) { + if (text == null) { + return; + } + + if (text.getBoolean("_filtered_correct", false)) { + text.remove("_filtered_correct"); + return; + } + + final ListType filteredMessages = text.getList("filtered_messages", ObjectType.STRING); + + if (filteredMessages == null || filteredMessages.size() == 0) { + return; + } + + // should treat null here as empty list + final ListType messages = text.getList("messages", ObjectType.STRING); + + final ListType newFilteredList = filteredMessages.getTypeUtil().createEmptyList(); + boolean newFilteredIsEmpty = true; + + for (int i = 0, len = filteredMessages.size(); i < len; ++i) { + final String filtered = filteredMessages.getString(i); + final String message = messages != null && i < messages.size() ? messages.getString(i) : ComponentUtils.EMPTY; + + final String newFiltered = ComponentUtils.EMPTY.equals(filtered) ? message : filtered; + + newFilteredList.addString(newFiltered); + + newFilteredIsEmpty = newFilteredIsEmpty && ComponentUtils.EMPTY.equals(newFiltered); + } + + if (newFilteredIsEmpty) { + text.remove("filtered_messages"); + } else { + text.setList("filtered_messages", newFilteredList); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + updateText(data.getMap("front_text")); + updateText(data.getMap("back_text")); + + for (final String toRemove : LEGACY_FIELDS) { + data.remove(toRemove); + } + + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:sign", converter); + // I don't know why this was moved to a sub version, but we don't need to do that. + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:hanging_sign", converter); + } + + private V3564() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3565.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3565.java new file mode 100644 index 0000000000000000000000000000000000000000..d0e6bcd9c4b48743a522ea2b79fa97fe27eb8cc8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3565.java @@ -0,0 +1,32 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3565 { + + private static final int VERSION = MCVersions.V1_20_1 + 100; + + public static void register() { + MCTypeRegistry.SAVED_DATA_RANDOM_SEQUENCES.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType oldData = root.getMap("data"); + if (oldData == null) { + return null; + } + + final MapType newData = root.getTypeUtil().createEmptyMap(); + root.setMap("data", newData); + + newData.setMap("sequences", oldData); + + return null; + } + }); + } + + private V3565() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3566.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3566.java new file mode 100644 index 0000000000000000000000000000000000000000..cae496fd174ac38b36885bdfa36805cd5c8321be --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3566.java @@ -0,0 +1,58 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; + +public final class V3566 { + + private static final int VERSION = MCVersions.V1_20_1 + 101; + + public static void register() { + MCTypeRegistry.SAVED_DATA_SCOREBOARD.addStructureConverter(new DataConverter<>(VERSION) { + + private static final Map 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/ca/spottedleaf/dataconverter/minecraft/versions/V3568.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3568.java new file mode 100644 index 0000000000000000000000000000000000000000..96a7c836b278a150164c7632a5b88c14a2978d52 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3568.java @@ -0,0 +1,245 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public final class V3568 { + + private static final int VERSION = MCVersions.V23W31A + 1; + + private static final String[] EFFECT_ID_MAP = new String[34]; + static { + EFFECT_ID_MAP[1] = "minecraft:speed"; + EFFECT_ID_MAP[2] = "minecraft:slowness"; + EFFECT_ID_MAP[3] = "minecraft:haste"; + EFFECT_ID_MAP[4] = "minecraft:mining_fatigue"; + EFFECT_ID_MAP[5] = "minecraft:strength"; + EFFECT_ID_MAP[6] = "minecraft:instant_health"; + EFFECT_ID_MAP[7] = "minecraft:instant_damage"; + EFFECT_ID_MAP[8] = "minecraft:jump_boost"; + EFFECT_ID_MAP[9] = "minecraft:nausea"; + EFFECT_ID_MAP[10] = "minecraft:regeneration"; + EFFECT_ID_MAP[11] = "minecraft:resistance"; + EFFECT_ID_MAP[12] = "minecraft:fire_resistance"; + EFFECT_ID_MAP[13] = "minecraft:water_breathing"; + EFFECT_ID_MAP[14] = "minecraft:invisibility"; + EFFECT_ID_MAP[15] = "minecraft:blindness"; + EFFECT_ID_MAP[16] = "minecraft:night_vision"; + EFFECT_ID_MAP[17] = "minecraft:hunger"; + EFFECT_ID_MAP[18] = "minecraft:weakness"; + EFFECT_ID_MAP[19] = "minecraft:poison"; + EFFECT_ID_MAP[20] = "minecraft:wither"; + EFFECT_ID_MAP[21] = "minecraft:health_boost"; + EFFECT_ID_MAP[22] = "minecraft:absorption"; + EFFECT_ID_MAP[23] = "minecraft:saturation"; + EFFECT_ID_MAP[24] = "minecraft:glowing"; + EFFECT_ID_MAP[25] = "minecraft:levitation"; + EFFECT_ID_MAP[26] = "minecraft:luck"; + EFFECT_ID_MAP[27] = "minecraft:unluck"; + EFFECT_ID_MAP[28] = "minecraft:slow_falling"; + EFFECT_ID_MAP[29] = "minecraft:conduit_power"; + EFFECT_ID_MAP[30] = "minecraft:dolphins_grace"; + EFFECT_ID_MAP[31] = "minecraft:bad_omen"; + EFFECT_ID_MAP[32] = "minecraft:hero_of_the_village"; + EFFECT_ID_MAP[33] = "minecraft:darkness"; + } + private static final Set 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 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 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 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 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 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 itemConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final String id = root.getString("id"); + + final MapType tag = root.getMap("tag"); + + if (tag == null) { + return null; + } + + if ("minecraft:suspicious_stew".equals(id)) { + RenameHelper.renameSingle(tag, "Effects", "effects"); + + final ListType effects = tag.getList("effects", ObjectType.MAP); + + if (effects != null) { + for (int i = 0, len = effects.size(); i < len; ++i) { + final MapType effect = effects.getMap(i); + updateSuspiciousStew(effect, effect); + } + } + + return null; + } + + if (EFFECT_ITEMS.contains(id)) { + convertMobEffectList(tag, "CustomPotionEffects", "custom_potion_effects"); + return null; + } + + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beacon", beaconConverter); + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:mooshroom", mooshroomConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", arrowConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", areaEffectCloudConverter); + MCTypeRegistry.ENTITY.addStructureConverter(livingEntityConverter); + + MCTypeRegistry.PLAYER.addStructureConverter(livingEntityConverter); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(itemConverter); + } + + private V3568() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3682.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3682.java new file mode 100644 index 0000000000000000000000000000000000000000..ba7e9c7c17a36222e384c78f6a260a97490a3610 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3682.java @@ -0,0 +1,16 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; + +public final class V3682 { + + private static final int VERSION = MCVersions.V23W41A + 1; + + public static void register() { + V1458.namedInventory(VERSION, "minecraft:crafter"); + } + + private V3682() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3683.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3683.java new file mode 100644 index 0000000000000000000000000000000000000000..d91b8d638af2d104de989bdf727f74914727fbd8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3683.java @@ -0,0 +1,33 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3683 { + + private static final int VERSION = MCVersions.V23W41A + 2; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:tnt", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Fuse", "fuse"); + + final MapType defaultState = data.getTypeUtil().createEmptyMap(); + data.setMap("block_state", defaultState); + + defaultState.setString("Name", "minecraft:tnt"); + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:tnt", new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "block_state")); + } + + private V3683() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3685.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3685.java new file mode 100644 index 0000000000000000000000000000000000000000..4393d5395259f9aaf941ad15352ac6615f44841a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3685.java @@ -0,0 +1,64 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; + +public final class V3685 { + + private static final int VERSION = MCVersions.V23W42A + 1; + + private static String getType(final MapType arrow) { + return "minecraft:empty".equals(arrow.getString("Potion", "minecraft:empty")) ? "minecraft:arrow" : "minecraft:tipped_arrow"; + } + + private static MapType createItem(final TypeUtil util, final String id, final int count) { + final MapType ret = util.createEmptyMap(); + + ret.setString("id", id); + ret.setInt("Count", count); + + return ret; + } + + private static void registerArrowEntity(final String id) { + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState")); + // new: item + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItems("item")); + } + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trident", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Trident", "item"); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setMap("item", createItem(data.getTypeUtil(), getType(data), 1)); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:spectral_arrow", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setMap("item", createItem(data.getTypeUtil(), "minecraft:spectral_arrow", 1)); + return null; + } + }); + + registerArrowEntity("minecraft:trident"); + registerArrowEntity("minecraft:spectral_arrow"); + registerArrowEntity("minecraft:arrow"); + } + + private V3685() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java new file mode 100644 index 0000000000000000000000000000000000000000..b3a8af24d80ed3fa9f205eb8d97bbd1defb9cbc8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3689.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V3689 { + + private static final int VERSION = MCVersions.V23W44A + 1; + + public static void register() { + //registerMob("minecraft:breeze"); // changed to simple in 1.21.5 + // minecraft:wind_charge is a simple entity + // minecraft:breeze_wind_charge is a simple entity + + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:trial_spawner", (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, data, "spawn_potentials", "data", "entity", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("spawn_data"), "entity", fromVersion, toVersion); + return null; + }); + } + + private V3689() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3692.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3692.java new file mode 100644 index 0000000000000000000000000000000000000000..1fc62f9cadb990790420376d5c80b14775b71a48 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3692.java @@ -0,0 +1,25 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.blockname.ConverterAbstractBlockRename; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import java.util.HashMap; +import java.util.Map; + +public final class V3692 { + + private static final int VERSION = MCVersions.V23W46A + 1; + + private static final Map GRASS_RENAME = new HashMap<>( + Map.of( + "minecraft:grass", "minecraft:short_grass" + ) + ); + + public static void register() { + ConverterAbstractBlockRename.register(VERSION, GRASS_RENAME::get); + ConverterAbstractItemRename.register(VERSION, GRASS_RENAME::get); + } + + private V3692() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3799.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3799.java new file mode 100644 index 0000000000000000000000000000000000000000..546d69f22b52f00cf2fa9bacc5fda6d2f116f148 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3799.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V3799 { + + private static final int VERSION = MCVersions.V1_20_4 + 99; + + public static void register() { + //V100.registerEquipment(VERSION, "minecraft:armadillo"); // changed to simple in 1.21.5 + } + + private V3799() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3800.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3800.java new file mode 100644 index 0000000000000000000000000000000000000000..a40397feb5962bd5f4a44cc85bb359f5f99ff03a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3800.java @@ -0,0 +1,23 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import java.util.HashMap; +import java.util.Map; + +public final class V3800 { + + private static final int VERSION = MCVersions.V1_20_4 + 100; + + public static void register() { + final Map renames = new HashMap<>( + Map.of( + "minecraft:scute", "minecraft:turtle_scute" + ) + ); + + ConverterAbstractItemRename.register(VERSION, renames::get); + } + + private V3800() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3803.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3803.java new file mode 100644 index 0000000000000000000000000000000000000000..7ff5e2f1a386d75b6d0d6fc3160f2241bf74b262 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3803.java @@ -0,0 +1,24 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterEnchantmentsRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import java.util.HashMap; +import java.util.Map; + +public final class V3803 { + + private static final int VERSION = MCVersions.V23W51B + 1; + + public static void register() { + final Map renames = new HashMap<>( + Map.of( + "minecraft:sweeping", "minecraft:sweeping_edge" + ) + ); + + MCTypeRegistry.ITEM_STACK.addStructureConverter(new ConverterEnchantmentsRename(VERSION, renames::get)); + } + + private V3803() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3807.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3807.java new file mode 100644 index 0000000000000000000000000000000000000000..b329a8086c695c1c16ece6dd40c0cbfdc3d04835 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3807.java @@ -0,0 +1,72 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V3807 { + + private static final int VERSION = MCVersions.V24W04A + 1; + + public static void flattenBlockPos(final MapType data, final String path) { + if (data == null) { + return; + } + + final MapType pos = data.getMap(path); + if (pos == null) { + return; + } + + final Number x = pos.getNumber("X"); + final Number y = pos.getNumber("Y"); + final Number z = pos.getNumber("Z"); + + if (x == null || y == null || z == null) { + return; + } + + data.setInts(path, new int[] { x.intValue(), y.intValue(), z.intValue() }); + } + + public static void register() { + // Step 0 + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:vault", (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root.getMap("config"), "key_item", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root.getMap("server_data"), "items_to_eject", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root.getMap("shared_data"), "display_item", fromVersion, toVersion); + + return null; + }); + + // Step 1 + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION, 1) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + + if (data == null) { + return null; + } + + final ListType banners = data.getList("banners", ObjectType.MAP); + + if (banners == null) { + return null; + } + + for (int i = 0, len = banners.size(); i < len; ++i) { + V3807.flattenBlockPos(banners.getMap(i), "Pos"); + } + + return null; + } + }); + } + + private V3807() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java new file mode 100644 index 0000000000000000000000000000000000000000..c7c4f912d9baf6df0392aee3c73f8f0a8ad938c3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3808.java @@ -0,0 +1,79 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V3808 { + + private static final int VERSION = MCVersions.V24W04A + 2; + + public static void register() { + class BodyArmorConverter extends DataConverter { + private final String path; + private final boolean clearArmor; + + public BodyArmorConverter(final int toVersion, final String path, final boolean clearArmor) { + this(toVersion, 0, path, clearArmor); + } + + public BodyArmorConverter(final int toVersion, final int versionStep, final String path, final boolean clearArmor) { + super(toVersion, versionStep); + + this.path = path; + this.clearArmor = clearArmor; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType prev = data.getMap(this.path); + + if (prev == null) { + return null; + } + + data.remove(this.path); + + data.setMap("body_armor_item", prev); + data.setFloat("body_armor_drop_chance", 2.0F); + + if (this.clearArmor) { + final ListType armor = data.getList("ArmorItems", ObjectType.MAP); + if (armor != null && armor.size() > 2) { + armor.setMap(2, data.getTypeUtil().createEmptyMap()); + } + + final ListType chances = data.getList("ArmorDropChances", ObjectType.FLOAT); + if (chances != null && chances.size() > 2) { + chances.setFloat(2, 0.085F); + } + } + + return null; + } + } + + // Step 0 + MCTypeRegistry.ENTITY.addConverterForId("minecraft:horse", new BodyArmorConverter(VERSION, "ArmorItem", true)); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:horse", new DataWalkerItems("SaddleItem")); + + // Step 1 + MCTypeRegistry.ENTITY.addConverterForId("minecraft:llama", new BodyArmorConverter(VERSION, 1, "DecorItem", false)); + + MCTypeRegistry.ENTITY.addWalker(VERSION, 1, "minecraft:llama", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 1, "minecraft:llama", new DataWalkerItems("SaddleItem")); + + // Step 2 + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trader_llama", new BodyArmorConverter(VERSION, 2, "DecorItem", false)); + MCTypeRegistry.ENTITY.addWalker(VERSION, 2, "minecraft:trader_llama", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, 2, "minecraft:trader_llama", new DataWalkerItems("SaddleItem")); + } + + private V3808() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3809.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3809.java new file mode 100644 index 0000000000000000000000000000000000000000..a5d3efbf4b32e813a66c2be700123a6f4cae4f28 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3809.java @@ -0,0 +1,41 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V3809 { + + private static final int VERSION = MCVersions.V24W05A; + + public static void register() { + final DataConverter slotConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType items = data.getList("Items", ObjectType.MAP); + if (items == null) { + return null; + } + + for (int i = 0, len = items.size(); i < len; ++i) { + final MapType item = items.getMap(i); + + final int slot = item.getInt("Slot", 2); + item.setByte("Slot", (byte)(slot - 2)); + } + + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:llama", slotConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:trader_llama", slotConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:mule", slotConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:donkey", slotConverter); + } + + private V3809() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3812.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3812.java new file mode 100644 index 0000000000000000000000000000000000000000..8465ca45a23c940bcab16450598562cf8c037051 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3812.java @@ -0,0 +1,48 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; + +public final class V3812 { + + private static final int VERSION = MCVersions.V24W05B + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:wolf", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + boolean doubleHealth = false; + + final ListType attributes = data.getList("Attributes", ObjectType.MAP); + if (attributes != null) { + for (int i = 0, len = attributes.size(); i < len; ++i) { + final MapType attribute = attributes.getMap(i); + + if (!"minecraft:generic.max_health".equals(NamespaceUtil.correctNamespace(attribute.getString("Name")))) { + continue; + } + + final double base = attribute.getDouble("Base", 0.0D); + if (base == 20.0D) { + attribute.setDouble("Base", 40.0D); + doubleHealth = true; + } + } + } + + if (doubleHealth) { + data.setFloat("Health", data.getFloat("Health", 0.0F) * 2.0F); + } + + return null; + } + }); + } + + private V3812() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java new file mode 100644 index 0000000000000000000000000000000000000000..8169c681b04f0d6dfd21c890ae4123d638ca4513 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3813.java @@ -0,0 +1,137 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; + +public final class V3813 { + + private static final int VERSION = MCVersions.V24W05B + 2; + + private static final String[] PATROLLING_MOBS = new String[] { + "minecraft:witch", + "minecraft:ravager", + "minecraft:pillager", + "minecraft:illusioner", + "minecraft:evoker", + "minecraft:vindicator" + }; + + public static void register() { + class RootPositionConverter extends DataConverter { + private final RenamePair[] convert; + + public RootPositionConverter(final int toVersion, final RenamePair[] convert) { + this(toVersion, 0, convert); + } + + public RootPositionConverter(final int toVersion, final int versionStep, final RenamePair[] convert) { + super(toVersion, versionStep); + this.convert = convert; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + for (final RenamePair rename : this.convert) { + V3807.flattenBlockPos(data, rename.from); + RenameHelper.renameSingle(data, rename.from, rename.to); + } + return null; + } + } + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:bee", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("HivePos", "hive_pos"), + new RenamePair("FlowerPos", "flower_pos") + })); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:end_crystal", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("BeamTarget", "beam_target"), + })); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:wandering_trader", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("WanderTarget", "wander_target"), + })); + + final RootPositionConverter patrolConverter = new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("PatrolTarget", "patrol_target"), + }); + for (final String id : PATROLLING_MOBS) { + MCTypeRegistry.ENTITY.addConverterForId(id, patrolConverter); + } + + MCTypeRegistry.ENTITY.addStructureConverter(new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("Leash", "leash"), + })); + + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beehive", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("FlowerPos", "flower_pos"), + })); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:end_gateway", new RootPositionConverter(VERSION, new RenamePair[] { + new RenamePair("ExitPortal", "exit_portal"), + })); + + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + + if (data == null) { + return null; + } + + final ListType frames = data.getList("frames", ObjectType.MAP); + if (frames != null) { + for (int i = 0, len = frames.size(); i < len; ++i) { + final MapType frame = frames.getMap(i); + + V3807.flattenBlockPos(frame, "Pos"); + + RenameHelper.renameSingle(frame, "Pos", "pos"); + RenameHelper.renameSingle(frame, "Rotation", "rotation"); + RenameHelper.renameSingle(frame, "EntityId", "entity_id"); + } + } + + final ListType banners = data.getList("banners", ObjectType.MAP); + for (int i = 0, len = banners.size(); i < len; ++i) { + final MapType banner = banners.getMap(i); + + RenameHelper.renameSingle(banner, "Pos", "pos"); + RenameHelper.renameSingle(banner, "Color", "color"); + RenameHelper.renameSingle(banner, "Name", "name"); + } + + return null; + } + }); + + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:compass", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + + if (tag == null) { + return null; + } + + V3807.flattenBlockPos(tag, "LodestonePos"); + + return null; + } + }); + + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, root.getMap("data"), "banners", "name", fromVersion, toVersion); + return null; + }); + } + + private V3813() {} + + private static record RenamePair(String from, String to) {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3814.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3814.java new file mode 100644 index 0000000000000000000000000000000000000000..c4cc52620afb728533efe988bf2066ffc947f2d6 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3814.java @@ -0,0 +1,21 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.attributes.ConverterAbstractOldAttributesRename; +import java.util.HashMap; +import java.util.Map; + +public final class V3814 { + + private static final int VERSION = MCVersions.V24W05B + 3; + + public static void register() { + final Map renames = new HashMap<>( + Map.of("minecraft:horse.jump_strength", "minecraft:generic.jump_strength") + ); + + ConverterAbstractOldAttributesRename.register(VERSION, renames::get); + } + + private V3814() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3816.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3816.java new file mode 100644 index 0000000000000000000000000000000000000000..b339e9559a3b5cadfab5e0c79327acace4df04b8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3816.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V3816 { + + private static final int VERSION = MCVersions.V24W06A + 1; + + public static void register() { + //V100.registerEquipment(VERSION, "minecraft:bogged"); // changed to simple in 1.21.5 + } + + private V3816() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java new file mode 100644 index 0000000000000000000000000000000000000000..96f21374468614655e8c25e314e18c92eba7b41a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3818.java @@ -0,0 +1,361 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterItemStackToDataComponents; +import ca.spottedleaf.dataconverter.minecraft.converters.particle.ConverterParticleToNBT; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.Types; +import java.util.HashMap; +import java.util.Map; + +public final class V3818 { + + private static final int VERSION = MCVersions.V24W07A + 1; + + private static final String[] BANNER_COLOURS = new String[] { + "white", + "orange", + "magenta", + "light_blue", + "yellow", + "lime", + "pink", + "gray", + "light_gray", + "cyan", + "purple", + "blue", + "brown", + "green", + "red", + "black", + }; + + public static String getBannerColour(final int id) { + return id >= 0 && id < BANNER_COLOURS.length ? BANNER_COLOURS[id] : BANNER_COLOURS[0]; + } + + public static void register() { + // Step 0 + // Note: No breakpoint needed, nothing nests hotbar + MCTypeRegistry.HOTBAR.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + for (final String key : data.keys()) { + final ListType itemList = data.getList(key, ObjectType.MAP); + if (itemList != null) { + for (int i = 0, len = itemList.size(); i < len; ++i) { + final MapType item = itemList.getMap(i); + + final String id = item.getString("id"); + final int count = item.getInt("Count"); + + if ("minecraft:air".equals(id) || count <= 0) { + itemList.setMap(i, item.getTypeUtil().createEmptyMap()); + } + } + } + } + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:beehive", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Bees", "bees"); + + final ListType bees = data.getList("bees", ObjectType.MAP); + if (bees != null) { + for (int i = 0, len = bees.size(); i < len; ++i) { + final MapType bee = bees.getMap(i); + + RenameHelper.renameSingle(bee, "EntityData", "entity_data"); + RenameHelper.renameSingle(bee, "TicksInHive", "ticks_in_hive"); + RenameHelper.renameSingle(bee, "MinOccupationTicks", "min_ticks_in_hive"); + } + } + + return null; + } + }); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:beehive", (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "bees", "entity_data", fromVersion, toVersion); + + return null; + }); + + // Step 1 + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION, 1) { + private static final Map PATTERN_UPDATE = new HashMap<>(); + static { + PATTERN_UPDATE.put("b", "minecraft:base"); + PATTERN_UPDATE.put("bl", "minecraft:square_bottom_left"); + PATTERN_UPDATE.put("br", "minecraft:square_bottom_right"); + PATTERN_UPDATE.put("tl", "minecraft:square_top_left"); + PATTERN_UPDATE.put("tr", "minecraft:square_top_right"); + PATTERN_UPDATE.put("bs", "minecraft:stripe_bottom"); + PATTERN_UPDATE.put("ts", "minecraft:stripe_top"); + PATTERN_UPDATE.put("ls", "minecraft:stripe_left"); + PATTERN_UPDATE.put("rs", "minecraft:stripe_right"); + PATTERN_UPDATE.put("cs", "minecraft:stripe_center"); + PATTERN_UPDATE.put("ms", "minecraft:stripe_middle"); + PATTERN_UPDATE.put("drs", "minecraft:stripe_downright"); + PATTERN_UPDATE.put("dls", "minecraft:stripe_downleft"); + PATTERN_UPDATE.put("ss", "minecraft:small_stripes"); + PATTERN_UPDATE.put("cr", "minecraft:cross"); + PATTERN_UPDATE.put("sc", "minecraft:straight_cross"); + PATTERN_UPDATE.put("bt", "minecraft:triangle_bottom"); + PATTERN_UPDATE.put("tt", "minecraft:triangle_top"); + PATTERN_UPDATE.put("bts", "minecraft:triangles_bottom"); + PATTERN_UPDATE.put("tts", "minecraft:triangles_top"); + PATTERN_UPDATE.put("ld", "minecraft:diagonal_left"); + PATTERN_UPDATE.put("rd", "minecraft:diagonal_up_right"); + PATTERN_UPDATE.put("lud", "minecraft:diagonal_up_left"); + PATTERN_UPDATE.put("rud", "minecraft:diagonal_right"); + PATTERN_UPDATE.put("mc", "minecraft:circle"); + PATTERN_UPDATE.put("mr", "minecraft:rhombus"); + PATTERN_UPDATE.put("vh", "minecraft:half_vertical"); + PATTERN_UPDATE.put("hh", "minecraft:half_horizontal"); + PATTERN_UPDATE.put("vhr", "minecraft:half_vertical_right"); + PATTERN_UPDATE.put("hhb", "minecraft:half_horizontal_bottom"); + PATTERN_UPDATE.put("bo", "minecraft:border"); + PATTERN_UPDATE.put("cbo", "minecraft:curly_border"); + PATTERN_UPDATE.put("gra", "minecraft:gradient"); + PATTERN_UPDATE.put("gru", "minecraft:gradient_up"); + PATTERN_UPDATE.put("bri", "minecraft:bricks"); + PATTERN_UPDATE.put("glb", "minecraft:globe"); + PATTERN_UPDATE.put("cre", "minecraft:creeper"); + PATTERN_UPDATE.put("sku", "minecraft:skull"); + PATTERN_UPDATE.put("flo", "minecraft:flower"); + PATTERN_UPDATE.put("moj", "minecraft:mojang"); + PATTERN_UPDATE.put("pig", "minecraft:piglin"); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType patterns = data.getList("Patterns", ObjectType.MAP); + if (patterns != null) { + for (int i = 0, len = patterns.size(); i < len; ++i) { + final MapType pattern = patterns.getMap(i); + + final String patternName = pattern.getString("Pattern"); + if (patternName != null) { + final String renamed = PATTERN_UPDATE.get(patternName); + if (renamed != null) { + pattern.setString("Pattern", renamed); + } + } + RenameHelper.renameSingle(pattern, "Pattern", "pattern"); + + final String newColour = getBannerColour(pattern.getInt("Color")); + pattern.setString("Color", newColour); + RenameHelper.renameSingle(pattern, "Color", "color"); + } + } + RenameHelper.renameSingle(data, "Patterns", "patterns"); + + return null; + } + }); + + // Step 2 + // Note: there is nothing after the previous breakpoint (1.19.4) that reads nested entity item + MCTypeRegistry.ENTITY.addConverterForId("minecraft:arrow", new DataConverter<>(VERSION, 2) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Object potion = data.getGeneric("Potion"); + final Object customPotionEffects = data.getGeneric("custom_potion_effects"); + final Object color = data.getGeneric("Color"); + + if (potion == null && customPotionEffects == null && color == null) { + return null; + } + + data.remove("Potion"); + data.remove("custom_potion_effects"); + data.remove("Color"); + + final MapType item = data.getMap("item"); + if (item == null) { + return null; + } + + final MapType tag = item.getOrCreateMap("tag"); + + if (potion != null) { + tag.setGeneric("Potion", potion); + } + if (customPotionEffects != null) { + tag.setGeneric("custom_potion_effects", customPotionEffects); + } + if (color != null) { + tag.setGeneric("CustomPotionColor", color); + } + + return null; + } + }); + + // Step 3 + // next version: 4059 + MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, 3, new DataWalker<>() { + private static void walkBlockPredicates(final MapType root, final long fromVersion, final long toVersion) { + if (root.hasKey("blocks", ObjectType.STRING)) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion); + } else if (root.hasKey("blocks", ObjectType.LIST)) { + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion); + } + } + + @Override + public MapType walk(final MapType root, final long fromVersion, final long toVersion) { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "minecraft:bees", "entity_data", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.TILE_ENTITY, root, "minecraft:block_entity_data", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:bundle_contents", fromVersion, toVersion); + + final MapType canBreak = root.getMap("minecraft:can_break"); + if (canBreak != null) { + final ListType predicates = canBreak.getList("predicates", ObjectType.MAP); + if (predicates != null) { + for (int i = 0, len = predicates.size(); i < len; ++i) { + walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion); + } + } + // Not handled by DFU: simple encoding does not require "predicates" + walkBlockPredicates(canBreak, fromVersion, toVersion); + } + + final MapType canPlaceOn = root.getMap("minecraft:can_place_on"); + if (canPlaceOn != null) { + final ListType predicates = canPlaceOn.getList("predicates", ObjectType.MAP); + if (predicates != null) { + for (int i = 0, len = predicates.size(); i < len; ++i) { + walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion); + } + } + // Not handled by DFU: simple encoding does not require "predicates" + walkBlockPredicates(canPlaceOn, fromVersion, toVersion); + } + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:charged_projectiles", fromVersion, toVersion); + WalkerUtils.convertListPath(MCTypeRegistry.ITEM_STACK, root, "minecraft:container", "item", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ENTITY, root, "minecraft:entity_data", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_NAME, root, "minecraft:pot_decorations", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root.getMap("minecraft:food"), "using_converts_to", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:custom_name", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:item_name", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:lore", fromVersion, toVersion); + + final MapType writtenBookContent = root.getMap("minecraft:written_book_content"); + if (writtenBookContent != null) { + // This logic is OK up until we need to convert TEXT_COMPONENT to NBT. + // But that's for the next walker to handle. + final ListType pages = writtenBookContent.getListUnchecked("pages"); + if (pages != null) { + for (int i = 0, len = pages.size(); i < len; ++i) { + final Object pageGeneric = pages.getGeneric(i); + if (pageGeneric instanceof String string) { + final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(string, fromVersion, toVersion); + if (convertedGeneric != null) { + pages.setGeneric(i, convertedGeneric); + } + } else if (pageGeneric instanceof MapType mapType) { + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "raw", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "filtered", fromVersion, toVersion); + } + } + } + } + + return null; + } + }); + + // Step 4 + MCTypeRegistry.PARTICLE.addStructureConverter(new DataConverter<>(VERSION, 4) { + @Override + public MapType convert(final Object input, final long sourceVersion, final long toVersion) { + if (!(input instanceof String flat)) { + return null; + } + + return ConverterParticleToNBT.convert(flat, Types.NBT); + } + }); + + MCTypeRegistry.PARTICLE.addStructureWalker(VERSION, 4, (final Object input, final long fromVersion, final long toVersion) -> { + if (!(input instanceof MapType)) { + return null; + } + + final MapType root = (MapType)input; + + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "item", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.BLOCK_STATE, root, "block_state", fromVersion, toVersion); + + return null; + }); + + // Step 5 + // Note: needs breakpoint, reads nested tile entity data + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION, 5) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + return ConverterItemStackToDataComponents.convertItem(data); + } + }); + + MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, 5, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, root, "id", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.DATA_COMPONENTS, root, "components", fromVersion, toVersion); + + return null; + }); + + // Step 6 + MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION, 6) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Object color = data.getGeneric("Color"); + final Object effects = data.getGeneric("effects"); + final Object potion = data.getGeneric("Potion"); + + if (color == null && effects == null && potion == null) { + return null; + } + data.remove("Color"); + data.remove("effects"); + data.remove("Potion"); + + final MapType potionContents = data.getTypeUtil().createEmptyMap(); + data.setMap("potion_contents", potionContents); + + if (color != null) { + potionContents.setGeneric("custom_color", color); + } + + if (effects != null) { + potionContents.setGeneric("custom_effects", effects); + } + + if (potion != null) { + potionContents.setGeneric("potion", potion); + } + + return null; + } + }); + } + + private V3818() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3820.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3820.java new file mode 100644 index 0000000000000000000000000000000000000000..8672d40af44a92516256a97d9912a08a6dcb446c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3820.java @@ -0,0 +1,81 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.itemstack.ConverterItemStackToDataComponents; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3820 { + + private static final int VERSION = MCVersions.V24W09A + 1; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:skull", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final Object skullOwner = data.getGeneric("SkullOwner"); + final Object extraType = data.getGeneric("ExtraType"); + + if (skullOwner == null && extraType == null) { + return null; + } + + data.remove("SkullOwner"); + data.remove("ExtraType"); + + data.setMap( + "profile", + ConverterItemStackToDataComponents.convertProfile( + skullOwner == null ? extraType : skullOwner, data.getTypeUtil() + ) + ); + + return null; + } + }); + // I don't see why this converter is necessary, V3818 should have converted correctly... + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType components = data.getMap("components"); + + if (components == null) { + return null; + } + + final MapType oldTarget = components.getMap("minecraft:lodestone_target"); + if (oldTarget == null) { + return null; + } + + components.remove("minecraft:lodestone_target"); + components.setMap("minecraft:lodestone_tracker", oldTarget); + + final Object pos = oldTarget.getGeneric("pos"); + final Object dim = oldTarget.getGeneric("dimension"); + + if (pos == null || dim == null) { + return null; + } + + oldTarget.remove("pos"); + oldTarget.remove("dimension"); + + final MapType target = oldTarget.getTypeUtil().createEmptyMap(); + oldTarget.setMap("target", target); + + target.setGeneric("pos", pos); + target.setGeneric("dimension", dim); + + return null; + } + }); + + // Moved from V99 to here, as 21w10a is when custom_name was added + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:skull", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "custom_name")); + } + + private V3820() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3825.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3825.java new file mode 100644 index 0000000000000000000000000000000000000000..547c7fe79f4602aefee5910335b147669acde031 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3825.java @@ -0,0 +1,153 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public final class V3825 { + + private static final int VERSION = MCVersions.V24W12A + 1; + + private static final Set 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/ca/spottedleaf/dataconverter/minecraft/versions/V3828.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3828.java new file mode 100644 index 0000000000000000000000000000000000000000..084b61402b954f4b29156a08d53b29d6c08fe692 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3828.java @@ -0,0 +1,37 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; + +public final class V3828 { + + private static final int VERSION = MCVersions.V24W14A + 1; + + public static void register() { + MCTypeRegistry.VILLAGER_TRADE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType buyB = data.getMap("buyB"); + + if (buyB == null) { + return null; + } + + final String id = NamespaceUtil.correctNamespace(buyB.getString("id", "minecraft:air")); + final int count = buyB.getInt("count", 0); + + // Fix DFU: use count <= 0 instead of count == 0 + if ("minecraft:air".equals(id) || count <= 0) { + data.remove("buyB"); + } + + return null; + } + }); + } + + private V3828() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3833.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3833.java new file mode 100644 index 0000000000000000000000000000000000000000..c4f0152c8c1b1dacd09b880e5415c2ca05f93956 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3833.java @@ -0,0 +1,36 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; + +public final class V3833 { + + private static final int VERSION = MCVersions.V1_20_5_PRE4 + 1; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:brushable_block", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType item = data.getMap("item"); + if (item == null) { + return null; + } + + final String id = NamespaceUtil.correctNamespace(item.getString("id", "minecraft:air")); + final int count = item.getInt("count", 0); + + // Fix DFU: use count <= 0 instead of count == 0 + if ("minecraft:air".equals(id) || count <= 0) { + data.remove("item"); + } + + return null; + } + }); + } + + private V3833() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3938.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3938.java new file mode 100644 index 0000000000000000000000000000000000000000..2a6d144c2f074403bde8a62377ca6986c0c12a84 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3938.java @@ -0,0 +1,24 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; + +public final class V3938 { + + private static final int VERSION = MCVersions.V1_20_6 + 99; + + private static void registerArrow(final String id) { + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerTypePaths<>(MCTypeRegistry.BLOCK_STATE, "inBlockState")); + // new: weapon + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItems("item", "weapon")); + } + + public static void register() { + registerArrow("minecraft:spectral_arrow"); + registerArrow("minecraft:arrow"); + } + + private V3938() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3939.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3939.java new file mode 100644 index 0000000000000000000000000000000000000000..2bcacb82a57bcdca6af699936b22db0ebe925f1b --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3939.java @@ -0,0 +1,22 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import java.util.Arrays; +import java.util.HashSet; + +public final class V3939 { + + private static final int VERSION = MCVersions.V1_20_6 + 100; + + public static void register() { + MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>( + Arrays.asList( + "minecraft:update_1_21" + ) + ))); + } + + private V3939() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3943.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3943.java new file mode 100644 index 0000000000000000000000000000000000000000..5bbfb32568d0367422f801a1402409f497959eb8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3943.java @@ -0,0 +1,34 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V3943 { + + private static final int VERSION = MCVersions.V24W19B + 1; + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String oldRange = data.getString("menuBackgroundBlurriness", "0.5"); + + int newRange; + try { + newRange = (int)Math.round(Double.parseDouble(oldRange) * 10.0); + } catch (final NumberFormatException ex) { + newRange = 5; + } + + // note: options are always string, so DFU is wrong to use int + data.setString("menuBackgroundBlurriness", Integer.toString(newRange)); + + return null; + } + }); + } + + private V3943() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V3945.java b/ca/spottedleaf/dataconverter/minecraft/versions/V3945.java new file mode 100644 index 0000000000000000000000000000000000000000..28f2c6f6562bb5f11c6519a7beae5f86e37541a7 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V3945.java @@ -0,0 +1,244 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; +import java.util.UUID; + +public final class V3945 { + + private static final int VERSION = MCVersions.V24W20A + 1; + + private static final Map UUID_TO_ID = new HashMap<>( + ImmutableMap.builder() + .put(UUID.fromString("736565d2-e1a7-403d-a3f8-1aeb3e302542"), "minecraft:creative_mode_block_range") + .put(UUID.fromString("98491ef6-97b1-4584-ae82-71a8cc85cf73"), "minecraft:creative_mode_entity_range") + .put(UUID.fromString("91AEAA56-376B-4498-935B-2F7F68070635"), "minecraft:effect.speed") + .put(UUID.fromString("7107DE5E-7CE8-4030-940E-514C1F160890"), "minecraft:effect.slowness") + .put(UUID.fromString("AF8B6E3F-3328-4C0A-AA36-5BA2BB9DBEF3"), "minecraft:effect.haste") + .put(UUID.fromString("55FCED67-E92A-486E-9800-B47F202C4386"), "minecraft:effect.mining_fatigue") + .put(UUID.fromString("648D7064-6A60-4F59-8ABE-C2C23A6DD7A9"), "minecraft:effect.strength") + .put(UUID.fromString("C0105BF3-AEF8-46B0-9EBC-92943757CCBE"), "minecraft:effect.jump_boost") + .put(UUID.fromString("22653B89-116E-49DC-9B6B-9971489B5BE5"), "minecraft:effect.weakness") + .put(UUID.fromString("5D6F0BA2-1186-46AC-B896-C61C5CEE99CC"), "minecraft:effect.health_boost") + .put(UUID.fromString("EAE29CF0-701E-4ED6-883A-96F798F3DAB5"), "minecraft:effect.absorption") + .put(UUID.fromString("03C3C89D-7037-4B42-869F-B146BCB64D2E"), "minecraft:effect.luck") + .put(UUID.fromString("CC5AF142-2BD2-4215-B636-2605AED11727"), "minecraft:effect.unluck") + .put(UUID.fromString("6555be74-63b3-41f1-a245-77833b3c2562"), "minecraft:evil") + .put(UUID.fromString("1eaf83ff-7207-4596-b37a-d7a07b3ec4ce"), "minecraft:powder_snow") + .put(UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D"), "minecraft:sprinting") + .put(UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0"), "minecraft:attacking") + .put(UUID.fromString("766bfa64-11f3-11ea-8d71-362b9e155667"), "minecraft:baby") + .put(UUID.fromString("7E0292F2-9434-48D5-A29F-9583AF7DF27F"), "minecraft:covered") + .put(UUID.fromString("9e362924-01de-4ddd-a2b2-d0f7a405a174"), "minecraft:suffocating") + .put(UUID.fromString("5CD17E52-A79A-43D3-A529-90FDE04B181E"), "minecraft:drinking") + .put(UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836"), "minecraft:baby") + .put(UUID.fromString("49455A49-7EC5-45BA-B886-3B90B23A1718"), "minecraft:attacking") + .put(UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), "minecraft:armor.boots") + .put(UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), "minecraft:armor.leggings") + .put(UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), "minecraft:armor.chestplate") + .put(UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150"), "minecraft:armor.helmet") + .put(UUID.fromString("C1C72771-8B8E-BA4A-ACE0-81A93C8928B2"), "minecraft:armor.body") + .put(UUID.fromString("b572ecd2-ac0c-4071-abde-9594af072a37"), "minecraft:enchantment.fire_protection") + .put(UUID.fromString("40a9968f-5c66-4e2f-b7f4-2ec2f4b3e450"), "minecraft:enchantment.blast_protection") + .put(UUID.fromString("07a65791-f64d-4e79-86c7-f83932f007ec"), "minecraft:enchantment.respiration") + .put(UUID.fromString("60b1b7db-fffd-4ad0-817c-d6c6a93d8a45"), "minecraft:enchantment.aqua_affinity") + .put(UUID.fromString("11dc269a-4476-46c0-aff3-9e17d7eb6801"), "minecraft:enchantment.depth_strider") + .put(UUID.fromString("87f46a96-686f-4796-b035-22e16ee9e038"), "minecraft:enchantment.soul_speed") + .put(UUID.fromString("b9716dbd-50df-4080-850e-70347d24e687"), "minecraft:enchantment.soul_speed") + .put(UUID.fromString("92437d00-c3a7-4f2e-8f6c-1f21585d5dd0"), "minecraft:enchantment.swift_sneak") + .put(UUID.fromString("5d3d087b-debe-4037-b53e-d84f3ff51f17"), "minecraft:enchantment.sweeping_edge") + .put(UUID.fromString("3ceb37c0-db62-46b5-bd02-785457b01d96"), "minecraft:enchantment.efficiency") + .put(UUID.fromString("CB3F55D3-645C-4F38-A497-9C13A33DB5CF"), "minecraft:base_attack_damage") + .put(UUID.fromString("FA233E1C-4180-4865-B01B-BCCE9785ACA3"), "minecraft:base_attack_speed") + .build() + ); + private static final Map NAME_TO_ID = new HashMap<>( + Map.of( + "Random spawn bonus", "minecraft:random_spawn_bonus", + "Random zombie-spawn bonus", "minecraft:zombie_random_spawn_bonus", + "Leader zombie bonus", "minecraft:leader_zombie_bonus", + "Zombie reinforcement callee charge", "minecraft:reinforcement_callee_charge", + "Zombie reinforcement caller charge", "minecraft:reinforcement_caller_charge" + ) + ); + + private static UUID makeUUID(final int[] arr) { + if (arr == null || arr.length != 4) { + return null; + } + + final long most = ((long)arr[0] << 32) | ((long)arr[1] & 0xFFFFFFFFL); + final long least = ((long)arr[2] << 32) | ((long)arr[3] & 0xFFFFFFFFL); + + return new UUID(most, least); + } + + private static ListType remapModifiers(final ListType list) { + final Map ret = new LinkedHashMap<>(); + + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType modifier = list.getMap(i).copy(); + + final UUID uuid = makeUUID(modifier.getInts("uuid")); + final String name = modifier.getString("name", ""); + + final String remappedUUID = UUID_TO_ID.get(uuid); + final String remappedName = NAME_TO_ID.get(name); + + if (remappedUUID != null) { + modifier.remove("uuid"); + modifier.remove("name"); + + modifier.setString("id", remappedUUID); + + ret.put(remappedUUID, modifier); + } else if (remappedName != null) { + final MapType existing = ret.get(remappedName); + if (existing != null) { + existing.setDouble("amount", + existing.getDouble("amount", 0.0) + modifier.getDouble("amount", 0.0) + ); + } else { + modifier.remove("uuid"); + modifier.remove("name"); + + modifier.setString("id", remappedName); + + ret.put(remappedName, modifier); + } + } else { + final String id = "minecraft:" + (uuid == null ? "unknown" : uuid.toString().toLowerCase(Locale.ROOT)); + + modifier.setString("id", id); + + ret.put(id, modifier); + } + } + + final ListType retList = list.getTypeUtil().createEmptyList(); + + for (final MapType modifier : ret.values()) { + retList.addMap(modifier); + } + + return retList; + } + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType components = data.getMap("components"); + if (components == null) { + return null; + } + + final MapType attributeModifiers = components.getMap("minecraft:attribute_modifiers"); + if (attributeModifiers == null) { + return null; + } + + final ListType modifiers = attributeModifiers.getList("modifiers", ObjectType.MAP); + if (modifiers == null) { + return null; + } + + attributeModifiers.setList("modifiers", remapModifiers(modifiers)); + + return null; + } + }); + + final DataConverter entityConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Attributes", "attributes"); + + final ListType attributes = data.getList("attributes", ObjectType.MAP); + if (attributes == null) { + return null; + } + + for (int i = 0, len = attributes.size(); i < len; ++i) { + final MapType attribute = attributes.getMap(i); + + RenameHelper.renameSingle(attribute, "Name", "id"); + RenameHelper.renameSingle(attribute, "Base", "base"); + RenameHelper.renameSingle(attribute, "Modifiers", "modifiers"); + + final ListType modifiers = attribute.getList("modifiers", ObjectType.MAP); + + if (modifiers == null) { + continue; + } + + for (int j = 0, len2 = modifiers.size(); j < len2; ++j) { + final MapType modifier = modifiers.getMap(j); + + RenameHelper.renameSingle(modifier, "UUID", "uuid"); + RenameHelper.renameSingle(modifier, "Name", "name"); + RenameHelper.renameSingle(modifier, "Amount", "amount"); + final String newOp; + switch (modifier.getInt("Operation", 0)) { + case 0: { + newOp = "add_value"; + break; + } + case 1: { + newOp = "add_multiplied_base"; + break; + } + case 2: { + newOp = "add_multiplied_total"; + break; + } + default: { + newOp = "invalid"; + break; + } + } + modifier.remove("Operation"); + modifier.setString("operation", newOp); + } + + attribute.setList("modifiers", remapModifiers(modifiers)); + } + + return null; + } + }; + + MCTypeRegistry.ENTITY.addStructureConverter(entityConverter); + MCTypeRegistry.PLAYER.addStructureConverter(entityConverter); + + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:jukebox", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final long playingFor = data.getLong("TickCount") - data.getLong("RecordStartTick"); + + data.remove("IsPlaying"); + data.remove("TickCount"); + data.remove("RecordStartTick"); + + if (playingFor > 0L) { + data.setLong("ticks_since_song_started", playingFor); + } + + return null; + } + }); + } + + private V3945() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4054.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4054.java new file mode 100644 index 0000000000000000000000000000000000000000..1a76415944b6ad8b98f917acd3c7157e9fccdd5f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4054.java @@ -0,0 +1,46 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.util.ComponentUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4054 { + + private static final int VERSION = MCVersions.V1_21_1 + 99; + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:banner", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertComponents(data.getMap("components")); + return null; + } + }); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:white_banner", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertComponents(data.getMap("components")); + return null; + } + }); + } + + private static void convertComponents(final MapType components) { + if (components == null) { + return; + } + + final String itemNameKey = ComponentUtils.retrieveTranslationString(components.getString("minecraft:item_name")); + + if (!"block.minecraft.ominous_banner".equals(itemNameKey)) { + return; + } + + components.setString("minecraft:rarity", "uncommon"); + components.setString("minecraft:item_name", ComponentUtils.createTranslatableComponent("block.minecraft.ominous_banner")); + } + + private V4054() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4055.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4055.java new file mode 100644 index 0000000000000000000000000000000000000000..45b141a651d954554fcca68f36c0b3344328d902 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4055.java @@ -0,0 +1,41 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.attributes.ConverterAbstractAttributesRename; +import ca.spottedleaf.dataconverter.util.NamespaceUtil; + +public final class V4055 { + + private static final int VERSION = MCVersions.V1_21_1 + 100; + + private static final Prefix[] PREFIXES_TO_REMOVE = new Prefix[] { + new Prefix("generic."), + new Prefix("horse."), + new Prefix("player."), + new Prefix("zombie.") + }; + + private static record Prefix(String raw, String namespaced) { + public Prefix(final String raw) { + this(raw, NamespaceUtil.correctNamespace(raw)); + } + } + + public static void register() { + ConverterAbstractAttributesRename.register(VERSION, (final String input) -> { + final String namespacedInput = NamespaceUtil.correctNamespace(input); + + for (final Prefix prefix : PREFIXES_TO_REMOVE) { + if (!namespacedInput.startsWith(prefix.namespaced())) { + continue; + } + + return "minecraft:".concat(namespacedInput.substring(prefix.namespaced().length())); + } + + return null; + }); + } + + private V4055() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4057.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4057.java new file mode 100644 index 0000000000000000000000000000000000000000..4165efcb182a52d4f1d52f25e684ab8f36cf4c79 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4057.java @@ -0,0 +1,33 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4057 { + + private static final int VERSION = MCVersions.V1_21_1 + 102; + + public static void register() { + MCTypeRegistry.CHUNK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType carvingMasks = data.getMap("CarvingMasks"); + if (carvingMasks == null) { + return null; + } + data.remove("CarvingMasks"); + + final long[] airMask = carvingMasks.getLongs("AIR"); + if (airMask != null) { + data.setLongs("carving_mask", airMask); + } + + return null; + } + }); + } + + private V4057() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java new file mode 100644 index 0000000000000000000000000000000000000000..e4a1bb8aa512203d28fb683d204762f322862921 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4059.java @@ -0,0 +1,164 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.TypeUtil; + +public final class V4059 { + + private static final int VERSION = MCVersions.V24W33A + 1; + + public static void register() { + // previous version: 3818.3 + // next version: 4307 + MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, new DataWalker<>() { + private static void walkBlockPredicates(final MapType root, final long fromVersion, final long toVersion) { + if (root.hasKey("blocks", ObjectType.STRING)) { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion); + } else if (root.hasKey("blocks", ObjectType.LIST)) { + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, root, "blocks", fromVersion, toVersion); + } + } + + @Override + public MapType walk(final MapType root, final long fromVersion, final long toVersion) { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "minecraft:bees", "entity_data", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.TILE_ENTITY, root, "minecraft:block_entity_data", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:bundle_contents", fromVersion, toVersion); + + final MapType canBreak = root.getMap("minecraft:can_break"); + if (canBreak != null) { + final ListType predicates = canBreak.getList("predicates", ObjectType.MAP); + if (predicates != null) { + for (int i = 0, len = predicates.size(); i < len; ++i) { + walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion); + } + } + // Not handled by DFU: simple encoding does not require "predicates" + walkBlockPredicates(canBreak, fromVersion, toVersion); + } + + final MapType canPlaceOn = root.getMap("minecraft:can_place_on"); + if (canPlaceOn != null) { + final ListType predicates = canPlaceOn.getList("predicates", ObjectType.MAP); + if (predicates != null) { + for (int i = 0, len = predicates.size(); i < len; ++i) { + walkBlockPredicates(predicates.getMap(i), fromVersion, toVersion); + } + } + // Not handled by DFU: simple encoding does not require "predicates" + walkBlockPredicates(canPlaceOn, fromVersion, toVersion); + } + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:charged_projectiles", fromVersion, toVersion); + WalkerUtils.convertListPath(MCTypeRegistry.ITEM_STACK, root, "minecraft:container", "item", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ENTITY, root, "minecraft:entity_data", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_NAME, root, "minecraft:pot_decorations", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "minecraft:use_remainder", fromVersion, toVersion); + + final MapType equippable = root.getMap("minecraft:equippable"); + if (equippable != null) { + WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, equippable, "allowed_entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ENTITY_NAME, equippable, "allowed_entities", fromVersion, toVersion); + } + + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:custom_name", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:item_name", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:lore", fromVersion, toVersion); + + final MapType writtenBookContent = root.getMap("minecraft:written_book_content"); + if (writtenBookContent != null) { + final ListType pages = writtenBookContent.getListUnchecked("pages"); + // This logic needs to correctly handle both the NBT format of TEXT_COMPONENT and the JSON format. + if (pages != null) { + for (int i = 0, len = pages.size(); i < len; ++i) { + final Object pageGeneric = pages.getGeneric(i); + final boolean isNBTFormat = fromVersion >= DataConverter.encodeVersions(V4290.VERSION, 0); + // Note: We only parse ListType for 4290 and above as only a String was valid JSON. List of anything was not valid. + if (pageGeneric instanceof String || (isNBTFormat && pageGeneric instanceof ListType)) { // handles: String case (JSON/NBT), ListType case (NBT) + final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(pageGeneric, fromVersion, toVersion); + if (convertedGeneric != null) { + pages.setGeneric(i, convertedGeneric); + } + } else if (pageGeneric instanceof MapType mapType) { + // Need to handle: Filterable format and regular NBT Component format are both MapType... + if (mapType.hasKey("raw") || mapType.hasKey("filtered")) { + // Assume filterable format + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "raw", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "filtered", fromVersion, toVersion); + } else if (isNBTFormat) { + final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(mapType, fromVersion, toVersion); + if (convertedGeneric != null) { + pages.setGeneric(i, convertedGeneric); + } + } // else: invalid data + } // else: invalid data + } + } + } + + return null; + } + }); + + MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType food = data.getMap("minecraft:food"); + if (food == null) { + return null; + } + + final TypeUtil typeUtil = data.getTypeUtil(); + + final float eatSeconds = food.getFloat("eat_seconds", 1.6F); + + final ListType oldEffects = food.getList("effects", ObjectType.MAP); + final ListType newEffects = typeUtil.createEmptyList(); + if (oldEffects != null) { + for (int i = 0, len = oldEffects.size(); i < len; ++i) { + final MapType oldEffect = oldEffects.getMap(i); + + final MapType newEffect = typeUtil.createEmptyMap(); + newEffects.addMap(newEffect); + + newEffect.setString("type", "minecraft:apply_effects"); + + final Object oldEffectEffect = oldEffect.getGeneric("effect"); + final ListType newEffectEffects = typeUtil.createEmptyList(); + newEffectEffects.addGeneric(oldEffectEffect); + newEffect.setList("effects", newEffectEffects); + + newEffect.setFloat("probability", oldEffect.getFloat("probability", 1.0F)); + } + } + + final Object convertsTo = food.getGeneric("using_converts_to"); + if (convertsTo != null) { + data.setGeneric("minecraft:use_remainder", convertsTo); + } + + food.remove("eat_seconds"); + food.remove("effects"); + food.remove("using_converts_to"); + + final MapType consumable = typeUtil.createEmptyMap(); + data.setMap("minecraft:consumable", consumable); + + consumable.setFloat("consume_seconds", eatSeconds); + consumable.setList("on_consume_effects", newEffects); + + return null; + } + }); + } + + private V4059() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4061.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4061.java new file mode 100644 index 0000000000000000000000000000000000000000..b092188f5e4f0fa3224fac3cd36f5c1ee6a7f0a4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4061.java @@ -0,0 +1,112 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.nbt.NBTMapType; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.datafixers.util.Pair; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; +import java.util.HashMap; +import java.util.Map; + +public final class V4061 { + + private static final int VERSION = MCVersions.V24W34A + 1; + + private static final Map, String> CONVERT_MAP = new HashMap<>(); + static { + addConversion("trial_chamber/breeze", "{simultaneous_mobs: 1.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:breeze\"}}, weight: 1}], ticks_between_spawn: 20, total_mobs: 2.0f, total_mobs_added_per_player: 1.0f}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], simultaneous_mobs: 2.0f, total_mobs: 4.0f}"); + addConversion("trial_chamber/melee/husk", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:husk\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:husk\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_melee\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/melee/spider", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:spider\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}],simultaneous_mobs: 4.0f, total_mobs: 12.0f}"); + addConversion("trial_chamber/melee/zombie", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:zombie\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}],spawn_potentials: [{data: {entity: {id: \"minecraft:zombie\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_melee\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/ranged/poison_skeleton", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:bogged\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}],spawn_potentials: [{data: {entity: {id: \"minecraft:bogged\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/ranged/skeleton", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:skeleton\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:skeleton\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/ranged/stray", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:stray\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:stray\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/slow_ranged/poison_skeleton", "{simultaneous_mobs: 4.0f, simultaneous_mobs_added_per_player: 2.0f, spawn_potentials: [{data: {entity: {id: \"minecraft:bogged\"}}, weight: 1}], ticks_between_spawn: 160}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:bogged\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/slow_ranged/skeleton", "{simultaneous_mobs: 4.0f, simultaneous_mobs_added_per_player: 2.0f, spawn_potentials: [{data: {entity: {id: \"minecraft:skeleton\"}}, weight: 1}], ticks_between_spawn: 160}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {id: \"minecraft:skeleton\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/slow_ranged/stray", "{simultaneous_mobs: 4.0f, simultaneous_mobs_added_per_player: 2.0f, spawn_potentials: [{data: {entity: {id: \"minecraft:stray\"}}, weight: 1}], ticks_between_spawn: 160}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}],spawn_potentials: [{data: {entity: {id: \"minecraft:stray\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_ranged\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/small_melee/baby_zombie", "{simultaneous_mobs: 2.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {IsBaby: 1b, id: \"minecraft:zombie\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], spawn_potentials: [{data: {entity: {IsBaby: 1b, id: \"minecraft:zombie\"}, equipment: {loot_table: \"minecraft:equipment/trial_chamber_melee\", slot_drop_chances: 0.0f}}, weight: 1}]}"); + addConversion("trial_chamber/small_melee/cave_spider", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:cave_spider\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], simultaneous_mobs: 4.0f, total_mobs: 12.0f}"); + addConversion("trial_chamber/small_melee/silverfish", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {id: \"minecraft:silverfish\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], simultaneous_mobs: 4.0f, total_mobs: 12.0f}"); + addConversion("trial_chamber/small_melee/slime", "{simultaneous_mobs: 3.0f, simultaneous_mobs_added_per_player: 0.5f, spawn_potentials: [{data: {entity: {Size: 1, id: \"minecraft:slime\"}}, weight: 3}, {data: {entity: {Size: 2, id: \"minecraft:slime\"}}, weight: 1}], ticks_between_spawn: 20}", "{loot_tables_to_eject: [{data: \"minecraft:spawners/ominous/trial_chamber/key\", weight: 3}, {data: \"minecraft:spawners/ominous/trial_chamber/consumables\", weight: 7}], simultaneous_mobs: 4.0f, total_mobs: 12.0f}"); + } + + private static void addConversion(final String keyPath, final String normalsNBT, final String ominoussNBT) { + final String fullKey = "minecraft:".concat(keyPath); + + final CompoundTag normalNBT = parseNBT(normalsNBT); + final MapType normalMapType = new NBTMapType(normalNBT); + final CompoundTag ominousNBT = parseNBT(ominoussNBT); + + final CompoundTag ominousMerged = normalNBT.copy().merge(ominousNBT); + + CONVERT_MAP.put(Pair.of(normalMapType, new NBTMapType(ominousNBT)), fullKey); + CONVERT_MAP.put(Pair.of(normalMapType, new NBTMapType(ominousMerged)), fullKey); + CONVERT_MAP.put(Pair.of(normalMapType, new NBTMapType(removeDefaults(ominousMerged.copy()))), fullKey); + } + + private static CompoundTag parseNBT(final String sNBT) { + try { + return TagParser.parseCompoundFully(sNBT); + } catch (final CommandSyntaxException ex) { + throw new IllegalArgumentException("Failed to parse NBT: " + sNBT, ex); + } + } + + private static CompoundTag removeDefaults(final CompoundTag config) { + if (config.getIntOr("spawn_range", 0) == 4) { + config.remove("spawn_range"); + } + + if (config.getFloatOr("total_mobs", 0.0F) == 6.0F) { + config.remove("total_mobs"); + } + + if (config.getFloatOr("simultaneous_mobs", 0.0F) == 2.0F) { + config.remove("simultaneous_mobs"); + } + + if (config.getFloatOr("total_mobs_added_per_player", 0.0F) == 2.0F) { + config.remove("total_mobs_added_per_player"); + } + + if (config.getFloatOr("simultaneous_mobs_added_per_player", 0.0F) == 1.0F) { + config.remove("simultaneous_mobs_added_per_player"); + } + + if (config.getIntOr("ticks_between_spawn", 0) == 40) { + config.remove("ticks_between_spawn"); + } + + return config; + } + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:trial_spawner", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType normalConfig = data.getMap("normal_config"); + final MapType ominousConfig = data.getMap("ominous_config"); + + if (normalConfig == null || ominousConfig == null) { + return null; + } + + final String newKey = CONVERT_MAP.get(new Pair<>(normalConfig, ominousConfig)); + if (newKey == null) { + return null; + } + + data.setString("normal_config", newKey.concat("/normal")); + data.setString("ominous_config", newKey.concat("/ominous")); + + return null; + } + }); + } + + private V4061() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4064.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4064.java new file mode 100644 index 0000000000000000000000000000000000000000..a3bde5f57589d8ec3f1b1d1332ec8a1780bd1f47 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4064.java @@ -0,0 +1,36 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4064 { + + private static final int VERSION = MCVersions.V24W36A + 1; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType components = data.getMap("components"); + if (components == null) { + return null; + } + + if (components.hasKey("minecraft:fire_resistant")) { + components.remove("minecraft:fire_resistant"); + + final MapType damageResistant = components.getTypeUtil().createEmptyMap(); + components.setMap("minecraft:damage_resistant", damageResistant); + + damageResistant.setString("types", "#minecraft:is_fire"); + } + + return null; + } + }); + } + + private V4064() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4067.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4067.java new file mode 100644 index 0000000000000000000000000000000000000000..1f3d0dc9353444a3826d77272f974a3362e845e1 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4067.java @@ -0,0 +1,143 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +public final class V4067 { + + private static final int VERSION = MCVersions.V24W38A + 1; + + private static final record BoatType(String name, String suffix) {} + private static final BoatType[] BOAT_TYPES = new BoatType[] { + new BoatType("oak", "boat"), + new BoatType("spruce", "boat"), + new BoatType("birch", "boat"), + new BoatType("jungle", "boat"), + new BoatType("acacia", "boat"), + new BoatType("cherry", "boat"), + new BoatType("dark_oak", "boat"), + new BoatType("mangrove", "boat"), + new BoatType("bamboo", "raft") + }; + + private static void registerChestBoat(final String id) { + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItemLists("Items")); + } + + public static void register() { + // minecraft:oak_boat is a simple entity + // minecraft:spruce_boat is a simple entity + // minecraft:birch_boat is a simple entity + // minecraft:jungle_boat is a simple entity + // minecraft:acacia_boat is a simple entity + // minecraft:cherry_boat is a simple entity + // minecraft:dark_oak_boat is a simple entity + // minecraft:mangrove_boat is a simple entity + // minecraft:bamboo_raft is a simple entity + + registerChestBoat("minecraft:oak_chest_boat"); + registerChestBoat("minecraft:spruce_chest_boat"); + registerChestBoat("minecraft:birch_chest_boat"); + registerChestBoat("minecraft:jungle_chest_boat"); + registerChestBoat("minecraft:acacia_chest_boat"); + registerChestBoat("minecraft:cherry_chest_boat"); + registerChestBoat("minecraft:dark_oak_chest_boat"); + registerChestBoat("minecraft:mangrove_chest_boat"); + registerChestBoat("minecraft:bamboo_chest_raft"); + + // we do not update V704 to set the new boat types, as the new ids are only registered here + // if we updated V704 to set the new boat types, then the registered walkers for the chest_boat would not run before + // V4067 as they are only registered here + + // to ensure that the id is correctly set eventually, we will force Type to the correct value based on the item id + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + private static final Map BOAT_TYPES_BY_ITEM_ID = new HashMap<>(); + static { + for (final BoatType boatType : BOAT_TYPES) { + BOAT_TYPES_BY_ITEM_ID.put(boatType.name() + "_" + boatType.suffix(), boatType.name()); + BOAT_TYPES_BY_ITEM_ID.put(boatType.name() + "_chest_" + boatType.suffix(), boatType.name()); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + final String boatType = BOAT_TYPES_BY_ITEM_ID.get(id); + + if (boatType == null) { + return null; + } + + final MapType components = data.getMap("components"); + if (components == null) { + return null; + } + + final MapType entityData = components.getMap("minecraft:entity_data"); + if (entityData == null) { + return null; + } + + entityData.setString("Type", boatType); + + return null; + } + }); + + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + private static final Map NORMAL_REMAPPING = new HashMap<>(BOAT_TYPES.length); + static { + for (final BoatType type : BOAT_TYPES) { + NORMAL_REMAPPING.put(type.name(), type.name() + "_" + type.suffix()); + } + } + private static final Map CHEST_REMAPPING = new HashMap<>(BOAT_TYPES.length); + static { + for (final BoatType type : BOAT_TYPES) { + CHEST_REMAPPING.put(type.name(), type.name() + "_chest_" + type.suffix()); + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + if (id == null) { + // wat + return null; + } + + final boolean normalBoat = id.equals("minecraft:boat"); + final boolean chestBoat = id.equals("minecraft:chest_boat"); + + if (!normalBoat && !chestBoat) { + return null; + } + + final String type = data.getString("Type"); + data.remove("Type"); + + if (normalBoat) { + data.setString("id", NORMAL_REMAPPING.getOrDefault(type, "minecraft:oak_boat")); + } else { + data.setString("id", CHEST_REMAPPING.getOrDefault(type, "minecraft:oak_chest_boat")); + } + + return null; + } + }); + + MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter( + new ConverterRemoveFeatureFlag(VERSION, new HashSet<>(Arrays.asList("minecraft:bundle"))) + ); + } + + private V4067() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4068.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4068.java new file mode 100644 index 0000000000000000000000000000000000000000..d24c33863e66010f4a6394a9afcc8ad7600969de --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4068.java @@ -0,0 +1,65 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import com.google.common.escape.Escaper; +import com.google.common.escape.Escapers; + +public final class V4068 { + public static final Escaper ESCAPER = Escapers.builder().addEscape('"', "\\\"").addEscape('\\', "\\\\").build(); + + private static final int VERSION = MCVersions.V24W38A + 2; + + private static void convertLock(final MapType root, final String srcPath, final String dstPath) { + if (root == null) { + return; + } + + final Object lockGeneric = root.getGeneric(srcPath); + if (lockGeneric == null) { + return; + } + + final TypeUtil typeUtil = root.getTypeUtil(); + + root.remove(srcPath); + + if (lockGeneric instanceof String lock && !lock.isEmpty()) { + final MapType newLock = typeUtil.createEmptyMap(); + root.setMap(dstPath, newLock); + + final MapType lockComponents = typeUtil.createEmptyMap(); + newLock.setMap("components", lockComponents); + + lockComponents.setString("minecraft:custom_name", ESCAPER.escape(lock)); + } + } + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType components = data.getMap("components"); + if (components == null) { + return null; + } + + convertLock(components, "minecraft:lock", "minecraft:lock"); + + return null; + } + }); + MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + convertLock(data, "Lock", "lock"); + return null; + } + }); + } + + private V4068() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4070.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4070.java new file mode 100644 index 0000000000000000000000000000000000000000..b85673d792d4b1c317d312ba607a0d30c2f57ea9 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4070.java @@ -0,0 +1,22 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; + +public final class V4070 { + + private static final int VERSION = MCVersions.V24W39A + 1; + + private static void registerChestBoat(final String id) { + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerItemLists("Items")); + } + + public static void register() { + // minecraft:pale_oak_boat is a simple entity + + registerChestBoat("minecraft:pale_oak_chest_boat"); + } + + private V4070() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java new file mode 100644 index 0000000000000000000000000000000000000000..d00e834ebb7ebdd544f4934375a5a8ba1882d89e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4071.java @@ -0,0 +1,17 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V4071 { + + private static final int VERSION = MCVersions.V24W39A + 2; + + public static void register() { + //registerMob("minecraft:creaking"); // changed to simple in 1.21.5 + //registerMob("minecraft:creaking_transient"); // changed to simple in 1.21.5 + + // minecraft:creaking_heart is a simple tile entity + } + + private V4071() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4081.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4081.java new file mode 100644 index 0000000000000000000000000000000000000000..214dd539edabc44ada373012b1256747ca373e92 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4081.java @@ -0,0 +1,27 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4081 { + + private static final int VERSION = MCVersions.V1_21_2 + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:salmon", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if ("large".equals(data.getString("type"))) { + return null; + } + + data.setString("type", "medium"); + return null; + } + }); + } + + private V4081() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4173.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4173.java new file mode 100644 index 0000000000000000000000000000000000000000..e9cff7ce434ca60196c25c44cd98e28dc5b9d151 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4173.java @@ -0,0 +1,24 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4173 { + + private static final int VERSION = MCVersions.V1_21_3 + 91; + + public static void register() { + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "TNTFuse", "fuse"); + return null; + } + }); + } + + private V4173() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4175.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4175.java new file mode 100644 index 0000000000000000000000000000000000000000..5812c07643dc21d0db4ebe808ffda0612454c00f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4175.java @@ -0,0 +1,40 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; + +public final class V4175 { + + private static final int VERSION = MCVersions.V24W44A + 1; + + public static void register() { + MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data.getMap("minecraft:equippable"), "model", "asset_id"); + + final Number modelData = data.getNumber("minecraft:custom_model_data"); + if (modelData != null) { + final TypeUtil typeUtil = data.getTypeUtil(); + + final MapType newModelData = typeUtil.createEmptyMap(); + data.setMap("minecraft:custom_model_data", newModelData); + + final ListType floats = typeUtil.createEmptyList(); + newModelData.setList("floats", floats); + + floats.addFloat(modelData.floatValue()); + } + + return null; + } + }); + } + + private V4175() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4176.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4176.java new file mode 100644 index 0000000000000000000000000000000000000000..c60f6da5422cc31a92164b5bc62f2afb8e962b00 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4176.java @@ -0,0 +1,44 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4176 { + + private static final int VERSION = MCVersions.V24W44A + 2; + + private static void fixInvalidLock(final MapType root, final String path) { + final MapType lock = root.getMap(path); + if (lock == null || lock.size() != 1) { + return; + } + + final MapType components = lock.getMap("components"); + if (components == null || components.size() != 1 || !"\"\"".equals(components.getString("minecraft:custom_name"))) { + return; + } + + root.remove(path); + } + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + fixInvalidLock(data, "lock"); + return null; + } + }); + MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + fixInvalidLock(data, "minecraft:lock"); + return null; + } + }); + } + + private V4176() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4180.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4180.java new file mode 100644 index 0000000000000000000000000000000000000000..76eeb8739d9c517a7843545f230853d214ecb8b2 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4180.java @@ -0,0 +1,22 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import java.util.Arrays; +import java.util.HashSet; + +public final class V4180 { + + private static final int VERSION = MCVersions.V1_21_4_PRE1 + 1; + + public static void register() { + MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>( + Arrays.asList( + "minecraft:winter_drop" + ) + ))); + } + + private V4180() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4181.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4181.java new file mode 100644 index 0000000000000000000000000000000000000000..8533e5924f5d5542692f511c11487c05bf61f486 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4181.java @@ -0,0 +1,36 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4181 { + + private static final int VERSION = MCVersions.V1_21_4_PRE1 + 2; + + public static void register() { + final DataConverter furnaceConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "CookTime", "cooking_time_spent"); + RenameHelper.renameSingle(data, "CookTimeTotal", "cooking_total_time"); + RenameHelper.renameSingle(data, "BurnTime", "lit_time_remaining"); + + final Object litTotalTime = data.getGeneric("lit_time_remaining"); + if (litTotalTime != null) { + data.setGeneric("lit_total_time", litTotalTime); + } + + return null; + } + }; + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:furnace", furnaceConverter); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:smoker", furnaceConverter); + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:blast_furnace", furnaceConverter); + } + + private V4181() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4185.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4185.java new file mode 100644 index 0000000000000000000000000000000000000000..8b4041d3d3a4a001bf06eaedbddad1b297122b12 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4185.java @@ -0,0 +1,17 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterAddBlendingData; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V4185 { + + private static final int VERSION = MCVersions.V1_21_4_RC1 + 1; + + public static void register() { + // See V3088 for why this converter is duplicated in here, V3441, and V3088 + MCTypeRegistry.CHUNK.addStructureConverter(new ConverterAddBlendingData(VERSION)); + } + + private V4185() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4187.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4187.java new file mode 100644 index 0000000000000000000000000000000000000000..7d09c4218d0db8119d1681bf95900be830557fa3 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4187.java @@ -0,0 +1,69 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.attributes.ConverterEntityAttributesBaseValueUpdater; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V4187 { + + private static final int VERSION = MCVersions.V1_21_4_RC2 + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId( + "minecraft:villager", + new ConverterEntityAttributesBaseValueUpdater( + VERSION, "minecraft:follow_range", + (final double curr) -> { + return curr == 48.0 ? 16.0 : curr; + } + ) + ); + MCTypeRegistry.ENTITY.addConverterForId( + "minecraft:bee", + new ConverterEntityAttributesBaseValueUpdater( + VERSION, "minecraft:follow_range", + (final double curr) -> { + return curr == 48.0 ? 16.0 : curr; + } + ) + ); + MCTypeRegistry.ENTITY.addConverterForId( + "minecraft:allay", + new ConverterEntityAttributesBaseValueUpdater( + VERSION, "minecraft:follow_range", + (final double curr) -> { + return curr == 48.0 ? 16.0 : curr; + } + ) + ); + MCTypeRegistry.ENTITY.addConverterForId( + "minecraft:llama", + new ConverterEntityAttributesBaseValueUpdater( + VERSION, "minecraft:follow_range", + (final double curr) -> { + return curr == 48.0 ? 16.0 : curr; + } + ) + ); + MCTypeRegistry.ENTITY.addConverterForId( + "minecraft:piglin_brute", + new ConverterEntityAttributesBaseValueUpdater( + VERSION, "minecraft:follow_range", + (final double curr) -> { + return curr == 16.0 ? 12.0 : curr; + } + ) + ); + MCTypeRegistry.ENTITY.addConverterForId( + "minecraft:warden", + new ConverterEntityAttributesBaseValueUpdater( + VERSION, "minecraft:follow_range", + (final double curr) -> { + return curr == 16.0 ? 24.0 : curr; + } + ) + ); + } + + private V4187() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java new file mode 100644 index 0000000000000000000000000000000000000000..44e74a97debbb36deb50a1f726ee25cc5272ab09 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java @@ -0,0 +1,312 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import ca.spottedleaf.dataconverter.types.Types; +import ca.spottedleaf.dataconverter.types.nbt.NBTMapType; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; +import com.mojang.logging.LogUtils; +import net.minecraft.nbt.TagParser; +import org.slf4j.Logger; + +public final class V4290 { + + public static final int VERSION = MCVersions.V1_21_4 + 101; + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static void convertNestedList(final ListType components) { + if (components == null) { + return; + } + for (int i = 0, len = components.size(); i < len; ++i) { + convertNested(components.getGeneric(i)); + } + } + + private static void convertNested(final Object component) { + if (component instanceof ListType listType) { + convertNestedList(listType); + } else if (component instanceof MapType root) { + convertLegacyHover(root); + + convertNestedList(root.getListUnchecked("extra")); + convertNested(root.getGeneric("separator")); + + final MapType hoverEvent = root.getMap("hoverEvent"); + if (hoverEvent != null) { + switch (hoverEvent.getString("action", "")) { + case "show_text": { + convertNested(hoverEvent.getGeneric("contents")); + break; + } + case "show_item": { + break; + } + case "show_entity": { + convertNested(hoverEvent.getGeneric("name")); + break; + } + // default: do nothing + } + } + } // else: should only be string + } + + private static void convertLegacyHover(final MapType textComponent) { + final TypeUtil typeUtil = textComponent.getTypeUtil(); + final MapType hoverEvent = textComponent.getMap("hoverEvent"); + if (hoverEvent == null) { + return; + } + + final Object legacyValue = hoverEvent.getGeneric("value"); + if (legacyValue == null) { + // nothing to do here + return; + } + + switch (hoverEvent.getString("action", "")) { + case "show_text": { + // value -> another text component; all we need to do is just move it to contents + hoverEvent.remove("value"); + hoverEvent.setGeneric("contents", legacyValue); + break; + } + case "show_item": { + // value -> snbt of serialized item + hoverEvent.remove("value"); + if (!(legacyValue instanceof String legacyItemStr)) { + LOGGER.error("Legacy HoverEvent with action=show_item has invalid value, expected string: " + legacyValue); + break; + } + + final MapType legacyItem; + try { + legacyItem = new NBTMapType(TagParser.parseCompoundFully(legacyItemStr)); + } catch (final Exception ex) { + LOGGER.error("Failed to parse SNBT for legacy item HoverEvent: " + legacyItemStr, ex); + break; + } + + // note: blindly take precedence over non-legacy data + hoverEvent.setMap("contents", legacyItem); + break; + } + case "show_entity": { + // value -> snbt of {name:,type:,id:} + hoverEvent.remove("value"); + if (!(legacyValue instanceof String legacyEntityStr)) { + LOGGER.error("Legacy HoverEvent with action=show_entity has invalid value, expected string: " + legacyValue); + break; + } + + final MapType legacyEntity; + try { + legacyEntity = new NBTMapType(TagParser.parseCompoundFully(legacyEntityStr)); + } catch (final Exception ex) { + LOGGER.error("Failed to parse SNBT for legacy entity HoverEvent: " + legacyEntityStr, ex); + break; + } + + final MapType newContents = typeUtil.createEmptyMap(); + // note: blindly take precedence over non-legacy data + hoverEvent.setMap("contents", newContents); + + final String name = legacyEntity.getString("name"); + if (name != null) { + newContents.setString("name", name); + } + final String type = legacyEntity.getString("type"); + if (type != null) { + newContents.setString("type", type); + } + final String id = legacyEntity.getString("id"); + if (id != null) { + newContents.setString("id", id); + } + + break; + } + // default: do nothing + } + } + + private static void directWalkComponentList(final ListType list, final long fromVersion, final long toVersion) { + for (int i = 0, len = list.size(); i < len; ++i) { + directWalkComponent(list.getGeneric(i), fromVersion, toVersion); + } + } + + private static void directWalkComponent(final Object input, final long fromVersion, final long toVersion) { + if (input instanceof ListType listType) { + directWalkComponentList(listType, fromVersion, toVersion); + } else if (input instanceof MapType root) { + final ListType extra = root.getListUnchecked("extra"); + if (extra != null) { + directWalkComponentList(extra, fromVersion, toVersion); + } + + final Object separator = root.getGeneric("separator"); + if (separator != null) { + directWalkComponent(separator, fromVersion, toVersion); + } + + final MapType clickEvent = root.getMap("clickEvent"); + if (clickEvent != null) { + switch (clickEvent.getString("action", "")) { + case "run_command": + case "suggest_command": { + WalkerUtils.convert(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, clickEvent, "value", fromVersion, toVersion); + break; + } + } + } + + final MapType hoverEvent = root.getMap("hoverEvent"); + if (hoverEvent != null) { + switch (hoverEvent.getString("action", "")) { + case "show_text": { + final Object contents = hoverEvent.getGeneric("contents"); + if (contents != null) { + directWalkComponent(contents, fromVersion, toVersion); + } + break; + } + case "show_item": { + if (hoverEvent.hasKey("contents", ObjectType.STRING)) { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, hoverEvent, "contents", fromVersion, toVersion); + } else { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, hoverEvent, "contents", fromVersion, toVersion); + } + break; + } + case "show_entity": { + WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, hoverEvent, "type", fromVersion, toVersion); + + final Object name = hoverEvent.getGeneric("name"); + if (name != null) { + directWalkComponent(name, fromVersion, toVersion); + } + break; + } + // default: do nothing + } + } + } // else: should only be string + } + + public static void register() { + MCTypeRegistry.TEXT_COMPONENT.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public Object convert(final Object data, final long sourceVersion, final long toVersion) { + if (data instanceof ListType) { + // will be iterated by walker + return null; + } + if (data instanceof MapType) { + // (probably) iterated by walker + return null; + } + if (data instanceof Number number) { + // text component parsed as list of numbers, which was then iterated by walker + // we need to convert to correct type, which is string + return number.toString(); + } + if (data instanceof Boolean bool) { + // text component parsed as list of booleans, which was then iterated by walker + // we need to convert to correct type, which is string + return bool.toString(); + } + + if (!(data instanceof String unparsedJson)) { + throw new IllegalArgumentException("Wrong type for text component: " + data); + } + + try { + final JsonElement json = JsonParser.parseString(unparsedJson); + + if (!json.isJsonNull()) { + final Object generic = Types.JSON.convertFromBaseToGeneric(json, Types.NBT); + final Object ret = switch (generic) { + case Number nt -> nt.toString(); // json may parse as integer, need to convert to string + case Boolean bt -> bt.toString(); // json may parse as boolean, need to convert to string + case String s -> s; // simple string component + case ListType lt -> lt; // list of text components + case MapType ct -> ct; // complex text component + case byte[] bt -> throw new IllegalStateException("Unexpected byte[] output from JsonTypeUtil"); + case int[] it -> throw new IllegalStateException("Unexpected int[] output from JsonTypeUtil"); + case long[] lt -> throw new IllegalStateException("Unexpected long[] output from JsonTypeUtil"); + // null is handled by isJsonNull() + default -> throw new IllegalStateException("Unknown nbt type: " + generic); + }; + + convertNested(ret); + directWalkComponent(ret, sourceVersion, toVersion); // Fix MC-299285 + return ret; + } + } catch (final JsonParseException ex) { + LOGGER.error("Failed to convert json to nbt: " + unparsedJson, ex); + } + + return null; + } + }); + + // step 1 + MCTypeRegistry.TEXT_COMPONENT.addStructureWalker(VERSION, 1, (final Object input, final long fromVersion, final long toVersion) -> { + if (input instanceof ListType listType) { + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, listType, fromVersion, toVersion); + } else if (input instanceof MapType root) { + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "extra", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "separator", fromVersion, toVersion); + + final MapType clickEvent = root.getMap("clickEvent"); + if (clickEvent != null) { + switch (clickEvent.getString("action", "")) { + case "run_command": + case "suggest_command": { + WalkerUtils.convert(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, clickEvent, "value", fromVersion, toVersion); + break; + } + } + } + + final MapType hoverEvent = root.getMap("hoverEvent"); + if (hoverEvent != null) { + switch (hoverEvent.getString("action", "")) { + case "show_text": { + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, hoverEvent, "contents", fromVersion, toVersion); + break; + } + case "show_item": { + if (hoverEvent.hasKey("contents", ObjectType.STRING)) { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, hoverEvent, "contents", fromVersion, toVersion); + } else { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, hoverEvent, "contents", fromVersion, toVersion); + } + break; + } + case "show_entity": { + WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, hoverEvent, "type", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, hoverEvent, "name", fromVersion, toVersion); + break; + } + // default: do nothing + } + } + } // else: should only be string + return null; + }); + } + + private V4290() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4291.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4291.java new file mode 100644 index 0000000000000000000000000000000000000000..9c01fa1f41735dd54641533ce6eefec381270993 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4291.java @@ -0,0 +1,45 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4291 { + + public static final int VERSION = MCVersions.V1_21_4 + 102; + + public static void register() { + // V4290 correctly handles legacy hover events, so we skip that converter. + MCTypeRegistry.TEXT_COMPONENT.addStructureConverter(new DataConverter<>(VERSION) { + private static final String[] BOOLEAN_PATHS_TO_CONVERT = new String[] { + "bold", + "italic", + "underlined", + "strikethrough", + "obfuscated", + // add extra interpret field + "interpret", + }; + + private static void convertToBoolean(final MapType data, final String path) { + final String value = data.getString(path); + if (value != null) { + data.setBoolean(path, Boolean.parseBoolean(value)); + } + } + + @Override + public Object convert(final Object data, final long sourceVersion, final long toVersion) { + if (data instanceof MapType root) { + for (final String path : BOOLEAN_PATHS_TO_CONVERT) { + convertToBoolean(root, path); + } + } // else: list -> handled by walker, string -> no formatting to convert + return null; + } + }); + } + + private V4291() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4292.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4292.java new file mode 100644 index 0000000000000000000000000000000000000000..34f20d3cb6595eaa11e00126804ef7bd3fafa05b --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4292.java @@ -0,0 +1,180 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.CopyHelper; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import java.net.URI; + +public final class V4292 { + + private static final int VERSION = MCVersions.V1_21_4 + 103; + + public static void register() { + MCTypeRegistry.TEXT_COMPONENT.addStructureConverter(new DataConverter<>(VERSION) { + private static boolean isWebUrl(final String value) { + try { + final String scheme = new URI(value).getScheme(); + + return "http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme); + } catch (final Exception ex) { + return false; + } + } + + private static boolean isValidCommandOrChat(final String value) { + for (int i = 0, len = value.length(); i < len; ++i) { + final char c = value.charAt(i); + + if (c < ' ' || c == 127 || c == 167) { + return false; + } + } + + return true; + } + + private static Integer parseInteger(final MapType root, final String path) { + final Object value = root.getGeneric(path); + if (value instanceof String string) { + try { + return Integer.parseInt(string); + } catch (final Exception ex) { + return null; + } + } else if (value instanceof Number number) { + return Integer.valueOf(number.intValue()); + } + + return null; + } + + @Override + public Object convert(final Object data, final long sourceVersion, final long toVersion) { + if (!(data instanceof MapType root)) { + // list or string, don't care about formatting for those + return null; + } + + RenameHelper.renameSingle(root, "hoverEvent", "hover_event"); + final MapType hoverEvent = root.getMap("hover_event"); + if (hoverEvent != null) { + switch (hoverEvent.getString("action", "")) { + case "show_text": { + RenameHelper.renameSingle(hoverEvent, "contents", "value"); + break; + } + case "show_item": { + if (hoverEvent.hasKey("contents", ObjectType.STRING)) { + RenameHelper.renameSingle(hoverEvent, "contents", "id"); + } else { + final MapType contents = hoverEvent.getOrCreateMap("contents"); + hoverEvent.remove("contents"); + + CopyHelper.move(contents, "id", hoverEvent, "id"); + CopyHelper.move(contents, "count", hoverEvent, "count"); + CopyHelper.move(contents, "components", hoverEvent, "components"); + } + break; + } + case "show_entity": { + final MapType contents = hoverEvent.getOrCreateMap("contents"); + hoverEvent.remove("contents"); + + CopyHelper.move(contents, "id", hoverEvent, "uuid"); + CopyHelper.move(contents, "type", hoverEvent, "id"); + CopyHelper.move(contents, "name", hoverEvent, "name"); + + break; + } + + // default: do nothing + } + } + + RenameHelper.renameSingle(root, "clickEvent", "click_event"); + final MapType clickEvent = root.getMap("click_event"); + if (clickEvent != null) { + final String value = clickEvent.getString("value", ""); + + switch (clickEvent.getString("action", "")) { + case "open_url": { + if (!isWebUrl(value)) { + root.remove("click_event"); + break; + } + RenameHelper.renameSingle(clickEvent, "value", "url"); + break; + } + case "open_file": { + RenameHelper.renameSingle(clickEvent, "value", "path"); + break; + } + case "run_command": + case "suggest_command": { + if (!isValidCommandOrChat(value)) { + root.remove("click_event"); + break; + } + RenameHelper.renameSingle(clickEvent, "value", "command"); + break; + } + case "change_page": { + final Integer page = parseInteger(clickEvent, "value"); + if (page == null) { + root.remove("click_event"); + break; + } + clickEvent.remove("value"); + clickEvent.setInt("page", Math.max(1, page.intValue())); + } + + // default: do nothing + } + } + + return null; + } + }); + + MCTypeRegistry.TEXT_COMPONENT.addStructureWalker(VERSION, (final Object input, final long fromVersion, final long toVersion) -> { + if (input instanceof ListType listType) { + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, listType, fromVersion, toVersion); + } else if (input instanceof MapType root) { + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "extra", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "separator", fromVersion, toVersion); + + + WalkerUtils.convert(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, root.getMap("clickEvent"), "command", fromVersion, toVersion); + + final MapType hoverEvent = root.getMap("hover_event"); + if (hoverEvent != null) { + switch (hoverEvent.getString("action", "")) { + case "show_text": { + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, hoverEvent, "value", fromVersion, toVersion); + break; + } + case "show_item": { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "hover_event", fromVersion, toVersion); + break; + } + case "show_entity": { + WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, hoverEvent, "id", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, hoverEvent, "name", fromVersion, toVersion); + break; + } + // default: do nothing + } + } + } // else: should only be string + return null; + }); + } + + private V4292() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4293.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4293.java new file mode 100644 index 0000000000000000000000000000000000000000..aac34658c39c568baba069ae151bcd7802bdad27 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4293.java @@ -0,0 +1,71 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4293 { + + private static final int VERSION = MCVersions.V1_21_4 + 104; + + public static void register() { + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + private static final float DEFAULT = 0.085f; + + private static final String[] ARMOR_SLOTS = new String[] { + "feet", + "legs", + "chest", + "head" + }; + + private static final String[] HAND_SLOTS = new String[] { + "mainhand", + "offhand" + }; + + private static void convertDropChances(final MapType root, final String srcPath, final String[] names, final MapType dst) { + final ListType oldChances = root.getListUnchecked(srcPath); + + if (oldChances == null) { + return; + } + + for (int i = 0, len = Math.min(oldChances.size(), names.length); i < len; ++i) { + final float chance = oldChances.getFloat(i, DEFAULT); + if (chance != DEFAULT) { + dst.setFloat(names[i], chance); + } + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType dropChances = data.getTypeUtil().createEmptyMap(); + + convertDropChances(data, "ArmorDropChances", ARMOR_SLOTS, dropChances); + convertDropChances(data, "HandDropChances", HAND_SLOTS, dropChances); + + data.remove("ArmorDropChances"); + data.remove("HandDropChances"); + + final float body = data.getFloat("body_armor_drop_chance", DEFAULT); + data.remove("body_armor_drop_chance"); + + if (body != DEFAULT) { + dropChances.setFloat("body", body); + } + + if (!dropChances.isEmpty()) { + data.setMap("drop_chances", dropChances); + } + + return null; + } + }); + } + + private V4293() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4294.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4294.java new file mode 100644 index 0000000000000000000000000000000000000000..86f4c268197d90270768786f3911258e841040ea --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4294.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4294 { + + private static final int VERSION = MCVersions.V1_21_4 + 105; + + public static void register() { + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"minecraft:creaking_heart".equals(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + if (properties == null) { + return null; + } + + final String active = properties.getString("active"); + if (active == null) { + return null; + } + properties.remove("active"); + properties.setString("creaking_heart_state", active.equals("true") ? "awake" : "uprooted"); + + return null; + } + }); + } + + private V4294() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4295.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4295.java new file mode 100644 index 0000000000000000000000000000000000000000..e85a156f21f826faf5e04a5f93df7e3b77ebc15c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4295.java @@ -0,0 +1,17 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.chunk.ConverterAddBlendingData; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; + +public final class V4295 { + + private static final int VERSION = MCVersions.V1_21_4 + 106; + + public static void register() { + // See V3088 for why this converter is duplicated in here, V4185, V3441, and V3088 + MCTypeRegistry.CHUNK.addStructureConverter(new ConverterAddBlendingData(VERSION)); + } + + private V4295() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4296.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4296.java new file mode 100644 index 0000000000000000000000000000000000000000..a22ee6dee2f14a61688734a1afa71dc55d90ff43 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4296.java @@ -0,0 +1,23 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4296 { + + private static final int VERSION = MCVersions.V1_21_4 + 107; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setFloat("potion_duration_scale", 0.25f); + return null; + } + }); + } + + private V4296() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4297.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4297.java new file mode 100644 index 0000000000000000000000000000000000000000..83c2c4e3e3c73e605d0f57b7c85db1bef64f982f --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4297.java @@ -0,0 +1,51 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; + +public final class V4297 { + + private static final int VERSION = MCVersions.V1_21_4 + 108; + + public static void register() { + MCTypeRegistry.SAVED_DATA_TICKETS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + final long[] forced = data.getLongs("Forced"); + if (forced == null) { + return null; + } + + data.remove("Forced"); + + final TypeUtil typeUtil = data.getTypeUtil(); + + final ListType tickets = typeUtil.createEmptyList(); + data.setList("tickets", tickets); + + for (final long coordinate : forced) { + final MapType ticket = typeUtil.createEmptyMap(); + tickets.addMap(ticket); + + ticket.setString("type", "minecraft:forced"); + ticket.setInt("level", 31); + ticket.setLong("ticks_left", 0L); + ticket.setLong("chunk_pos", coordinate); + } + + return null; + } + }); + } + + private V4297() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4299.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4299.java new file mode 100644 index 0000000000000000000000000000000000000000..e09c5ed9bd872ddb4d809b28434d35d48b065564 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4299.java @@ -0,0 +1,140 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public final class V4299 { + + private static final int VERSION = MCVersions.V25W02A + 1; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addStructureConverter(new DataConverter<>(VERSION) { + private static final String[] AXOLOTL_VARIANT_LOOKUP = new String[] { + "lucy", + "wild", + "gold", + "cyan", + "blue", + }; + + private static final Int2ObjectOpenHashMap FISH_PATTERN_LOOKUP = new Int2ObjectOpenHashMap<>(); + static { + FISH_PATTERN_LOOKUP.defaultReturnValue("kob"); + FISH_PATTERN_LOOKUP.put(1,"flopper"); + FISH_PATTERN_LOOKUP.put(256,"sunstreak"); + FISH_PATTERN_LOOKUP.put(257,"stripey"); + FISH_PATTERN_LOOKUP.put(512,"snooper"); + FISH_PATTERN_LOOKUP.put(513,"glitter"); + FISH_PATTERN_LOOKUP.put(768,"dasher"); + FISH_PATTERN_LOOKUP.put(769,"blockfish"); + FISH_PATTERN_LOOKUP.put(1024,"brinely"); + FISH_PATTERN_LOOKUP.put(1025,"betty"); + FISH_PATTERN_LOOKUP.put(1280,"spotty"); + FISH_PATTERN_LOOKUP.put(1281,"clayfish"); + } + + private static String lookupAxolotl(final int index) { + return index >= 0 && index < AXOLOTL_VARIANT_LOOKUP.length ? AXOLOTL_VARIANT_LOOKUP[index] : AXOLOTL_VARIANT_LOOKUP[0]; + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType components = data.getMap("components"); + if (components == null) { + return null; + } + + final String id = data.getString("id"); + switch (id) { + case "minecraft:axolotl_bucket": { + final MapType bucketEntityData = components.getMap("minecraft:bucket_entity_data"); + if (bucketEntityData == null) { + break; + } + + final Number variant = bucketEntityData.getNumber("Variant"); + if (variant == null) { + break; + } + + bucketEntityData.remove("Variant"); + components.setString("minecraft:axolotl/variant", lookupAxolotl(variant.intValue())); + + break; + } + case "minecraft:salmon_bucket": { + final MapType bucketEntityData = components.getMap("minecraft:bucket_entity_data"); + if (bucketEntityData == null) { + break; + } + + final Object type = bucketEntityData.getGeneric("type"); + if (type == null) { + break; + } + bucketEntityData.remove("type"); + components.setGeneric("minecraft:salmon/size", type); + + break; + } + case "minecraft:tropical_fish_bucket": { + final MapType bucketEntityData = components.getMap("minecraft:bucket_entity_data"); + if (bucketEntityData == null) { + break; + } + + final Number variantBoxed = bucketEntityData.getNumber("BucketVariantTag"); + if (variantBoxed == null) { + break; + } + bucketEntityData.remove("BucketVariantTag"); + + final int variant = variantBoxed.intValue(); + + final String fishPattern = FISH_PATTERN_LOOKUP.get(variant & 0xFFFF); + final String baseColour = V3818.getBannerColour((variant >>> 16) & 0xFF); + final String patternColour = V3818.getBannerColour((variant >>> 24) & 0xFF); + + components.setString("minecraft:tropical_fish/pattern", fishPattern); + components.setString("minecraft:tropical_fish/base_color", baseColour); + components.setString("minecraft:tropical_fish/pattern_color", patternColour); + + break; + } + case "minecraft:painting": { + final MapType entityData = components.getMap("minecraft:entity_data"); + + if (entityData == null) { + break; + } + + if (!"minecraft:painting".equals(entityData.getString("id"))) { + break; + } + + final Object variant = entityData.getGeneric("variant"); + if (variant != null) { + entityData.remove("variant"); + components.setGeneric("minecraft:painting/variant", variant); + } + if (entityData.size() == 1) { + components.remove("minecraft:entity_data"); + } + + break; + } + default: { + return null; + } + } + + return null; + } + }); + } + + private V4299() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4300.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4300.java new file mode 100644 index 0000000000000000000000000000000000000000..0619fc8509177e8f66e6a33072249d2468789fef --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4300.java @@ -0,0 +1,89 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public final class V4300 { + + private static final int VERSION = MCVersions.V25W02A + 2; + + public static void register() { + MCTypeRegistry.ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + private static final Set SADDLE_ITEM_ENTITIES = new HashSet<>( + Arrays.asList( + "minecraft:horse", + "minecraft:skeleton_horse", + "minecraft:zombie_horse", + "minecraft:donkey", + "minecraft:mule", + "minecraft:camel", + "minecraft:llama", + "minecraft:trader_llama" + ) + ); + private static final Set SADDLE_FLAG_ENTITIES = new HashSet<>( + Arrays.asList( + "minecraft:pig", + "minecraft:strider" + ) + ); + + private static void setGuaranteedSaddleDropChance(final MapType data) { + data.getOrCreateMap("drop_chances").setFloat("saddle", 2.0f); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + + if (SADDLE_ITEM_ENTITIES.contains(id)) { + if (!RenameHelper.renameSingle(data, "SaddleItem", "saddle")) { + return null; + } + + setGuaranteedSaddleDropChance(data); + + return null; + } else if (SADDLE_FLAG_ENTITIES.contains(id)) { + final boolean saddle = data.getBoolean("Saddle"); + data.remove("Saddle"); + + if (!saddle) { + return null; + } + + final MapType saddleItem = data.getTypeUtil().createEmptyMap(); + data.setMap("saddle", saddleItem); + saddleItem.setString("id", "minecraft:saddle"); + saddleItem.setInt("count", 1); + + setGuaranteedSaddleDropChance(data); + + return null; + } + + return null; + } + }); + + // saddle item moved to `saddle`, which is now under ENTITY_EQUIPMENT + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:llama", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:trader_llama", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:donkey", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:mule", new DataWalkerItemLists("Items")); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:horse", DataWalker.noOp()); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:skeleton_horse", DataWalker.noOp()); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:zombie_horse", DataWalker.noOp()); + } + + private V4300() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4301.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4301.java new file mode 100644 index 0000000000000000000000000000000000000000..3eef93d9666ccf4fd748f137daa25613fefae548 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4301.java @@ -0,0 +1,93 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4301 { + + private static final int VERSION = MCVersions.V25W02A + 3; + + public static void register() { + MCTypeRegistry.ENTITY_EQUIPMENT.addStructureConverter(new DataConverter<>(VERSION) { + private static final String[] ARMOR_SLOTS = new String[] { + "feet", + "legs", + "chest", + "head" + }; + + private static final String[] HAND_SLOTS = new String[] { + "mainhand", + "offhand" + }; + + private static MapType filterItem(final MapType item) { + return item == null || item.hasKey("id") ? item : null; + } + + private static void setIfNonNull(final MapType dst, final String dstKey, final MapType value) { + if (value != null) { + dst.setMap(dstKey, value); + } + } + + private static void moveItems(final MapType src, final String srcPath, final String[] names, final MapType dst) { + final ListType items = src.getListUnchecked(srcPath); + if (items == null) { + return; + } + + for (int i = 0, len = Math.min(items.size(), names.length); i < len; ++i) { + final MapType item = filterItem(items.getMap(i, null)); + if (item != null) { + dst.setMap(names[i], item); + } + } + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType equipment = data.getTypeUtil().createEmptyMap(); + + setIfNonNull(equipment, "body", filterItem(data.getMap("body_armor_item"))); + setIfNonNull(equipment, "saddle", filterItem(data.getMap("saddle"))); + + moveItems(data, "ArmorItems", ARMOR_SLOTS, equipment); + moveItems(data, "HandItems", HAND_SLOTS, equipment); + + data.remove("ArmorItems"); + data.remove("HandItems"); + data.remove("body_armor_item"); + data.remove("saddle"); + + if (!equipment.isEmpty()) { + data.setMap("equipment", equipment); + } + + return null; + } + }); + + MCTypeRegistry.ENTITY_EQUIPMENT.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType equipment = data.getMap("equipment"); + if (equipment != null) { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "mainhand", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "offhand", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "feet", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "legs", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "chest", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "head", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "body", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, equipment, "saddle", fromVersion, toVersion); + } + + return null; + }); + } + + private V4301() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4302.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4302.java new file mode 100644 index 0000000000000000000000000000000000000000..7eb1d865cf8ba91f15b0bb6460de7c26853bb21b --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4302.java @@ -0,0 +1,17 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V4302 { + + private static final int VERSION = MCVersions.V25W02A + 4; + + public static void register() { + + + // test_block is simple TE + // test_instance_block is simple TE + } + + private V4302() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4303.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4303.java new file mode 100644 index 0000000000000000000000000000000000000000..b0a1766502493fa2d2ce746c47c883d270144293 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4303.java @@ -0,0 +1,33 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4303 { + + private static final int VERSION = MCVersions.V25W02A + 5; + + public static void register() { + final DataConverter fallConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey("FallDistance")) { + return null; + } + final float fallDistance = data.getFloat("FallDistance", 0.0f); + data.remove("FallDistance"); + + data.setDouble("fall_distance", (double)fallDistance); + + return null; + } + }; + + MCTypeRegistry.ENTITY.addStructureConverter(fallConverter); + MCTypeRegistry.PLAYER.addStructureConverter(fallConverter); + } + + private V4303() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4305.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4305.java new file mode 100644 index 0000000000000000000000000000000000000000..90bd5dad4efaa654adbda610a287fea26519a352 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4305.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4305 { + + private static final int VERSION = MCVersions.V25W03A + 1; + + public static void register() { + MCTypeRegistry.BLOCK_STATE.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!"minecraft:test_block".equals(data.getString("Name"))) { + return null; + } + + final MapType properties = data.getMap("Properties"); + if (properties == null) { + return null; + } + + final String mode = properties.getString("test_block_mode"); + if (mode == null) { + return null; + } + properties.remove("test_block_mode"); + properties.setString("mode", mode); + + return null; + } + }); + } + + private V4305() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4306.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4306.java new file mode 100644 index 0000000000000000000000000000000000000000..f5b46c9f10719ce0e2014eb2289648fc7f4aa904 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4306.java @@ -0,0 +1,37 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4306 { + + private static final int VERSION = MCVersions.V25W03A + 2; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:potion", new DataConverter<>(VERSION) { + private static boolean matchItem(final MapType item, final String id) { + if (item == null) { + return false; + } + + return id.equals(item.getString("id")); + } + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setString("id", matchItem(data.getMap("Item"), "minecraft:lingering_potion") ? "minecraft:lingering_potion" : "minecraft:splash_potion"); + + return null; + } + }); + + MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:potion", "minecraft:splash_potion"); + MCTypeRegistry.ENTITY.copyWalkers(VERSION, "minecraft:potion", "minecraft:lingering_potion"); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", DataWalker.noOp()); + } + + private V4306() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4307.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4307.java new file mode 100644 index 0000000000000000000000000000000000000000..d2877c20f389d0131e1dd208b464f590671e5d82 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4307.java @@ -0,0 +1,224 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import java.util.LinkedHashSet; +import java.util.Set; + +public final class V4307 { + + private static final int VERSION = MCVersions.V25W03A + 3; + + public static void register() { + MCTypeRegistry.DATA_COMPONENTS.addStructureConverter(new DataConverter<>(VERSION) { + private static final String[] ADDITIONAL_TOOLTIP_COMPONENTS = new String[] { + "minecraft:banner_patterns", + "minecraft:bees", + "minecraft:block_entity_data", + "minecraft:block_state", + "minecraft:bundle_contents", + "minecraft:charged_projectiles", + "minecraft:container", + "minecraft:container_loot", + "minecraft:firework_explosion", + "minecraft:fireworks", + "minecraft:instrument", + "minecraft:map_id", + "minecraft:painting/variant", + "minecraft:pot_decorations", + "minecraft:potion_contents", + "minecraft:tropical_fish/pattern", + "minecraft:written_book_content" + }; + + private static void unwrapBlockPredicates(final MapType root, final String path, final Set hiddenComponents) { + final MapType component = root.getMap(path); + if (component == null) { + return; + } + + final Object predicates = component.getGeneric("predicates"); + if (predicates == null) { + return; + } + root.setGeneric(path, predicates); + if (!component.getBoolean("show_in_tooltip", true)) { + hiddenComponents.add(path); + } + } + + private static void updateComponent(final MapType root, final String path, final Set hiddenComponents) { + final MapType component = root.getMap(path); + if (component == null) { + return; + } + + if (!component.getBoolean("show_in_tooltip", true)) { + hiddenComponents.add(path); + } + + component.remove("show_in_tooltip"); + } + + private static void updateComponentAndUnwrap(final MapType root, final String componentPath, final String unwrapPath, final Set hiddenComponents) { + final MapType component = root.getMap(componentPath); + if (component == null) { + return; + } + + if (!component.getBoolean("show_in_tooltip", true)) { + hiddenComponents.add(componentPath); + } + + component.remove("show_in_tooltip"); + + final Object wrapped = component.getGeneric(unwrapPath); + if (wrapped != null) { + root.setGeneric(componentPath, wrapped); + } + } + + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final Set hiddenComponents = new LinkedHashSet<>(); + + unwrapBlockPredicates(root, "minecraft:can_break", hiddenComponents); + unwrapBlockPredicates(root, "minecraft:can_place_on", hiddenComponents); + + updateComponent(root, "minecraft:trim", hiddenComponents); + updateComponent(root, "minecraft:unbreakable", hiddenComponents); + + updateComponentAndUnwrap(root, "minecraft:dyed_color", "rgb", hiddenComponents); + updateComponentAndUnwrap(root, "minecraft:attribute_modifiers", "modifiers", hiddenComponents); + updateComponentAndUnwrap(root, "minecraft:enchantments", "levels", hiddenComponents); + updateComponentAndUnwrap(root, "minecraft:stored_enchantments", "levels", hiddenComponents); + updateComponentAndUnwrap(root, "minecraft:jukebox_playable", "song", hiddenComponents); + + final boolean hideTooltip = root.hasKey("minecraft:hide_tooltip"); + final boolean hideAdditionalTooltip = root.hasKey("minecraft:hide_additional_tooltip"); + + if (hideAdditionalTooltip) { + for (final String component : ADDITIONAL_TOOLTIP_COMPONENTS) { + if (root.hasKey(component)) { + hiddenComponents.add(component); + } + } + } + + root.remove("minecraft:hide_tooltip"); + root.remove("minecraft:hide_additional_tooltip"); + + if (hideTooltip || !hiddenComponents.isEmpty()) { + final TypeUtil typeUtil = root.getTypeUtil(); + + final MapType tooltipDisplay = typeUtil.createEmptyMap(); + final ListType hiddenComponentsList = typeUtil.createEmptyList(); + + root.setMap("minecraft:tooltip_display", tooltipDisplay); + tooltipDisplay.setBoolean("hide_tooltip", hideTooltip); + tooltipDisplay.setList("hidden_components", hiddenComponentsList); + + for (final String component : hiddenComponents) { + hiddenComponentsList.addString(component); + } + } + + return null; + } + }); + + // previous version: 4059 + MCTypeRegistry.DATA_COMPONENTS.addStructureWalker(VERSION, new DataWalker<>() { + private static void walkBlockPredicate(final MapType data, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + if (data.hasKey("blocks", ObjectType.LIST)) { + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, data, "blocks", fromVersion, toVersion); + } else { + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, data, "blocks", fromVersion, toVersion); + } + } + + private static void walkBlockPredicates(final MapType root, final String path, final long fromVersion, final long toVersion) { + final Object value = root.getGeneric(path); + + if (value instanceof MapType data) { + walkBlockPredicate(data, fromVersion, toVersion); + } else if (value instanceof ListType list) { + for (int i = 0, len = list.size(); i < len; ++i) { + walkBlockPredicate(list.getMap(i, null), fromVersion, toVersion); + } + } + } + + @Override + public MapType walk(final MapType root, final long fromVersion, final long toVersion) { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "minecraft:bees", "entity_data", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.TILE_ENTITY, root, "minecraft:block_entity_data", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:bundle_contents", fromVersion, toVersion); + + walkBlockPredicates(root, "minecraft:can_break", fromVersion, toVersion); + walkBlockPredicates(root, "minecraft:can_place_on", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, root, "minecraft:charged_projectiles", fromVersion, toVersion); + WalkerUtils.convertListPath(MCTypeRegistry.ITEM_STACK, root, "minecraft:container", "item", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ENTITY, root, "minecraft:entity_data", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_NAME, root, "minecraft:pot_decorations", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "minecraft:use_remainder", fromVersion, toVersion); + + final MapType equippable = root.getMap("minecraft:equippable"); + if (equippable != null) { + WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, equippable, "allowed_entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ENTITY_NAME, equippable, "allowed_entities", fromVersion, toVersion); + } + + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:custom_name", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:item_name", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, root, "minecraft:lore", fromVersion, toVersion); + + final MapType writtenBookContent = root.getMap("minecraft:written_book_content"); + if (writtenBookContent != null) { + final ListType pages = writtenBookContent.getListUnchecked("pages"); + if (pages != null) { + for (int i = 0, len = pages.size(); i < len; ++i) { + final Object pageGeneric = pages.getGeneric(i); + if (pageGeneric instanceof String || pageGeneric instanceof ListType) { // handles: String case, ListType case + final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(pageGeneric, fromVersion, toVersion); + if (convertedGeneric != null) { + pages.setGeneric(i, convertedGeneric); + } + } else if (pageGeneric instanceof MapType mapType) { + // Need to handle: Filterable format and regular NBT Component format are both MapType... + if (mapType.hasKey("raw") || mapType.hasKey("filtered")) { + // Assume filterable format + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "raw", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, mapType, "filtered", fromVersion, toVersion); + } else { + // Assume regular NBT format + final Object convertedGeneric = MCTypeRegistry.TEXT_COMPONENT.convert(pageGeneric, fromVersion, toVersion); + if (convertedGeneric != null) { + pages.setGeneric(i, convertedGeneric); + } + } + } + } + } + } + + return null; + } + }); + } + + private V4307() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4309.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4309.java new file mode 100644 index 0000000000000000000000000000000000000000..6b73fcafb812f24aede33868ef87408a60ef19c8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4309.java @@ -0,0 +1,109 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4309 { + + private static final int VERSION = MCVersions.V25W04A + 1; + + public static int[] makeBlockPosition(final Number x, final Number y, final Number z) { + return new int[] { x.intValue(), y.intValue(), z.intValue() }; + } + + public static void convertBlockPosition(final MapType data, final String xPath, final String yPath, final String zPath, + final String toPath) { + final Number x = data.getNumber(xPath); + final Number y = data.getNumber(yPath); + final Number z = data.getNumber(zPath); + + if (x == null || y == null || z == null) { + return; + } + + data.remove(xPath); + data.remove(yPath); + data.remove(zPath); + + data.setInts(toPath, makeBlockPosition(x, y, z)); + } + + public static void register() { + MCTypeRegistry.SAVED_DATA_RAIDS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + RenameHelper.renameSingle(data, "Raids", "raids"); + RenameHelper.renameSingle(data, "Tick", "tick"); + RenameHelper.renameSingle(data, "NextAvailableID", "next_id"); + + final ListType raids = data.getListUnchecked("raids"); + if (raids != null) { + for (int i = 0, len = raids.size(); i < len; ++i) { + final MapType raid = raids.getMap(i, null); + if (raid == null) { + continue; + } + + convertBlockPosition(raid, "CX", "CY", "CZ", "center"); + + RenameHelper.renameSingle(raid, "Id", "id"); + RenameHelper.renameSingle(raid, "Started", "started"); + RenameHelper.renameSingle(raid, "Active", "active"); + RenameHelper.renameSingle(raid, "TicksActive", "ticks_active"); + RenameHelper.renameSingle(raid, "BadOmenLevel", "raid_omen_level"); + RenameHelper.renameSingle(raid, "GroupsSpawned", "groups_spawned"); + RenameHelper.renameSingle(raid, "PreRaidTicks", "cooldown_ticks"); + RenameHelper.renameSingle(raid, "PostRaidTicks", "post_raid_ticks"); + RenameHelper.renameSingle(raid, "TotalHealth", "total_health"); + RenameHelper.renameSingle(raid, "NumGroups", "group_count"); + RenameHelper.renameSingle(raid, "Status", "status"); + RenameHelper.renameSingle(raid, "HeroesOfTheVillage", "heroes_of_the_village"); + } + } + + return null; + } + }); + MCTypeRegistry.SAVED_DATA_TICKETS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + + final ListType tickets = data.getListUnchecked("tickets"); + if (tickets == null) { + return null; + } + + for (int i = 0, len = tickets.size(); i < len; ++i) { + final MapType ticket = tickets.getMap(i, null); + if (ticket == null) { + continue; + } + + if (ticket.hasKey("chunk_pos")) { + final long coordinate = ticket.getLong("chunk_pos", 0L); + + ticket.setInts("chunk_pos", new int[] { (int)coordinate, (int)(coordinate >>> 32) }); + } + } + + return null; + } + }); + } + + private V4309() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4311.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4311.java new file mode 100644 index 0000000000000000000000000000000000000000..ec8dacda319762effbd01c58cb1d41ff00fc7aa1 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4311.java @@ -0,0 +1,22 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.advancements.ConverterAbstractAdvancementsRename; +import java.util.HashMap; +import java.util.Map; + +public final class V4311 { + + private static final int VERSION = MCVersions.V25W05A + 1; + + private static final Map ADVANCEMENTS_RENAME = new HashMap<>(); + static { + ADVANCEMENTS_RENAME.put("minecraft:nether/use_lodestone", "minecraft:adventure/use_lodestone"); + } + + public static void register() { + ConverterAbstractAdvancementsRename.register(VERSION, ADVANCEMENTS_RENAME::get); + } + + private V4311() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4312.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4312.java new file mode 100644 index 0000000000000000000000000000000000000000..7015d97cb5b97d59ca41f63ba23da1edfb6bae0a --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4312.java @@ -0,0 +1,89 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import java.util.Map; + +public final class V4312 { + + private static final int VERSION = MCVersions.V25W05A + 2; + + public static void register() { + MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) { + private static final Int2ObjectOpenHashMap SLOT_MOVE_MAPPING = new Int2ObjectOpenHashMap<>( + Map.of( + 100, "feet", + 101, "legs", + 102, "chest", + 103, "head", + -106, "offhand" + ) + ); + + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final ListType inventory = data.getListUnchecked("Inventory"); + if (inventory == null) { + return null; + } + + final MapType equipment = data.getTypeUtil().createEmptyMap(); + + for (int i = 0; i < inventory.size(); ++i) { + final MapType item = inventory.getMap(i, null); + if (item == null) { + continue; + } + + final int slot = item.getInt("Slot", Integer.MIN_VALUE); + final String equipmentKey = SLOT_MOVE_MAPPING.get(slot); + + if (equipmentKey == null) { + continue; + } + + inventory.remove(i--); + + item.remove("Slot"); + equipment.setMap(equipmentKey, item); + } + + data.setMap("equipment", equipment); + + return null; + } + }); + + // Note: See V1458 for why we walk CustomName + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ENTITY, data.getMap("RootVehicle"), "Entity", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "ender_pearls", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "EnderItems", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityLeft", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "ShoulderEntityRight", fromVersion, toVersion); + + final MapType recipeBook = data.getMap("recipeBook"); + if (recipeBook != null) { + WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "recipes", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.RECIPE, recipeBook, "toBeDisplayed", fromVersion, toVersion); + } + + // "From CB" + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "CustomName", fromVersion, toVersion); + + return MCTypeRegistry.ENTITY_EQUIPMENT.convert(data, fromVersion, toVersion); + }); + + } + + private V4312() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4314.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4314.java new file mode 100644 index 0000000000000000000000000000000000000000..3b61eb6776c517b553c76a6bd3651d3f7c7155c5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4314.java @@ -0,0 +1,110 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.CopyHelper; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; + +public final class V4314 { + + private static final int VERSION = MCVersions.V25W06A + 1; + + public static void register() { + final DataConverter livingEntityConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + V4309.convertBlockPosition(data, "SleepingX", "SleepingY", "SleepingZ", "sleeping_pos"); + return null; + } + }; + + MCTypeRegistry.PLAYER.addStructureConverter(livingEntityConverter); + MCTypeRegistry.PLAYER.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType root, final long sourceVersion, final long toVersion) { + final TypeUtil typeUtil = root.getTypeUtil(); + + final Number spawnX = root.getNumber("SpawnX"); + final Number spawnY = root.getNumber("SpawnY"); + final Number spawnZ = root.getNumber("SpawnZ"); + if (spawnX != null && spawnY != null && spawnZ != null) { + root.remove("SpawnX"); + root.remove("SpawnY"); + root.remove("SpawnZ"); + + final MapType respawn = typeUtil.createEmptyMap(); + root.setMap("respawn", respawn); + + respawn.setInts("pos", V4309.makeBlockPosition(spawnX, spawnY, spawnZ)); + + CopyHelper.move(root, "SpawnAngle", respawn, "angle"); + CopyHelper.move(root, "SpawnDimension", respawn, "dimension"); + CopyHelper.move(root, "SpawnForced", respawn, "forced"); + } + + final MapType netherPos = root.getMap("enteredNetherPosition"); + if (netherPos != null) { + root.remove("enteredNetherPosition"); + + final ListType newPos = typeUtil.createEmptyList(); + root.setList("entered_nether_pos", newPos); + + newPos.addDouble(netherPos.getDouble("x", 0.0)); + newPos.addDouble(netherPos.getDouble("y", 0.0)); + newPos.addDouble(netherPos.getDouble("z", 0.0)); + } + return null; + } + }); + + MCTypeRegistry.ENTITY.addStructureConverter(livingEntityConverter); + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:vex", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + V4309.convertBlockPosition(data, "BoundX", "BoundY", "BoundZ", "bound_pos"); + RenameHelper.renameSingle(data, "LifeTicks", "life_ticks"); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:phantom", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + V4309.convertBlockPosition(data, "AX", "AY", "AZ", "anchor_pos"); + RenameHelper.renameSingle(data, "Size", "size"); + return null; + } + }); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:turtle", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.remove("TravelPosX"); + data.remove("TravelPosY"); + data.remove("TravelPosZ"); + V4309.convertBlockPosition(data, "HomePosX", "HomePosY", "HomePosZ", "home_pos"); + RenameHelper.renameSingle(data, "HasEgg", "has_egg"); + return null; + } + }); + + final DataConverter attachedBlockConverter = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + V4309.convertBlockPosition(data, "TileX", "TileY", "TileZ", "block_pos"); + return null; + } + }; + + MCTypeRegistry.ENTITY.addConverterForId("minecraft:item_frame", attachedBlockConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:glow_item_frame", attachedBlockConverter); + MCTypeRegistry.ENTITY.addConverterForId("minecraft:painting", attachedBlockConverter); + // Note: Leash entities never wrote TileX/Y/Z and don't read block_pos... Why is this here then? + MCTypeRegistry.ENTITY.addConverterForId("minecraft:leash_knot", attachedBlockConverter); + } + + private V4314() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4420.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4420.java new file mode 100644 index 0000000000000000000000000000000000000000..3d95461b89963acc2c999f31aada04cead295b96 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4420.java @@ -0,0 +1,26 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V4420 { + + private static final int VERSION = MCVersions.V1_21_5 + 95; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:area_effect_cloud", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + RenameHelper.renameSingle(data, "Particle", "custom_particle"); + return null; + } + }); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:area_effect_cloud", new DataWalkerTypePaths<>(MCTypeRegistry.PARTICLE, "custom_particle")); + } + + private V4420() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4421.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4421.java new file mode 100644 index 0000000000000000000000000000000000000000..3802412c0443cce233f897852a201eebbb0504bc --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4421.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V4421 { + + private static final int VERSION = MCVersions.V1_21_5 + 96; + + public static void register() { + // happy_ghast is simple entity + } + + private V4421() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4424.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4424.java new file mode 100644 index 0000000000000000000000000000000000000000..690794c0963a4935390b4830202cb6b78dcf29da --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4424.java @@ -0,0 +1,22 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.leveldat.ConverterRemoveFeatureFlag; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import java.util.Arrays; +import java.util.HashSet; + +public final class V4424 { + + private static final int VERSION = MCVersions.V25W15A + 2; + + public static void register() { + MCTypeRegistry.LIGHTWEIGHT_LEVEL.addStructureConverter(new ConverterRemoveFeatureFlag(VERSION, new HashSet<>( + Arrays.asList( + "minecraft:locator_bar" + ) + ))); + } + + private V4424() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V501.java b/ca/spottedleaf/dataconverter/minecraft/versions/V501.java new file mode 100644 index 0000000000000000000000000000000000000000..da5731090c1de479b77d0d9a1b66d217f7f4eeb5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V501.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; + +public final class V501 { + + private static final int VERSION = MCVersions.V16W20A; + + public static void register() { + //registerMob("PolarBear"); // is now simple in 1.21.5 + } + + private V501() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V502.java b/ca/spottedleaf/dataconverter/minecraft/versions/V502.java new file mode 100644 index 0000000000000000000000000000000000000000..2b6f3eef26a27e800f87a189c63250293b812e50 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V502.java @@ -0,0 +1,45 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.concurrent.ThreadLocalRandom; + +public final class V502 { + + private static final int VERSION = MCVersions.V16W20A + 1; + + public static void register() { + ConverterAbstractItemRename.register(VERSION, (final String name) -> { + return "minecraft:cooked_fished".equals(name) ? "minecraft:cooked_fish" : null; + }); + MCTypeRegistry.ENTITY.addConverterForId("Zombie", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.getBoolean("IsVillager")) { + return null; + } + + data.remove("IsVillager"); + + if (data.hasKey("ZombieType")) { + return null; + } + + int type = data.getInt("VillagerProfession", -1); + // Vanilla doesn't remove the profession tag, so we don't! + if (type < 0 || type >= 6) { + type = ThreadLocalRandom.current().nextInt(6); + } + + data.setInt("ZombieType", type); + + return null; + } + }); + } + + private V502() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V505.java b/ca/spottedleaf/dataconverter/minecraft/versions/V505.java new file mode 100644 index 0000000000000000000000000000000000000000..112e287bf2bd21650798f089d6860b9714f19067 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V505.java @@ -0,0 +1,23 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V505 { + + private static final int VERSION = MCVersions.V16W21B + 1; + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.setString("useVbo", "true"); + return null; + } + }); + } + + private V505() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V700.java b/ca/spottedleaf/dataconverter/minecraft/versions/V700.java new file mode 100644 index 0000000000000000000000000000000000000000..63e3c70cc817bd8729ad177df8d388036bb7241d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V700.java @@ -0,0 +1,28 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V700 { + + private static final int VERSION = MCVersions.V1_10_2 + 188; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("Guardian", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (data.getBoolean("Elder")) { + data.setString("id", "ElderGuardian"); + } + data.remove("Elder"); + return null; + } + }); + + //registerMob("ElderGuardian"); // is now simple in 1.21.5 + } + + private V700() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V701.java b/ca/spottedleaf/dataconverter/minecraft/versions/V701.java new file mode 100644 index 0000000000000000000000000000000000000000..5fa1afd449c2a45efccc3966c34310bb695ad082 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V701.java @@ -0,0 +1,37 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V701 { + + private static final int VERSION = MCVersions.V1_10_2 + 189; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("Skeleton", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int type = data.getInt("SkeletonType"); + data.remove("SkeletonType"); + + switch (type) { + case 1: + data.setString("id", "WitherSkeleton"); + break; + case 2: + data.setString("id", "Stray"); + break; + } + + return null; + } + }); + + //registerMob("WitherSkeleton"); // is now simple in 1.21.5 + //registerMob("Stray"); // is now simple in 1.21.5 + } + + private V701() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V702.java b/ca/spottedleaf/dataconverter/minecraft/versions/V702.java new file mode 100644 index 0000000000000000000000000000000000000000..b2408f8e0c2e62155c51e8383448d5e64bbb58f5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V702.java @@ -0,0 +1,51 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V702 { + + private static final int VERSION = MCVersions.V1_10_2 + 190; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("Zombie", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int zombieType = data.getInt("ZombieType"); + data.remove("ZombieType"); + + switch (zombieType) { + case 0: + default: + break; + + case 1: + case 2: + case 3: + case 4: + case 5: + data.setString("id", "ZombieVillager"); + data.setInt("Profession", zombieType - 1); + break; + + case 6: + data.setString("id", "Husk"); + break; + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "ZombieVillager", (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, root.getMap("Offers"), "Recipes", fromVersion, toVersion); + return null; + }); + //registerMob("Husk"); // is now simple in 1.21.5 + } + + private V702() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V703.java b/ca/spottedleaf/dataconverter/minecraft/versions/V703.java new file mode 100644 index 0000000000000000000000000000000000000000..d56ec81710d23b6bcbc6c5daad6e22a355df3056 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V703.java @@ -0,0 +1,62 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V703 { + + private static final int VERSION = MCVersions.V1_10_2 + 191; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("EntityHorse", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final int type = data.getInt("Type"); + data.remove("Type"); + + switch (type) { + case 0: + default: + data.setString("id", "Horse"); + break; + + case 1: + data.setString("id", "Donkey"); + break; + + case 2: + data.setString("id", "Mule"); + break; + + case 3: + data.setString("id", "ZombieHorse"); + break; + + case 4: + data.setString("id", "SkeletonHorse"); + break; + } + + return null; + } + }); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "Horse", new DataWalkerItems("ArmorItem", "SaddleItem")); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "Donkey", new DataWalkerItems("SaddleItem")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "Donkey", new DataWalkerItemLists("Items")); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "Mule", new DataWalkerItems("SaddleItem")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "Mule", new DataWalkerItemLists("Items")); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "ZombieHorse", new DataWalkerItems("SaddleItem")); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "SkeletonHorse", new DataWalkerItems("SaddleItem")); + } + + private V703() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V704.java b/ca/spottedleaf/dataconverter/minecraft/versions/V704.java new file mode 100644 index 0000000000000000000000000000000000000000..16e188ae63c8a545bbc57a58b30311bb9721b826 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V704.java @@ -0,0 +1,467 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookEnforceNamespacedID; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.item_name.DataWalkerItemNames; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.util.Long2ObjectArraySortedMap; +import com.mojang.logging.LogUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import org.slf4j.Logger; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public final class V704 { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private static final int VERSION = MCVersions.V1_10_2 + 192; + + public static final Map 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 int k1, final String v1) { + final Long2ObjectArraySortedMap ret = new Long2ObjectArraySortedMap<>(); + + ret.put(DataConverter.encodeVersions(k1, 0), v1); + + return ret; + } + + private static Long2ObjectArraySortedMap makeDouble(final int k1, final String v1, + final int k2, final String v2) { + final Long2ObjectArraySortedMap ret = new Long2ObjectArraySortedMap<>(); + + ret.put(DataConverter.encodeVersions(k1, 0), v1); + ret.put(DataConverter.encodeVersions(k2, 0), 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")); + + // Mojang missed these + ITEM_ID_TO_ENTITY_ID.put("minecraft:pufferfish_bucket", makeSingle(V705.VERSION, "minecraft:pufferfish")); + ITEM_ID_TO_ENTITY_ID.put("minecraft:salmon_bucket", makeSingle(V705.VERSION, "minecraft:salmon")); + ITEM_ID_TO_ENTITY_ID.put("minecraft:cod_bucket", makeSingle(V705.VERSION, "minecraft:cod")); + ITEM_ID_TO_ENTITY_ID.put("minecraft:tropical_fish_bucket", makeSingle(V705.VERSION, "minecraft:tropical_fish")); + ITEM_ID_TO_ENTITY_ID.put("minecraft:axolotl_bucket", makeSingle(V705.VERSION, "minecraft:axolotl")); + ITEM_ID_TO_ENTITY_ID.put("minecraft:tadpole_bucket", makeSingle(V705.VERSION, "minecraft:tadpole")); + } + + private static final Map TILE_ID_UPDATE = new HashMap<>(); + static { + TILE_ID_UPDATE.put("Airportal", "minecraft:end_portal"); + TILE_ID_UPDATE.put("Banner", "minecraft:banner"); + TILE_ID_UPDATE.put("Beacon", "minecraft:beacon"); + TILE_ID_UPDATE.put("Cauldron", "minecraft:brewing_stand"); + TILE_ID_UPDATE.put("Chest", "minecraft:chest"); + TILE_ID_UPDATE.put("Comparator", "minecraft:comparator"); + TILE_ID_UPDATE.put("Control", "minecraft:command_block"); + TILE_ID_UPDATE.put("DLDetector", "minecraft:daylight_detector"); + TILE_ID_UPDATE.put("Dropper", "minecraft:dropper"); + TILE_ID_UPDATE.put("EnchantTable", "minecraft:enchanting_table"); + TILE_ID_UPDATE.put("EndGateway", "minecraft:end_gateway"); + TILE_ID_UPDATE.put("EnderChest", "minecraft:ender_chest"); + TILE_ID_UPDATE.put("FlowerPot", "minecraft:flower_pot"); + TILE_ID_UPDATE.put("Furnace", "minecraft:furnace"); + TILE_ID_UPDATE.put("Hopper", "minecraft:hopper"); + TILE_ID_UPDATE.put("MobSpawner", "minecraft:mob_spawner"); + TILE_ID_UPDATE.put("Music", "minecraft:noteblock"); + TILE_ID_UPDATE.put("Piston", "minecraft:piston"); + TILE_ID_UPDATE.put("RecordPlayer", "minecraft:jukebox"); + TILE_ID_UPDATE.put("Sign", "minecraft:sign"); + TILE_ID_UPDATE.put("Skull", "minecraft:skull"); + TILE_ID_UPDATE.put("Structure", "minecraft:structure_block"); + TILE_ID_UPDATE.put("Trap", "minecraft:dispenser"); + } + + // These do not need a walker, so we can ignore them not being registered. + private static final Set IGNORE_ABSENT_WALKERS = new HashSet<>( + Arrays.asList( + "Airportal", + "DLDetector", + "Comparator", + "EnchantTable", + "EndGateway", + "Music", + "Beacon", + // note: contains blockId and blockData, but handled by flattening converters + "Piston", + "Structure", + "EnderChest", + // See V99 + "Skull", + "Banner" + ) + ); + + public static void register() { + MCTypeRegistry.TILE_ENTITY.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String id = data.getString("id"); + if (id == null) { + return null; + } + + data.setString("id", TILE_ID_UPDATE.getOrDefault(id, id)); + return null; + } + }); + + + for (final Map.Entry entry : TILE_ID_UPDATE.entrySet()) { + final String oldId = entry.getKey(); + final String newId = entry.getValue(); + + if (!MCTypeRegistry.TILE_ENTITY.hasWalkers(oldId) && !IGNORE_ABSENT_WALKERS.contains(oldId)) { + LOGGER.error("(V704) Failed to find walkers for " + oldId); + } + + MCTypeRegistry.TILE_ENTITY.copyWalkers(VERSION, oldId, newId); + } + + MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, data, "id", fromVersion, toVersion); + + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final String itemId = data.getString("id"); + + // only things here are in tag, if changed update if above + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, tag, "Items", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, tag, "ChargedProjectiles", fromVersion, toVersion); + if ("minecraft:written_book".equals(itemId)) { + // These are only text component for WRITTEN books! DFU blindly will mark this as TEXT_COMPONENT. + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, tag, "pages", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, tag, "filtered_pages", fromVersion, toVersion); + } + // Vanilla blindly marks these as TEXT_COMPONENT even though they are only converted after the versions noted + // below. + if (toVersion >= DataConverter.encodeVersions(V1458.VERSION, 0)) { + final MapType display = tag.getMap("display"); + if (display != null) { + // only TEXT_COMPONENT in V1458 + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, display, "Name", fromVersion, toVersion); + if (toVersion >= DataConverter.encodeVersions(V1803.VERSION, 0)) { + // only TEXT_COMPONENT in V1803 + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, display, "Lore", fromVersion, toVersion); + } + } + } + + MapType entityTag = tag.getMap("EntityTag"); + if (entityTag != null) { + final String entityId; + if (itemId != null && itemId.contains("_spawn_egg")) { + // V1451 changes spawn eggs to have the sub entity id be a part of the item id, but of course Mojang never + // bothered to write in logic to set the sub entity id, so we have to. + // format is ALWAYS :_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 entityId; + if (fromVersion < DataConverter.encodeVersions(V3438.VERSION, 0) && "minecraft:suspicious_sand".equals(itemId)) { + // renamed after this version, and since the id is a mapping to just string we need to special case this + entityId = "minecraft:suspicious_sand"; + } else { + entityId = ITEM_ID_TO_TILE_ENTITY_ID.get(itemId); + } + + if (entityId == null) { + if (!"minecraft:air".equals(itemId)) { + LOGGER.warn("Unable to resolve BlockEntity for ItemStack (V704): " + itemId); + } + } else { + if (!blockEntityTag.hasKey("id", ObjectType.STRING)) { + blockEntityTag.setString("id", entityId); + } + } + final MapType replace = MCTypeRegistry.TILE_ENTITY.convert(blockEntityTag, fromVersion, toVersion); + if (replace != null) { + blockEntityTag = replace; + tag.setMap("BlockEntityTag", blockEntityTag); + } + } + + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanDestroy", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanPlaceOn", fromVersion, toVersion); + + return null; + }); + + // Enforce namespace for ids + MCTypeRegistry.TILE_ENTITY.addStructureHook(VERSION, new DataHookEnforceNamespacedID()); + } + + private V704() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V705.java b/ca/spottedleaf/dataconverter/minecraft/versions/V705.java new file mode 100644 index 0000000000000000000000000000000000000000..333a86b4a041df2f9679799f64037ebea33746c0 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V705.java @@ -0,0 +1,209 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.entity.ConverterAbstractEntityRename; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookEnforceNamespacedID; +import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookValueTypeEnforceNamespaced; +import ca.spottedleaf.dataconverter.minecraft.walkers.block_name.DataWalkerBlockNames; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.minecraft.walkers.tile_entity.DataWalkerTileEntities; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.HashMap; +import java.util.Map; + +public final class V705 { + + public static final int VERSION = MCVersions.V1_10_2 + 193; + + private static final Map ENTITY_ID_UPDATE = new HashMap<>(); + static { + ENTITY_ID_UPDATE.put("AreaEffectCloud", "minecraft:area_effect_cloud"); + ENTITY_ID_UPDATE.put("ArmorStand", "minecraft:armor_stand"); + ENTITY_ID_UPDATE.put("Arrow", "minecraft:arrow"); + ENTITY_ID_UPDATE.put("Bat", "minecraft:bat"); + ENTITY_ID_UPDATE.put("Blaze", "minecraft:blaze"); + ENTITY_ID_UPDATE.put("Boat", "minecraft:boat"); + ENTITY_ID_UPDATE.put("CaveSpider", "minecraft:cave_spider"); + ENTITY_ID_UPDATE.put("Chicken", "minecraft:chicken"); + ENTITY_ID_UPDATE.put("Cow", "minecraft:cow"); + ENTITY_ID_UPDATE.put("Creeper", "minecraft:creeper"); + ENTITY_ID_UPDATE.put("Donkey", "minecraft:donkey"); + ENTITY_ID_UPDATE.put("DragonFireball", "minecraft:dragon_fireball"); + ENTITY_ID_UPDATE.put("ElderGuardian", "minecraft:elder_guardian"); + ENTITY_ID_UPDATE.put("EnderCrystal", "minecraft:ender_crystal"); + ENTITY_ID_UPDATE.put("EnderDragon", "minecraft:ender_dragon"); + ENTITY_ID_UPDATE.put("Enderman", "minecraft:enderman"); + ENTITY_ID_UPDATE.put("Endermite", "minecraft:endermite"); + ENTITY_ID_UPDATE.put("EyeOfEnderSignal", "minecraft:eye_of_ender_signal"); + ENTITY_ID_UPDATE.put("FallingSand", "minecraft:falling_block"); + ENTITY_ID_UPDATE.put("Fireball", "minecraft:fireball"); + ENTITY_ID_UPDATE.put("FireworksRocketEntity", "minecraft:fireworks_rocket"); + ENTITY_ID_UPDATE.put("Ghast", "minecraft:ghast"); + ENTITY_ID_UPDATE.put("Giant", "minecraft:giant"); + ENTITY_ID_UPDATE.put("Guardian", "minecraft:guardian"); + ENTITY_ID_UPDATE.put("Horse", "minecraft:horse"); + ENTITY_ID_UPDATE.put("Husk", "minecraft:husk"); + ENTITY_ID_UPDATE.put("Item", "minecraft:item"); + ENTITY_ID_UPDATE.put("ItemFrame", "minecraft:item_frame"); + ENTITY_ID_UPDATE.put("LavaSlime", "minecraft:magma_cube"); + ENTITY_ID_UPDATE.put("LeashKnot", "minecraft:leash_knot"); + ENTITY_ID_UPDATE.put("MinecartChest", "minecraft:chest_minecart"); + ENTITY_ID_UPDATE.put("MinecartCommandBlock", "minecraft:commandblock_minecart"); + ENTITY_ID_UPDATE.put("MinecartFurnace", "minecraft:furnace_minecart"); + ENTITY_ID_UPDATE.put("MinecartHopper", "minecraft:hopper_minecart"); + ENTITY_ID_UPDATE.put("MinecartRideable", "minecraft:minecart"); + ENTITY_ID_UPDATE.put("MinecartSpawner", "minecraft:spawner_minecart"); + ENTITY_ID_UPDATE.put("MinecartTNT", "minecraft:tnt_minecart"); + ENTITY_ID_UPDATE.put("Mule", "minecraft:mule"); + ENTITY_ID_UPDATE.put("MushroomCow", "minecraft:mooshroom"); + ENTITY_ID_UPDATE.put("Ozelot", "minecraft:ocelot"); + ENTITY_ID_UPDATE.put("Painting", "minecraft:painting"); + ENTITY_ID_UPDATE.put("Pig", "minecraft:pig"); + ENTITY_ID_UPDATE.put("PigZombie", "minecraft:zombie_pigman"); + ENTITY_ID_UPDATE.put("PolarBear", "minecraft:polar_bear"); + ENTITY_ID_UPDATE.put("PrimedTnt", "minecraft:tnt"); + ENTITY_ID_UPDATE.put("Rabbit", "minecraft:rabbit"); + ENTITY_ID_UPDATE.put("Sheep", "minecraft:sheep"); + ENTITY_ID_UPDATE.put("Shulker", "minecraft:shulker"); + ENTITY_ID_UPDATE.put("ShulkerBullet", "minecraft:shulker_bullet"); + ENTITY_ID_UPDATE.put("Silverfish", "minecraft:silverfish"); + ENTITY_ID_UPDATE.put("Skeleton", "minecraft:skeleton"); + ENTITY_ID_UPDATE.put("SkeletonHorse", "minecraft:skeleton_horse"); + ENTITY_ID_UPDATE.put("Slime", "minecraft:slime"); + ENTITY_ID_UPDATE.put("SmallFireball", "minecraft:small_fireball"); + ENTITY_ID_UPDATE.put("SnowMan", "minecraft:snowman"); + ENTITY_ID_UPDATE.put("Snowball", "minecraft:snowball"); + ENTITY_ID_UPDATE.put("SpectralArrow", "minecraft:spectral_arrow"); + ENTITY_ID_UPDATE.put("Spider", "minecraft:spider"); + ENTITY_ID_UPDATE.put("Squid", "minecraft:squid"); + ENTITY_ID_UPDATE.put("Stray", "minecraft:stray"); + ENTITY_ID_UPDATE.put("ThrownEgg", "minecraft:egg"); + ENTITY_ID_UPDATE.put("ThrownEnderpearl", "minecraft:ender_pearl"); + ENTITY_ID_UPDATE.put("ThrownExpBottle", "minecraft:xp_bottle"); + ENTITY_ID_UPDATE.put("ThrownPotion", "minecraft:potion"); + ENTITY_ID_UPDATE.put("Villager", "minecraft:villager"); + ENTITY_ID_UPDATE.put("VillagerGolem", "minecraft:villager_golem"); + ENTITY_ID_UPDATE.put("Witch", "minecraft:witch"); + ENTITY_ID_UPDATE.put("WitherBoss", "minecraft:wither"); + ENTITY_ID_UPDATE.put("WitherSkeleton", "minecraft:wither_skeleton"); + ENTITY_ID_UPDATE.put("WitherSkull", "minecraft:wither_skull"); + ENTITY_ID_UPDATE.put("Wolf", "minecraft:wolf"); + ENTITY_ID_UPDATE.put("XPOrb", "minecraft:xp_orb"); + ENTITY_ID_UPDATE.put("Zombie", "minecraft:zombie"); + ENTITY_ID_UPDATE.put("ZombieHorse", "minecraft:zombie_horse"); + ENTITY_ID_UPDATE.put("ZombieVillager", "minecraft:zombie_villager"); + } + + private static void registerThrowableProjectile(final String id) { + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerBlockNames("inTile")); + } + + public static void register() { + ConverterAbstractEntityRename.register(VERSION, ENTITY_ID_UPDATE::get); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:area_effect_cloud", new DataWalkerTypePaths<>(MCTypeRegistry.PARTICLE, "Particle")); + //registerMob("minecraft:armor_stand"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:arrow", new DataWalkerBlockNames("inTile")); + //registerMob("minecraft:bat"); // now simple in 1.21.5 + //registerMob("minecraft:blaze"); // now simple in 1.21.5 + //registerMob("minecraft:cave_spider"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:chest_minecart", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:chest_minecart", new DataWalkerItemLists("Items")); + //registerMob("minecraft:chicken"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:commandblock_minecart", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:commandblock_minecart", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "LastOutput")); + //registerMob("minecraft:cow"); // now simple in 1.21.5 + //registerMob("minecraft:creeper"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:donkey", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:donkey", new DataWalkerItems("SaddleItem")); + registerThrowableProjectile("minecraft:egg"); + //registerMob("minecraft:elder_guardian"); // now simple in 1.21.5 + //registerMob("minecraft:ender_dragon"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:enderman", new DataWalkerBlockNames("carried")); + //registerMob("minecraft:endermite"); // now simple in 1.21.5 + registerThrowableProjectile("minecraft:ender_pearl"); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:falling_block", new DataWalkerBlockNames("Block")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:falling_block", new DataWalkerTileEntities("TileEntityData")); + registerThrowableProjectile("minecraft:fireball"); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:fireworks_rocket", new DataWalkerItems("FireworksItem")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:furnace_minecart", new DataWalkerBlockNames("DisplayTile")); + //registerMob("minecraft:ghast"); // now simple in 1.21.5 + //registerMob("minecraft:giant"); // now simple in 1.21.5 + //registerMob("minecraft:guardian"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:hopper_minecart", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:hopper_minecart", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:horse", new DataWalkerItems("ArmorItem", "SaddleItem")); + //registerMob("minecraft:husk"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:item", new DataWalkerItems("Item")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:item_frame", new DataWalkerItems("Item")); + //registerMob("minecraft:magma_cube"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:minecart", new DataWalkerBlockNames("DisplayTile")); + //registerMob("minecraft:mooshroom"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:mule", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:mule", new DataWalkerItems("SaddleItem")); + //registerMob("minecraft:ocelot"); // now simple in 1.21.5 + //registerMob("minecraft:pig"); // now simple in 1.21.5 + //registerMob("minecraft:polar_bear"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerItems("Potion")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:potion", new DataWalkerBlockNames("inTile")); + //registerMob("minecraft:rabbit"); // now simple in 1.21.5 + //registerMob("minecraft:sheep"); // now simple in 1.21.5 + //registerMob("minecraft:shulker"); // now simple in 1.21.5 + //registerMob("minecraft:silverfish"); // now simple in 1.21.5 + //registerMob("minecraft:skeleton"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:skeleton_horse", new DataWalkerItems("SaddleItem")); + //registerMob("minecraft:slime"); // now simple in 1.21.5 + registerThrowableProjectile("minecraft:small_fireball"); + registerThrowableProjectile("minecraft:snowball"); + //registerMob("minecraft:snowman"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spawner_minecart", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spawner_minecart", (final MapType data, final long fromVersion, final long toVersion) -> { + return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion); + }); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:spectral_arrow", new DataWalkerBlockNames("inTile")); + //registerMob("minecraft:spider"); // now simple in 1.21.5 + //registerMob("minecraft:squid"); // now simple in 1.21.5 + //registerMob("minecraft:stray"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:tnt_minecart", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:villager", (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, data, "Inventory", fromVersion, toVersion); + + WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion); + + return null; + }); + //registerMob("minecraft:villager_golem"); // now simple in 1.21.5 + //registerMob("minecraft:witch"); // now simple in 1.21.5 + //registerMob("minecraft:wither"); // now simple in 1.21.5 + //registerMob("minecraft:wither_skeleton"); // now simple in 1.21.5 + registerThrowableProjectile("minecraft:wither_skull"); + //registerMob("minecraft:wolf"); // now simple in 1.21.5 + registerThrowableProjectile("minecraft:xp_bottle"); + //registerMob("minecraft:zombie"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:zombie_horse", new DataWalkerItems("SaddleItem")); + //registerMob("minecraft:zombie_pigman"); // now simple in 1.21.5 + //registerMob("minecraft:zombie_villager"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:zombie_villager", (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion); + + return null; + }); + //registerMob("minecraft:evocation_illager"); // now simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:llama", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "minecraft:llama", new DataWalkerItems("SaddleItem", "DecorItem")); + //registerMob("minecraft:vex"); // now simple in 1.21.5 + //registerMob("minecraft:vindication_illager"); // now simple in 1.21.5 + // Don't need to re-register itemstack walker, the V704 will correctly choose the right id for armorstand based on + // the source version + + // Enforce namespace for ids + MCTypeRegistry.ENTITY.addStructureHook(VERSION, new DataHookEnforceNamespacedID()); + MCTypeRegistry.ENTITY_NAME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced()); + } + + private V705() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V804.java b/ca/spottedleaf/dataconverter/minecraft/versions/V804.java new file mode 100644 index 0000000000000000000000000000000000000000..7f71c76352bf32d91826dab2e0b8dc8393afcfdc --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V804.java @@ -0,0 +1,59 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V804 { + + private static final int VERSION = MCVersions.V16W35A + 1; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:banner", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType blockEntity = tag.getMap("BlockEntityTag"); + if (blockEntity == null) { + return null; + } + + if (!blockEntity.hasKey("Base", ObjectType.NUMBER)) { + return null; + } + + data.setShort("Damage", (short)(blockEntity.getShort("Base") & 15)); + + final MapType display = tag.getMap("display"); + if (display != null) { + final ListType lore = display.getList("Lore", ObjectType.STRING); + if (lore != null) { + if (lore.size() == 1 && "(+NBT)".equals(lore.getString(0))) { + return null; + } + } + } + + blockEntity.remove("Base"); + if (blockEntity.isEmpty()) { + tag.remove("BlockEntityTag"); + } + + if (tag.isEmpty()) { + data.remove("tag"); + } + + return null; + } + }); + } + + private V804() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V806.java b/ca/spottedleaf/dataconverter/minecraft/versions/V806.java new file mode 100644 index 0000000000000000000000000000000000000000..510262ad7ff4ab12548e04906a96b7334fe8271d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V806.java @@ -0,0 +1,39 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.Types; + +public final class V806 { + + private static final int VERSION = MCVersions.V16W36A + 1; + + public static void register() { + final DataConverter potionWaterUpdater = new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + MapType tag = data.getMap("tag"); + if (tag == null) { + tag = Types.NBT.createEmptyMap(); + data.setMap("tag", tag); + } + + if (!tag.hasKey("Potion", ObjectType.STRING)) { + tag.setString("Potion", "minecraft:water"); + } + + return null; + } + }; + + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:potion", potionWaterUpdater); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:splash_potion", potionWaterUpdater); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:lingering_potion", potionWaterUpdater); + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:tipped_arrow", potionWaterUpdater); + } + + private V806() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V808.java b/ca/spottedleaf/dataconverter/minecraft/versions/V808.java new file mode 100644 index 0000000000000000000000000000000000000000..c1bd8f279b3dd38296564fc4b1cf7322c7d1c686 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V808.java @@ -0,0 +1,29 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V808 { + + private static final int VERSION = MCVersions.V16W38A + 1; + + public static void register() { + MCTypeRegistry.ENTITY.addConverterForId("minecraft:shulker", new DataConverter<>(VERSION, 1) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + if (!data.hasKey("Color", ObjectType.NUMBER)) { + data.setByte("Color", (byte)10); + } + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "minecraft:shulker_box", new DataWalkerItemLists("Items")); + } + + private V808() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V813.java b/ca/spottedleaf/dataconverter/minecraft/versions/V813.java new file mode 100644 index 0000000000000000000000000000000000000000..0f79651b6d35464823988bd2aba57d08a0ac7613 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V813.java @@ -0,0 +1,64 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class V813 { + + private static final int VERSION = MCVersions.V16W40A; + + private static final String[] SHULKER_ID_BY_COLOUR = new String[] { + "minecraft:white_shulker_box", + "minecraft:orange_shulker_box", + "minecraft:magenta_shulker_box", + "minecraft:light_blue_shulker_box", + "minecraft:yellow_shulker_box", + "minecraft:lime_shulker_box", + "minecraft:pink_shulker_box", + "minecraft:gray_shulker_box", + "minecraft:silver_shulker_box", + "minecraft:cyan_shulker_box", + "minecraft:purple_shulker_box", + "minecraft:blue_shulker_box", + "minecraft:brown_shulker_box", + "minecraft:green_shulker_box", + "minecraft:red_shulker_box", + "minecraft:black_shulker_box" + }; + + public static void register() { + MCTypeRegistry.ITEM_STACK.addConverterForId("minecraft:shulker_box", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final MapType blockEntity = tag.getMap("BlockEntityTag"); + if (blockEntity == null) { + return null; + } + + final int color = blockEntity.getInt("Color"); + blockEntity.remove("Color"); + + data.setString("id", SHULKER_ID_BY_COLOUR[color % SHULKER_ID_BY_COLOUR.length]); + + return null; + } + }); + + MCTypeRegistry.TILE_ENTITY.addConverterForId("minecraft:shulker_box", new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + data.remove("Color"); + return null; + } + }); + } + + private V813() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V816.java b/ca/spottedleaf/dataconverter/minecraft/versions/V816.java new file mode 100644 index 0000000000000000000000000000000000000000..edbf9c01a44a77f87bdc186bdfaf36b408a31f4e --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V816.java @@ -0,0 +1,27 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.Locale; + +public final class V816 { + + private static final int VERSION = MCVersions.V16W43A; + + public static void register() { + MCTypeRegistry.OPTIONS.addStructureConverter(new DataConverter<>(VERSION) { + @Override + public MapType convert(final MapType data, final long sourceVersion, final long toVersion) { + final String lang = data.getString("lang"); + if (lang != null) { + data.setString("lang", lang.toLowerCase(Locale.ROOT)); + } + return null; + } + }); + } + + private V816() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V820.java b/ca/spottedleaf/dataconverter/minecraft/versions/V820.java new file mode 100644 index 0000000000000000000000000000000000000000..0d59cb380e625bb2658216d4a6cb8faebdd147c5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V820.java @@ -0,0 +1,21 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.itemname.ConverterAbstractItemRename; +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; + +public final class V820 { + + private static final int VERSION = MCVersions.V1_11 + 1; + + public static void register() { + ConverterAbstractItemRename.register(VERSION, new HashMap<>( + ImmutableMap.of( + "minecraft:totem", "minecraft:totem_of_undying" + ) + )::get); + } + + private V820() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V99.java b/ca/spottedleaf/dataconverter/minecraft/versions/V99.java new file mode 100644 index 0000000000000000000000000000000000000000..3a2a82bc7c18667bed10086203d995f9effe3399 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V99.java @@ -0,0 +1,418 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.datatypes.DataHook; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.MCDataConverter; +import ca.spottedleaf.dataconverter.minecraft.MCVersions; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.HelperItemNameV102; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookEnforceNamespacedID; +import ca.spottedleaf.dataconverter.minecraft.hooks.DataHookValueTypeEnforceNamespaced; +import ca.spottedleaf.dataconverter.minecraft.walkers.block_name.DataWalkerBlockNames; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItemLists; +import ca.spottedleaf.dataconverter.minecraft.walkers.item_name.DataWalkerItemNames; +import ca.spottedleaf.dataconverter.minecraft.walkers.itemstack.DataWalkerItems; +import ca.spottedleaf.dataconverter.minecraft.walkers.tile_entity.DataWalkerTileEntities; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import com.mojang.logging.LogUtils; +import org.slf4j.Logger; +import java.util.HashMap; +import java.util.Map; + +public final class V99 { + + // Structure for all data before data upgrading was added to minecraft (pre 15w32a) + + private static final Logger LOGGER = LogUtils.getLogger(); + + public static final int VERSION = MCVersions.V15W32A - 1; + + private static final Map ITEM_ID_TO_TILE_ENTITY_ID = new HashMap<>(); + static { + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:furnace", "Furnace"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:lit_furnace", "Furnace"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:chest", "Chest"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:trapped_chest", "Chest"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:ender_chest", "EnderChest"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:jukebox", "RecordPlayer"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dispenser", "Trap"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:dropper", "Dropper"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:sign", "Sign"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:mob_spawner", "MobSpawner"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:noteblock", "Music"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:brewing_stand", "Cauldron"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:enhanting_table", "EnchantTable"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:command_block", "CommandBlock"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:beacon", "Beacon"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:skull", "Skull"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:daylight_detector", "DLDetector"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:hopper", "Hopper"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:banner", "Banner"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:flower_pot", "FlowerPot"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:repeating_command_block", "CommandBlock"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:chain_command_block", "CommandBlock"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:standing_sign", "Sign"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:wall_sign", "Sign"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:piston_head", "Piston"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:daylight_detector_inverted", "DLDetector"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:unpowered_comparator", "Comparator"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:powered_comparator", "Comparator"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:wall_banner", "Banner"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:standing_banner", "Banner"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:structure_block", "Structure"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:end_portal", "Airportal"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:end_gateway", "EndGateway"); + ITEM_ID_TO_TILE_ENTITY_ID.put("minecraft:shield", "Banner"); + } + + private static void registerProjectile(final String id) { + MCTypeRegistry.ENTITY.addWalker(VERSION, id, new DataWalkerBlockNames("inTile")); + } + + private static void registerInventory(final String id) { + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, id, new DataWalkerItemLists("Items")); + } + + static void registerSign(final int version, final String id) { + // NOTE: In 1.7.10, the text was not TEXT_COMPONENT but in 1.8 it is. + MCTypeRegistry.TILE_ENTITY.addWalker(version, id, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "Text1", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "Text2", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "Text3", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "Text4", fromVersion, toVersion); + + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "FilteredText1", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "FilteredText2", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "FilteredText3", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, data, "FilteredText4", fromVersion, toVersion); + + return null; + }); + } + + public static void register() { + // entities + MCTypeRegistry.ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ENTITY, data, "Riding", fromVersion, toVersion); + + return MCTypeRegistry.ENTITY_EQUIPMENT.convert(data, fromVersion, toVersion); + }); + MCTypeRegistry.ENTITY_EQUIPMENT.addStructureWalker(VERSION, new DataWalkerItemLists("Equipment")); + + MCTypeRegistry.ENTITY.addWalker(VERSION, "Item", new DataWalkerItems("Item")); + registerProjectile("ThrownEgg"); + MCTypeRegistry.ENTITY.addWalker(VERSION, "Arrow", new DataWalkerBlockNames("inTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "TippedArrow", new DataWalkerBlockNames("inTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "SpectralArrow", new DataWalkerBlockNames("inTile")); + registerProjectile("Snowball"); + registerProjectile("Fireball"); + registerProjectile("SmallFireball"); + registerProjectile("ThrownEnderpearl"); + MCTypeRegistry.ENTITY.addWalker(VERSION, "ThrownPotion", new DataWalkerBlockNames("inTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "ThrownPotion", new DataWalkerItems("Potion")); + registerProjectile("ThrownExpBottle"); + MCTypeRegistry.ENTITY.addWalker(VERSION, "ItemFrame", new DataWalkerItems("Item")); + registerProjectile("WitherSkull"); + MCTypeRegistry.ENTITY.addWalker(VERSION, "FallingSand", new DataWalkerBlockNames("Block")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "FallingSand", new DataWalkerTileEntities("TileEntityData")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "FireworksRocketEntity", new DataWalkerItems("FireworksItem")); + // Note: Minecart is the generic entity. It can be subtyped via an int to become one of the specific minecarts + // (i.e rideable, chest, furnace, tnt, etc) + // Because of this, we add all walkers to the generic type, even though they might not be needed. + // Vanilla does not make the generic minecart convert spawners, but we do. + MCTypeRegistry.ENTITY.addWalker(VERSION, "Minecart", new DataWalkerBlockNames("DisplayTile")); // for all minecart types + MCTypeRegistry.ENTITY.addWalker(VERSION, "Minecart", new DataWalkerItemLists("Items")); // for chest types + MCTypeRegistry.ENTITY.addWalker(VERSION, "Minecart", (final MapType data, final long fromVersion, final long toVersion) -> { + return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion); + }); // for spawner type + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartRideable", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartChest", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartChest", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartFurnace", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartTNT", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartSpawner", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartSpawner", (final MapType data, final long fromVersion, final long toVersion) -> { + return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion); + }); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartHopper", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartHopper", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartCommandBlock", new DataWalkerBlockNames("DisplayTile")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "MinecartCommandBlock", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "LastOutput")); + // mob -> simple as equipment is moved to base ENTITY + //registerMob("ArmorStand"); // changed to simple in 1.21.5 + //registerMob("Creeper"); // changed to simple in 1.21.5 + //registerMob("Skeleton"); // changed to simple in 1.21.5 + //registerMob("Spider"); // changed to simple in 1.21.5 + //registerMob("Giant"); // changed to simple in 1.21.5 + //registerMob("Zombie"); // changed to simple in 1.21.5 + //registerMob("Slime"); // changed to simple in 1.21.5 + //registerMob("Ghast"); // changed to simple in 1.21.5 + //registerMob("PigZombie"); // changed to simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "Enderman", new DataWalkerBlockNames("carried")); + //registerMob("CaveSpider"); // changed to simple in 1.21.5 + //registerMob("Silverfish"); // changed to simple in 1.21.5 + //registerMob("Blaze"); // changed to simple in 1.21.5 + //registerMob("LavaSlime"); // changed to simple in 1.21.5 + //registerMob("EnderDragon"); // changed to simple in 1.21.5 + //registerMob("WitherBoss"); // changed to simple in 1.21.5 + //registerMob("Bat"); // changed to simple in 1.21.5 + //registerMob("Witch"); // changed to simple in 1.21.5 + //registerMob("Endermite"); // changed to simple in 1.21.5 + //registerMob("Guardian"); // changed to simple in 1.21.5 + //registerMob("Pig"); // changed to simple in 1.21.5 + //registerMob("Sheep"); // changed to simple in 1.21.5 + //registerMob("Cow"); // changed to simple in 1.21.5 + //registerMob("Chicken"); // changed to simple in 1.21.5 + //registerMob("Squid"); // changed to simple in 1.21.5 + //registerMob("Wolf"); // changed to simple in 1.21.5 + //registerMob("MushroomCow"); // changed to simple in 1.21.5 + //registerMob("SnowMan"); // changed to simple in 1.21.5 + //registerMob("Ozelot"); // changed to simple in 1.21.5 + //registerMob("VillagerGolem"); // changed to simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "EntityHorse", new DataWalkerItemLists("Items")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "EntityHorse", new DataWalkerItems("ArmorItem", "SaddleItem")); + //registerMob("Rabbit"); // changed to simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "Villager", new DataWalkerItemLists("Inventory")); + MCTypeRegistry.ENTITY.addWalker(VERSION, "Villager", (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.VILLAGER_TRADE, data.getMap("Offers"), "Recipes", fromVersion, toVersion); + + return null; + }); + //registerMob("Shulker"); // changed to simple in 1.21.5 + MCTypeRegistry.ENTITY.addWalker(VERSION, "AreaEffectCloud", new DataWalkerTypePaths<>(MCTypeRegistry.PARTICLE, "Particle")); + + // tile entities + MCTypeRegistry.TILE_ENTITY.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.DATA_COMPONENTS, data, "components", fromVersion, toVersion); + + return null; + }); + + // Inventory -> new DataWalkerItemLists("Items") + registerInventory("Furnace"); + registerInventory("Chest"); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "RecordPlayer", new DataWalkerItems("RecordItem")); + registerInventory("Trap"); + registerInventory("Dropper"); + registerSign(VERSION, "Sign"); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "MobSpawner", (final MapType data, final long fromVersion, final long toVersion) -> { + return MCTypeRegistry.UNTAGGED_SPAWNER.convert(data, fromVersion, toVersion); + }); + registerInventory("Cauldron"); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "Control", + new DataWalkerTypePaths<>(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, "Command") + ); + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "Control", new DataWalkerTypePaths<>(MCTypeRegistry.TEXT_COMPONENT, "LastOutput")); + // skull doesn't even have custom_name in legacy versions! Why is it being walked here in DFU????? + registerInventory("Hopper"); + // Banner CustomName is a string, not TEXT_COMPONENT. Fix Vanilla incorrectly converting this + // Note: Vanilla does not properly handle this case for FlowerPot, it will not convert int ids! + MCTypeRegistry.TILE_ENTITY.addWalker(VERSION, "FlowerPot", new DataWalkerItemNames("Item")); + + // rest + + MCTypeRegistry.LEVEL.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, data, "CustomBossEvents", "Name", fromVersion, toVersion); + + return MCTypeRegistry.LIGHTWEIGHT_LEVEL.convert(data, fromVersion, toVersion); + }); + + MCTypeRegistry.ITEM_STACK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, data, "id", fromVersion, toVersion); + + final MapType tag = data.getMap("tag"); + if (tag == null) { + return null; + } + + final String itemId = getStringId(data.getGeneric("id")); + + // only things here are in tag, if changed update if above + + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, tag, "Items", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.ITEM_STACK, tag, "ChargedProjectiles", fromVersion, toVersion); + if ("minecraft:written_book".equals(itemId)) { + // These are only text component for WRITTEN books! DFU blindly will mark this as TEXT_COMPONENT. + // Like signs, they are only a real TEXT_COMPONENT (possibly!) in 1.8. We really can't distinguish between + // them though. + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, tag, "pages", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TEXT_COMPONENT, tag, "filtered_pages", fromVersion, toVersion); + } + // Note: In this version, display IS NEVER a TEXT_COMPONENT! This fixes incorrectly converting the display tag + + MapType entityTag = tag.getMap("EntityTag"); + if (entityTag != null) { + final String entityId; + if ("minecraft:armor_stand".equals(itemId)) { + // The check for version id is removed here. For whatever reason, the legacy + // data converters used entity id "minecraft:armor_stand" when version was greater-than 514, + // but entity ids were not namespaced until V705! So somebody fucked up the legacy converters. + // DFU agrees with my analysis here, it will only set the entityId here to the namespaced variant + // with the V705 schema. + entityId = "ArmorStand"; + } else if ("minecraft:item_frame".equals(itemId)) { + // add missing item_frame entity id + entityId = "ItemFrame"; + } else if ("minecraft:painting".equals(itemId)) { + entityId = "Painting"; + } else { + entityId = entityTag.getString("id"); + } + + final boolean removeId; + if (entityId == null) { + if (!"minecraft:air".equals(itemId)) { + LOGGER.warn("Unable to resolve Entity for ItemStack (V99): " + data.getGeneric("id")); + } + removeId = false; + } else { + removeId = !entityTag.hasKey("id", ObjectType.STRING); + if (removeId) { + entityTag.setString("id", entityId); + } + } + + final MapType replace = MCTypeRegistry.ENTITY.convert(entityTag, fromVersion, toVersion); + + if (replace != null) { + entityTag = replace; + tag.setMap("EntityTag", entityTag); + } + if (removeId) { + entityTag.remove("id"); + } + } + + MapType blockEntityTag = tag.getMap("BlockEntityTag"); + if (blockEntityTag != null) { + final String entityId = ITEM_ID_TO_TILE_ENTITY_ID.get(itemId); + final boolean removeId; + if (entityId == null) { + if (!"minecraft:air".equals(itemId)) { + LOGGER.warn("Unable to resolve BlockEntity for ItemStack (V99): " + data.getGeneric("id")); + } + removeId = false; + } else { + removeId = !blockEntityTag.hasKey("id", ObjectType.STRING); + blockEntityTag.setString("id", entityId); + } + final MapType replace = MCTypeRegistry.TILE_ENTITY.convert(blockEntityTag, fromVersion, toVersion); + if (replace != null) { + blockEntityTag = replace; + tag.setMap("BlockEntityTag", blockEntityTag); + } + if (removeId) { + blockEntityTag.remove("id"); + } + } + + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanDestroy", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_NAME, tag, "CanPlaceOn", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.PLAYER.addStructureWalker(VERSION, new DataWalkerItemLists("Inventory", "EnderItems")); + + MCTypeRegistry.CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + final MapType level = data.getMap("Level"); + if (level == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.ENTITY, level, "Entities", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TILE_ENTITY, level, "TileEntities", fromVersion, toVersion); + + final ListType tileTicks = level.getList("TileTicks", ObjectType.MAP); + if (tileTicks != null) { + for (int i = 0, len = tileTicks.size(); i < len; ++i) { + final MapType tileTick = tileTicks.getMap(i); + WalkerUtils.convert(MCTypeRegistry.BLOCK_NAME, tileTick, "i", fromVersion, toVersion); + } + } + + return null; + }); + + MCTypeRegistry.ENTITY_CHUNK.addStructureWalker(VERSION, (final MapType data, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertList(MCTypeRegistry.ENTITY, data, "Entities", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.SAVED_DATA_MAP_DATA.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, root, "banners", "Name", fromVersion, toVersion); + WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, root.getMap("data"), "banners", "Name", fromVersion, toVersion); + return null; + }); + MCTypeRegistry.SAVED_DATA_SCOREBOARD.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + WalkerUtils.convertList(MCTypeRegistry.OBJECTIVE, data, "Objectives", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.TEAM, data, "Teams", fromVersion, toVersion); + WalkerUtils.convertListPath(MCTypeRegistry.TEXT_COMPONENT, data, "PlayerScores", "display", fromVersion, toVersion); + + return null; + }); + MCTypeRegistry.SAVED_DATA_STRUCTURE_FEATURE_INDICES.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + final MapType data = root.getMap("data"); + if (data == null) { + return null; + } + + WalkerUtils.convertValues(MCTypeRegistry.STRUCTURE_FEATURE, data, "Features", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.TEAM.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "MemberNamePrefix", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "MemberNameSuffix", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.TEXT_COMPONENT, root, "DisplayName", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.VILLAGER_TRADE.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "buy", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "buyB", fromVersion, toVersion); + WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, root, "sell", fromVersion, toVersion); + + return null; + }); + + MCTypeRegistry.STRUCTURE.addStructureWalker(VERSION, (final MapType root, final long fromVersion, final long toVersion) -> { + WalkerUtils.convertListPath(MCTypeRegistry.ENTITY, root, "entities", "nbt", fromVersion, toVersion); + WalkerUtils.convertListPath(MCTypeRegistry.TILE_ENTITY, root, "blocks", "nbt", fromVersion, toVersion); + WalkerUtils.convertList(MCTypeRegistry.BLOCK_STATE, root, "palette", fromVersion, toVersion); + + return null; + }); + + // Enforce namespacing for ids + MCTypeRegistry.BLOCK_NAME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced()); + MCTypeRegistry.ITEM_NAME.addStructureHook(VERSION, new DataHookValueTypeEnforceNamespaced()); + MCTypeRegistry.ITEM_STACK.addStructureHook(VERSION, new DataHookEnforceNamespacedID()); + + // Entity is absent; the String form is not yet namespaced, unlike the above. + } + + private static String getStringId(final Object id) { + if (id instanceof String string) { + return string; + } else if (id instanceof Number number) { + return HelperItemNameV102.getNameFromId(number.intValue()); + } else { + return null; + } + } + + private V99() {} +} diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/block_name/DataWalkerBlockNames.java b/ca/spottedleaf/dataconverter/minecraft/walkers/block_name/DataWalkerBlockNames.java new file mode 100644 index 0000000000000000000000000000000000000000..930e014858ef635ebe25f7f92dc81ba0eaac50a8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/block_name/DataWalkerBlockNames.java @@ -0,0 +1,11 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.block_name; + +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; + +public final class DataWalkerBlockNames extends DataWalkerTypePaths { + + public DataWalkerBlockNames(final String... paths) { + super(MCTypeRegistry.BLOCK_NAME, paths); + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java b/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java new file mode 100644 index 0000000000000000000000000000000000000000..618c6d141c30506123dc7acae793355a3f6ff02c --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/game_event/GameEventListenerWalker.java @@ -0,0 +1,21 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.game_event; + +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class GameEventListenerWalker implements DataWalker { + + @Override + public MapType walk(final MapType data, final long fromVersion, final long toVersion) { + final MapType listener = data.getMap("listener"); + if (listener == null) { + return null; + } + + WalkerUtils.convert(MCTypeRegistry.GAME_EVENT_NAME, listener.getMap("event"), "game_event", fromVersion, toVersion); + + return null; + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerListPaths.java b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerListPaths.java new file mode 100644 index 0000000000000000000000000000000000000000..6fd706b2fc0b979a3b2b8175127b935ec3f8486d --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerListPaths.java @@ -0,0 +1,38 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.generic; + +import ca.spottedleaf.dataconverter.converters.datatypes.DataType; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; + +public class DataWalkerListPaths 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/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerTypePaths.java b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerTypePaths.java new file mode 100644 index 0000000000000000000000000000000000000000..961da39f6d64a6b569071e4351648432961a6a33 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/DataWalkerTypePaths.java @@ -0,0 +1,34 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.generic; + +import ca.spottedleaf.dataconverter.converters.datatypes.DataType; +import ca.spottedleaf.dataconverter.converters.datatypes.DataWalker; +import ca.spottedleaf.dataconverter.types.MapType; + +public class DataWalkerTypePaths 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/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..3c865e0c4e05cb3161e5003b5ce6f0b83ad40463 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/generic/WalkerUtils.java @@ -0,0 +1,199 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.generic; + +import ca.spottedleaf.dataconverter.converters.datatypes.DataType; +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.RenameHelper; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType; +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCValueType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import java.util.ArrayList; + +public final class WalkerUtils { + + public static void convert(final MCDataType type, final MapType data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final MapType map = data.getMap(path); + if (map != null) { + final MapType replace = type.convert(map, fromVersion, toVersion); + if (replace != null) { + data.setMap(path, replace); + } + } + } + + public static void convertList(final MCDataType type, final MapType data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final ListType list = data.getListUnchecked(path); + if (list != null) { + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType listVal = list.getMap(i, null); + if (listVal == null) { + continue; + } + + final MapType replace = type.convert(listVal, fromVersion, toVersion); + if (replace != null) { + list.setMap(i, replace); + } + } + } + } + + public static void convertListPath(final MCDataType type, final MapType data, final String listPath, final String elementPath, + final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final ListType list = data.getListUnchecked(listPath); + if (list != null) { + for (int i = 0, len = list.size(); i < len; ++i) { + WalkerUtils.convert(type, list.getMap(i, null), elementPath, fromVersion, toVersion); + } + } + } + + public static void convertListPath(final MCDataType type, final MapType data, final String listPath, final String elementPath1, + final String elementPath2, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final ListType list = data.getListUnchecked(listPath); + if (list != null) { + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType listVal = list.getMap(i, null); + if (listVal == null) { + continue; + } + + WalkerUtils.convert(type, listVal.getMap(elementPath1), elementPath2, fromVersion, toVersion); + } + } + } + + public static void convert(final DataType type, final MapType data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final Object value = data.getGeneric(path); + if (value != null) { + final Object converted = type.convert(value, fromVersion, toVersion); + if (converted != null) { + data.setGeneric(path, converted); + } + } + } + + public static void convert(final DataType type, final ListType data, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + for (int i = 0, len = data.size(); i < len; ++i) { + final Object value = data.getGeneric(i); + final Object converted = type.convert(value, fromVersion, toVersion); + if (converted != null) { + data.setGeneric(i, converted); + } + } + } + + public static void convertList(final DataType type, final MapType data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final ListType list = data.getListUnchecked(path); + if (list != null) { + convert(type, list, fromVersion, toVersion); + } + } + + public static void convertListPath(final DataType type, final MapType data, final String listPath, final String elementPath, + final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final ListType list = data.getListUnchecked(listPath); + if (list != null) { + for (int i = 0, len = list.size(); i < len; ++i) { + WalkerUtils.convert(type, list.getMap(i, null), elementPath, fromVersion, toVersion); + } + } + } + + public static void convertListPath(final DataType type, final MapType data, final String listPath, final String elementPath1, + final String elementPath2, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final ListType list = data.getListUnchecked(listPath); + if (list != null) { + for (int i = 0, len = list.size(); i < len; ++i) { + final MapType listVal = list.getMap(i, null); + if (listVal == null) { + continue; + } + + WalkerUtils.convert(type, listVal.getMap(elementPath1), elementPath2, fromVersion, toVersion); + } + } + } + + public static void convertKeys(final DataType type, final MapType data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + final MapType map = data.getMap(path); + if (map != null) { + convertKeys(type, map, fromVersion, toVersion); + } + } + + public static void convertKeys(final DataType type, final MapType data, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + RenameHelper.renameKeys(data, (final String input) -> { + return (String)type.convert(input, fromVersion, toVersion); + }); + } + + public static void convertValues(final MCDataType type, final MapType data, final String path, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + convertValues(type, data.getMap(path), fromVersion, toVersion); + } + + public static void convertValues(final MCDataType type, final MapType data, final long fromVersion, final long toVersion) { + if (data == null) { + return; + } + + for (final String key : data.keys()) { + final MapType value = data.getMap(key); + if (value != null) { + final MapType replace = type.convert(value, fromVersion, toVersion); + if (replace != null) { + // no CME, key is in map already + data.setMap(key, replace); + } + } + } + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/item_name/DataWalkerItemNames.java b/ca/spottedleaf/dataconverter/minecraft/walkers/item_name/DataWalkerItemNames.java new file mode 100644 index 0000000000000000000000000000000000000000..14e291efd864d97dcf83db01c09b9daaae1949bd --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/item_name/DataWalkerItemNames.java @@ -0,0 +1,11 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.item_name; + +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; + +public final class DataWalkerItemNames extends DataWalkerTypePaths { + + public DataWalkerItemNames(final String... paths) { + super(MCTypeRegistry.ITEM_NAME, paths); + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItemLists.java b/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItemLists.java new file mode 100644 index 0000000000000000000000000000000000000000..4541d2e80f806e62ade419b8f54475fd0aa6d9e8 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItemLists.java @@ -0,0 +1,12 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.itemstack; + +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerListPaths; +import ca.spottedleaf.dataconverter.types.MapType; + +public class DataWalkerItemLists extends DataWalkerListPaths { + + public DataWalkerItemLists(final String... paths) { + super(MCTypeRegistry.ITEM_STACK, paths); + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItems.java b/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItems.java new file mode 100644 index 0000000000000000000000000000000000000000..fac29551a3093459a8fd8eceb6323e615c729a97 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/itemstack/DataWalkerItems.java @@ -0,0 +1,12 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.itemstack; + +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.types.MapType; + +public class DataWalkerItems extends DataWalkerTypePaths { + + public DataWalkerItems(final String... paths) { + super(MCTypeRegistry.ITEM_STACK, paths); + } +} diff --git a/ca/spottedleaf/dataconverter/minecraft/walkers/tile_entity/DataWalkerTileEntities.java b/ca/spottedleaf/dataconverter/minecraft/walkers/tile_entity/DataWalkerTileEntities.java new file mode 100644 index 0000000000000000000000000000000000000000..14d72f19a429ac12f38cc79f526d465b386c9a15 --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/walkers/tile_entity/DataWalkerTileEntities.java @@ -0,0 +1,12 @@ +package ca.spottedleaf.dataconverter.minecraft.walkers.tile_entity; + +import ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry; +import ca.spottedleaf.dataconverter.minecraft.walkers.generic.DataWalkerTypePaths; +import ca.spottedleaf.dataconverter.types.MapType; + +public final class DataWalkerTileEntities extends DataWalkerTypePaths { + + public DataWalkerTileEntities(final String... paths) { + super(MCTypeRegistry.TILE_ENTITY, paths); + } +} diff --git a/ca/spottedleaf/dataconverter/types/ListType.java b/ca/spottedleaf/dataconverter/types/ListType.java new file mode 100644 index 0000000000000000000000000000000000000000..54a6b9db0bc3579735bb473f1e1f4a8c7d4bc6f6 --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/ListType.java @@ -0,0 +1,272 @@ +package ca.spottedleaf.dataconverter.types; + +public interface ListType { + + public TypeUtil getTypeUtil(); + + @Override + public int hashCode(); + + @Override + public boolean equals(final Object other); + + // Provides a deep copy of this list + public ListType copy(); + + // Returns the type of all elements in this list. Returns NONE if empty, returns UNDEFINED if not supported, MIXED if mixed types + public ObjectType getUniformType(); + + public int size(); + + public void remove(final int index); + + public Object getGeneric(final int index); + + public default void setGeneric(final int index, final Object to) { + if (to instanceof Number) { + if (to instanceof Byte b) { + this.setByte(index, b.byteValue()); + return; + } else if (to instanceof Short s) { + this.setShort(index, s.shortValue()); + return; + } else if (to instanceof Integer i) { + this.setInt(index, i.intValue()); + return; + } else if (to instanceof Long l) { + this.setLong(index, l.longValue()); + return; + } else if (to instanceof Float f) { + this.setFloat(index, f.floatValue()); + return; + } else if (to instanceof Double d) { + this.setDouble(index, d.doubleValue()); + return; + } // else fall through to throw + } else if (to instanceof MapType m) { + this.setMap(index, m); + return; + } else if (to instanceof ListType l) { + this.setList(index, l); + return; + } else if (to instanceof String s) { + this.setString(index, s); + return; + } else if (to.getClass().isArray()) { + if (to instanceof byte[] bytes) { + this.setBytes(index, bytes); + return; + } else if (to instanceof short[] shorts) { + this.setShorts(index, shorts); + return; + } else if (to instanceof int[] ints) { + this.setInts(index, ints); + return; + } else if (to instanceof long[] longs) { + this.setLongs(index, longs); + return; + } // else fall through to throw + } + + throw new IllegalArgumentException("Object " + to + " is not a valid type!"); + } + + // types here are strict. if the type on get does not match the underlying type, will throw - except for the + // default parameter methods, in such cases the default value will be returned. + + public Number getNumber(final int index); + + public Number getNumber(final int index, final Number dfl); + + // if the value at index is a Number but not a byte, then returns the number casted to byte. + public byte getByte(final int index); + + // if the value at index is a Number but not a byte, then returns the number casted to byte. + public byte getByte(final int index, final byte dfl); + + public void setByte(final int index, final byte to); + + // if the value at index is a Number but not a short, then returns the number casted to short. + public short getShort(final int index); + + // if the value at index is a Number but not a short, then returns the number casted to short. + public short getShort(final int index, final short dfl); + + public void setShort(final int index, final short to); + + // if the value at index is a Number but not a int, then returns the number casted to int. + public int getInt(final int index); + + // if the value at index is a Number but not a int, then returns the number casted to int. + public int getInt(final int index, final int dfl); + + public void setInt(final int index, final int to); + + // if the value at index is a Number but not a long, then returns the number casted to long. + public long getLong(final int index); + + // if the value at index is a Number but not a long, then returns the number casted to long. + public long getLong(final int index, final long dfl); + + public void setLong(final int index, final long to); + + // if the value at index is a Number but not a float, then returns the number casted to float. + public float getFloat(final int index); + + // if the value at index is a Number but not a float, then returns the number casted to float. + public float getFloat(final int index, final float dfl); + + public void setFloat(final int index, final float to); + + // if the value at index is a Number but not a double, then returns the number casted to double. + public double getDouble(final int index); + + // if the value at index is a Number but not a double, then returns the number casted to double. + public double getDouble(final int index, final double dfl); + + public void setDouble(final int index, final double to); + + public byte[] getBytes(final int index); + + public byte[] getBytes(final int index, final byte[] bytes); + + public void setBytes(final int index, final byte[] to); + + public short[] getShorts(final int index); + + public short[] getShorts(final int index, final short[] dfl); + + public void setShorts(final int index, final short[] to); + + public int[] getInts(final int index); + + public int[] getInts(final int index, final int[] dfl); + + public void setInts(final int index, final int[] to); + + public long[] getLongs(final int index); + + public long[] getLongs(final int index, final long[] dfl); + + public void setLongs(final int index, final long[] to); + + public ListType getList(final int index); + + public ListType getList(final int index, final ListType dfl); + + public void setList(final int index, final ListType list); + + public MapType getMap(final int index); + + public MapType getMap(final int index, final MapType dfl); + + public void setMap(final int index, final MapType to); + + public String getString(final int index); + + public String getString(final int index, final String dfl); + + public void setString(final int index, final String to); + + public default void addGeneric(final Object to) { + if (to instanceof Number) { + if (to instanceof Byte b) { + this.addByte(b.byteValue()); + return; + } else if (to instanceof Short s) { + this.addShort(s.shortValue()); + return; + } else if (to instanceof Integer i) { + this.addInt(i.intValue()); + return; + } else if (to instanceof Long l) { + this.addLong(l.longValue()); + return; + } else if (to instanceof Float f) { + this.addFloat(f.floatValue()); + return; + } else if (to instanceof Double d) { + this.addDouble(d.doubleValue()); + return; + } // else fall through to throw + } else if (to instanceof MapType m) { + this.addMap(m); + return; + } else if (to instanceof ListType l) { + this.addList(l); + return; + } else if (to instanceof String s) { + this.addString(s); + return; + } else if (to.getClass().isArray()) { + if (to instanceof byte[] bytes) { + this.addByteArray(bytes); + return; + } else if (to instanceof short[] shorts) { + this.addShortArray(shorts); + return; + } else if (to instanceof int[] ints) { + this.addIntArray(ints); + return; + } else if (to instanceof long[] longs) { + this.addLongArray(longs); + return; + } // else fall through to throw + } + + throw new IllegalArgumentException("Object " + to + " is not a valid type!"); + } + + public void addByte(final byte b); + + public void addByte(final int index, final byte b); + + public void addShort(final short s); + + public void addShort(final int index, final short s); + + public void addInt(final int i); + + public void addInt(final int index, final int i); + + public void addLong(final long l); + + public void addLong(final int index, final long l); + + public void addFloat(final float f); + + public void addFloat(final int index, final float f); + + public void addDouble(final double d); + + public void addDouble(final int index, final double d); + + public void addByteArray(final byte[] arr); + + public void addByteArray(final int index, final byte[] arr); + + public void addShortArray(final short[] arr); + + public void addShortArray(final int index, final short[] arr); + + public void addIntArray(final int[] arr); + + public void addIntArray(final int index, final int[] arr); + + public void addLongArray(final long[] arr); + + public void addLongArray(final int index, final long[] arr); + + public void addList(final ListType list); + + public void addList(final int index, final ListType list); + + public void addMap(final MapType map); + + public void addMap(final int index, final MapType map); + + public void addString(final String string); + + public void addString(final int index, final String string); + +} diff --git a/ca/spottedleaf/dataconverter/types/MapType.java b/ca/spottedleaf/dataconverter/types/MapType.java new file mode 100644 index 0000000000000000000000000000000000000000..709edd3e92fb8f73b8f9ae192162a72ce7f99fac --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/MapType.java @@ -0,0 +1,220 @@ +package ca.spottedleaf.dataconverter.types; + +import java.util.Set; + +public interface MapType { + + public TypeUtil getTypeUtil(); + + @Override + public int hashCode(); + + @Override + public boolean equals(final Object other); + + public int size(); + + public boolean isEmpty(); + + public void clear(); + + public Set keys(); + + // Provides a deep copy of this map + public MapType copy(); + + public boolean hasKey(final String key); + + public boolean hasKey(final String key, final ObjectType type); + + public void remove(final String key); + + public Object getGeneric(final String key); + + // types here are not strict. if the key maps to a different type, default is always returned + // if default is not a parameter, then default is always null + + public Number getNumber(final String key); + + public Number getNumber(final String key, final Number dfl); + + public boolean getBoolean(final String key); + + public boolean getBoolean(final String key, final boolean dfl); + + public void setBoolean(final String key, final boolean val); + + // if the mapped value is a Number but not a byte, then the number is casted to byte. If the mapped value does not exist or is not a number, returns 0 + public byte getByte(final String key); + + // if the mapped value is a Number but not a byte, then the number is casted to byte. If the mapped value does not exist or is not a number, returns dfl + public byte getByte(final String key, final byte dfl); + + public void setByte(final String key, final byte val); + + // if the mapped value is a Number but not a short, then the number is casted to short. If the mapped value does not exist or is not a number, returns 0 + public short getShort(final String key); + + // if the mapped value is a Number but not a short, then the number is casted to short. If the mapped value does not exist or is not a number, returns dfl + public short getShort(final String key, final short dfl); + + public void setShort(final String key, final short val); + + // if the mapped value is a Number but not a int, then the number is casted to int. If the mapped value does not exist or is not a number, returns 0 + public int getInt(final String key); + + // if the mapped value is a Number but not a int, then the number is casted to int. If the mapped value does not exist or is not a number, returns dfl + public int getInt(final String key, final int dfl); + + public void setInt(final String key, final int val); + + // if the mapped value is a Number but not a long, then the number is casted to long. If the mapped value does not exist or is not a number, returns 0 + public long getLong(final String key); + + // if the mapped value is a Number but not a long, then the number is casted to long. If the mapped value does not exist or is not a number, returns dfl + public long getLong(final String key, final long dfl); + + public void setLong(final String key, final long val); + + // if the mapped value is a Number but not a float, then the number is casted to float. If the mapped value does not exist or is not a number, returns 0 + public float getFloat(final String key); + + // if the mapped value is a Number but not a float, then the number is casted to float. If the mapped value does not exist or is not a number, returns dfl + public float getFloat(final String key, final float dfl); + + public void setFloat(final String key, final float val); + + // if the mapped value is a Number but not a double, then the number is casted to double. If the mapped value does not exist or is not a number, returns 0 + public double getDouble(final String key); + + // if the mapped value is a Number but not a double, then the number is casted to double. If the mapped value does not exist or is not a number, returns dfl + public double getDouble(final String key, final double dfl); + + public void setDouble(final String key, final double val); + + public byte[] getBytes(final String key); + + public byte[] getBytes(final String key, final byte[] dfl); + + public void setBytes(final String key, final byte[] val); + + public short[] getShorts(final String key); + + public short[] getShorts(final String key, final short[] dfl); + + public void setShorts(final String key, final short[] val); + + public int[] getInts(final String key); + + public int[] getInts(final String key, final int[] dfl); + + public void setInts(final String key, final int[] val); + + public long[] getLongs(final String key); + + public long[] getLongs(final String key, final long[] dfl); + + public void setLongs(final String key, final long[] val); + + public ListType getListUnchecked(final String key); + + public ListType getListUnchecked(final String key, final ListType dfl); + + public default ListType getList(final String key, final ObjectType type) { + return this.getList(key, type, null); + } + + public default ListType getOrCreateList(final String key, final ObjectType type) { + ListType ret = this.getList(key, type); + if (ret == null) { + this.setList(key, ret = this.getTypeUtil().createEmptyList()); + } + + return ret; + } + + public default ListType getList(final String key, final ObjectType type, final ListType dfl) { + final ListType ret = this.getListUnchecked(key, null); + final ObjectType retType; + if (ret != null && ((retType = ret.getUniformType()) == type || retType == ObjectType.UNDEFINED || retType == ObjectType.NONE)) { + return ret; + } else { + return dfl; + } + } + + public void setList(final String key, final ListType val); + + public MapType getMap(final String key); + + public default MapType getOrCreateMap(final String key) { + MapType ret = this.getMap(key); + if (ret == null) { + this.setMap(key, ret = this.getTypeUtil().createEmptyMap()); + } + + return ret; + } + + public MapType getMap(final String key, final MapType dfl); + + public void setMap(final String key, final MapType val); + + public String getString(final String key); + + public String getString(final String key, final String dfl); + + public void setString(final String key, final String val); + + public default void setGeneric(final String key, final Object value) { + if (value instanceof Boolean bool) { + this.setBoolean(key, bool.booleanValue()); + return; + } else if (value instanceof Number) { + if (value instanceof Byte b) { + this.setByte(key, b.byteValue()); + return; + } else if (value instanceof Short s) { + this.setShort(key, s.shortValue()); + return; + } else if (value instanceof Integer i) { + this.setInt(key, i.intValue()); + return; + } else if (value instanceof Long l) { + this.setLong(key, l.longValue()); + return; + } else if (value instanceof Float f) { + this.setFloat(key, f.floatValue()); + return; + } else if (value instanceof Double d) { + this.setDouble(key, d.doubleValue()); + return; + } // else fall through to throw + } else if (value instanceof MapType map) { + this.setMap(key, map); + return; + } else if (value instanceof ListType list) { + this.setList(key, list); + return; + } else if (value instanceof String string) { + this.setString(key, string); + return; + } else if (value.getClass().isArray()) { + if (value instanceof byte[] bytes) { + this.setBytes(key, bytes); + return; + } else if (value instanceof short[] shorts) { + this.setShorts(key, shorts); + return; + } else if (value instanceof int[] ints) { + this.setInts(key, ints); + return; + } else if (value instanceof long[] longs) { + this.setLongs(key, longs); + return; + } // else fall through to throw + } + + throw new IllegalArgumentException("Object " + value + " is not a valid type!"); + } +} diff --git a/ca/spottedleaf/dataconverter/types/ObjectType.java b/ca/spottedleaf/dataconverter/types/ObjectType.java new file mode 100644 index 0000000000000000000000000000000000000000..9775d810ba28e59d4eec6c79643c4bcaeb97fc31 --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/ObjectType.java @@ -0,0 +1,73 @@ +package ca.spottedleaf.dataconverter.types; + +public enum ObjectType { + NONE(null), + BYTE(Byte.class), + SHORT(Short.class), + INT(Integer.class), + LONG(Long.class), + FLOAT(Float.class), + DOUBLE(Double.class), + NUMBER(Number.class), + BYTE_ARRAY(byte[].class), + SHORT_ARRAY(short[].class), + INT_ARRAY(int[].class), + LONG_ARRAY(long[].class), + LIST(ListType.class), + MAP(MapType.class), + STRING(String.class), + UNDEFINED(null), + MIXED(null); + + private final Class clazz; + private final boolean isNumber; + + private ObjectType(final Class clazz) { + this.clazz = clazz; + this.isNumber = clazz != null && Number.class.isAssignableFrom(clazz); + } + + public boolean isNumber() { + return this.isNumber; + } + + public Class getObjectClass() { + return this.clazz; + } + + public static ObjectType getType(final Object object) { + if (object instanceof Number) { + if (object instanceof Byte) { + return BYTE; + } else if (object instanceof Short) { + return SHORT; + } else if (object instanceof Integer) { + return INT; + } else if (object instanceof Long) { + return LONG; + } else if (object instanceof Float) { + return FLOAT; + } else if (object instanceof Double) { + return DOUBLE; + } // else return null + } else if (object instanceof MapType) { + return MAP; + } else if (object instanceof ListType) { + return LIST; + } else if (object instanceof String) { + return STRING; + } else if (object.getClass().isArray()) { + if (object instanceof byte[]) { + return BYTE_ARRAY; + } else if (object instanceof short[]) { + return SHORT_ARRAY; + } else if (object instanceof int[]) { + return INT_ARRAY; + } else if (object instanceof long[]) { + return LONG_ARRAY; + } // else return null + } + + return null; + } +} diff --git a/ca/spottedleaf/dataconverter/types/TypeUtil.java b/ca/spottedleaf/dataconverter/types/TypeUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..4170c188d9e7150ef7b728d4992d10ec8dab4fa4 --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/TypeUtil.java @@ -0,0 +1,26 @@ +package ca.spottedleaf.dataconverter.types; + +public interface TypeUtil { + + public ListType createEmptyList(); + + public MapType createEmptyMap(); + + public default Object convertFromBaseToGeneric(final T input, final TypeUtil to) { + return this.convertTo(this.baseToGeneric(input), to); + } + + public default D convertBaseToBase(final T input, final TypeUtil to) { + return to.genericToBase(this.convertFromBaseToGeneric(input, to)); + } + + public default D convertGenericToBase(final Object valueGeneric, final TypeUtil to) { + return to.genericToBase(this.convertTo(valueGeneric, to)); + } + + public Object convertTo(final Object valueGeneric, final TypeUtil to); + + public Object baseToGeneric(final T input); + + public T genericToBase(final Object input); +} diff --git a/ca/spottedleaf/dataconverter/types/Types.java b/ca/spottedleaf/dataconverter/types/Types.java new file mode 100644 index 0000000000000000000000000000000000000000..750aa7b31732d81eb01c80b45b13a830ae7feb91 --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/Types.java @@ -0,0 +1,14 @@ +package ca.spottedleaf.dataconverter.types; + +import ca.spottedleaf.dataconverter.types.json.JsonTypeUtil; +import ca.spottedleaf.dataconverter.types.nbt.NBTTypeUtil; + +public interface Types { + + public static final NBTTypeUtil NBT = new NBTTypeUtil(); + + public static final JsonTypeUtil JSON = new JsonTypeUtil(false); + + // why does this exist + public static final JsonTypeUtil JSON_COMPRESSED = new JsonTypeUtil(true); +} diff --git a/ca/spottedleaf/dataconverter/types/json/JsonListType.java b/ca/spottedleaf/dataconverter/types/json/JsonListType.java new file mode 100644 index 0000000000000000000000000000000000000000..58d0bf4931e7516b39d9d31b4807cfa28efeee0a --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/json/JsonListType.java @@ -0,0 +1,510 @@ +package ca.spottedleaf.dataconverter.types.json; + +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import ca.spottedleaf.dataconverter.types.Types; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; + +public final class JsonListType implements ListType { + + final JsonArray array; + final boolean compressed; + + public JsonListType(final boolean compressed) { + this.array = new JsonArray(); + this.compressed = compressed; + } + + public JsonListType(final JsonArray array, final boolean compressed) { + this.array = array; + this.compressed = compressed; + } + + @Override + public TypeUtil getTypeUtil() { + return this.compressed ? Types.JSON_COMPRESSED : Types.JSON; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + + if (obj == null || obj.getClass() != JsonListType.class) { + return false; + } + + return this.array.equals(((JsonListType)obj).array); + } + + @Override + public int hashCode() { + return this.array.hashCode(); + } + + @Override + public String toString() { + return "JsonListType{" + + "array=" + this.array + + ", compressed=" + this.compressed + + '}'; + } + + public JsonArray getJson() { + return this.array; + } + + @Override + public ListType copy() { + return new JsonListType(this.array.deepCopy(), this.compressed); + } + + @Override + public ObjectType getUniformType() { + return ObjectType.UNDEFINED; + } + + @Override + public int size() { + return this.array.size(); + } + + @Override + public void remove(final int index) { + this.array.remove(index); + } + + @Override + public Object getGeneric(final int index) { + return Types.JSON.baseToGeneric(this.array.get(index)); + } + + @Override + public Number getNumber(final int index) { + final JsonElement element = this.array.get(index); + if (element instanceof JsonPrimitive) { + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isNumber()) { + return primitive.getAsNumber(); + } else if (primitive.isBoolean()) { + return primitive.getAsBoolean() ? Byte.valueOf((byte)1) : Byte.valueOf((byte)0); + } else if (this.compressed && primitive.isString()) { + try { + return Integer.valueOf(Integer.parseInt(primitive.getAsString())); + } catch (final NumberFormatException ex) { + return null; + } + } + } + + return null; + } + + @Override + public Number getNumber(final int index, final Number dfl) { + final Number ret = this.getNumber(index); + return ret == null ? dfl : ret; + } + + @Override + public byte getByte(final int index) { + final Number number = this.getNumber(index); + + return number == null ? (byte)0 : number.byteValue(); + } + + @Override + public byte getByte(final int index, final byte dfl) { + final Number number = this.getNumber(index); + + return number == null ? dfl : number.byteValue(); + } + + @Override + public void setByte(final int index, final byte to) { + this.array.set(index, new JsonPrimitive(Byte.valueOf(to))); + } + + @Override + public short getShort(final int index) { + final Number number = this.getNumber(index); + + return number == null ? (short)0 : number.shortValue(); + } + + @Override + public short getShort(final int index, final short dfl) { + final Number number = this.getNumber(index); + + return number == null ? dfl : number.shortValue(); + } + + @Override + public void setShort(final int index, final short to) { + this.array.set(index, new JsonPrimitive(Short.valueOf(to))); + } + + @Override + public int getInt(final int index) { + final Number number = this.getNumber(index); + + return number == null ? 0 : number.intValue(); + } + + @Override + public int getInt(final int index, final int dfl) { + final Number number = this.getNumber(index); + + return number == null ? dfl : number.intValue(); + } + + @Override + public void setInt(final int index, final int to) { + this.array.set(index, new JsonPrimitive(Integer.valueOf(to))); + } + + @Override + public long getLong(final int index) { + final Number number = this.getNumber(index); + + return number == null ? 0L : number.longValue(); + } + + @Override + public long getLong(final int index, final long dfl) { + final Number number = this.getNumber(index); + + return number == null ? dfl : number.longValue(); + } + + @Override + public void setLong(final int index, final long to) { + this.array.set(index, new JsonPrimitive(Long.valueOf(to))); + } + + @Override + public float getFloat(final int index) { + final Number number = this.getNumber(index); + + return number == null ? 0.0f : number.floatValue(); + } + + @Override + public float getFloat(final int index, final float dfl) { + final Number number = this.getNumber(index); + + return number == null ? dfl : number.floatValue(); + } + + @Override + public void setFloat(final int index, final float to) { + this.array.set(index, new JsonPrimitive(Float.valueOf(to))); + } + + @Override + public double getDouble(final int index) { + final Number number = this.getNumber(index); + + return number == null ? 0.0 : number.doubleValue(); + } + + @Override + public double getDouble(final int index, final double dfl) { + final Number number = this.getNumber(index); + + return number == null ? dfl : number.doubleValue(); + } + + @Override + public void setDouble(final int index, final double to) { + this.array.set(index, new JsonPrimitive(Double.valueOf(to))); + } + + @Override + public byte[] getBytes(final int index) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public byte[] getBytes(final int index, final byte[] dfl) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void setBytes(final int index, final byte[] to) { + throw new UnsupportedOperationException(); + } + + @Override + public short[] getShorts(final int index) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public short[] getShorts(final int index, final short[] dfl) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void setShorts(final int index, final short[] to) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public int[] getInts(final int index) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public int[] getInts(final int index, final int[] dfl) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void setInts(final int index, final int[] to) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public long[] getLongs(final int index) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public long[] getLongs(final int index, final long[] dfl) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void setLongs(final int index, final long[] to) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public ListType getList(final int index) { + final JsonElement element = this.array.get(index); + if (element instanceof JsonArray) { + return new JsonListType((JsonArray)element, this.compressed); + } + return null; + } + + @Override + public ListType getList(final int index, final ListType dfl) { + final ListType ret = this.getList(index); + return ret == null ? dfl : ret; + } + + @Override + public void setList(final int index, final ListType list) { + this.array.set(index, ((JsonListType)list).array); + } + + @Override + public MapType getMap(final int index) { + final JsonElement element = this.array.get(index); + if (element instanceof JsonObject) { + return new JsonMapType((JsonObject)element, this.compressed); + } + return null; + } + + @Override + public MapType getMap(final int index, final MapType dfl) { + final MapType ret = this.getMap(index); + return ret == null ? dfl : ret; + } + + @Override + public void setMap(final int index, final MapType to) { + this.array.set(index, ((JsonMapType)to).map); + } + + @Override + public String getString(final int index) { + final JsonElement element = this.array.get(index); + if (element instanceof JsonPrimitive) { + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isString() || (this.compressed && primitive.isNumber())) { + return primitive.getAsString(); + } + } + + return null; + } + + @Override + public String getString(final int index, final String dfl) { + final String ret = this.getString(index); + return ret == null ? dfl : ret; + } + + @Override + public void setString(final int index, final String to) { + this.array.set(index, new JsonPrimitive(to)); + } + + @Override + public void addByte(final byte b) { + this.array.add(Byte.valueOf(b)); + } + + @Override + public void addByte(final int index, final byte b) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } + + @Override + public void addShort(final short s) { + this.array.add(Short.valueOf(s)); + } + + @Override + public void addShort(final int index, final short s) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } + + @Override + public void addInt(final int i) { + this.array.add(Integer.valueOf(i)); + } + + @Override + public void addInt(final int index, final int i) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } + + @Override + public void addLong(final long l) { + this.array.add(Long.valueOf(l)); + } + + @Override + public void addLong(final int index, final long l) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } + + @Override + public void addFloat(final float f) { + this.array.add(Float.valueOf(f)); + } + + @Override + public void addFloat(final int index, final float f) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } + + @Override + public void addDouble(final double d) { + this.array.add(Double.valueOf(d)); + } + + @Override + public void addDouble(final int index, final double d) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } + + @Override + public void addByteArray(final byte[] arr) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void addByteArray(final int index, final byte[] arr) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void addShortArray(final short[] arr) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void addShortArray(final int index, final short[] arr) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void addIntArray(final int[] arr) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void addIntArray(final int index, final int[] arr) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void addLongArray(final long[] arr) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void addLongArray(final int index, final long[] arr) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public void addList(final ListType list) { + this.array.add(((JsonListType)list).array); + } + + @Override + public void addList(final int index, final ListType list) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } + + @Override + public void addMap(final MapType map) { + this.array.add(((JsonMapType)map).map); + } + + @Override + public void addMap(final int index, final MapType map) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } + + @Override + public void addString(final String string) { + this.array.add(string); + } + + @Override + public void addString(final int index, final String string) { + // doesn't implement any methods for adding at index... yee haw... + throw new UnsupportedOperationException(); + } +} diff --git a/ca/spottedleaf/dataconverter/types/json/JsonMapType.java b/ca/spottedleaf/dataconverter/types/json/JsonMapType.java new file mode 100644 index 0000000000000000000000000000000000000000..6704da4a40522a4f40cd770a4cbaaa8e6f67cc31 --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/json/JsonMapType.java @@ -0,0 +1,472 @@ +package ca.spottedleaf.dataconverter.types.json; + +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import ca.spottedleaf.dataconverter.types.Types; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +public final class JsonMapType implements MapType { + + final JsonObject map; + final boolean compressed; + + public JsonMapType(final boolean compressed) { + this.map = new JsonObject(); + this.compressed = compressed; + } + + public JsonMapType(final JsonObject map, final boolean compressed) { + this.map = map; + this.compressed = compressed; + } + + @Override + public TypeUtil 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(this.map.deepCopy(), this.compressed); + } + + @Override + public boolean hasKey(final String key) { + return this.map.has(key); + } + + @Override + public boolean hasKey(final String key, final ObjectType type) { + final JsonElement element = this.map.get(key); + if (element == null) { + return false; + } + + if (type == ObjectType.UNDEFINED) { + return true; + } + + if (element.isJsonArray()) { + return type == ObjectType.LIST; + } else if (element.isJsonObject()) { + return type == ObjectType.MAP; + } else if (element.isJsonNull()) { + return false; + } + + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isString()) { + return type == ObjectType.STRING || (this.compressed && type == ObjectType.NUMBER); + } else if (primitive.isBoolean()) { + return type.isNumber(); + } else { + // is number + final Number number = primitive.getAsNumber(); + if (number instanceof Byte) { + return type == ObjectType.BYTE || (this.compressed && type == ObjectType.STRING); + } else if (number instanceof Short) { + return type == ObjectType.SHORT || (this.compressed && type == ObjectType.STRING); + } else if (number instanceof Integer) { + return type == ObjectType.INT || (this.compressed && type == ObjectType.STRING); + } else if (number instanceof Long) { + return type == ObjectType.LONG || (this.compressed && type == ObjectType.STRING); + } else if (number instanceof Float) { + return type == ObjectType.FLOAT || (this.compressed && type == ObjectType.STRING); + } else { + return type == ObjectType.DOUBLE || (this.compressed && type == ObjectType.STRING); + } + } + } + + @Override + public void remove(final String key) { + this.map.remove(key); + } + + @Override + public Object getGeneric(final String key) { + final JsonElement element = this.map.get(key); + if (element == null || element.isJsonNull()) { + return null; + } else if (element.isJsonObject()) { + return new JsonMapType((JsonObject)element, this.compressed); + } else if (element.isJsonArray()) { + return new JsonListType((JsonArray)element, this.compressed); + } else { + // primitive + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isNumber()) { + return primitive.getAsNumber(); + } else if (primitive.isString()) { + return primitive.getAsString(); + } else if (primitive.isBoolean()) { + return Boolean.valueOf(primitive.getAsBoolean()); + } else { + throw new IllegalStateException("Unknown json object " + element); + } + } + } + + @Override + public Number getNumber(final String key) { + return this.getNumber(key, null); + } + + @Override + public Number getNumber(final String key, final Number dfl) { + final JsonElement element = this.map.get(key); + if (element instanceof JsonPrimitive) { + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isNumber()) { + return primitive.getAsNumber(); + } else if (primitive.isBoolean()) { + return primitive.getAsBoolean() ? Byte.valueOf((byte)1) : Byte.valueOf((byte)0); + } else if (this.compressed && primitive.isString()) { + try { + return Integer.valueOf(Integer.parseInt(primitive.getAsString())); + } catch (final NumberFormatException ex) { + return null; + } + } + } + + return dfl; + } + + @Override + public boolean getBoolean(final String key) { + return this.getBoolean(key, false); + } + + @Override + public boolean getBoolean(final String key, final boolean dfl) { + final JsonElement element = this.map.get(key); + if (element instanceof JsonPrimitive) { + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isNumber()) { + return primitive.getAsNumber().byteValue() != 0; + } else if (primitive.isBoolean()) { + return primitive.getAsBoolean(); + } + } + + return dfl; + } + + @Override + public void setBoolean(final String key, final boolean val) { + this.map.addProperty(key, Boolean.valueOf(val)); + } + + @Override + public byte getByte(final String key) { + return this.getByte(key, (byte)0); + } + + @Override + public byte getByte(final String key, final byte dfl) { + final Number ret = this.getNumber(key, null); + return ret == null ? dfl : ret.byteValue(); + } + + @Override + public void setByte(final String key, final byte val) { + this.map.addProperty(key, Byte.valueOf(val)); + } + + @Override + public short getShort(final String key) { + return this.getShort(key, (short)0); + } + + @Override + public short getShort(final String key, final short dfl) { + final Number ret = this.getNumber(key, null); + return ret == null ? dfl : ret.shortValue(); + } + + @Override + public void setShort(final String key, final short val) { + this.map.addProperty(key, Short.valueOf(val)); + } + + @Override + public int getInt(final String key) { + return this.getInt(key, 0); + } + + @Override + public int getInt(final String key, final int dfl) { + final Number ret = this.getNumber(key, null); + return ret == null ? dfl : ret.intValue(); + } + + @Override + public void setInt(final String key, final int val) { + this.map.addProperty(key, Integer.valueOf(val)); + } + + @Override + public long getLong(final String key) { + return this.getLong(key, 0L); + } + + @Override + public long getLong(final String key, final long dfl) { + final Number ret = this.getNumber(key, null); + return ret == null ? dfl : ret.longValue(); + } + + @Override + public void setLong(final String key, final long val) { + this.map.addProperty(key, Long.valueOf(val)); + } + + @Override + public float getFloat(final String key) { + return this.getFloat(key, 0.0F); + } + + @Override + public float getFloat(final String key, final float dfl) { + final Number ret = this.getNumber(key, null); + return ret == null ? dfl : ret.floatValue(); + } + + @Override + public void setFloat(final String key, final float val) { + this.map.addProperty(key, Float.valueOf(val)); + } + + @Override + public double getDouble(final String key) { + return this.getDouble(key, 0.0D); + } + + @Override + public double getDouble(final String key, final double dfl) { + final Number ret = this.getNumber(key, null); + return ret == null ? dfl : ret.doubleValue(); + } + + @Override + public void setDouble(final String key, final double val) { + this.map.addProperty(key, Double.valueOf(val)); + } + + @Override + public byte[] getBytes(final String key) { + return this.getBytes(key, null); + } + + @Override + public byte[] getBytes(final String key, final byte[] dfl) { + return dfl; + } + + @Override + public void setBytes(final String key, final byte[] val) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public short[] getShorts(final String key) { + return this.getShorts(key, null); + } + + @Override + public short[] getShorts(final String key, final short[] dfl) { + return dfl; + } + + @Override + public void setShorts(final String key, final short[] val) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public int[] getInts(final String key) { + return this.getInts(key, null); + } + + @Override + public int[] getInts(final String key, final int[] dfl) { + return dfl; + } + + @Override + public void setInts(final String key, final int[] val) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public long[] getLongs(final String key) { + return this.getLongs(key, null); + } + + @Override + public long[] getLongs(final String key, final long[] dfl) { + return dfl; + } + + @Override + public void setLongs(final String key, final long[] val) { + // JSON does not support raw primitive arrays + throw new UnsupportedOperationException(); + } + + @Override + public ListType getListUnchecked(final String key) { + return this.getListUnchecked(key, null); + } + + @Override + public ListType getListUnchecked(final String key, final ListType dfl) { + final JsonElement element = this.map.get(key); + if (element instanceof JsonArray) { + return new JsonListType((JsonArray)element, this.compressed); + } + + return dfl; + } + + @Override + public void setList(final String key, final ListType val) { + this.map.add(key, ((JsonListType)val).getJson()); + } + + @Override + public MapType getMap(final String key) { + return this.getMap(key, null); + } + + @Override + public MapType getMap(final String key, final MapType dfl) { + final JsonElement element = this.map.get(key); + if (element instanceof JsonObject) { + return new JsonMapType((JsonObject)element, this.compressed); + } + + return dfl; + } + + @Override + public void setMap(final String key, final MapType val) { + this.map.add(key, ((JsonMapType)val).map); + } + + @Override + public String getString(final String key) { + return this.getString(key, null); + } + + @Override + public String getString(final String key, final String dfl) { + final JsonElement element = this.map.get(key); + if (element instanceof JsonPrimitive) { + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isString()) { + return primitive.getAsString(); + } else if (this.compressed && primitive.isNumber()) { + return primitive.getAsString(); + } + } + + return dfl; + } + + public String getForcedString(final String key) { + return this.getForcedString(key, null); + } + + public String getForcedString(final String key, final String dfl) { + final JsonElement element = this.map.get(key); + if (element instanceof JsonPrimitive) { + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isString()) { + return primitive.getAsString(); + } else if (primitive.isNumber()) { + return primitive.getAsString(); + } + + return primitive.toString(); + } else if (element != null) { + return element.toString(); + } + + return dfl; + } + + @Override + public void setString(final String key, final String val) { + this.map.addProperty(key, val); + } +} diff --git a/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java b/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..3ace24bdd5e5da4333e25c9c681007e6a85d52ab --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/json/JsonTypeUtil.java @@ -0,0 +1,181 @@ +package ca.spottedleaf.dataconverter.types.json; + +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.CopyHelper; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import java.math.BigDecimal; +import java.util.Map; + +public final class JsonTypeUtil implements TypeUtil { + + private final boolean compressed; + + public JsonTypeUtil(final boolean compressed) { + this.compressed = compressed; + } + + public boolean isCompressed() { + return this.compressed; + } + + @Override + public ListType createEmptyList() { + return new JsonListType(this.compressed); + } + + @Override + public MapType createEmptyMap() { + return new JsonMapType(this.compressed); + } + + @Override + public Object convertTo(final Object valueGeneric, final TypeUtil to) { + if (valueGeneric == null || valueGeneric instanceof String || valueGeneric instanceof Boolean) { + return valueGeneric; + } + if (valueGeneric instanceof Number number) { + if (CopyHelper.sanitizeNumber(number) == null) { + throw new IllegalStateException("Unknown type: " + number); + } + return number; + } + if (valueGeneric instanceof JsonListType listType) { + return convertJson(to, listType.array, this.compressed); // override input compression + } + if (valueGeneric instanceof JsonMapType mapType) { + return convertJson(to, mapType.map, this.compressed); // override input compression + } + throw new IllegalStateException("Unknown type: " + valueGeneric); + } + + @Override + public Object convertFromBaseToGeneric(final JsonElement input, final TypeUtil to) { + return convertJsonToGeneric(to, input, this.compressed); + } + + @Override + public Object baseToGeneric(final JsonElement input) { + if (input == null) { + return null; + } + if (input instanceof JsonObject jsonObject) { + return new JsonMapType(jsonObject, this.compressed); + } else if (input instanceof JsonArray array) { + return new JsonListType(array, this.compressed); + } else if (input instanceof JsonNull) { + return null; + } else { + final JsonPrimitive primitive = (JsonPrimitive)input; + if (primitive.isBoolean()) { + return Boolean.valueOf(primitive.getAsBoolean()); + } else if (primitive.isNumber()) { + final Number number = CopyHelper.sanitizeNumber(primitive.getAsNumber()); + return number != null ? number : convertBDToGeneric(primitive.getAsBigDecimal()); + } else if (primitive.isString()) { + return primitive.getAsString(); + } + } + + throw new IllegalStateException("Unrecognized type " + input); + } + + @Override + public JsonElement genericToBase(final Object input) { + if (input == null) { + return JsonNull.INSTANCE; + } else if (input instanceof JsonMapType mapType) { + return mapType.map; + } else if (input instanceof JsonListType listType) { + return listType.array; + } else if (input instanceof Boolean bool) { + return new JsonPrimitive(bool); + } else if (input instanceof Number number) { + return new JsonPrimitive(number); + } else if (input instanceof String string) { + return new JsonPrimitive(string); + } + + throw new IllegalStateException("Unrecognized type " + input); + } + + private static Number convertBDToGeneric(final BigDecimal input) { + try { + final long l = input.longValueExact(); + final byte b = (byte)l; + final short s = (short)l; + final int i = (int)l; + + if ((long)b == l) { + return Byte.valueOf(b); + } + if ((long)s == l) { + return Short.valueOf(s); + } + if ((long)i == l) { + return Integer.valueOf(i); + } + + return Long.valueOf(l); + } catch (final ArithmeticException ex) { + final double d = input.doubleValue(); // possibly lose precision! + final float f = (float)d; + + return (double)f == d ? Float.valueOf(f) : Double.valueOf(d); + } + } + + private static Object convertJsonToGeneric(final TypeUtil to, final JsonElement element, final boolean compressed) { + if (element == null) { + return null; + } + if (element instanceof JsonObject jsonObject) { + return convertJson(to, jsonObject, compressed); + } else if (element instanceof JsonArray array) { + return convertJson(to, array, compressed); + } else if (element instanceof JsonNull) { + return null; + } else { + final JsonPrimitive primitive = (JsonPrimitive)element; + if (primitive.isBoolean()) { + return Boolean.valueOf(primitive.getAsBoolean()); + } else if (primitive.isNumber()) { + final Number number = CopyHelper.sanitizeNumber(primitive.getAsNumber()); + return number != null ? number : convertBDToGeneric(primitive.getAsBigDecimal()); + } else if (primitive.isString()) { + return primitive.getAsString(); + } + } + + throw new IllegalStateException("Unrecognized type " + element); + } + + private static MapType convertJson(final TypeUtil to, final JsonObject json, final boolean compressed) { + final MapType ret = to.createEmptyMap(); + for (final Map.Entry entry : json.entrySet()) { + final Object obj = convertJsonToGeneric(to, entry.getValue(), compressed); + if (obj == null) { + continue; + } + + ret.setGeneric(entry.getKey(), obj); + } + + return ret; + } + + private static ListType convertJson(final TypeUtil to, final JsonArray json, final boolean compressed) { + final ListType ret = to.createEmptyList(); + + for (int i = 0, len = json.size(); i < len; ++i) { + ret.addGeneric(convertJsonToGeneric(to, json.get(i), compressed)); + } + + return ret; + } +} diff --git a/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java b/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java new file mode 100644 index 0000000000000000000000000000000000000000..b4882e90c8845694032e4a43e75bbf35c5eed873 --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/nbt/NBTListType.java @@ -0,0 +1,582 @@ +package ca.spottedleaf.dataconverter.types.nbt; + +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import ca.spottedleaf.dataconverter.types.Types; +import net.minecraft.nbt.ByteArrayTag; +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.DoubleTag; +import net.minecraft.nbt.FloatTag; +import net.minecraft.nbt.IntArrayTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.LongArrayTag; +import net.minecraft.nbt.LongTag; +import net.minecraft.nbt.NumericTag; +import net.minecraft.nbt.ShortTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; + +public final class NBTListType implements ListType { + + final ListTag list; + + public NBTListType() { + this.list = new ListTag(); + } + + public NBTListType(final ListTag tag) { + this.list = tag; + } + + @Override + public TypeUtil getTypeUtil() { + return Types.NBT; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null || obj.getClass() != NBTListType.class) { + return false; + } + + return this.list.equals(((NBTListType)obj).list); + } + + @Override + public int hashCode() { + return this.list.hashCode(); + } + + @Override + public String toString() { + return "NBTListType{" + + "list=" + this.list + + '}'; + } + + public ListTag getTag() { + return this.list; + } + + @Override + public ListType copy() { + return new NBTListType(this.list.copy()); + } + + static ObjectType getType(final byte id) { + switch (id) { + case Tag.TAG_END: + return ObjectType.NONE; + case Tag.TAG_BYTE: + return ObjectType.BYTE; + case Tag.TAG_SHORT: + return ObjectType.SHORT; + case Tag.TAG_INT: + return ObjectType.INT; + case Tag.TAG_LONG: + return ObjectType.LONG; + case Tag.TAG_FLOAT: + return ObjectType.FLOAT; + case Tag.TAG_DOUBLE: + return ObjectType.DOUBLE; + case Tag.TAG_BYTE_ARRAY: + return ObjectType.BYTE_ARRAY; + case Tag.TAG_STRING: + return ObjectType.STRING; + case Tag.TAG_LIST: + return ObjectType.LIST; + case Tag.TAG_COMPOUND: + return ObjectType.MAP; + case Tag.TAG_INT_ARRAY: + return ObjectType.INT_ARRAY; + case Tag.TAG_LONG_ARRAY: + return ObjectType.LONG_ARRAY; + default: + throw new IllegalStateException("Unknown type: " + id); + } + } + + @Override + public ObjectType getUniformType() { + ObjectType curr = null; + + for (int i = 0, len = this.list.size(); i < len; ++i) { + final Tag tag = this.list.get(i); + final ObjectType tagType = getType(tag.getId()); + if (curr == null) { + curr = tagType; + } else if (tagType != curr) { + return ObjectType.MIXED; + } + } + + return curr == null ? ObjectType.NONE : curr; + } + + @Override + public int size() { + return this.list.size(); + } + + @Override + public void remove(final int index) { + this.list.remove(index); + } + + @Override + public Object getGeneric(final int index) { + return Types.NBT.baseToGeneric(this.list.get(index)); + } + + @Override + public Number getNumber(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + throw new IllegalStateException(); + } + return numericTag.box(); + } + + @Override + public Number getNumber(final int index, final Number dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + return dfl; + } + return numericTag.box(); + } + + @Override + public byte getByte(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + throw new IllegalStateException(); + } + return numericTag.byteValue(); + } + + @Override + public byte getByte(final int index, final byte dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + return dfl; + } + return numericTag.byteValue(); + } + + @Override + public void setByte(final int index, final byte to) { + this.list.set(index, ByteTag.valueOf(to)); + } + + @Override + public short getShort(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + throw new IllegalStateException(); + } + return numericTag.shortValue(); + } + + @Override + public short getShort(final int index, final short dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + return dfl; + } + return numericTag.shortValue(); + } + + @Override + public void setShort(final int index, final short to) { + this.list.set(index, ShortTag.valueOf(to)); + } + + @Override + public int getInt(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + throw new IllegalStateException(); + } + return numericTag.intValue(); + } + + @Override + public int getInt(final int index, final int dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + return dfl; + } + return numericTag.intValue(); + } + + @Override + public void setInt(final int index, final int to) { + this.list.set(index, IntTag.valueOf(to)); + } + + @Override + public long getLong(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + throw new IllegalStateException(); + } + return numericTag.longValue(); + } + + @Override + public long getLong(final int index, final long dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + return dfl; + } + return numericTag.longValue(); + } + + @Override + public void setLong(final int index, final long to) { + this.list.set(index, LongTag.valueOf(to)); + } + + @Override + public float getFloat(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + throw new IllegalStateException(); + } + return numericTag.floatValue(); + } + + @Override + public float getFloat(final int index, final float dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + return dfl; + } + return numericTag.floatValue(); + } + + @Override + public void setFloat(final int index, final float to) { + this.list.set(index, FloatTag.valueOf(to)); + } + + @Override + public double getDouble(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + throw new IllegalStateException(); + } + return numericTag.doubleValue(); + } + + @Override + public double getDouble(final int index, final double dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof NumericTag numericTag)) { + return dfl; + } + return numericTag.doubleValue(); + } + + @Override + public void setDouble(final int index, final double to) { + this.list.set(index, DoubleTag.valueOf(to)); + } + + @Override + public byte[] getBytes(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof ByteArrayTag bytes)) { + throw new IllegalStateException(); + } + return bytes.getAsByteArray(); + } + + + @Override + public byte[] getBytes(final int index, final byte[] dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof ByteArrayTag bytes)) { + return dfl; + } + return bytes.getAsByteArray(); + } + + @Override + public void setBytes(final int index, final byte[] to) { + this.list.set(index, new ByteArrayTag(to)); + } + + @Override + public short[] getShorts(final int index) { + // NBT does not support shorts + throw new UnsupportedOperationException(); + } + + @Override + public short[] getShorts(final int index, final short[] dfl) { + // NBT does not support shorts + throw new UnsupportedOperationException(); + } + + @Override + public void setShorts(final int index, final short[] to) { + throw new UnsupportedOperationException(); + } + + @Override + public int[] getInts(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof IntArrayTag ints)) { + throw new IllegalStateException(); + } + return ints.getAsIntArray(); + } + + @Override + public int[] getInts(final int index, final int[] dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof IntArrayTag ints)) { + return dfl; + } + return ints.getAsIntArray(); + } + + @Override + public void setInts(final int index, final int[] to) { + this.list.set(index, new IntArrayTag(to)); + } + + @Override + public long[] getLongs(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof LongArrayTag longs)) { + throw new IllegalStateException(); + } + return longs.getAsLongArray(); + } + + @Override + public long[] getLongs(final int index, final long[] dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof LongArrayTag longs)) { + return dfl; + } + return longs.getAsLongArray(); + } + + @Override + public void setLongs(final int index, final long[] to) { + this.list.set(index, new LongArrayTag(to)); + } + + @Override + public ListType getList(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof ListTag list)) { + throw new IllegalStateException(); + } + return new NBTListType(list); + } + + @Override + public ListType getList(final int index, final ListType dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof ListTag list)) { + return dfl; + } + return new NBTListType(list); + } + + @Override + public void setList(final int index, final ListType list) { + this.list.set(index, ((NBTListType)list).getTag()); + } + + @Override + public MapType getMap(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof CompoundTag compoundTag)) { + throw new IllegalStateException(); + } + return new NBTMapType(compoundTag); + } + + @Override + public MapType getMap(final int index, final MapType dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof CompoundTag compoundTag)) { + return dfl; + } + return new NBTMapType(compoundTag); + } + + @Override + public void setMap(final int index, final MapType to) { + this.list.set(index, ((NBTMapType)to).getTag()); + } + + @Override + public String getString(final int index) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof StringTag stringTag)) { + throw new IllegalStateException(); + } + return stringTag.value(); + } + + + @Override + public String getString(final int index, final String dfl) { + final Tag tag = this.list.get(index); // does bound checking for us + if (!(tag instanceof StringTag stringTag)) { + return dfl; + } + return stringTag.value(); + } + + @Override + public void setString(final int index, final String to) { + this.list.set(index, StringTag.valueOf(to)); + } + + @Override + public void addByte(final byte b) { + this.list.add(ByteTag.valueOf(b)); + } + + @Override + public void addByte(final int index, final byte b) { + this.list.add(index, ByteTag.valueOf(b)); + } + + @Override + public void addShort(final short s) { + this.list.add(ShortTag.valueOf(s)); + } + + @Override + public void addShort(final int index, final short s) { + this.list.add(index, ShortTag.valueOf(s)); + } + + @Override + public void addInt(final int i) { + this.list.add(IntTag.valueOf(i)); + } + + @Override + public void addInt(final int index, final int i) { + this.list.add(index, IntTag.valueOf(i)); + } + + @Override + public void addLong(final long l) { + this.list.add(LongTag.valueOf(l)); + } + + @Override + public void addLong(final int index, final long l) { + this.list.add(index, LongTag.valueOf(l)); + } + + @Override + public void addFloat(final float f) { + this.list.add(FloatTag.valueOf(f)); + } + + @Override + public void addFloat(final int index, final float f) { + this.list.add(index, FloatTag.valueOf(f)); + } + + @Override + public void addDouble(final double d) { + this.list.add(DoubleTag.valueOf(d)); + } + + @Override + public void addDouble(final int index, final double d) { + this.list.add(index, DoubleTag.valueOf(d)); + } + + @Override + public void addByteArray(final byte[] arr) { + this.list.add(new ByteArrayTag(arr)); + } + + @Override + public void addByteArray(final int index, final byte[] arr) { + this.list.add(index, new ByteArrayTag(arr)); + } + + @Override + public void addShortArray(final short[] arr) { + // NBT does not support short[] + throw new UnsupportedOperationException(); + } + + @Override + public void addShortArray(final int index, final short[] arr) { + // NBT does not support short[] + throw new UnsupportedOperationException(); + } + + @Override + public void addIntArray(final int[] arr) { + this.list.add(new IntArrayTag(arr)); + } + + @Override + public void addIntArray(final int index, final int[] arr) { + this.list.add(index, new IntArrayTag(arr)); + } + + @Override + public void addLongArray(final long[] arr) { + this.list.add(new LongArrayTag(arr)); + } + + @Override + public void addLongArray(final int index, final long[] arr) { + this.list.add(index, new LongArrayTag(arr)); + } + + @Override + public void addList(final ListType list) { + this.list.add(((NBTListType)list).getTag()); + } + + @Override + public void addList(final int index, final ListType list) { + this.list.add(index, ((NBTListType)list).getTag()); + } + + @Override + public void addMap(final MapType map) { + this.list.add(((NBTMapType)map).getTag()); + } + + @Override + public void addMap(final int index, final MapType map) { + this.list.add(index, ((NBTMapType)map).getTag()); + } + + @Override + public void addString(final String string) { + this.list.add(StringTag.valueOf(string)); + } + + @Override + public void addString(final int index, final String string) { + this.list.add(index, StringTag.valueOf(string)); + } +} diff --git a/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java b/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java new file mode 100644 index 0000000000000000000000000000000000000000..2558d9014e1daff6dd4a44ad85bbc0254c7de056 --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/nbt/NBTMapType.java @@ -0,0 +1,442 @@ +package ca.spottedleaf.dataconverter.types.nbt; + +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.ObjectType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import ca.spottedleaf.dataconverter.types.Types; +import net.minecraft.nbt.ByteArrayTag; +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.IntArrayTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.LongArrayTag; +import net.minecraft.nbt.NumericTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.StringTagVisitor; +import net.minecraft.nbt.Tag; + +import java.util.Set; + +public final class NBTMapType implements MapType { + + final CompoundTag map; + + public NBTMapType() { + this.map = new CompoundTag(); + } + + public NBTMapType(final CompoundTag tag) { + this.map = tag; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null || obj.getClass() != NBTMapType.class) { + return false; + } + + return this.map.equals(((NBTMapType)obj).map); + } + + @Override + public TypeUtil getTypeUtil() { + return Types.NBT; + } + + @Override + public int hashCode() { + return this.map.hashCode(); + } + + @Override + public String toString() { + return "NBTMapType{" + + "map=" + this.map + + '}'; + } + + @Override + public int size() { + return this.map.size(); + } + + @Override + public boolean isEmpty() { + return this.map.isEmpty(); + } + + @Override + public void clear() { + this.map.keySet().clear(); + } + + @Override + public Set keys() { + return this.map.keySet(); + } + + public CompoundTag getTag() { + return this.map; + } + + @Override + public MapType copy() { + return new NBTMapType(this.map.copy()); + } + + @Override + public boolean hasKey(final String key) { + return this.map.get(key) != null; + } + + @Override + public boolean hasKey(final String key, final ObjectType type) { + final Tag tag = this.map.get(key); + if (tag == null) { + return false; + } + + final ObjectType valueType = NBTListType.getType(tag.getId()); + + return valueType == type || (type == ObjectType.NUMBER && valueType.isNumber()); + } + + @Override + public void remove(final String key) { + this.map.remove(key); + } + + @Override + public Object getGeneric(final String key) { + final Tag tag = this.map.get(key); + if (tag == null) { + return null; + } + + switch (NBTListType.getType(tag.getId())) { + case BYTE: + case SHORT: + case INT: + case LONG: + case FLOAT: + case DOUBLE: + return ((NumericTag)tag).box(); + case MAP: + return new NBTMapType((CompoundTag)tag); + case LIST: + return new NBTListType((ListTag)tag); + case STRING: + return ((StringTag)tag).value(); + case BYTE_ARRAY: + return ((ByteArrayTag)tag).getAsByteArray(); + // Note: No short array tag! + case INT_ARRAY: + return ((IntArrayTag)tag).getAsIntArray(); + case LONG_ARRAY: + return ((LongArrayTag)tag).getAsLongArray(); + } + + throw new IllegalStateException("Unrecognized type " + tag); + } + + @Override + public Number getNumber(final String key) { + return this.getNumber(key, null); + } + + @Override + public Number getNumber(final String key, final Number dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numTag) { + return numTag.box(); + } + return dfl; + } + + @Override + public boolean getBoolean(final String key) { + return this.getByte(key) != 0; + } + + @Override + public boolean getBoolean(final String key, final boolean dfl) { + return this.getByte(key, dfl ? (byte)1 : (byte)0) != 0; + } + + @Override + public void setBoolean(final String key, final boolean val) { + this.setByte(key, val ? (byte)1 : (byte)0); + } + + @Override + public byte getByte(final String key) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.byteValue(); + } + return 0; + } + + @Override + public byte getByte(final String key, final byte dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.byteValue(); + } + return dfl; + } + + @Override + public void setByte(final String key, final byte val) { + this.map.putByte(key, val); + } + + @Override + public short getShort(final String key) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.shortValue(); + } + return 0; + } + + @Override + public short getShort(final String key, final short dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.shortValue(); + } + return dfl; + } + + @Override + public void setShort(final String key, final short val) { + this.map.putShort(key, val); + } + + @Override + public int getInt(final String key) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.intValue(); + } + return 0; + } + + @Override + public int getInt(final String key, final int dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.intValue(); + } + return dfl; + } + + @Override + public void setInt(final String key, final int val) { + this.map.putInt(key, val); + } + + @Override + public long getLong(final String key) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.longValue(); + } + return 0; + } + + @Override + public long getLong(final String key, final long dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.longValue(); + } + return dfl; + } + + @Override + public void setLong(final String key, final long val) { + this.map.putLong(key, val); + } + + @Override + public float getFloat(final String key) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.floatValue(); + } + return 0; + } + + @Override + public float getFloat(final String key, final float dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.floatValue(); + } + return dfl; + } + + @Override + public void setFloat(final String key, final float val) { + this.map.putFloat(key, val); + } + + @Override + public double getDouble(final String key) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.doubleValue(); + } + return 0; + } + + @Override + public double getDouble(final String key, final double dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof NumericTag numericTag) { + return numericTag.doubleValue(); + } + return dfl; + } + + @Override + public void setDouble(final String key, final double val) { + this.map.putDouble(key, val); + } + + @Override + public byte[] getBytes(final String key) { + return this.getBytes(key, null); + } + + @Override + public byte[] getBytes(final String key, final byte[] dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof ByteArrayTag byteArrayTag) { + return byteArrayTag.getAsByteArray(); + } + return dfl; + } + + @Override + public void setBytes(final String key, final byte[] val) { + this.map.putByteArray(key, val); + } + + @Override + public short[] getShorts(final String key) { + return this.getShorts(key, null); + } + + @Override + public short[] getShorts(final String key, final short[] dfl) { + // NBT does not support short array + return dfl; + } + + @Override + public void setShorts(final String key, final short[] val) { + throw new UnsupportedOperationException(); + } + + @Override + public int[] getInts(final String key) { + return this.getInts(key, null); + } + + @Override + public int[] getInts(final String key, final int[] dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof IntArrayTag intArrayTag) { + return intArrayTag.getAsIntArray(); + } + return dfl; + } + + @Override + public void setInts(final String key, final int[] val) { + this.map.putIntArray(key, val); + } + + @Override + public long[] getLongs(final String key) { + return this.getLongs(key, null); + } + + @Override + public long[] getLongs(final String key, final long[] dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof LongArrayTag longArrayTag) { + return longArrayTag.getAsLongArray(); + } + return dfl; + } + + @Override + public void setLongs(final String key, final long[] val) { + this.map.putLongArray(key, val); + } + + @Override + public ListType getListUnchecked(final String key) { + return this.getListUnchecked(key, null); + } + + @Override + public ListType getListUnchecked(final String key, final ListType dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof ListTag listTag) { + return new NBTListType(listTag); + } + return dfl; + } + + @Override + public void setList(final String key, final ListType val) { + this.map.put(key, ((NBTListType)val).getTag()); + } + + @Override + public MapType getMap(final String key) { + return this.getMap(key, null); + } + + @Override + public MapType getMap(final String key, final MapType dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof CompoundTag compoundTag) { + return new NBTMapType(compoundTag); + } + return dfl; + } + + @Override + public void setMap(final String key, final MapType val) { + this.map.put(key, ((NBTMapType)val).getTag()); + } + + @Override + public String getString(final String key) { + return this.getString(key, null); + } + + @Override + public String getString(final String key, final String dfl) { + final Tag tag = this.map.get(key); + if (tag instanceof StringTag strTag) { + return strTag.value(); + } + return dfl; + } + + @Override + public void setString(final String key, final String val) { + this.map.putString(key, val); + } +} diff --git a/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java b/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..61e98240a221a75780e311c0777a8c43c4297d65 --- /dev/null +++ b/ca/spottedleaf/dataconverter/types/nbt/NBTTypeUtil.java @@ -0,0 +1,128 @@ +package ca.spottedleaf.dataconverter.types.nbt; + +import ca.spottedleaf.dataconverter.minecraft.converters.helpers.CopyHelper; +import ca.spottedleaf.dataconverter.types.ListType; +import ca.spottedleaf.dataconverter.types.MapType; +import ca.spottedleaf.dataconverter.types.TypeUtil; +import net.minecraft.nbt.ByteArrayTag; +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.EndTag; +import net.minecraft.nbt.IntArrayTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.LongArrayTag; +import net.minecraft.nbt.LongTag; +import net.minecraft.nbt.NumericTag; +import net.minecraft.nbt.ShortTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; + +public final class NBTTypeUtil implements TypeUtil { + + @Override + public ListType createEmptyList() { + return new NBTListType(); + } + + @Override + public MapType createEmptyMap() { + return new NBTMapType(); + } + + @Override + public Object convertTo(final Object valueGeneric, final TypeUtil to) { + if (valueGeneric == null || valueGeneric instanceof String || valueGeneric instanceof Boolean) { + return valueGeneric; + } + if (valueGeneric instanceof Number number) { + if (CopyHelper.sanitizeNumber(number) == null) { + throw new IllegalStateException("Unknown type: " + number); + } + return number; + } + if (valueGeneric instanceof NBTListType listType) { + return convertNBT(to, listType.list); + } + if (valueGeneric instanceof NBTMapType mapType) { + return convertNBT(to, mapType.map); + } + throw new IllegalStateException("Unknown type: " + valueGeneric); + } + + @Override + public Object convertFromBaseToGeneric(final Tag input, final TypeUtil to) { + return convertNBTToGeneric(to, input); + } + + @Override + public Object baseToGeneric(final Tag input) { + return switch (input) { + case CompoundTag ct -> new NBTMapType(ct); + case ListTag lt -> new NBTListType(lt); + case EndTag endTag -> null; + case StringTag st -> st.value(); + case ByteArrayTag bt -> bt.getAsByteArray(); + case IntArrayTag it -> it.getAsIntArray(); + case LongArrayTag lt -> lt.getAsLongArray(); + case NumericTag nt -> nt.box(); + case null -> null; + default -> throw new IllegalStateException("Unknown tag: " + input); + }; + } + + @Override + public Tag genericToBase(final Object input) { + return switch (input) { + case null -> EndTag.INSTANCE; + case NBTMapType mapType -> mapType.map; + case NBTListType listType -> listType.list; + case String string -> StringTag.valueOf(string); + case Boolean bool -> ByteTag.valueOf(bool.booleanValue()); + case Byte b -> ByteTag.valueOf(b.byteValue()); + case Short s -> ShortTag.valueOf(s.shortValue()); + case Integer i -> IntTag.valueOf(i.intValue()); + case Long l -> LongTag.valueOf(l.longValue()); + case byte[] bytes -> new ByteArrayTag(bytes); + case int[] ints -> new IntArrayTag(ints); + case long[] longs -> new LongArrayTag(longs); + + default -> throw new IllegalStateException("Unrecognized type " + input); + }; + } + + private static Object convertNBTToGeneric(final TypeUtil to, final Tag nbt) { + return switch (nbt) { + case CompoundTag ct -> convertNBT(to, ct); + case ListTag lt -> convertNBT(to, lt); + case EndTag endTag -> null; + case StringTag st -> st.value(); + case ByteArrayTag bt -> bt.getAsByteArray(); + case IntArrayTag it -> it.getAsIntArray(); + case LongArrayTag lt -> lt.getAsLongArray(); + case NumericTag nt -> nt.box(); + case null -> null; + default -> throw new IllegalStateException("Unknown tag: " + nbt); + }; + } + + public static MapType convertNBT(final TypeUtil to, final CompoundTag nbt) { + final MapType ret = to.createEmptyMap(); + + for (final String key : nbt.keySet()) { + ret.setGeneric(key, convertNBTToGeneric(to, nbt.get(key))); + } + + return ret; + } + + public static ListType convertNBT(final TypeUtil to, final ListTag nbt) { + final ListType ret = to.createEmptyList(); + + for (int i = 0, len = nbt.size(); i < len; ++i) { + ret.addGeneric(convertNBTToGeneric(to, nbt.get(i))); + } + + return ret; + } +} diff --git a/ca/spottedleaf/dataconverter/util/Int2IntArraySortedMap.java b/ca/spottedleaf/dataconverter/util/Int2IntArraySortedMap.java new file mode 100644 index 0000000000000000000000000000000000000000..6596de3d9ebae583c252aa061f0cfdf8778ea1a5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/util/Int2IntArraySortedMap.java @@ -0,0 +1,77 @@ +package ca.spottedleaf.dataconverter.util; + +import it.unimi.dsi.fastutil.ints.Int2IntFunction; + +import java.util.Arrays; + +public class Int2IntArraySortedMap { + + protected int[] key; + protected int[] val; + protected int size; + + public Int2IntArraySortedMap() { + this.key = new int[8]; + this.val = new int[8]; + } + + public int put(final int key, final int value) { + final int index = Arrays.binarySearch(this.key, 0, this.size, key); + if (index >= 0) { + final int current = this.val[index]; + this.val[index] = value; + return current; + } + final int insert = -(index + 1); + // shift entries down + if (this.size >= this.val.length) { + this.key = Arrays.copyOf(this.key, this.key.length * 2); + this.val = Arrays.copyOf(this.val, this.val.length * 2); + } + System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert); + System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert); + ++this.size; + + this.key[insert] = key; + this.val[insert] = value; + + return 0; + } + + public int computeIfAbsent(final int key, final Int2IntFunction producer) { + final int index = Arrays.binarySearch(this.key, 0, this.size, key); + if (index >= 0) { + return this.val[index]; + } + final int insert = -(index + 1); + // shift entries down + if (this.size >= this.val.length) { + this.key = Arrays.copyOf(this.key, this.key.length * 2); + this.val = Arrays.copyOf(this.val, this.val.length * 2); + } + System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert); + System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert); + ++this.size; + + this.key[insert] = key; + + return this.val[insert] = producer.apply(key); + } + + public int get(final int key) { + final int index = Arrays.binarySearch(this.key, 0, this.size, key); + if (index < 0) { + return 0; + } + return this.val[index]; + } + + public int getFloor(final int key) { + final int index = Arrays.binarySearch(this.key, 0, this.size, key); + if (index < 0) { + final int insert = -(index + 1) - 1; + return insert < 0 ? 0 : this.val[insert]; + } + return this.val[index]; + } +} diff --git a/ca/spottedleaf/dataconverter/util/Int2ObjectArraySortedMap.java b/ca/spottedleaf/dataconverter/util/Int2ObjectArraySortedMap.java new file mode 100644 index 0000000000000000000000000000000000000000..de9d632489609136c712a9adaee941fd38fad440 --- /dev/null +++ b/ca/spottedleaf/dataconverter/util/Int2ObjectArraySortedMap.java @@ -0,0 +1,74 @@ +package ca.spottedleaf.dataconverter.util; + +import java.util.Arrays; +import java.util.function.IntFunction; + +public class Int2ObjectArraySortedMap { + + 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/ca/spottedleaf/dataconverter/util/IntegerUtil.java b/ca/spottedleaf/dataconverter/util/IntegerUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..4bbf38c812feeb30d2aa5f3fcf482bfcbed79d05 --- /dev/null +++ b/ca/spottedleaf/dataconverter/util/IntegerUtil.java @@ -0,0 +1,239 @@ +package ca.spottedleaf.dataconverter.util; + +public final class IntegerUtil { + public static final int HIGH_BIT_U32 = Integer.MIN_VALUE; + public static final long HIGH_BIT_U64 = Long.MIN_VALUE; + + public static int ceilLog2(final int value) { + return Integer.SIZE - Integer.numberOfLeadingZeros(value - 1); // see doc of numberOfLeadingZeros + } + + public static long ceilLog2(final long value) { + return Long.SIZE - Long.numberOfLeadingZeros(value - 1); // see doc of numberOfLeadingZeros + } + + public static int floorLog2(final int value) { + // xor is optimized subtract for 2^n -1 + // note that (2^n -1) - k = (2^n -1) ^ k for k <= (2^n - 1) + return (Integer.SIZE - 1) ^ Integer.numberOfLeadingZeros(value); // see doc of numberOfLeadingZeros + } + + public static int floorLog2(final long value) { + // xor is optimized subtract for 2^n -1 + // note that (2^n -1) - k = (2^n -1) ^ k for k <= (2^n - 1) + return (Long.SIZE - 1) ^ Long.numberOfLeadingZeros(value); // see doc of numberOfLeadingZeros + } + + public static int roundCeilLog2(final int value) { + // optimized variant of 1 << (32 - leading(val - 1)) + // given + // 1 << n = HIGH_BIT_32 >>> (31 - n) for n [0, 32) + // 1 << (32 - leading(val - 1)) = HIGH_BIT_32 >>> (31 - (32 - leading(val - 1))) + // HIGH_BIT_32 >>> (31 - (32 - leading(val - 1))) + // HIGH_BIT_32 >>> (31 - 32 + leading(val - 1)) + // HIGH_BIT_32 >>> (-1 + leading(val - 1)) + return HIGH_BIT_U32 >>> (Integer.numberOfLeadingZeros(value - 1) - 1); + } + + public static long roundCeilLog2(final long value) { + // see logic documented above + return HIGH_BIT_U64 >>> (Long.numberOfLeadingZeros(value - 1) - 1); + } + + public static int roundFloorLog2(final int value) { + // optimized variant of 1 << (31 - leading(val)) + // given + // 1 << n = HIGH_BIT_32 >>> (31 - n) for n [0, 32) + // 1 << (31 - leading(val)) = HIGH_BIT_32 >> (31 - (31 - leading(val))) + // HIGH_BIT_32 >> (31 - (31 - leading(val))) + // HIGH_BIT_32 >> (31 - 31 + leading(val)) + return HIGH_BIT_U32 >>> Integer.numberOfLeadingZeros(value); + } + + public static long roundFloorLog2(final long value) { + // see logic documented above + return HIGH_BIT_U64 >>> Long.numberOfLeadingZeros(value); + } + + public static boolean isPowerOfTwo(final int n) { + // 2^n has one bit + // note: this rets true for 0 still + return IntegerUtil.getTrailingBit(n) == n; + } + + public static boolean isPowerOfTwo(final long n) { + // 2^n has one bit + // note: this rets true for 0 still + return IntegerUtil.getTrailingBit(n) == n; + } + + public static int getTrailingBit(final int n) { + return -n & n; + } + + public static long getTrailingBit(final long n) { + return -n & n; + } + + public static int trailingZeros(final int n) { + return Integer.numberOfTrailingZeros(n); + } + + public static int trailingZeros(final long n) { + return Long.numberOfTrailingZeros(n); + } + + // from hacker's delight (signed division magic value) + public static int getDivisorMultiple(final long numbers) { + return (int)(numbers >>> 32); + } + + // from hacker's delight (signed division magic value) + public static int getDivisorShift(final long numbers) { + return (int)numbers; + } + + public static long getDivisorNumbers(final int d) { + final int ad = branchlessAbs(d); + + if (ad < 2) { + throw new IllegalArgumentException("|number| must be in [2, 2^31 -1], not: " + d); + } + + final int two31 = 0x80000000; + final long mask = 0xFFFFFFFFL; // mask for enforcing unsigned behaviour + + /* + Signed usage: + int number; + long magic = getDivisorNumbers(div); + long mul = magic >>> 32; + int sign = number >> 31; + int result = (int)(((long)number * mul) >>> magic) - sign; + */ + /* + Unsigned usage: + int number; + long magic = getDivisorNumbers(div); + long mul = magic >>> 32; + int result = (int)(((long)number * mul) >>> magic); + */ + + int p = 31; + + // all these variables are UNSIGNED! + int t = two31 + (d >>> 31); + int anc = t - 1 - (int)((t & mask)%ad); + int q1 = (int)((two31 & mask)/(anc & mask)); + int r1 = two31 - q1*anc; + int q2 = (int)((two31 & mask)/(ad & mask)); + int r2 = two31 - q2*ad; + int delta; + + do { + p = p + 1; + q1 = 2*q1; // Update q1 = 2**p/|nc|. + r1 = 2*r1; // Update r1 = rem(2**p, |nc|). + if ((r1 & mask) >= (anc & mask)) {// (Must be an unsigned comparison here) + q1 = q1 + 1; + r1 = r1 - anc; + } + q2 = 2*q2; // Update q2 = 2**p/|d|. + r2 = 2*r2; // Update r2 = rem(2**p, |d|). + if ((r2 & mask) >= (ad & mask)) {// (Must be an unsigned comparison here) + q2 = q2 + 1; + r2 = r2 - ad; + } + delta = ad - r2; + } while ((q1 & mask) < (delta & mask) || (q1 == delta && r1 == 0)); + + int magicNum = q2 + 1; + if (d < 0) { + magicNum = -magicNum; + } + int shift = p; + return ((long)magicNum << 32) | shift; + } + + public static int branchlessAbs(final int val) { + // -n = -1 ^ n + 1 + final int mask = val >> (Integer.SIZE - 1); // -1 if < 0, 0 if >= 0 + return (mask ^ val) - mask; // if val < 0, then (0 ^ val) - 0 else (-1 ^ val) + 1 + } + + public static long branchlessAbs(final long val) { + // -n = -1 ^ n + 1 + final long mask = val >> (Long.SIZE - 1); // -1 if < 0, 0 if >= 0 + return (mask ^ val) - mask; // if val < 0, then (0 ^ val) - 0 else (-1 ^ val) + 1 + } + + //https://github.com/skeeto/hash-prospector for hash functions + + //score = ~590.47984224483832 + public static int hash0(int x) { + x *= 0x36935555; + x ^= x >>> 16; + return x; + } + + //score = ~310.01596637036749 + public static int hash1(int x) { + x ^= x >>> 15; + x *= 0x356aaaad; + x ^= x >>> 17; + return x; + } + + public static int hash2(int x) { + x ^= x >>> 16; + x *= 0x7feb352d; + x ^= x >>> 15; + x *= 0x846ca68b; + x ^= x >>> 16; + return x; + } + + public static int hash3(int x) { + x ^= x >>> 17; + x *= 0xed5ad4bb; + x ^= x >>> 11; + x *= 0xac4c1b51; + x ^= x >>> 15; + x *= 0x31848bab; + x ^= x >>> 14; + return x; + } + + //score = ~365.79959673201887 + public static long hash1(long x) { + x ^= x >>> 27; + x *= 0xb24924b71d2d354bL; + x ^= x >>> 28; + return x; + } + + //h2 hash + public static long hash2(long x) { + x ^= x >>> 32; + x *= 0xd6e8feb86659fd93L; + x ^= x >>> 32; + x *= 0xd6e8feb86659fd93L; + x ^= x >>> 32; + return x; + } + + public static long hash3(long x) { + x ^= x >>> 45; + x *= 0xc161abe5704b6c79L; + x ^= x >>> 41; + x *= 0xe3e5389aedbc90f7L; + x ^= x >>> 56; + x *= 0x1f9aba75a52db073L; + x ^= x >>> 53; + return x; + } + + private IntegerUtil() { + throw new RuntimeException(); + } +} diff --git a/ca/spottedleaf/dataconverter/util/Long2IntArraySortedMap.java b/ca/spottedleaf/dataconverter/util/Long2IntArraySortedMap.java new file mode 100644 index 0000000000000000000000000000000000000000..94705bb141b550589faa9a0408402d8636c61907 --- /dev/null +++ b/ca/spottedleaf/dataconverter/util/Long2IntArraySortedMap.java @@ -0,0 +1,76 @@ +package ca.spottedleaf.dataconverter.util; + +import it.unimi.dsi.fastutil.longs.Long2IntFunction; +import java.util.Arrays; + +public class Long2IntArraySortedMap { + + protected long[] key; + protected int[] val; + protected int size; + + public Long2IntArraySortedMap() { + this.key = new long[8]; + this.val = new int[8]; + } + + public int put(final long key, final int value) { + final int index = Arrays.binarySearch(this.key, 0, this.size, key); + if (index >= 0) { + final int current = this.val[index]; + this.val[index] = value; + return current; + } + final int insert = -(index + 1); + // shift entries down + if (this.size >= this.val.length) { + this.key = Arrays.copyOf(this.key, this.key.length * 2); + this.val = Arrays.copyOf(this.val, this.val.length * 2); + } + System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert); + System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert); + ++this.size; + + this.key[insert] = key; + this.val[insert] = value; + + return 0; + } + + public int computeIfAbsent(final long key, final Long2IntFunction producer) { + final int index = Arrays.binarySearch(this.key, 0, this.size, key); + if (index >= 0) { + return this.val[index]; + } + final int insert = -(index + 1); + // shift entries down + if (this.size >= this.val.length) { + this.key = Arrays.copyOf(this.key, this.key.length * 2); + this.val = Arrays.copyOf(this.val, this.val.length * 2); + } + System.arraycopy(this.key, insert, this.key, insert + 1, this.size - insert); + System.arraycopy(this.val, insert, this.val, insert + 1, this.size - insert); + ++this.size; + + this.key[insert] = key; + + return this.val[insert] = producer.apply(key); + } + + public int get(final long key) { + final int index = Arrays.binarySearch(this.key, 0, this.size, key); + if (index < 0) { + return 0; + } + return this.val[index]; + } + + public int getFloor(final long key) { + final int index = Arrays.binarySearch(this.key, 0, this.size, key); + if (index < 0) { + final int insert = -(index + 1) - 1; + return insert < 0 ? 0 : this.val[insert]; + } + return this.val[index]; + } +} diff --git a/ca/spottedleaf/dataconverter/util/Long2ObjectArraySortedMap.java b/ca/spottedleaf/dataconverter/util/Long2ObjectArraySortedMap.java new file mode 100644 index 0000000000000000000000000000000000000000..6f634c8825589a23f46ad7b54354475c9a95bd1b --- /dev/null +++ b/ca/spottedleaf/dataconverter/util/Long2ObjectArraySortedMap.java @@ -0,0 +1,76 @@ +package ca.spottedleaf.dataconverter.util; + +import java.util.Arrays; +import java.util.function.LongFunction; + +public class Long2ObjectArraySortedMap { + + 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/ca/spottedleaf/dataconverter/util/NamespaceUtil.java b/ca/spottedleaf/dataconverter/util/NamespaceUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..b028017b9c44821a8a313a04e0b10f5d0610edd5 --- /dev/null +++ b/ca/spottedleaf/dataconverter/util/NamespaceUtil.java @@ -0,0 +1,39 @@ +package ca.spottedleaf.dataconverter.util; + +import ca.spottedleaf.dataconverter.types.MapType; +import net.minecraft.resources.ResourceLocation; + +public final class NamespaceUtil { + + private NamespaceUtil() {} + + public static void enforceForPath(final MapType data, final String path) { + if (data == null) { + return; + } + + final String id = data.getString(path); + if (id != null) { + final String replace = NamespaceUtil.correctNamespaceOrNull(id); + if (replace != null) { + data.setString(path, replace); + } + } + } + + public static String correctNamespace(final String value) { + if (value == null) { + return null; + } + final ResourceLocation resourceLocation = ResourceLocation.tryParse(value); + return resourceLocation != null ? resourceLocation.toString() : value; + } + + public static String correctNamespaceOrNull(final String value) { + if (value == null) { + return null; + } + final String correct = correctNamespace(value); + return correct.equals(value) ? null : correct; + } +} diff --git a/ca/spottedleaf/moonrise/paper/PaperHooks.java b/ca/spottedleaf/moonrise/paper/PaperHooks.java index e4f0653c575c33b1ef8160b6c88e29ee9fb44508..b6a34796d33f1593301c3a67a013fa7e812cb329 100644 --- a/ca/spottedleaf/moonrise/paper/PaperHooks.java +++ b/ca/spottedleaf/moonrise/paper/PaperHooks.java @@ -211,6 +211,43 @@ public final class PaperHooks extends BaseChunkSystemHooks implements PlatformHo @Override public CompoundTag convertNBT(final DSL.TypeReference type, final DataFixer dataFixer, final CompoundTag nbt, final int fromVersion, final int toVersion) { + // Paper start - optimise data conversion + if (type == net.minecraft.util.datafix.fixes.References.PLAYER) { + return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag( + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.PLAYER, nbt, fromVersion, toVersion + ); + } + if (type == net.minecraft.util.datafix.fixes.References.CHUNK) { + return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag( + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, nbt, fromVersion, toVersion + ); + } + if (type == net.minecraft.util.datafix.fixes.References.STRUCTURE) { + return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag( + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.STRUCTURE, nbt, fromVersion, toVersion + ); + } + if (type == net.minecraft.util.datafix.fixes.References.POI_CHUNK) { + return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag( + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.POI_CHUNK, nbt, fromVersion, toVersion + ); + } + if (type == net.minecraft.util.datafix.fixes.References.ENTITY_CHUNK) { + return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag( + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY_CHUNK, nbt, fromVersion, toVersion + ); + } + if (type == net.minecraft.util.datafix.fixes.References.ITEM_STACK) { + return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag( + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ITEM_STACK, nbt, fromVersion, toVersion + ); + } + if (type == net.minecraft.util.datafix.fixes.References.ENTITY || type == net.minecraft.util.datafix.fixes.References.ENTITY_TREE) { + return ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag( + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY, nbt, fromVersion, toVersion + ); + } + // Paper end - optimise data conversion return (CompoundTag)dataFixer.update( type, new Dynamic<>(NbtOps.INSTANCE, nbt), fromVersion, toVersion ).getValue(); diff --git a/net/minecraft/data/structures/StructureUpdater.java b/net/minecraft/data/structures/StructureUpdater.java index 6536dc08c80170f5679acedd65cd2b9f6ad3fb3a..294cd15a796ad25823c8ccf98fbfae46ddac2c26 100644 --- a/net/minecraft/data/structures/StructureUpdater.java +++ b/net/minecraft/data/structures/StructureUpdater.java @@ -27,7 +27,7 @@ public class StructureUpdater implements SnbtToNbt.Filter { LOGGER.warn("SNBT Too old, do not forget to update: {} < {}: {}", dataVersion, 4420, structureLocationPath); } - CompoundTag compoundTag = DataFixTypes.STRUCTURE.updateToCurrentVersion(DataFixers.getDataFixer(), tag, dataVersion); + CompoundTag compoundTag = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.STRUCTURE, tag, dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); // Paper structureTemplate.load(BuiltInRegistries.BLOCK, compoundTag); return structureTemplate.save(new CompoundTag()); } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java index 8a18b0d926f80bab09a478b9d34ec914e5f76795..3527c39f3f95832d52aeda6205bbbb7161ecaf66 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -305,6 +305,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function threadFunction) { + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system AtomicReference atomicReference = new AtomicReference<>(); Thread thread = new ca.spottedleaf.moonrise.common.util.TickThread(() -> atomicReference.get().runServer(), "Server thread"); thread.setUncaughtExceptionHandler((thread1, exception) -> LOGGER.error("Uncaught exception in server thread", exception)); diff --git a/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/net/minecraft/world/level/chunk/storage/ChunkStorage.java index 8c1417c659ea0e079e99b9bfa79e1cf6ba9b712b..a8a32edea080f32fd25c9e009d4efa416a51a4cf 100644 --- a/net/minecraft/world/level/chunk/storage/ChunkStorage.java +++ b/net/minecraft/world/level/chunk/storage/ChunkStorage.java @@ -54,7 +54,7 @@ public class ChunkStorage implements AutoCloseable { } else { try { // CraftBukkit start - if (version < 1466) { + if (false && version < 1466) { // Paper - no longer needed, data converter system / DFU handles it now CompoundTag level = chunkData.getCompoundOrEmpty("Level"); if (level.getBooleanOr("TerrainPopulated", false) && !level.getBooleanOr("LightPopulated", false)) { // Light is purged updating to 1.14+. We need to set light populated to true so the converter recognizes the chunk as being "full" @@ -63,7 +63,7 @@ public class ChunkStorage implements AutoCloseable { } // CraftBukkit end if (version < 1493) { - chunkData = DataFixTypes.CHUNK.update(this.fixerUpper, chunkData, version, 1493); + chunkData = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, chunkData, version, 1493); // Paper - replace chunk converter if (chunkData.getCompound("Level").flatMap(compoundTag -> compoundTag.getBoolean("hasLegacyStructureData")).orElse(false)) { LegacyStructureDataHandler legacyStructureHandler = this.getLegacyStructureHandler(levelKey, storage); chunkData = legacyStructureHandler.updateFromLegacy(chunkData); @@ -80,7 +80,7 @@ public class ChunkStorage implements AutoCloseable { // Spigot end injectDatafixingContext(chunkData, levelKey, chunkGeneratorKey); - chunkData = DataFixTypes.CHUNK.updateToCurrentVersion(this.fixerUpper, chunkData, Math.max(1493, version)); + chunkData = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, chunkData, Math.max(1493, version), ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); // Paper - replace chunk converter // Spigot start if (stopBelowZero) { chunkData.putString("Status", net.minecraft.core.registries.BuiltInRegistries.CHUNK_STATUS.getKey(net.minecraft.world.level.chunk.status.ChunkStatus.SPAWN).toString()); diff --git a/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java b/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java index 914af3dbbc875f7f672618e1a7a0bf8f10945eba..5b40a63955b61fa53bd9096b34de3adb036d0f35 100644 --- a/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java +++ b/net/minecraft/world/level/chunk/storage/SimpleRegionStorage.java @@ -32,14 +32,29 @@ public class SimpleRegionStorage implements AutoCloseable { return this.worker.store(chunkPos, data); } + // Paper start - rewrite data conversion system + private ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType getDataConverterType() { + if (this.dataFixType == DataFixTypes.ENTITY_CHUNK) { + return ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY_CHUNK; + } else if (this.dataFixType == DataFixTypes.POI_CHUNK) { + return ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.POI_CHUNK; + } else { + throw new UnsupportedOperationException("For " + this.dataFixType.name()); + } + } + // Paper end - rewrite data conversion system + public CompoundTag upgradeChunkTag(CompoundTag tag, int version) { int dataVersion = NbtUtils.getDataVersion(tag, version); - CompoundTag compoundTag = this.dataFixType.updateToCurrentVersion(this.fixerUpper, tag, dataVersion); + CompoundTag compoundTag = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(this.getDataConverterType(), tag, dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion());; // Paper start - rewrite data conversion system return NbtUtils.addCurrentDataVersion(compoundTag); } public Dynamic upgradeChunkTag(Dynamic tag, int version) { - return this.dataFixType.updateToCurrentVersion(this.fixerUpper, tag, version); + // Paper start - rewrite data conversion system + final CompoundTag converted = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(this.getDataConverterType(), (CompoundTag)tag.getValue(), version, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); + return new Dynamic<>(tag.getOps(), converted); + // Paper end - rewrite data conversion system } public CompletableFuture synchronize(boolean flushStorage) { diff --git a/net/minecraft/world/level/levelgen/structure/StructureCheck.java b/net/minecraft/world/level/levelgen/structure/StructureCheck.java index 6a5451440751ad017324e3fec8cfd8efb118511b..4a3a05335e21008eb349e9ab221b54234d9ac200 100644 --- a/net/minecraft/world/level/levelgen/structure/StructureCheck.java +++ b/net/minecraft/world/level/levelgen/structure/StructureCheck.java @@ -152,7 +152,7 @@ public class StructureCheck { CompoundTag compoundTag1; try { - compoundTag1 = DataFixTypes.CHUNK.updateToCurrentVersion(this.fixerUpper, compoundTag, version); + compoundTag1 = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.CHUNK, compoundTag, version, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); // Paper - replace chunk converter } catch (Exception var12) { LOGGER.warn("Failed to partially datafix chunk {}", chunkPos, var12); return StructureCheckResult.CHUNK_LOAD_NEEDED; diff --git a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java index 7bb5a1102524cfe850859482346b1dd2af2d8868..c748e9b29173bed20f14de11d52e719b19d3469e 100644 --- a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java +++ b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager.java @@ -243,7 +243,7 @@ public class StructureTemplateManager { public StructureTemplate readStructure(CompoundTag nbt) { StructureTemplate structureTemplate = new StructureTemplate(); int dataVersion = NbtUtils.getDataVersion(nbt, 500); - structureTemplate.load(this.blockLookup, DataFixTypes.STRUCTURE.updateToCurrentVersion(this.fixerUpper, nbt, dataVersion)); + structureTemplate.load(this.blockLookup, ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.STRUCTURE, nbt, dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion())); // Paper - rewrite data conversion system return structureTemplate; } diff --git a/net/minecraft/world/level/storage/LevelStorageSource.java b/net/minecraft/world/level/storage/LevelStorageSource.java index d0512d2e9b241fbea2cb8248c750aa55c41fbb9d..3b40822ea6ec9783fe3cb8eaba069a8d626d8382 100644 --- a/net/minecraft/world/level/storage/LevelStorageSource.java +++ b/net/minecraft/world/level/storage/LevelStorageSource.java @@ -227,7 +227,7 @@ public class LevelStorageSource { CompoundTag compoundOrEmpty = levelDataTagRaw.getCompoundOrEmpty("Data"); int dataVersion = NbtUtils.getDataVersion(compoundOrEmpty, -1); Dynamic dynamic = DataFixTypes.LEVEL.updateToCurrentVersion(dataFixer, new Dynamic<>(NbtOps.INSTANCE, compoundOrEmpty), dataVersion); - dynamic = dynamic.update("Player", dynamic1 -> DataFixTypes.PLAYER.updateToCurrentVersion(dataFixer, dynamic1, dataVersion)); + dynamic = dynamic.update("Player", dynamic1 -> new Dynamic(dynamic1.getOps(), ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.PLAYER, (net.minecraft.nbt.CompoundTag)dynamic1.getValue(), dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()))); // Paper - replace data conversion system return dynamic.update("WorldGenSettings", dynamic1 -> DataFixTypes.WORLD_GEN_SETTINGS.updateToCurrentVersion(dataFixer, dynamic1, dataVersion)); } diff --git a/net/minecraft/world/level/storage/PlayerDataStorage.java b/net/minecraft/world/level/storage/PlayerDataStorage.java index 232a561be430d0be7964eb15a873f8dc5ac1bcd8..fe44d8d17d2622b3d6021c11579af85ef96737bb 100644 --- a/net/minecraft/world/level/storage/PlayerDataStorage.java +++ b/net/minecraft/world/level/storage/PlayerDataStorage.java @@ -117,7 +117,7 @@ public class PlayerDataStorage { return optional.or(() -> this.load(name, uuid, ".dat_old")).map(compoundTag -> { // CraftBukkit int dataVersion = NbtUtils.getDataVersion(compoundTag, -1); - compoundTag = DataFixTypes.PLAYER.updateToCurrentVersion(this.fixerUpper, compoundTag, dataVersion); + compoundTag = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.PLAYER, compoundTag, dataVersion, ca.spottedleaf.dataconverter.minecraft.util.Version.getCurrentVersion()); // Paper - rewrite data conversion system return compoundTag; // CraftBukkit - handled above }); }