From 936dcafc11a7ac5db1e7abca5e8620c0d3555a45 Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Fri, 15 Mar 2024 12:45:44 +0100 Subject: [PATCH] Make HolderSet an interface --- .../viaversion/api/minecraft/HolderSet.java | 54 +++++++++++++++--- .../api/minecraft/HolderSetImpl.java | 56 +++++++++++++++++++ .../minecraft/item/data/BlockPredicate.java | 12 ++-- .../api/type/types/misc/HolderSetType.java | 10 ++-- .../BlockItemPacketRewriter1_20_5.java | 6 +- .../rewriter/StructuredDataConverter.java | 13 ++--- 6 files changed, 123 insertions(+), 28 deletions(-) create mode 100644 api/src/main/java/com/viaversion/viaversion/api/minecraft/HolderSetImpl.java diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/HolderSet.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/HolderSet.java index b9796f734..1b72aef84 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/HolderSet.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/HolderSet.java @@ -22,18 +22,58 @@ */ package com.viaversion.viaversion.api.minecraft; -import com.viaversion.viaversion.util.EitherImpl; - /** * Set of ids that either holds a string tag key or an array of ids. */ -public final class HolderSet extends EitherImpl { +public interface HolderSet { - public HolderSet(final String tagKey) { - super(tagKey, null); + /** + * Creates a new holder set for the given tag. + * + * @param tagKey the tag key + * @return a new holder set + */ + static HolderSet of(final String tagKey) { + return new HolderSetImpl(tagKey); } - public HolderSet(final int[] ids) { - super(null, ids); + /** + * Creates a new holder set for the given ids. + * + * @param ids the direct ids + * @return a new holder set + */ + static HolderSet of(final int[] ids) { + return new HolderSetImpl(ids); } + + /** + * Gets the tag key. + * + * @return the tag key + * @see #hasTagKey() + */ + String tagKey(); + + /** + * Returns whether this holder set has a tag key. + * + * @return true if this holder set has a tag key, false if it has direct ids + */ + boolean hasTagKey(); + + /** + * Gets the direct ids. + * + * @return direct ids + * @see #hasIds() + */ + int[] ids(); + + /** + * Returns whether this holder set has direct ids. + * + * @return true if this holder set has direct ids, false if it has a tag key + */ + boolean hasIds(); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/HolderSetImpl.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/HolderSetImpl.java new file mode 100644 index 000000000..6bdba6bdf --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/HolderSetImpl.java @@ -0,0 +1,56 @@ +/* + * 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; + +import com.viaversion.viaversion.util.EitherImpl; + +final class HolderSetImpl extends EitherImpl implements HolderSet { + + HolderSetImpl(final String tagKey) { + super(tagKey, null); + } + + HolderSetImpl(final int[] ids) { + super(null, ids); + } + + @Override + public String tagKey() { + return left(); + } + + @Override + public boolean hasTagKey() { + return isLeft(); + } + + @Override + public int[] ids() { + return right(); + } + + @Override + public boolean hasIds() { + return isRight(); + } +} diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BlockPredicate.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BlockPredicate.java index 32e4f0173..149cea6b4 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BlockPredicate.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BlockPredicate.java @@ -42,7 +42,7 @@ public final class BlockPredicate { @Override public void write(final ByteBuf buffer, final BlockPredicate value) throws Exception { - Type.OPTIONAL_HOLDER_SET.write(buffer, value.holders); + Type.OPTIONAL_HOLDER_SET.write(buffer, value.holderSet); buffer.writeBoolean(value.propertyMatchers != null); if (value.propertyMatchers != null) { @@ -54,18 +54,18 @@ public final class BlockPredicate { }; public static final Type ARRAY_TYPE = new ArrayType<>(TYPE); - private final HolderSet holders; + private final HolderSet holderSet; private final StatePropertyMatcher[] propertyMatchers; private final CompoundTag tag; - public BlockPredicate(@Nullable final HolderSet holders, final StatePropertyMatcher @Nullable [] propertyMatchers, @Nullable final CompoundTag tag) { - this.holders = holders; + public BlockPredicate(@Nullable final HolderSet holderSet, final StatePropertyMatcher @Nullable [] propertyMatchers, @Nullable final CompoundTag tag) { + this.holderSet = holderSet; this.propertyMatchers = propertyMatchers; this.tag = tag; } - public @Nullable HolderSet predicates() { - return holders; + public @Nullable HolderSet holderSet() { + return holderSet; } public StatePropertyMatcher @Nullable [] propertyMatchers() { diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/HolderSetType.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/HolderSetType.java index aec86254b..9e6c081f1 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/HolderSetType.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/misc/HolderSetType.java @@ -38,23 +38,23 @@ public class HolderSetType extends Type { final int size = Type.VAR_INT.readPrimitive(buffer) - 1; if (size == -1) { final String tag = Type.STRING.read(buffer); - return new HolderSet(tag); + return HolderSet.of(tag); } final int[] values = new int[size]; for (int i = 0; i < size; i++) { values[i] = Type.VAR_INT.readPrimitive(buffer); } - return new HolderSet(values); + return HolderSet.of(values); } @Override public void write(final ByteBuf buffer, final HolderSet object) throws Exception { - if (object.isLeft()) { + if (object.hasTagKey()) { Type.VAR_INT.writePrimitive(buffer, 0); - Type.STRING.write(buffer, object.left()); + Type.STRING.write(buffer, object.tagKey()); } else { - final int[] values = object.right(); + final int[] values = object.ids(); Type.VAR_INT.writePrimitive(buffer, values.length + 1); for (final int value : values) { Type.VAR_INT.writePrimitive(buffer, value); 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 8352ed2a1..d14edd9e5 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 @@ -452,9 +452,9 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter predicatedListTag = new ListTag<>(StringTag.class); for (final BlockPredicate predicate : data.predicates()) { - final HolderSet holders = predicate.predicates(); + final HolderSet holders = predicate.holderSet(); if (holders == null) { // Can't do (nicely) continue; } - - if (holders.isLeft()) { - final String identifier = holders.left(); - predicatedListTag.add(serializeBlockPredicate(predicate, identifier)); + if (holders.hasTagKey()) { + final String tagKey = "#" + holders.tagKey(); + predicatedListTag.add(serializeBlockPredicate(predicate, tagKey)); } else { - for (final int id : holders.right()) { + for (final int id : holders.ids()) { final int oldId = Protocol1_20_5To1_20_3.MAPPINGS.getOldItemId(id); final String identifier = Protocol1_20_5To1_20_3.MAPPINGS.itemName(oldId); predicatedListTag.add(serializeBlockPredicate(predicate, identifier)); @@ -377,7 +376,7 @@ final class StructuredDataConverter { final StringBuilder builder = new StringBuilder(identifier); if (predicate.propertyMatchers() != null) { for (final StatePropertyMatcher matcher : predicate.propertyMatchers()) { - // I'm not sure if ranged values were possible in 1.20.4 (if so, there's no trace of how) + // Ranges were introduced in 1.20.5, so only handle the simple case if (matcher.matcher().isLeft()) { builder.append(matcher.name()).append('='); builder.append(matcher.matcher().left());