diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/Protocol1_18_2To1_19.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/Protocol1_18_2To1_19.java index 0fede82d..99187789 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/Protocol1_18_2To1_19.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/Protocol1_18_2To1_19.java @@ -311,14 +311,32 @@ public final class Protocol1_18_2To1_19 extends BackwardsProtocol 2) { - wrapper.set(Type.BYTE, 0, (byte) 0); // Chat type + byte chatTypeId = wrapper.get(Type.BYTE, 0); + final DimensionRegistryStorage dimensionRegistryStorage = wrapper.user().get(DimensionRegistryStorage.class); + final String chatTypeKey = dimensionRegistryStorage.chatTypeKey(chatTypeId); + switch (chatTypeKey) { + default: + case "minecraft:chat": + chatTypeId = 0; + break; + case "minecraft:system": + chatTypeId = 1; + break; + case "minecraft:game_info": + chatTypeId = 2; + break; } - final String key = CHAT_KEYS[type]; + final String key = CHAT_KEYS[chatTypeId]; if (key != null) { - Component component = Component.text(ViaBackwards.getConfig().chatTypeFormat(key)); + final String chatFormat = ViaBackwards.getConfig().chatTypeFormat(key); + if (chatFormat == null) { + wrapper.cancel(); + ViaBackwards.getPlatform().getLogger().severe("Chat type format " + key + " is not defined under chat-types in the ViaBackwards config."); + return; + } + + Component component = Component.text(chatFormat); if (key.equals("chat.type.team.text")) { Preconditions.checkNotNull(teamName, "Team name is null"); component = component.replaceText(replace(teamName)); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/packets/EntityPackets1_19.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/packets/EntityPackets1_19.java index bdad1d58..a075a706 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/packets/EntityPackets1_19.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/packets/EntityPackets1_19.java @@ -35,14 +35,12 @@ import com.viaversion.viaversion.api.type.types.version.Types1_18; import com.viaversion.viaversion.api.type.types.version.Types1_19; import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag; +import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag; import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18; import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19; -import java.util.HashMap; -import java.util.Map; - public final class EntityPackets1_19 extends EntityRewriter { public EntityPackets1_19(final Protocol1_18_2To1_19 protocol) { @@ -127,27 +125,45 @@ public final class EntityPackets1_19 extends EntityRewriter { + final DimensionRegistryStorage dimensionRegistryStorage = wrapper.user().get(DimensionRegistryStorage.class); + + // Cache dimensions and find current dimension final String dimensionKey = wrapper.read(Type.STRING); - final ListTag dimensions = ((CompoundTag) wrapper.get(Type.NBT, 0).get("minecraft:dimension_type")).get("value"); - final Map dimensionsMap = new HashMap<>(dimensions.size()); + final CompoundTag registry = wrapper.get(Type.NBT, 0); + final ListTag dimensions = ((CompoundTag) registry.get("minecraft:dimension_type")).get("value"); boolean found = false; for (final Tag dimension : dimensions) { final CompoundTag dimensionCompound = (CompoundTag) dimension; final StringTag nameTag = dimensionCompound.get("name"); final CompoundTag dimensionData = dimensionCompound.get("element"); - dimensionsMap.put(nameTag.getValue(), dimensionData.clone()); + dimensionRegistryStorage.addDimension(nameTag.getValue(), dimensionData.clone()); if (!found && nameTag.getValue().equals(dimensionKey)) { wrapper.write(Type.NBT, dimensionData); found = true; } } - if (!found) { throw new IllegalStateException("Could not find dimension " + dimensionKey + " in dimension registry"); } - wrapper.user().get(DimensionRegistryStorage.class).setDimensions(dimensionsMap); + // Add biome category and track biomes + final CompoundTag biomeRegistry = registry.get("minecraft:worldgen/biome"); + final ListTag biomes = biomeRegistry.get("value"); + for (final Tag biome : biomes.getValue()) { + final CompoundTag biomeCompound = ((CompoundTag) biome).get("element"); + biomeCompound.put("category", new StringTag("none")); + } + tracker(wrapper.user()).setBiomesSent(biomes.size()); + + // Cache and remove chat types + final ListTag chatTypes = ((CompoundTag) registry.remove("minecraft:chat_type")).get("value"); + for (final Tag chatType : chatTypes) { + final CompoundTag chatTypeCompound = (CompoundTag) chatType; + final NumberTag idTag = chatTypeCompound.get("id"); + final StringTag nameTag = chatTypeCompound.get("name"); + dimensionRegistryStorage.addChatType(idTag.asInt(), nameTag.getValue()); + } }); map(Type.STRING); // World map(Type.LONG); // Seed @@ -161,20 +177,6 @@ public final class EntityPackets1_19 extends EntityRewriter { - final CompoundTag registry = wrapper.get(Type.NBT, 0); - final CompoundTag biomeRegistry = registry.get("minecraft:worldgen/biome"); - final ListTag biomes = biomeRegistry.get("value"); - for (final Tag biome : biomes.getValue()) { - final CompoundTag biomeCompound = ((CompoundTag) biome).get("element"); - biomeCompound.put("category", new StringTag("none")); - } - - registry.remove("minecraft:chat_type"); - - // Track amount of biomes sent - tracker(wrapper.user()).setBiomesSent(biomes.size()); - }); } }); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/storage/DimensionRegistryStorage.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/storage/DimensionRegistryStorage.java index 66700abd..6311260e 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/storage/DimensionRegistryStorage.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_18_2to1_19/storage/DimensionRegistryStorage.java @@ -18,6 +18,8 @@ package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage; import com.viaversion.viaversion.api.connection.StorableObject; +import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap; +import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap; import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag; import org.checkerframework.checker.nullness.qual.Nullable; @@ -26,15 +28,29 @@ import java.util.Map; public final class DimensionRegistryStorage implements StorableObject { - private Map dimensions = new HashMap<>(); + private final Map dimensions = new HashMap<>(); + private final Int2ObjectMap chatTypes = new Int2ObjectOpenHashMap<>(); public @Nullable CompoundTag dimension(final String dimensionKey) { final CompoundTag compoundTag = dimensions.get(dimensionKey); return compoundTag != null ? compoundTag.clone() : null; } - public void setDimensions(final Map dimensions) { - this.dimensions = dimensions; + public void addDimension(final String dimensionKey, final CompoundTag dimension) { + dimensions.put(dimensionKey, dimension); + } + + public @Nullable String chatTypeKey(final int id) { + return chatTypes.get(id); + } + + public void addChatType(final int id, final String chatTypeKey) { + chatTypes.put(id, chatTypeKey); + } + + public void clear() { + dimensions.clear(); + chatTypes.clear(); } @Override