diff --git a/build.gradle.kts b/build.gradle.kts index 798b4645..4eb1054a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { allprojects { group = "com.viaversion" - version = "4.1.0-1.18-pre1-SNAPSHOT" + version = "4.1.0-1.18-pre2-SNAPSHOT" description = "Allow older clients to join newer server versions." } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/data/BackwardsMappings.java b/common/src/main/java/com/viaversion/viabackwards/api/data/BackwardsMappings.java index bdc2d59d..09af5004 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/data/BackwardsMappings.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/data/BackwardsMappings.java @@ -83,7 +83,8 @@ public class BackwardsMappings extends MappingDataBase { if (!oldMappings.has(key) || !newMappings.has(key)) return null; JsonObject diff = diffMappings != null ? diffMappings.getAsJsonObject(key) : null; - return new VBMappings(oldMappings.getAsJsonArray(key), newMappings.getAsJsonArray(key), diff, shouldWarnOnMissing(key)); + return VBMappings.vbBuilder().unmapped(oldMappings.getAsJsonArray(key)).mapped(newMappings.getAsJsonArray(key)) + .diffMappings(diff).warnOnMissing(shouldWarnOnMissing(key)).build(); } @Override @@ -91,7 +92,8 @@ public class BackwardsMappings extends MappingDataBase { if (!oldMappings.has(key) || !newMappings.has(key)) return null; JsonObject diff = diffMappings != null ? diffMappings.getAsJsonObject(key) : null; - return new VBMappings(oldMappings.getAsJsonObject(key), newMappings.getAsJsonObject(key), diff, shouldWarnOnMissing(key)); + return VBMappings.vbBuilder().unmapped(oldMappings.getAsJsonObject(key)).mapped(newMappings.getAsJsonObject(key)) + .diffMappings(diff).warnOnMissing(shouldWarnOnMissing(key)).build(); } @Override diff --git a/common/src/main/java/com/viaversion/viabackwards/api/data/VBMappingDataLoader.java b/common/src/main/java/com/viaversion/viabackwards/api/data/VBMappingDataLoader.java index cfcd4ff2..dcbc7bf3 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/data/VBMappingDataLoader.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/data/VBMappingDataLoader.java @@ -38,7 +38,7 @@ import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; -public class VBMappingDataLoader { +public final class VBMappingDataLoader { public static JsonObject loadFromDataDir(String name) { File file = new File(ViaBackwards.getPlatform().getDataFolder(), name); @@ -68,10 +68,6 @@ public class VBMappingDataLoader { } } - public static void mapIdentifiers(int[] output, JsonObject oldIdentifiers, JsonObject newIdentifiers, JsonObject diffIdentifiers) { - mapIdentifiers(output, oldIdentifiers, newIdentifiers, diffIdentifiers, true); - } - public static void mapIdentifiers(int[] output, JsonObject oldIdentifiers, JsonObject newIdentifiers, JsonObject diffIdentifiers, boolean warnOnMissing) { Object2IntMap newIdentifierMap = MappingDataLoader.indexedObjectToMap(newIdentifiers); for (Map.Entry entry : oldIdentifiers.entrySet()) { @@ -137,10 +133,6 @@ public class VBMappingDataLoader { return mappings; } - public static Int2ObjectMap loadItemMappings(JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping) { - return loadItemMappings(oldMapping, newMapping, diffMapping, false); - } - public static Int2ObjectMap loadItemMappings(JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping, boolean warnOnMissing) { Int2ObjectMap itemMapping = new Int2ObjectOpenHashMap<>(diffMapping.size(), 0.99F); Object2IntMap newIdenfierMap = MappingDataLoader.indexedObjectToMap(newMapping); diff --git a/common/src/main/java/com/viaversion/viabackwards/api/data/VBMappings.java b/common/src/main/java/com/viaversion/viabackwards/api/data/VBMappings.java index d6ba1179..55dccd84 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/data/VBMappings.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/data/VBMappings.java @@ -18,33 +18,44 @@ package com.viaversion.viabackwards.api.data; import com.viaversion.viaversion.api.data.IntArrayMappings; -import com.viaversion.viaversion.libs.gson.JsonArray; -import com.viaversion.viaversion.libs.gson.JsonObject; +import com.viaversion.viaversion.api.data.MappingDataLoader; +import com.viaversion.viaversion.api.data.Mappings; -import java.util.Arrays; +public final class VBMappings extends IntArrayMappings { -public class VBMappings extends IntArrayMappings { - - public VBMappings(int size, JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping, boolean warnOnMissing) { - super(create(size, oldMapping, newMapping, diffMapping, warnOnMissing)); + private VBMappings(final int[] oldToNew, final int mappedIds) { + super(oldToNew, mappedIds); } - public VBMappings(JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping, boolean warnOnMissing) { - super(create(oldMapping.entrySet().size(), oldMapping, newMapping, diffMapping, warnOnMissing)); + public static Mappings.Builder vbBuilder() { + return new Builder(VBMappings::new); } - public VBMappings(JsonObject oldMapping, JsonObject newMapping, boolean warnOnMissing) { - this(oldMapping, newMapping, null, warnOnMissing); - } + public static final class Builder extends Mappings.Builder { - public VBMappings(JsonArray oldMapping, JsonArray newMapping, JsonObject diffMapping, boolean warnOnMissing) { - super(oldMapping.size(), oldMapping, newMapping, diffMapping, warnOnMissing); - } + private Builder(final MappingsSupplier supplier) { + super(supplier); + } - private static int[] create(int size, JsonObject oldMapping, JsonObject newMapping, JsonObject diffMapping, boolean warnOnMissing) { - int[] oldToNew = new int[size]; - Arrays.fill(oldToNew, -1); - VBMappingDataLoader.mapIdentifiers(oldToNew, oldMapping, newMapping, diffMapping, warnOnMissing); - return oldToNew; + @Override + public VBMappings build() { + final int size = this.size != -1 ? this.size : size(unmapped); + final int mappedSize = this.mappedSize != -1 ? this.mappedSize : size(mapped); + final int[] mappings = new int[size]; + // Do conversion if one is an array and the other an object, otherwise directly map + if (unmapped.isJsonArray()) { + if (mapped.isJsonObject()) { + VBMappingDataLoader.mapIdentifiers(mappings, toJsonObject(unmapped.getAsJsonArray()), mapped.getAsJsonObject(), diffMappings, warnOnMissing); + } else { + // Use the normal loader + MappingDataLoader.mapIdentifiers(mappings, unmapped.getAsJsonArray(), mapped.getAsJsonArray(), diffMappings, warnOnMissing); + } + } else if (mapped.isJsonArray()) { + VBMappingDataLoader.mapIdentifiers(mappings, unmapped.getAsJsonObject(), toJsonObject(mapped.getAsJsonArray()), diffMappings, warnOnMissing); + } else { + VBMappingDataLoader.mapIdentifiers(mappings, unmapped.getAsJsonObject(), mapped.getAsJsonObject(), diffMappings, warnOnMissing); + } + return supplier.supply(mappings, mappedSize); + } } } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriterBase.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriterBase.java index e5bb86f4..8e4e2006 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriterBase.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriterBase.java @@ -52,6 +52,7 @@ public abstract class EntityRewriterBase extends En private final MetaType displayVisibilityMetaType; private final int displayNameIndex; private final int displayVisibilityIndex; + protected boolean allowNullEntityType; EntityRewriterBase(T protocol, MetaType displayNameMetaType, int displayNameIndex, MetaType displayVisibilityMetaType, int displayVisibilityIndex) { @@ -65,12 +66,16 @@ public abstract class EntityRewriterBase extends En @Override public void handleMetadata(int entityId, List metadataList, UserConnection connection) { EntityType type = tracker(connection).entityType(entityId); - if (type == null) { - return; // Don't handle untracked entities - basically always the fault of a plugin sending virtual entities through concurrency-unsafe handling + if (type == null && !allowNullEntityType) { + return; } super.handleMetadata(entityId, metadataList, connection); + if (type == null) { + return; // Don't handle untracked entities - basically always the fault of a plugin sending virtual entities through concurrency-unsafe handling + } + EntityData entityData = entityDataForType(type); // Set the mapped entity name if there is no custom name set already diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/data/BackwardsMappings.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/data/BackwardsMappings.java index fb1c2af3..ebf94cf6 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/data/BackwardsMappings.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/data/BackwardsMappings.java @@ -49,7 +49,8 @@ public class BackwardsMappings extends com.viaversion.viabackwards.api.data.Back @Override public void loadVBExtras(JsonObject oldMappings, JsonObject newMappings) { - enchantmentMappings = new VBMappings(oldMappings.getAsJsonObject("enchantments"), newMappings.getAsJsonObject("enchantments"), false); + enchantmentMappings = VBMappings.vbBuilder().warnOnMissing(false) + .unmapped(oldMappings.getAsJsonObject("enchantments")).mapped(newMappings.getAsJsonObject("enchantments")).build(); for (Map.Entry entry : StatisticMappings.CUSTOM_STATS.entrySet()) { statisticMappings.put(entry.getValue().intValue(), entry.getKey()); } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_17_1to1_18/packets/EntityPackets1_18.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_17_1to1_18/packets/EntityPackets1_18.java index 5aab8b99..798faa60 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_17_1to1_18/packets/EntityPackets1_18.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_17_1to1_18/packets/EntityPackets1_18.java @@ -40,6 +40,7 @@ public final class EntityPackets1_18 extends EntityRewriter