diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..b1361d123 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: kennytv +patreon: kennytv diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java index 0857fdc0e..f939a1192 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java @@ -25,6 +25,7 @@ package com.viaversion.viaversion.api.data; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntArrayTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.minecraft.RegistryType; @@ -89,8 +90,8 @@ public class MappingDataBase implements MappingData { recipeSerializerMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "recipe_serializers"); itemDataSerializerMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "data_component_type"); - final ListTag unmappedParticles = unmappedIdentifierData.get("particles"); - final ListTag mappedParticles = mappedIdentifierData.get("particles"); + final ListTag unmappedParticles = unmappedIdentifierData.getListTag("particles", StringTag.class); + final ListTag mappedParticles = mappedIdentifierData.getListTag("particles", StringTag.class); if (unmappedParticles != null && mappedParticles != null) { Mappings particleMappings = loadMappings(data, "particles"); if (particleMappings == null) { diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java index ecbc7a0c4..07d7f65de 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java @@ -27,6 +27,7 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntArrayTag; import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.io.NBTIO; import com.github.steveice10.opennbt.tag.io.TagReader; import com.google.common.annotations.Beta; @@ -227,8 +228,8 @@ public final class MappingDataLoader { } public static FullMappings loadFullMappings(final CompoundTag mappingsTag, final CompoundTag unmappedIdentifiers, final CompoundTag mappedIdentifiers, final String key) { - final ListTag unmappedElements = unmappedIdentifiers.get(key); - final ListTag mappedElements = mappedIdentifiers.get(key); + final ListTag unmappedElements = unmappedIdentifiers.getListTag(key, StringTag.class); + final ListTag mappedElements = mappedIdentifiers.getListTag(key, StringTag.class); if (unmappedElements == null || mappedElements == null) { return null; } @@ -239,8 +240,8 @@ public final class MappingDataLoader { } return new FullMappingsBase( - unmappedElements.getValue().stream().map(t -> (String) t.getValue()).collect(Collectors.toList()), - mappedElements.getValue().stream().map(t -> (String) t.getValue()).collect(Collectors.toList()), + unmappedElements.getValue().stream().map(StringTag::getValue).collect(Collectors.toList()), + mappedElements.getValue().stream().map(StringTag::getValue).collect(Collectors.toList()), mappings ); } diff --git a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitEncodeHandler.java b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitEncodeHandler.java index 7ecfcb2fd..1147ad407 100644 --- a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitEncodeHandler.java +++ b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitEncodeHandler.java @@ -43,7 +43,8 @@ public final class BukkitEncodeHandler extends MessageToMessageEncoder @Override protected void encode(final ChannelHandlerContext ctx, final ByteBuf bytebuf, final List out) throws Exception { - if (!connection.checkClientboundPacket()) { + // Check if the channel is open as older servers might start sending packets through the pipeline despite the channel being closed + if (!connection.checkClientboundPacket() || !ctx.channel().isOpen()) { throw CancelEncoderException.generate(null); } if (!connection.shouldTransformPacket()) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java index ff2c7b3bb..ea4c80711 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java @@ -22,6 +22,7 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntArrayTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.NumberTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; @@ -166,9 +167,9 @@ public final class ConnectionData { } Via.getPlatform().getLogger().info("Loading block connection mappings ..."); - ListTag blockStates = MappingDataLoader.loadNBT("blockstates-1.13.nbt").getListTag("blockstates"); + ListTag blockStates = MappingDataLoader.loadNBT("blockstates-1.13.nbt").getListTag("blockstates", StringTag.class); for (int id = 0; id < blockStates.size(); id++) { - String key = (String) blockStates.get(id).getValue(); + String key = blockStates.get(id).getValue(); KEY_TO_ID.put(key, id); } @@ -177,11 +178,10 @@ public final class ConnectionData { if (!Via.getConfig().isReduceBlockStorageMemory()) { blockConnectionData = new Int2ObjectOpenHashMap<>(2048); - ListTag blockConnectionMappings = MappingDataLoader.loadNBT("blockConnections.nbt").getListTag("data"); - for (Tag blockTag : blockConnectionMappings) { - CompoundTag blockCompoundTag = (CompoundTag) blockTag; + ListTag blockConnectionMappings = MappingDataLoader.loadNBT("blockConnections.nbt").getListTag("data", CompoundTag.class); + for (CompoundTag blockTag : blockConnectionMappings) { BlockData blockData = new BlockData(); - for (Entry entry : blockCompoundTag.entrySet()) { + for (Entry entry : blockTag.entrySet()) { String key = entry.getKey(); if (key.equals("id") || key.equals("ids")) { continue; @@ -198,11 +198,11 @@ public final class ConnectionData { blockData.put(connectionTypeId, attachingFaces); } - NumberTag idTag = blockCompoundTag.getNumberTag("id"); + NumberTag idTag = blockTag.getNumberTag("id"); if (idTag != null) { blockConnectionData.put(idTag.asInt(), blockData); } else { - IntArrayTag idsTag = blockCompoundTag.getIntArrayTag("ids"); + IntArrayTag idsTag = blockTag.getIntArrayTag("ids"); for (int id : idsTag.getValue()) { blockConnectionData.put(id, blockData); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java index 7f484f840..0717c2efe 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java @@ -300,21 +300,16 @@ public class InventoryPackets extends ItemRewriter patternsTag = blockEntityTag.getListTag("Patterns", CompoundTag.class); if (patternsTag != null) { - for (Tag pattern : patternsTag) { - if (!(pattern instanceof CompoundTag)) { - continue; - } - - CompoundTag patternTag = (CompoundTag) pattern; - NumberTag colorTag = patternTag.getNumberTag("Color"); + for (CompoundTag pattern : patternsTag) { + NumberTag colorTag = pattern.getNumberTag("Color"); if (colorTag == null) { continue; } // Invert color id - patternTag.putInt("Color", 15 - colorTag.asInt()); + pattern.putInt("Color", 15 - colorTag.asInt()); } } } @@ -329,16 +324,11 @@ public class InventoryPackets extends ItemRewriter ench = tag.getListTag("ench", CompoundTag.class); if (ench != null) { - ListTag enchantments = new ListTag(CompoundTag.class); - for (Tag enchEntry : ench) { - if (!(enchEntry instanceof CompoundTag)) { - continue; - } - - CompoundTag entryTag = (CompoundTag) enchEntry; - NumberTag idTag = entryTag.getNumberTag("id"); + ListTag enchantments = new ListTag<>(CompoundTag.class); + for (CompoundTag enchEntry : ench) { + NumberTag idTag = enchEntry.getNumberTag("id"); if (idTag == null) { continue; } @@ -351,7 +341,7 @@ public class InventoryPackets extends ItemRewriter storedEnch = tag.getListTag("StoredEnchantments", CompoundTag.class); if (storedEnch != null) { - ListTag newStoredEnch = new ListTag(CompoundTag.class); - for (Tag enchEntry : storedEnch) { - if (!(enchEntry instanceof CompoundTag)) { - continue; - } - - CompoundTag entryTag = (CompoundTag) enchEntry; - NumberTag idTag = entryTag.getNumberTag("id"); + ListTag newStoredEnch = new ListTag<>(CompoundTag.class); + for (CompoundTag enchEntry : storedEnch) { + NumberTag idTag = enchEntry.getNumberTag("id"); if (idTag == null) { continue; } @@ -384,7 +369,7 @@ public class InventoryPackets extends ItemRewriter canPlaceOnTag = tag.getListTag("CanPlaceOn"); if (canPlaceOnTag != null) { - ListTag newCanPlaceOn = new ListTag(StringTag.class); + ListTag newCanPlaceOn = new ListTag<>(StringTag.class); tag.put(NBT_TAG_NAME + "|CanPlaceOn", canPlaceOnTag.copy()); for (Tag oldTag : canPlaceOnTag) { Object value = oldTag.getValue(); @@ -417,9 +402,9 @@ public class InventoryPackets extends ItemRewriter canDestroyTag = tag.getListTag("CanDestroy"); if (canDestroyTag != null) { - ListTag newCanDestroy = new ListTag(StringTag.class); + ListTag newCanDestroy = new ListTag<>(StringTag.class); tag.put(NBT_TAG_NAME + "|CanDestroy", canDestroyTag.copy()); for (Tag oldTag : canDestroyTag) { Object value = oldTag.getValue(); @@ -599,16 +584,11 @@ public class InventoryPackets extends ItemRewriter patternsTag = blockEntityTag.getListTag("Patterns", CompoundTag.class); if (patternsTag != null) { - for (Tag pattern : patternsTag) { - if (!(pattern instanceof CompoundTag)) { - continue; - } - - CompoundTag patternTag = (CompoundTag) pattern; - NumberTag colorTag = patternTag.getNumberTag("Color"); - patternTag.putInt("Color", 15 - colorTag.asInt()); // Invert color id + for (CompoundTag pattern : patternsTag) { + NumberTag colorTag = pattern.getNumberTag("Color"); + pattern.putInt("Color", 15 - colorTag.asInt()); // Invert color id } } } @@ -624,16 +604,11 @@ public class InventoryPackets extends ItemRewriter enchantments = tag.getListTag("Enchantments", CompoundTag.class); if (enchantments != null) { - ListTag ench = new ListTag(CompoundTag.class); - for (Tag enchantmentEntry : enchantments) { - if (!(enchantmentEntry instanceof CompoundTag)) { - continue; - } - - CompoundTag entryTag = (CompoundTag) enchantmentEntry; - StringTag idTag = entryTag.getStringTag("id"); + ListTag ench = new ListTag<>(CompoundTag.class); + for (CompoundTag enchantmentEntry : enchantments) { + StringTag idTag = enchantmentEntry.getStringTag("id"); if (idTag == null) { continue; } @@ -646,7 +621,7 @@ public class InventoryPackets extends ItemRewriter storedEnch = tag.getListTag("StoredEnchantments", CompoundTag.class); if (storedEnch != null) { - ListTag newStoredEnch = new ListTag(CompoundTag.class); - for (Tag enchantmentEntry : storedEnch) { - if (!(enchantmentEntry instanceof CompoundTag)) { - continue; - } - - CompoundTag entryTag = (CompoundTag) enchantmentEntry; - StringTag idTag = entryTag.getStringTag("id"); + ListTag newStoredEnch = new ListTag<>(CompoundTag.class); + for (CompoundTag enchantmentEntry : storedEnch) { + StringTag idTag = enchantmentEntry.getStringTag("id"); if (idTag == null) { continue; } @@ -684,7 +654,7 @@ public class InventoryPackets extends ItemRewriter old = tag.getListTag("CanPlaceOn"); + ListTag newCanPlaceOn = new ListTag<>(StringTag.class); for (Tag oldTag : old) { Object value = oldTag.getValue(); String[] newValues = BlockIdData.fallbackReverseMapping.get(value instanceof String @@ -707,7 +677,7 @@ public class InventoryPackets extends ItemRewriter old = tag.getListTag("CanDestroy"); + ListTag newCanDestroy = new ListTag<>(StringTag.class); for (Tag oldTag : old) { Object value = oldTag.getValue(); String[] newValues = BlockIdData.fallbackReverseMapping.get(value instanceof String @@ -727,7 +697,7 @@ public class InventoryPackets extends ItemRewriter patterns = tag.getListTag("Patterns", CompoundTag.class); if (patterns != null) { - for (Tag pattern : patterns) { - if (!(pattern instanceof CompoundTag)) { - continue; - } - - CompoundTag patternTag = (CompoundTag) pattern; - NumberTag colorTag = patternTag.getNumberTag("Color"); + for (CompoundTag pattern : patterns) { + NumberTag colorTag = pattern.getNumberTag("Color"); if (colorTag != null) { - patternTag.putInt("Color", 15 - colorTag.asInt()); // Invert color id + pattern.putInt("Color", 15 - colorTag.asInt()); // Invert color id } } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java index 16f16cc32..ecb706e63 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java @@ -244,14 +244,12 @@ public class InventoryPackets extends ItemRewriter lore = display.getListTag("Lore", StringTag.class); if (lore != null) { - display.put(NBT_TAG_NAME + "|Lore", new ListTag(lore.copy().getValue())); // Save old lore - for (Tag loreEntry : lore) { - if (loreEntry instanceof StringTag) { - String jsonText = ComponentUtil.legacyToJsonString(((StringTag) loreEntry).getValue(), true); - ((StringTag) loreEntry).setValue(jsonText); - } + display.put(NBT_TAG_NAME + "|Lore", new ListTag<>(lore.copy().getValue())); // Save old lore + for (StringTag loreEntry : lore) { + String jsonText = ComponentUtil.legacyToJsonString(loreEntry.getValue(), true); + loreEntry.setValue(jsonText); } } } @@ -268,16 +266,14 @@ public class InventoryPackets extends ItemRewriter lore = display.getListTag("Lore", StringTag.class); if (lore != null) { Tag savedLore = display.remove(NBT_TAG_NAME + "|Lore"); if (savedLore instanceof ListTag) { - display.put("Lore", new ListTag(((ListTag) savedLore).getValue())); + display.put("Lore", new ListTag<>(((ListTag) savedLore).getValue())); } else { - for (Tag loreEntry : lore) { - if (loreEntry instanceof StringTag) { - ((StringTag) loreEntry).setValue(ComponentUtil.jsonToLegacy(((StringTag) loreEntry).getValue())); - } + for (StringTag loreEntry : lore) { + loreEntry.setValue(ComponentUtil.jsonToLegacy(loreEntry.getValue())); } } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/PlayerPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/PlayerPackets.java index c87d2518a..522a101be 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/PlayerPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/packets/PlayerPackets.java @@ -57,15 +57,18 @@ public class PlayerPackets { CompoundTag tag = item.tag(); if (tag == null) return; - ListTag pages = tag.getListTag("pages"); + ListTag pages = tag.getListTag("pages", StringTag.class); // Fix for https://github.com/ViaVersion/ViaVersion/issues/2660 if (pages == null) { - tag.put("pages", new ListTag(Collections.singletonList(new StringTag()))); + pages = new ListTag<>(StringTag.class); + pages.add(new StringTag()); + tag.put("pages", pages); + return; } // Client limit when editing a book was upped from 50 to 100 in 1.14, but some anti-exploit plugins ban with a size higher than the old client limit - if (Via.getConfig().isTruncate1_14Books() && pages != null) { + if (Via.getConfig().isTruncate1_14Books()) { if (pages.size() > 50) { pages.setValue(pages.getValue().subList(0, 50)); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16_2to1_16_1/data/MappingData.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16_2to1_16_1/data/MappingData.java index 2fc15e2ef..882c7178b 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16_2to1_16_1/data/MappingData.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16_2to1_16_1/data/MappingData.java @@ -38,12 +38,11 @@ public class MappingData extends MappingDataBase { dimensionRegistry = MappingDataLoader.loadNBTFromFile("dimension-registry-1.16.2.nbt"); // Data of each dimension - final ListTag dimensions = dimensionRegistry.getCompoundTag("minecraft:dimension_type").get("value"); - for (final Tag dimension : dimensions) { - final CompoundTag dimensionCompound = (CompoundTag) dimension; + final ListTag dimensions = dimensionRegistry.getCompoundTag("minecraft:dimension_type").getListTag("value", CompoundTag.class); + for (final CompoundTag dimension : dimensions) { // Copy with an empty name - final CompoundTag dimensionData = dimensionCompound.getCompoundTag("element").copy(); - dimensionDataMap.put(dimensionCompound.getStringTag("name").getValue(), dimensionData); + final CompoundTag dimensionData = dimension.getCompoundTag("element").copy(); + dimensionDataMap.put(dimension.getStringTag("name").getValue(), dimensionData); } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/packets/EntityPackets.java index 20db4a55d..6bd834699 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/packets/EntityPackets.java @@ -80,7 +80,7 @@ public class EntityPackets { private static final String[] WORLD_NAMES = {"minecraft:overworld", "minecraft:the_nether", "minecraft:the_end"}; static { - ListTag list = new ListTag(CompoundTag.class); + ListTag list = new ListTag<>(CompoundTag.class); list.add(createOverworldEntry()); list.add(createOverworldCavesEntry()); list.add(createNetherEntry()); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java index fce2e38a7..4f4451035 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java @@ -156,15 +156,10 @@ public class InventoryPackets extends ItemRewriter pages = tag.getListTag("pages", StringTag.class); if (pages != null) { - for (Tag pageTag : pages) { - if (!(pageTag instanceof StringTag)) { - continue; - } - - StringTag page = (StringTag) pageTag; - page.setValue(protocol.getComponentRewriter().processText(page.getValue()).toString()); + for (StringTag pageTag : pages) { + pageTag.setValue(protocol.getComponentRewriter().processText(pageTag.getValue()).toString()); } } } @@ -199,13 +194,10 @@ public class InventoryPackets extends ItemRewriter attributes = item.tag().getListTag("AttributeModifiers", CompoundTag.class); if (attributes == null) return; - for (Tag tag : attributes) { - if (!(tag instanceof CompoundTag)) continue; - - CompoundTag attribute = (CompoundTag) tag; + for (CompoundTag attribute : attributes) { rewriteAttributeName(attribute, "AttributeName", false); rewriteAttributeName(attribute, "Name", false); NumberTag leastTag = attribute.getNumberTag("UUIDLeast"); @@ -220,13 +212,10 @@ public class InventoryPackets extends ItemRewriter attributes = item.tag().getListTag("AttributeModifiers", CompoundTag.class); if (attributes == null) return; - for (Tag tag : attributes) { - if (!(tag instanceof CompoundTag)) continue; - - CompoundTag attribute = (CompoundTag) tag; + for (CompoundTag attribute : attributes) { rewriteAttributeName(attribute, "AttributeName", true); rewriteAttributeName(attribute, "Name", true); IntArrayTag uuidTag = attribute.getIntArrayTag("UUID"); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17_1to1_17/Protocol1_17_1To1_17.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17_1to1_17/Protocol1_17_1To1_17.java index ab7cef3cf..27f8b69f2 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17_1to1_17/Protocol1_17_1To1_17.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17_1to1_17/Protocol1_17_1To1_17.java @@ -88,14 +88,14 @@ public final class Protocol1_17_1To1_17 extends AbstractProtocol pagesTag = new ListTag<>(StringTag.class); for (int i = 0; i < pages; i++) { String page = wrapper.read(PAGE_STRING_TYPE); pagesTag.add(new StringTag(page)); } // Legacy servers don't like an empty pages list - if (pagesTag.size() == 0) { + if (pagesTag.isEmpty()) { pagesTag.add(new StringTag("")); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17to1_16_4/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17to1_16_4/packets/EntityPackets.java index 4404fdaa7..1a0216af5 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17to1_16_4/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_17to1_16_4/packets/EntityPackets.java @@ -78,9 +78,9 @@ public final class EntityPackets extends EntityRewriter { // Add new dimension fields CompoundTag dimensionRegistry = wrapper.get(Type.NAMED_COMPOUND_TAG, 0).get("minecraft:dimension_type"); - ListTag dimensions = dimensionRegistry.get("value"); - for (Tag dimension : dimensions) { - CompoundTag dimensionCompound = ((CompoundTag) dimension).get("element"); + ListTag dimensions = dimensionRegistry.getListTag("value", CompoundTag.class); + for (CompoundTag dimension : dimensions) { + CompoundTag dimensionCompound = dimension.get("element"); addNewDimensionData(dimensionCompound); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18_2to1_18/Protocol1_18_2To1_18.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18_2to1_18/Protocol1_18_2To1_18.java index 3ad1aa9ca..9533b38e5 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18_2to1_18/Protocol1_18_2To1_18.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18_2to1_18/Protocol1_18_2To1_18.java @@ -70,9 +70,9 @@ public final class Protocol1_18_2To1_18 extends AbstractProtocol { final CompoundTag registry = wrapper.get(Type.NAMED_COMPOUND_TAG, 0); final CompoundTag dimensionsHolder = registry.get("minecraft:dimension_type"); - final ListTag dimensions = dimensionsHolder.get("value"); - for (final Tag dimension : dimensions) { - addTagPrefix(((CompoundTag) dimension).get("element")); + final ListTag dimensions = dimensionsHolder.getListTag("value", CompoundTag.class); + for (final CompoundTag dimension : dimensions) { + addTagPrefix(dimension.get("element")); } addTagPrefix(wrapper.get(Type.NAMED_COMPOUND_TAG, 1)); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_1to1_19/Protocol1_19_1To1_19.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_1to1_19/Protocol1_19_1To1_19.java index 13955ef7e..259fedaab 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_1to1_19/Protocol1_19_1To1_19.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_1to1_19/Protocol1_19_1To1_19.java @@ -222,11 +222,10 @@ public final class Protocol1_19_1To1_19 extends AbstractProtocol chatTypes = registry.getCompoundTag("minecraft:chat_type").getListTag("value", CompoundTag.class); + for (final CompoundTag chatType : chatTypes) { + final NumberTag idTag = chatType.get("id"); + chatTypeStorage.addChatType(idTag.asInt(), chatType); } // Replace chat types - they won't actually be used @@ -405,12 +404,12 @@ public final class Protocol1_19_1To1_19 extends AbstractProtocol parameters = tag.getListTag("parameters", StringTag.class); final List arguments = new ArrayList<>(); if (parameters != null) { - for (final Tag element : parameters) { + for (final StringTag element : parameters) { JsonElement argument = null; - switch ((String) element.getValue()) { + switch (element.getValue()) { case "sender": argument = senderName; break; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/packets/EntityPackets.java index aaebf5a40..5b8872d58 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/packets/EntityPackets.java @@ -64,9 +64,9 @@ public final class EntityPackets extends EntityRewriter biomes = biomeRegistry.getListTag("value", CompoundTag.class); + for (final CompoundTag biomeTag : biomes) { + final CompoundTag biomeData = biomeTag.get("element"); final StringTag precipitation = biomeData.get("precipitation"); final byte precipitationByte = precipitation.getValue().equals("none") ? (byte) 0 : 1; biomeData.put("has_precipitation", new ByteTag(precipitationByte)); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/data/MappingData.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/data/MappingData.java index 5a3b3dfb8..975ba3c97 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/data/MappingData.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/data/MappingData.java @@ -37,11 +37,10 @@ public final class MappingData extends MappingDataBase { @Override protected void loadExtras(final CompoundTag daata) { - final ListTag chatTypes = MappingDataLoader.loadNBTFromFile("chat-types-1.19.nbt").get("values"); - for (final Tag chatType : chatTypes) { - final CompoundTag chatTypeCompound = (CompoundTag) chatType; - final NumberTag idTag = chatTypeCompound.get("id"); - defaultChatTypes.put(idTag.asInt(), chatTypeCompound); + final ListTag chatTypes = MappingDataLoader.loadNBTFromFile("chat-types-1.19.nbt").getListTag("values", CompoundTag.class); + for (final CompoundTag chatType : chatTypes) { + final NumberTag idTag = chatType.get("id"); + defaultChatTypes.put(idTag.asInt(), chatType); } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java index f5acda689..dfc624eb8 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java @@ -210,14 +210,13 @@ public final class EntityPackets extends EntityRewriter dimensions = tag.getCompoundTag("minecraft:dimension_type").getListTag("value", CompoundTag.class); final Map dimensionDataMap = new HashMap<>(dimensions.size()); final Map dimensionsMap = new HashMap<>(dimensions.size()); - for (final Tag dimension : dimensions) { - final CompoundTag dimensionCompound = (CompoundTag) dimension; - final NumberTag idTag = dimensionCompound.get("id"); - final CompoundTag element = dimensionCompound.get("element"); - final String name = (String) dimensionCompound.get("name").getValue(); + for (final CompoundTag dimension : dimensions) { + final NumberTag idTag = dimension.get("id"); + final CompoundTag element = dimension.get("element"); + final String name = dimension.getStringTag("name").getValue(); addMonsterSpawnData(element); dimensionDataMap.put(Key.stripMinecraftNamespace(name), new DimensionDataImpl(idTag.asInt(), element)); dimensionsMap.put(element.copy(), name); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/BlockItemPacketRewriter1_20_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/BlockItemPacketRewriter1_20_2.java index b1285eedb..a60e652e3 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/BlockItemPacketRewriter1_20_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/BlockItemPacketRewriter1_20_2.java @@ -372,7 +372,7 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter effectsTag = (ListTag) customPotionEffectsTag; item.tag().put("custom_potion_effects", customPotionEffectsTag); for (final Tag tag : effectsTag) { @@ -403,7 +403,7 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter effectsTag = (ListTag) customPotionEffectsTag; item.tag().put("CustomPotionEffects", effectsTag); for (final Tag tag : effectsTag) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/BlockItemPacketRewriter1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/BlockItemPacketRewriter1_20_3.java index ea72b7903..67f11cf35 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/BlockItemPacketRewriter1_20_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_3to1_20_2/rewriter/BlockItemPacketRewriter1_20_3.java @@ -152,20 +152,15 @@ public final class BlockItemPacketRewriter1_20_3 extends ItemRewriter pages = tag.getListTag(key, StringTag.class); if (pages == null) { return; } - for (final Tag pageTag : pages) { - if (!(pageTag instanceof StringTag)) { - continue; - } - - final StringTag stringTag = (StringTag) pageTag; + for (final StringTag pageTag : pages) { try { - final JsonElement updatedComponent = ComponentUtil.convertJson(stringTag.getValue(), ComponentUtil.SerializerVersion.V1_19_4, ComponentUtil.SerializerVersion.V1_20_3); - stringTag.setValue(updatedComponent.toString()); + final JsonElement updatedComponent = ComponentUtil.convertJson(pageTag.getValue(), ComponentUtil.SerializerVersion.V1_19_4, ComponentUtil.SerializerVersion.V1_20_3); + pageTag.setValue(updatedComponent.toString()); } catch (final Exception e) { Via.getManager().debugHandler().error("Error during book conversion", e); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/BlockItemPacketRewriter1_20_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/BlockItemPacketRewriter1_20_5.java index 1b250a6d3..877dacf58 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/BlockItemPacketRewriter1_20_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/BlockItemPacketRewriter1_20_5.java @@ -276,7 +276,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter newKey, final boolean show) { - final ListTag enchantmentsTag = tag.getListTag(key); + final ListTag enchantmentsTag = tag.getListTag(key, CompoundTag.class); if (enchantmentsTag == null) { return; } @@ -333,14 +333,9 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter) entry.getValue()) { if (!(propertyTag instanceof CompoundTag)) { continue; } @@ -407,25 +402,20 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter decorationsTag) { if (decorationsTag == null) { return; } final CompoundTag updatedDecorationsTag = new CompoundTag(); - for (final Tag decorationTag : decorationsTag) { - if (!(decorationTag instanceof CompoundTag)) { - continue; - } - - final CompoundTag decoration = (CompoundTag) decorationTag; - final StringTag idTag = decoration.getStringTag("id"); + for (final CompoundTag decorationTag : decorationsTag) { + final StringTag idTag = decorationTag.getStringTag("id"); final String id = idTag != null ? idTag.asRawString() : ""; - final NumberTag typeTag = decoration.getNumberTag("type"); + final NumberTag typeTag = decorationTag.getNumberTag("type"); final int type = typeTag != null ? typeTag.asInt() : 0; - final NumberTag xTag = decoration.getNumberTag("x"); - final NumberTag zTag = decoration.getNumberTag("z"); - final NumberTag rotationTag = decoration.getNumberTag("rot"); + final NumberTag xTag = decorationTag.getNumberTag("x"); + final NumberTag zTag = decorationTag.getNumberTag("z"); + final NumberTag rotationTag = decorationTag.getNumberTag("rot"); final CompoundTag updatedDecorationTag = new CompoundTag(); updatedDecorationTag.putString("type", MapDecorationMappings.mapDecoration(type)); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/EntityPacketRewriter1_20_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/EntityPacketRewriter1_20_5.java index a2c5ed655..6a8d48fcb 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/EntityPacketRewriter1_20_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/rewriter/EntityPacketRewriter1_20_5.java @@ -19,7 +19,6 @@ package com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; -import com.github.steveice10.opennbt.tag.builtin.NumberTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.viaversion.viaversion.api.data.entity.DimensionData; @@ -66,15 +65,14 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter entry : registryData.entrySet()) { final CompoundTag entryTag = (CompoundTag) entry.getValue(); - final StringTag typeTag = entryTag.get("type"); - final ListTag valueTag = entryTag.get("value"); + final StringTag typeTag = entryTag.getStringTag("type"); + final ListTag valueTag = entryTag.getListTag("value", CompoundTag.class); RegistryEntry[] registryEntries = new RegistryEntry[valueTag.size()]; boolean requiresDummyValues = false; int entriesLength = registryEntries.length; - for (final Tag tag : valueTag) { - final CompoundTag compoundTag = (CompoundTag) tag; - final StringTag nameTag = compoundTag.get("name"); - final int id = ((NumberTag) compoundTag.get("id")).asInt(); + for (final CompoundTag tag : valueTag) { + final StringTag nameTag = tag.getStringTag("name"); + final int id = tag.getNumberTag("id").asInt(); entriesLength = Math.max(entriesLength, id + 1); if (id >= registryEntries.length) { // It was previously possible to have arbitrary ids @@ -82,7 +80,7 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter { final CompoundTag registry = wrapper.get(Type.NAMED_COMPOUND_TAG, 0); final CompoundTag damageTypeRegistry = registry.get("minecraft:damage_type"); - final ListTag damageTypes = damageTypeRegistry.get("value"); + final ListTag damageTypes = damageTypeRegistry.get("value"); int highestId = -1; - for (final Tag damageType : damageTypes) { - final IntTag id = ((CompoundTag) damageType).get("id"); + for (final CompoundTag damageType : damageTypes) { + final IntTag id = damageType.get("id"); highestId = Math.max(highestId, id.asInt()); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/packets/InventoryPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/packets/InventoryPackets.java index 2a87050cc..1ad77ab7c 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/packets/InventoryPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20to1_19_4/packets/InventoryPackets.java @@ -170,16 +170,16 @@ public final class InventoryPackets extends ItemRewriter messages = new ListTag<>(StringTag.class); for (int i = 1; i < 5; i++) { - final Tag text = tag.remove("Text" + i); + final StringTag text = tag.remove("Text" + i); messages.add(text != null ? text : new StringTag(ComponentUtil.emptyJsonComponentString())); } frontText.put("messages", messages); - final ListTag filteredMessages = new ListTag(StringTag.class); + final ListTag filteredMessages = new ListTag<>(StringTag.class); for (int i = 1; i < 5; i++) { - final Tag text = tag.remove("FilteredText" + i); + final StringTag text = tag.remove("FilteredText" + i); filteredMessages.add(text != null ? text : messages.get(i - 1)); } if (!filteredMessages.equals(messages)) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/ItemRewriter.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/ItemRewriter.java index 82356b9b1..9da9c1edd 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/ItemRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/ItemRewriter.java @@ -221,24 +221,20 @@ public class ItemRewriter { } CompoundTag tag = item.tag(); - ListTag pages = tag.getListTag("pages"); + ListTag pages = tag.getListTag("pages", StringTag.class); if (pages == null) { return; } for (int i = 0; i < pages.size(); i++) { - Tag pageTag = pages.get(i); - if (!(pageTag instanceof StringTag)) { - continue; - } - StringTag stag = (StringTag) pageTag; - String value = stag.getValue(); + StringTag pageTag = pages.get(i); + String value = pageTag.getValue(); if (value.replaceAll(" ", "").isEmpty()) { value = "\"" + fixBookSpaceChars(value) + "\""; } else { value = fixBookSpaceChars(value); } - stag.setValue(value); + pageTag.setValue(value); } } @@ -289,17 +285,15 @@ public class ItemRewriter { tag = new CompoundTag(); } - ListTag pages = tag.getListTag("pages"); + ListTag pages = tag.getListTag("pages", StringTag.class); if (pages == null) { - pages = new ListTag(Collections.singletonList(new StringTag(Protocol1_9To1_8.fixJson("").toString()))); + pages = new ListTag<>(Collections.singletonList(new StringTag(Protocol1_9To1_8.fixJson("").toString()))); tag.put("pages", pages); item.setTag(tag); return; } for (int i = 0; i < pages.size(); i++) { - if (!(pages.get(i) instanceof StringTag)) - continue; StringTag page = pages.get(i); page.setValue(Protocol1_9To1_8.fixJson(page.getValue()).toString()); } diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/ComponentRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/ComponentRewriter.java index 808f225e9..125dcc3e4 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/ComponentRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/ComponentRewriter.java @@ -254,13 +254,13 @@ public class ComponentRewriter { } if (tag instanceof ListTag) { - processListTag((ListTag) tag); + processListTag((ListTag) tag); } else if (tag instanceof CompoundTag) { processCompoundTag((CompoundTag) tag); } } - private void processListTag(final ListTag tag) { + private void processListTag(final ListTag tag) { for (final Tag entry : tag) { processTag(entry); } @@ -271,13 +271,13 @@ public class ComponentRewriter { if (translate != null) { handleTranslate(tag, translate); - final ListTag with = tag.getListTag("with"); + final ListTag with = tag.getListTag("with"); if (with != null) { processListTag(with); } } - final ListTag extra = tag.getListTag("extra"); + final ListTag extra = tag.getListTag("extra"); if (extra != null) { processListTag(extra); } diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java index ab6c66626..1541d23b2 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java @@ -475,7 +475,7 @@ public abstract class EntityRewriter biomes = biomeRegistry.get("value"); tracker(connection).setBiomesSent(biomes.size()); } @@ -491,13 +491,12 @@ public abstract class EntityRewriter dimensions = registry.getCompoundTag("minecraft:dimension_type").getListTag("value", CompoundTag.class); final Map dimensionDataMap = new HashMap<>(dimensions.size()); - for (final Tag dimension : dimensions) { - final CompoundTag dimensionCompound = (CompoundTag) dimension; - final NumberTag idTag = dimensionCompound.get("id"); - final CompoundTag element = dimensionCompound.get("element"); - final String name = dimensionCompound.getStringTag("name").getValue(); + for (final CompoundTag dimension : dimensions) { + final NumberTag idTag = dimension.get("id"); + final CompoundTag element = dimension.get("element"); + final String name = dimension.getStringTag("name").getValue(); dimensionDataMap.put(Key.stripMinecraftNamespace(name), new DimensionDataImpl(idTag.asInt(), element)); } tracker(connection).setDimensions(dimensionDataMap); diff --git a/common/src/main/java/com/viaversion/viaversion/util/ComponentUtil.java b/common/src/main/java/com/viaversion/viaversion/util/ComponentUtil.java index d530b120a..cc5292e46 100644 --- a/common/src/main/java/com/viaversion/viaversion/util/ComponentUtil.java +++ b/common/src/main/java/com/viaversion/viaversion/util/ComponentUtil.java @@ -69,13 +69,30 @@ public final class ComponentUtil { try { final ATextComponent component = TextComponentSerializer.V1_19_4.deserialize(element); - return TextComponentCodec.V1_20_3.serializeNbt(component); + return trimStrings(TextComponentCodec.V1_20_3.serializeNbt(component)); } catch (final Exception e) { Via.getPlatform().getLogger().log(Level.SEVERE, "Error converting component: " + element, e); return new StringTag(""); } } + private static Tag trimStrings(final Tag input) { + // Dirty fix for https://github.com/ViaVersion/ViaVersion/issues/3650 + // Usually tripped by hover event data being too long, e.g. book or shulker box contents, which have to be held in full as SNBT + if (input == null) { + return null; + } + return TagUtil.handleDeep(input, (key, tag) -> { + if (tag instanceof StringTag) { + final String value = ((StringTag) tag).getValue(); + if (value.length() > Short.MAX_VALUE) { + ((StringTag) tag).setValue("{}"); + } + } + return tag; + }); + } + public static @Nullable JsonElement convertJson(@Nullable final JsonElement element, final SerializerVersion from, final SerializerVersion to) { return element != null ? convert(from, to, from.jsonSerializer.deserialize(element)) : null; } diff --git a/common/src/main/java/com/viaversion/viaversion/util/TagUtil.java b/common/src/main/java/com/viaversion/viaversion/util/TagUtil.java new file mode 100644 index 000000000..28be0a62a --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/util/TagUtil.java @@ -0,0 +1,61 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2024 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.util; + +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; +import java.util.Map; +import org.checkerframework.checker.nullness.qual.Nullable; + +public final class TagUtil { + + public static Tag handleDeep(final Tag tag, final TagUpdater consumer) { + return handleDeep(null, tag, consumer); + } + + private static Tag handleDeep(@Nullable final String key, final Tag tag, final TagUpdater consumer) { + if (tag instanceof CompoundTag) { + final CompoundTag compoundTag = (CompoundTag) tag; + for (final Map.Entry entry : compoundTag.entrySet()) { + final Tag updatedTag = handleDeep(entry.getKey(), entry.getValue(), consumer); + entry.setValue(updatedTag); + } + } else if (tag instanceof ListTag) { + handleListTag((ListTag) tag, consumer); + } + return consumer.update(key, tag); + } + + private static void handleListTag(final ListTag listTag, final TagUpdater consumer) { + listTag.getValue().replaceAll(t -> (T) handleDeep(null, t, consumer)); + } + + @FunctionalInterface + public interface TagUpdater { + + /** + * Updates the given tag. + * + * @param key key of the tag if inside a CompoundTag + * @param tag the tag to update + * @return the updated tag, can be the original one + */ + Tag update(@Nullable String key, Tag tag); + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 656c55659..168455c84 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,8 +4,8 @@ metadata.format.version = "1.1" gson = "2.10.1" fastutil = "8.5.12" -vianbt = "4.3.0" -mcstructs = "2.4.2-SNAPSHOT" +vianbt = "4.4.0" +mcstructs = "2.4.2" # Common provided netty = "4.0.20.Final"