From b4ee564aa24a2f75b643c912ea4100517c60524b Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Wed, 6 Mar 2024 16:53:37 +0100 Subject: [PATCH] 24w10a, more item component work --- .../viaversion/api/minecraft/GameProfile.java | 4 +- .../minecraft/data/EmptyStructuredData.java | 24 ++++ .../minecraft/data/FilledStructuredData.java | 28 +++++ .../data/StructuredDataContainer.java | 7 +- .../api/minecraft/data/StructuredDataKey.java | 8 +- .../api/minecraft/item/StructuredItem.java | 11 +- .../minecraft/item/data/BannerPattern.java | 37 +++---- .../item/data/BannerPatternLayer.java | 63 +++++++++++ ...stoneTarget.java => LodestoneTracker.java} | 19 ++-- .../metadata/types/MetaTypes1_20_5.java | 17 +-- .../api/protocol/version/ProtocolVersion.java | 2 +- .../api/type/types/item/ItemType1_20_5.java | 6 +- .../api/type/types/misc/GameProfileType.java | 4 +- .../Protocol1_20_5To1_20_3.java | 5 +- .../BlockItemPacketRewriter1_20_5.java | 103 +++++++++++++----- .../viaversion/util/ComponentUtil.java | 24 ++++ .../viaversion/data/identifiers-1.20.3.nbt | Bin 4722 -> 4723 bytes .../viaversion/data/identifiers-1.20.5.nbt | Bin 4794 -> 4807 bytes .../data/mappings-1.20.3to1.20.5.nbt | Bin 606 -> 683 bytes gradle.properties | 2 +- 20 files changed, 281 insertions(+), 83 deletions(-) create mode 100644 api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BannerPatternLayer.java rename api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/{LodestoneTarget.java => LodestoneTracker.java} (73%) diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/GameProfile.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/GameProfile.java index c1d8f23cc..64cb02408 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/GameProfile.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/GameProfile.java @@ -31,13 +31,13 @@ public final class GameProfile { private final UUID id; private final Property[] properties; - public GameProfile(final String name, @Nullable final UUID id, final Property[] properties) { + public GameProfile(@Nullable final String name, @Nullable final UUID id, final Property[] properties) { this.name = name; this.id = id; this.properties = properties; } - public String name() { + public @Nullable String name() { return name; } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/EmptyStructuredData.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/EmptyStructuredData.java index 0ca603c7d..19fc880eb 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/EmptyStructuredData.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/EmptyStructuredData.java @@ -67,4 +67,28 @@ final class EmptyStructuredData implements StructuredData { public int id() { return this.id; } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final EmptyStructuredData that = (EmptyStructuredData) o; + if (id != that.id) return false; + return key.equals(that.key); + } + + @Override + public int hashCode() { + int result = key.hashCode(); + result = 31 * result + id; + return result; + } + + @Override + public String toString() { + return "EmptyStructuredData{" + + "key=" + key + + ", id=" + id + + '}'; + } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/FilledStructuredData.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/FilledStructuredData.java index 1d1fb4169..eed092e43 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/FilledStructuredData.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/FilledStructuredData.java @@ -24,6 +24,7 @@ package com.viaversion.viaversion.api.minecraft.data; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; +import java.util.Objects; final class FilledStructuredData implements StructuredData { @@ -72,4 +73,31 @@ final class FilledStructuredData implements StructuredData { public int id() { return id; } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final FilledStructuredData that = (FilledStructuredData) o; + if (id != that.id) return false; + if (!key.equals(that.key)) return false; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + int result = key.hashCode(); + result = 31 * result + (value != null ? value.hashCode() : 0); + result = 31 * result + id; + return result; + } + + @Override + public String toString() { + return "FilledStructuredData{" + + "key=" + key + + ", value=" + value + + ", id=" + id + + '}'; + } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/StructuredDataContainer.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/StructuredDataContainer.java index 01b21d1a5..ed13054b3 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/StructuredDataContainer.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/StructuredDataContainer.java @@ -25,6 +25,7 @@ package com.viaversion.viaversion.api.minecraft.data; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.data.FullMappings; import com.viaversion.viaversion.api.protocol.Protocol; +import com.viaversion.viaversion.util.Unit; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import java.util.Map; import org.checkerframework.checker.nullness.qual.Nullable; @@ -68,13 +69,17 @@ public final class StructuredDataContainer { return data != null && data.isPresent() ? data : null; } - public void add(final StructuredDataKey key, final T value) { + public void set(final StructuredDataKey key, final T value) { final int id = serializerId(key); if (id != -1) { this.data.put(key, StructuredData.of(key, value, id)); } } + public void set(final StructuredDataKey key) { + this.set(key, Unit.INSTANCE); + } + public void addEmpty(final StructuredDataKey key) { // Empty optional to override the Minecraft default this.data.put(key, StructuredData.empty(key, serializerId(key))); diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/StructuredDataKey.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/StructuredDataKey.java index 2116e27d6..82f088a0d 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/StructuredDataKey.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/data/StructuredDataKey.java @@ -30,7 +30,7 @@ import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.minecraft.item.data.AdventureModePredicate; import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrim; import com.viaversion.viaversion.api.minecraft.item.data.AttributeModifiers; -import com.viaversion.viaversion.api.minecraft.item.data.BannerPattern; +import com.viaversion.viaversion.api.minecraft.item.data.BannerPatternLayer; import com.viaversion.viaversion.api.minecraft.item.data.Bee; import com.viaversion.viaversion.api.minecraft.item.data.BlockStateProperties; import com.viaversion.viaversion.api.minecraft.item.data.DyedColor; @@ -38,7 +38,7 @@ import com.viaversion.viaversion.api.minecraft.item.data.Enchantments; import com.viaversion.viaversion.api.minecraft.item.data.FireworkExplosion; import com.viaversion.viaversion.api.minecraft.item.data.Fireworks; import com.viaversion.viaversion.api.minecraft.item.data.Instrument; -import com.viaversion.viaversion.api.minecraft.item.data.LodestoneTarget; +import com.viaversion.viaversion.api.minecraft.item.data.LodestoneTracker; import com.viaversion.viaversion.api.minecraft.item.data.PotionContents; import com.viaversion.viaversion.api.minecraft.item.data.SuspiciousStewEffect; import com.viaversion.viaversion.api.minecraft.item.data.WrittenBook; @@ -82,12 +82,12 @@ public final class StructuredDataKey { public static final StructuredDataKey BLOCK_ENTITY_DATA = new StructuredDataKey<>("block_entity_data", Type.COMPOUND_TAG); public static final StructuredDataKey> INSTRUMENT = new StructuredDataKey<>("instrument", Instrument.TYPE); public static final StructuredDataKey RECIPES = new StructuredDataKey<>("recipes", Type.STRING_ARRAY); - public static final StructuredDataKey LODESTONE_TARGET = new StructuredDataKey<>("lodestone_target", LodestoneTarget.TYPE); + public static final StructuredDataKey LODESTONE_TRACKER = new StructuredDataKey<>("lodestone_tracker", LodestoneTracker.TYPE); public static final StructuredDataKey FIREWORK_EXPLOSION = new StructuredDataKey<>("firework_explosion", FireworkExplosion.TYPE); public static final StructuredDataKey FIREWORKS = new StructuredDataKey<>("fireworks", Fireworks.TYPE); public static final StructuredDataKey PROFILE = new StructuredDataKey<>("profile", Type.GAME_PROFILE); public static final StructuredDataKey NOTE_BLOCK_SOUND = new StructuredDataKey<>("note_block_sound", Type.STRING); - public static final StructuredDataKey BANNER_PATTERNS = new StructuredDataKey<>("banner_patterns", BannerPattern.ARRAY_TYPE); + public static final StructuredDataKey BANNER_PATTERNS = new StructuredDataKey<>("banner_patterns", BannerPatternLayer.ARRAY_TYPE); public static final StructuredDataKey BASE_COLOR = new StructuredDataKey<>("base_color", Type.VAR_INT); public static final StructuredDataKey POT_DECORATIONS = new StructuredDataKey<>("pot_decorations", Type.VAR_INT_ARRAY_PRIMITIVE); public static final StructuredDataKey CONTAINER = new StructuredDataKey<>("container", Types1_20_5.ITEM_ARRAY); diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/StructuredItem.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/StructuredItem.java index 2fa028e03..cc7ab2503 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/StructuredItem.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/StructuredItem.java @@ -29,13 +29,13 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class StructuredItem implements Item { private final StructuredDataContainer data; private int identifier; - private byte amount; + private int amount; public StructuredItem() { - this(0, (byte) 0, new StructuredDataContainer()); + this(0, 0, new StructuredDataContainer()); } - public StructuredItem(final int identifier, final byte amount, final StructuredDataContainer data) { + public StructuredItem(final int identifier, final int amount, final StructuredDataContainer data) { this.identifier = identifier; this.amount = amount; this.data = data; @@ -58,10 +58,7 @@ public class StructuredItem implements Item { @Override public void setAmount(final int amount) { - if (amount > Byte.MAX_VALUE || amount < Byte.MIN_VALUE) { - throw new IllegalArgumentException("Invalid item amount: " + amount); - } - this.amount = (byte) amount; + this.amount = amount; } @Override diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BannerPattern.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BannerPattern.java index 6e75c2d6b..baed0263d 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BannerPattern.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BannerPattern.java @@ -23,40 +23,39 @@ package com.viaversion.viaversion.api.minecraft.item.data; import com.viaversion.viaversion.api.type.Type; -import com.viaversion.viaversion.api.type.types.ArrayType; +import com.viaversion.viaversion.api.type.types.misc.HolderType; import io.netty.buffer.ByteBuf; public final class BannerPattern { - public static final Type TYPE = new Type(BannerPattern.class) { + public static final HolderType TYPE = new HolderType() { @Override - public BannerPattern read(final ByteBuf buffer) throws Exception { - final int pattern = Type.VAR_INT.readPrimitive(buffer); - final int color = Type.VAR_INT.readPrimitive(buffer); - return new BannerPattern(pattern, color); + public BannerPattern readDirect(final ByteBuf buffer) throws Exception { + final String assetId = Type.STRING.read(buffer); + final String tanslationKey = Type.STRING.read(buffer); + return new BannerPattern(assetId, tanslationKey); } @Override - public void write(final ByteBuf buffer, final BannerPattern value) throws Exception { - Type.VAR_INT.writePrimitive(buffer, value.pattern); - Type.VAR_INT.writePrimitive(buffer, value.color); + public void writeDirect(final ByteBuf buffer, final BannerPattern value) throws Exception { + Type.STRING.write(buffer, value.assetId); + Type.STRING.write(buffer, value.tanslationKey); } }; - public static final Type ARRAY_TYPE = new ArrayType<>(TYPE); - private final int pattern; - private final int color; + private final String assetId; + private final String tanslationKey; - public BannerPattern(final int pattern, final int color) { - this.pattern = pattern; - this.color = color; + public BannerPattern(final String assetId, final String tanslationKey) { + this.assetId = assetId; + this.tanslationKey = tanslationKey; } - public int pattern() { - return this.pattern; + public String assetId() { + return assetId; } - public int color() { - return this.color; + public String tanslationKey() { + return tanslationKey; } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BannerPatternLayer.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BannerPatternLayer.java new file mode 100644 index 000000000..d7be2e02d --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BannerPatternLayer.java @@ -0,0 +1,63 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2024 ViaVersion and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.viaversion.viaversion.api.minecraft.item.data; + +import com.viaversion.viaversion.api.minecraft.Holder; +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.api.type.types.ArrayType; +import io.netty.buffer.ByteBuf; + +public final class BannerPatternLayer { + + public static final Type TYPE = new Type(BannerPatternLayer.class) { + @Override + public BannerPatternLayer read(final ByteBuf buffer) throws Exception { + final Holder pattern = BannerPattern.TYPE.read(buffer); + final DyedColor color = DyedColor.TYPE.read(buffer); + return new BannerPatternLayer(pattern, color); + } + + @Override + public void write(final ByteBuf buffer, final BannerPatternLayer value) throws Exception { + BannerPattern.TYPE.write(buffer, value.pattern); + DyedColor.TYPE.write(buffer, value.color); + } + }; + public static final Type ARRAY_TYPE = new ArrayType<>(TYPE); + + private final Holder pattern; + private final DyedColor color; + + public BannerPatternLayer(final Holder pattern, final DyedColor color) { + this.pattern = pattern; + this.color = color; + } + + public Holder pattern() { + return pattern; + } + + public DyedColor color() { + return color; + } +} diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/LodestoneTarget.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/LodestoneTracker.java similarity index 73% rename from api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/LodestoneTarget.java rename to api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/LodestoneTracker.java index 476f96ac4..997e0f092 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/LodestoneTarget.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/LodestoneTracker.java @@ -25,20 +25,21 @@ package com.viaversion.viaversion.api.minecraft.item.data; import com.viaversion.viaversion.api.minecraft.GlobalPosition; import com.viaversion.viaversion.api.type.Type; import io.netty.buffer.ByteBuf; +import org.checkerframework.checker.nullness.qual.Nullable; -public final class LodestoneTarget { +public final class LodestoneTracker { - public static final Type TYPE = new Type(LodestoneTarget.class) { + public static final Type TYPE = new Type(LodestoneTracker.class) { @Override - public LodestoneTarget read(final ByteBuf buffer) throws Exception { - final GlobalPosition position = Type.GLOBAL_POSITION.read(buffer); + public LodestoneTracker read(final ByteBuf buffer) throws Exception { + final GlobalPosition position = Type.OPTIONAL_GLOBAL_POSITION.read(buffer); final boolean tracked = buffer.readBoolean(); - return new LodestoneTarget(position, tracked); + return new LodestoneTracker(position, tracked); } @Override - public void write(final ByteBuf buffer, final LodestoneTarget value) throws Exception { - Type.GLOBAL_POSITION.write(buffer, value.position); + public void write(final ByteBuf buffer, final LodestoneTracker value) throws Exception { + Type.OPTIONAL_GLOBAL_POSITION.write(buffer, value.position); buffer.writeBoolean(value.tracked); } }; @@ -46,12 +47,12 @@ public final class LodestoneTarget { private final GlobalPosition position; private final boolean tracked; - public LodestoneTarget(final GlobalPosition position, final boolean tracked) { + public LodestoneTracker(@Nullable final GlobalPosition position, final boolean tracked) { this.position = position; this.tracked = tracked; } - public GlobalPosition pos() { + public @Nullable GlobalPosition pos() { return this.position; } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/types/MetaTypes1_20_5.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/types/MetaTypes1_20_5.java index 83d492044..a58bd2259 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/types/MetaTypes1_20_5.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/types/MetaTypes1_20_5.java @@ -51,16 +51,17 @@ public final class MetaTypes1_20_5 extends AbstractMetaTypes { public final MetaType optionalVarIntType = add(19, Type.OPTIONAL_VAR_INT); public final MetaType poseType = add(20, Type.VAR_INT); public final MetaType catVariantType = add(21, Type.VAR_INT); - public final MetaType frogVariantType = add(22, Type.VAR_INT); - public final MetaType optionalGlobalPosition = add(23, Type.OPTIONAL_GLOBAL_POSITION); - public final MetaType paintingVariantType = add(24, Type.VAR_INT); - public final MetaType snifferState = add(25, Type.VAR_INT); - public final MetaType armadilloState = add(26, Type.VAR_INT); - public final MetaType vectorType = add(27, Type.VECTOR3F); - public final MetaType quaternionType = add(28, Type.QUATERNION); + public final MetaType wolfVariantType = add(22, Type.VAR_INT); + public final MetaType frogVariantType = add(23, Type.VAR_INT); + public final MetaType optionalGlobalPosition = add(24, Type.OPTIONAL_GLOBAL_POSITION); + public final MetaType paintingVariantType = add(25, Type.VAR_INT); + public final MetaType snifferState = add(26, Type.VAR_INT); + public final MetaType armadilloState = add(27, Type.VAR_INT); + public final MetaType vectorType = add(28, Type.VECTOR3F); + public final MetaType quaternionType = add(29, Type.QUATERNION); public MetaTypes1_20_5(final ParticleType particleType) { - super(29); + super(30); this.particleType = add(17, particleType); } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java index 9d66c6814..2d393df53 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java @@ -83,7 +83,7 @@ public class ProtocolVersion implements Comparable { public static final ProtocolVersion v1_20 = register(763, "1.20/1.20.1", new SubVersionRange("1.20", 0, 1)); public static final ProtocolVersion v1_20_2 = register(764, "1.20.2"); public static final ProtocolVersion v1_20_3 = register(765, "1.20.3/1.20.4", new SubVersionRange("1.20", 3, 4)); - public static final ProtocolVersion v1_20_5 = register(766, 178, "1.20.5"); + public static final ProtocolVersion v1_20_5 = register(766, 179, "1.20.5"); public static final ProtocolVersion unknown = new ProtocolVersion(VersionType.SPECIAL, -1, -1, "UNKNOWN", null); public static ProtocolVersion register(int version, String name) { diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemType1_20_5.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemType1_20_5.java index 8a149f053..434a5557c 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemType1_20_5.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemType1_20_5.java @@ -45,7 +45,7 @@ public class ItemType1_20_5 extends Type { @Override public @Nullable Item read(final ByteBuf buffer) throws Exception { - final byte amount = buffer.readByte(); + final int amount = Type.VAR_INT.readPrimitive(buffer); if (amount <= 0) { return null; } @@ -82,11 +82,11 @@ public class ItemType1_20_5 extends Type { @Override public void write(final ByteBuf buffer, @Nullable final Item object) throws Exception { if (object == null) { - buffer.writeByte(0); + Type.VAR_INT.writePrimitive(buffer, 0); return; } - buffer.writeByte(object.amount()); + Type.VAR_INT.writePrimitive(buffer, object.amount()); Type.VAR_INT.writePrimitive(buffer, object.identifier()); final Map, StructuredData> data = object.structuredData().data(); diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/GameProfileType.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/GameProfileType.java index d6d6f5035..db301e522 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/GameProfileType.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/GameProfileType.java @@ -34,7 +34,7 @@ public final class GameProfileType extends Type { @Override public GameProfile read(final ByteBuf buffer) throws Exception { - final String name = Type.STRING.read(buffer); + final String name = Type.OPTIONAL_STRING.read(buffer); final java.util.UUID id = Type.OPTIONAL_UUID.read(buffer); final int propertyCount = Type.VAR_INT.readPrimitive(buffer); final GameProfile.Property[] properties = new GameProfile.Property[propertyCount]; @@ -49,7 +49,7 @@ public final class GameProfileType extends Type { @Override public void write(final ByteBuf buffer, final GameProfile value) throws Exception { - Type.STRING.write(buffer, value.name()); + Type.OPTIONAL_STRING.write(buffer, value.name()); Type.OPTIONAL_UUID.write(buffer, value.id()); Type.VAR_INT.writePrimitive(buffer, value.properties().length); for (final GameProfile.Property property : value.properties()) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/Protocol1_20_5To1_20_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/Protocol1_20_5To1_20_3.java index f4175ff63..196f54118 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/Protocol1_20_5To1_20_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_5to1_20_3/Protocol1_20_5To1_20_3.java @@ -33,6 +33,7 @@ import com.viaversion.viaversion.api.type.types.version.Types1_20_5; import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets; import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets; +import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.rewriter.CommandRewriter1_19_4; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundConfigurationPackets1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3; import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPacket1_20_3; @@ -90,6 +91,8 @@ public final class Protocol1_20_5To1_20_3 extends AbstractProtocol(this).registerDeclareCommands1_19(ClientboundPackets1_20_3.DECLARE_COMMANDS); + cancelServerbound(State.LOGIN, ServerboundLoginPackets.COOKIE_RESPONSE.getId()); cancelServerbound(ServerboundConfigurationPackets1_20_5.COOKIE_RESPONSE); cancelServerbound(ServerboundConfigurationPackets1_20_5.SELECT_KNOWN_PACKS); @@ -147,7 +150,7 @@ public final class Protocol1_20_5To1_20_3 extends AbstractProtocol customData = data.getNonEmpty(StructuredDataKey.CUSTOM_DATA); final CompoundTag tag = customData != null ? customData.value() : new CompoundTag(); + final DataItem dataItem = new DataItem(item.identifier(), (byte) item.amount(), (short) 0, tag); + if (customData != null && tag.remove(tagMarker) != null) { + return dataItem; + } // TODO - return new DataItem(item.identifier(), (byte) item.amount(), (short) 0, tag); + return dataItem; } public Item toStructuredItem(final Item old) { @@ -215,21 +222,27 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter items = new ArrayList<>(); + for (final Tag chargedProjectile : chargedProjectiles) { + if (!(chargedProjectile instanceof CompoundTag)) { + continue; + } + items.add(itemFromTag((CompoundTag) chargedProjectile)); + } + data.set(StructuredDataKey.CHARGED_PROJECTILES, items.toArray(new Item[0])); + } + updateEnchantments(data, tag, "Enchantments", StructuredDataKey.ENCHANTMENTS, (hideFlagsValue & 0x01) == 0); updateEnchantments(data, tag, "StoredEnchantments", StructuredDataKey.STORED_ENCHANTMENTS, (hideFlagsValue & 0x20) == 0); final NumberTag map = tag.getNumberTag("map"); if (map != null) { - data.add(StructuredDataKey.MAP_ID, map.asInt()); + data.set(StructuredDataKey.MAP_ID, map.asInt()); } updateMapDecorations(data, tag.getListTag("Decorations", CompoundTag.class)); @@ -281,13 +311,9 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter newKey, final boolean show) { final ListTag enchantmentsTag = tag.getListTag(key, CompoundTag.class); @@ -346,11 +379,11 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter decorationsTag) { @@ -423,18 +456,38 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter updatedLore = new ArrayList<>(); + for (final Tag loreEntry : loreTag) { + if (loreEntry instanceof StringTag) { + updatedLore.add(ComponentUtil.jsonStringToTag(((StringTag) loreEntry).getValue())); + } + } + data.set(StructuredDataKey.LORE, updatedLore.toArray(new Tag[0])); + } + + final NumberTag colorTag = displayTag.getNumberTag("color"); + if (colorTag != null) { + data.set(StructuredDataKey.DYED_COLOR, new DyedColor(colorTag.asInt(), (hideFlags & 0x40) == 0)); } - // TODO other display values } } \ No newline at end of file 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 e523bf231..33c8c2fce 100644 --- a/common/src/main/java/com/viaversion/viaversion/util/ComponentUtil.java +++ b/common/src/main/java/com/viaversion/viaversion/util/ComponentUtil.java @@ -92,6 +92,30 @@ public final class ComponentUtil { }); } + public static @Nullable String tagToJsonString(@Nullable final Tag tag) { + try { + final ATextComponent component = TextComponentCodec.V1_20_3.deserializeNbtTree(tag); + return component != null ? SerializerVersion.V1_20_3.jsonSerializer.serialize(component) : null; + } catch (final Exception e) { + Via.getPlatform().getLogger().log(Level.SEVERE, "Error converting tag: " + tag, e); + return plainToJson("").toString(); + } + } + + public static @Nullable Tag jsonStringToTag(@Nullable final String json) { + if (json == null) { + return null; + } + + try { + final ATextComponent component = TextComponentSerializer.V1_20_3.deserialize(json); + return TextComponentCodec.V1_20_3.serializeNbt(component); + } catch (final Exception e) { + Via.getPlatform().getLogger().log(Level.SEVERE, "Error converting component: " + json, e); + return new StringTag(""); + } + } + 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/resources/assets/viaversion/data/identifiers-1.20.3.nbt b/common/src/main/resources/assets/viaversion/data/identifiers-1.20.3.nbt index d5353a88efa08bc24687c122ad903cc03f5390b3..f1e6ff99fbf4d41095989977c775207948f08142 100644 GIT binary patch delta 30 mcmeyQ@>ylW5kVorocxs3;*$Kl)cBI3#N_PMqRCeU=K=uAsSN}G delta 29 lcmeyY@=0aG5kWzLocxs3;*$Kl)cBIbqV&{~$=3wu0sy`L44wc0 diff --git a/common/src/main/resources/assets/viaversion/data/identifiers-1.20.5.nbt b/common/src/main/resources/assets/viaversion/data/identifiers-1.20.5.nbt index 84cbd575c2523c74d4f8eaa516d89dfd0d94a2d6..3a492af4ad9d65d9a986449a5e32e49a71a90789 100644 GIT binary patch delta 54 zcmdm`dR%qGFD^#o&A+)8GIDcemZav!7w6=c6mOo*Q^+bLn3JE9T3nK!ml|JEl$e~I KS~OW!Xf6OqrWDWs delta 41 xcmX@Ex=VG#FD^!-&A+)8GHzbMQ@|=HkdvR1T3nK!ml|J^Sd^YxGFeM#E&yJ;5Geov diff --git a/common/src/main/resources/assets/viaversion/data/mappings-1.20.3to1.20.5.nbt b/common/src/main/resources/assets/viaversion/data/mappings-1.20.3to1.20.5.nbt index 1bd88ade32488982c06e576c13be16d0f7bd0c68..11278b72e61912fb95a18f73ba1faf0dab273f4e 100644 GIT binary patch delta 86 zcmcb|vYK_n4@NKE#G>@l+|<01lFEYAVrB-e+{A){)Rf@Ns#FFB24hABrpy#ZW(JmG ch=36{15;uNP=*nRm4KX*d?-hG@>j-806w1-O#lD@ delta 11 ScmZ3@dXHtp55~!^Olbfet^|Al diff --git a/gradle.properties b/gradle.properties index f3145a053..c1c3c100e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Project properties - we put these here so they can be modified without causing a recompile of the build scripts -projectVersion=4.10.0-24w09a-SNAPSHOT +projectVersion=4.10.0-24w10a-SNAPSHOT # Smile emoji mcVersions=1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9