Skip to content

Commit 4dfc3bd

Browse files
committed
Make parts of item data component rewriting more generic via an interface
1 parent b0c53ff commit 4dfc3bd

23 files changed

+284
-126
lines changed

api/src/main/java/com/viaversion/viaversion/api/minecraft/Holder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
package com.viaversion.viaversion.api.minecraft;
2424

2525
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
26+
import java.util.function.Function;
2627

2728
public interface Holder<T> {
2829

@@ -89,4 +90,12 @@ static <T> Holder<T> of(final T value) {
8990
* @return a new holder with the id rewritten, or self
9091
*/
9192
Holder<T> updateId(final Int2IntFunction rewriteFunction);
93+
94+
/**
95+
* Returns a new holder with the value rewritten using the given function, or self if this is an id holder or the value did not change.
96+
*
97+
* @param rewriteFunction the function to rewrite the value
98+
* @return a new holder with the value rewritten, or self
99+
*/
100+
Holder<T> updateValue(final Function<T, T> rewriteFunction);
92101
}

api/src/main/java/com/viaversion/viaversion/api/minecraft/IdHolder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import com.google.common.base.Preconditions;
2626
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
27+
import java.util.function.Function;
2728

2829
record IdHolder<T>(int id) implements Holder<T> {
2930

@@ -57,4 +58,9 @@ public Holder<T> updateId(final Int2IntFunction rewriteFunction) {
5758
}
5859
return Holder.of(rewrittenId);
5960
}
61+
62+
@Override
63+
public Holder<T> updateValue(final Function<T, T> rewriteFunction) {
64+
return this;
65+
}
6066
}

api/src/main/java/com/viaversion/viaversion/api/minecraft/ValueHolder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
package com.viaversion.viaversion.api.minecraft;
2424

2525
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
26+
import java.util.function.Function;
2627

2728
record ValueHolder<T>(T value) implements Holder<T> {
2829

@@ -45,4 +46,10 @@ public int id() {
4546
public Holder<T> updateId(final Int2IntFunction rewriteFunction) {
4647
return this;
4748
}
49+
50+
@Override
51+
public Holder<T> updateValue(final Function<T, T> rewriteFunction) {
52+
final T rewrittenValue = rewriteFunction.apply(value);
53+
return rewrittenValue != value ? Holder.of(rewrittenValue) : this;
54+
}
4855
}

api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/AdventureModePredicate.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,17 @@
2222
*/
2323
package com.viaversion.viaversion.api.minecraft.item.data;
2424

25+
import com.viaversion.viaversion.api.connection.UserConnection;
2526
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
27+
import com.viaversion.viaversion.api.protocol.Protocol;
2628
import com.viaversion.viaversion.api.type.Type;
2729
import com.viaversion.viaversion.api.type.types.ArrayType;
2830
import com.viaversion.viaversion.util.Copyable;
31+
import com.viaversion.viaversion.util.Rewritable;
2932
import io.netty.buffer.ByteBuf;
30-
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
3133

32-
public record AdventureModePredicate(BlockPredicate[] predicates, boolean showInTooltip) implements Copyable {
34+
public record AdventureModePredicate(BlockPredicate[] predicates,
35+
boolean showInTooltip) implements Copyable, Rewritable {
3336

3437
public AdventureModePredicate(final BlockPredicate[] predicates) {
3538
this(predicates, true);
@@ -70,10 +73,11 @@ public void write(final ByteBuf buffer, final AdventureModePredicate value) {
7073
}
7174
}
7275

73-
public AdventureModePredicate rewrite(final Int2IntFunction blockIdRewriter) {
76+
@Override
77+
public AdventureModePredicate rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
7478
final BlockPredicate[] predicates = new BlockPredicate[this.predicates.length];
7579
for (int i = 0; i < predicates.length; i++) {
76-
predicates[i] = this.predicates[i].rewrite(blockIdRewriter);
80+
predicates[i] = this.predicates[i].rewrite(connection, protocol, clientbound);
7781
}
7882
return new AdventureModePredicate(predicates, showInTooltip);
7983
}

api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/ArmorTrim.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,15 @@
2222
*/
2323
package com.viaversion.viaversion.api.minecraft.item.data;
2424

25+
import com.viaversion.viaversion.api.connection.UserConnection;
2526
import com.viaversion.viaversion.api.minecraft.Holder;
27+
import com.viaversion.viaversion.api.protocol.Protocol;
2628
import com.viaversion.viaversion.api.type.Type;
29+
import com.viaversion.viaversion.util.Rewritable;
2730
import io.netty.buffer.ByteBuf;
28-
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
2931

30-
public record ArmorTrim(Holder<ArmorTrimMaterial> material, Holder<ArmorTrimPattern> pattern, boolean showInTooltip) {
32+
public record ArmorTrim(Holder<ArmorTrimMaterial> material, Holder<ArmorTrimPattern> pattern,
33+
boolean showInTooltip) implements Rewritable {
3134

3235
public ArmorTrim(Holder<ArmorTrimMaterial> material, Holder<ArmorTrimPattern> pattern) {
3336
this(material, pattern, true);
@@ -96,15 +99,16 @@ public void write(final ByteBuf buffer, final ArmorTrim value) {
9699
}
97100
};
98101

99-
public ArmorTrim rewrite(final Int2IntFunction idRewriteFunction) {
102+
@Override
103+
public ArmorTrim rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
100104
Holder<ArmorTrimMaterial> material = this.material;
101105
if (material.isDirect()) {
102-
material = Holder.of(material.value().rewrite(idRewriteFunction));
106+
material = Holder.of(material.value().rewrite(connection, protocol, clientbound));
103107
}
104108

105109
Holder<ArmorTrimPattern> pattern = this.pattern;
106110
if (pattern.isDirect()) {
107-
pattern = Holder.of(pattern.value().rewrite(idRewriteFunction));
111+
pattern = Holder.of(pattern.value().rewrite(connection, protocol, clientbound));
108112
}
109113
return new ArmorTrim(material, pattern, showInTooltip);
110114
}

api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/ArmorTrimMaterial.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,19 @@
2323
package com.viaversion.viaversion.api.minecraft.item.data;
2424

2525
import com.viaversion.nbt.tag.Tag;
26+
import com.viaversion.viaversion.api.connection.UserConnection;
27+
import com.viaversion.viaversion.api.protocol.Protocol;
2628
import com.viaversion.viaversion.api.type.Types;
2729
import com.viaversion.viaversion.api.type.types.misc.HolderType;
2830
import com.viaversion.viaversion.util.Copyable;
31+
import com.viaversion.viaversion.util.Rewritable;
2932
import io.netty.buffer.ByteBuf;
30-
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
3133
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
3234
import java.util.Map;
3335

3436
public record ArmorTrimMaterial(String assetName, int itemId, float itemModelIndex,
35-
Map<String, String> overrideArmorMaterials, Tag description) implements Copyable {
37+
Map<String, String> overrideArmorMaterials,
38+
Tag description) implements Copyable, Rewritable {
3639

3740
public ArmorTrimMaterial(final String assetName, final int itemId, final Map<String, String> overrideArmorMaterials, final Tag description) {
3841
this(assetName, itemId, 0F, overrideArmorMaterials, description);
@@ -175,8 +178,9 @@ public void writeDirect(final ByteBuf buffer, final ArmorTrimMaterial value) {
175178
}
176179
};
177180

178-
public ArmorTrimMaterial rewrite(final Int2IntFunction idRewriteFunction) {
179-
return new ArmorTrimMaterial(assetName, idRewriteFunction.applyAsInt(itemId), itemModelIndex, overrideArmorMaterials, description);
181+
@Override
182+
public ArmorTrimMaterial rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
183+
return new ArmorTrimMaterial(assetName, Rewritable.rewriteItem(protocol, clientbound, itemId), itemModelIndex, overrideArmorMaterials, description);
180184
}
181185

182186
@Override

api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/ArmorTrimPattern.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@
2323
package com.viaversion.viaversion.api.minecraft.item.data;
2424

2525
import com.viaversion.nbt.tag.Tag;
26+
import com.viaversion.viaversion.api.connection.UserConnection;
27+
import com.viaversion.viaversion.api.protocol.Protocol;
2628
import com.viaversion.viaversion.api.type.Types;
2729
import com.viaversion.viaversion.api.type.types.misc.HolderType;
2830
import com.viaversion.viaversion.util.Copyable;
31+
import com.viaversion.viaversion.util.Rewritable;
2932
import io.netty.buffer.ByteBuf;
30-
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
3133

32-
public record ArmorTrimPattern(String assetName, int itemId, Tag description, boolean decal) implements Copyable {
34+
public record ArmorTrimPattern(String assetName, int itemId, Tag description, boolean decal) implements Copyable, Rewritable {
3335

3436
public ArmorTrimPattern(final String assetName, final Tag description, final boolean decal) {
3537
this(assetName, 0, description, decal);
@@ -70,8 +72,9 @@ public void writeDirect(final ByteBuf buffer, final ArmorTrimPattern value) {
7072
}
7173
};
7274

73-
public ArmorTrimPattern rewrite(final Int2IntFunction idRewriteFunction) {
74-
return new ArmorTrimPattern(assetName, idRewriteFunction.applyAsInt(itemId), description, decal);
75+
@Override
76+
public ArmorTrimPattern rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
77+
return new ArmorTrimPattern(assetName, Rewritable.rewriteItem(protocol, clientbound, itemId), description, decal);
7578
}
7679

7780
@Override

api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/BlockPredicate.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,23 @@
2323
package com.viaversion.viaversion.api.minecraft.item.data;
2424

2525
import com.viaversion.nbt.tag.CompoundTag;
26+
import com.viaversion.viaversion.api.connection.UserConnection;
2627
import com.viaversion.viaversion.api.minecraft.HolderSet;
2728
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
2829
import com.viaversion.viaversion.api.minecraft.data.predicate.DataComponentMatchers;
2930
import com.viaversion.viaversion.api.minecraft.data.predicate.DataComponentMatchers.DataComponentMatchersType;
31+
import com.viaversion.viaversion.api.protocol.Protocol;
3032
import com.viaversion.viaversion.api.type.Type;
3133
import com.viaversion.viaversion.api.type.Types;
3234
import com.viaversion.viaversion.api.type.types.ArrayType;
3335
import com.viaversion.viaversion.util.Copyable;
36+
import com.viaversion.viaversion.util.Rewritable;
3437
import io.netty.buffer.ByteBuf;
35-
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
3638
import org.checkerframework.checker.nullness.qual.Nullable;
3739

3840
public record BlockPredicate(@Nullable HolderSet holderSet, StatePropertyMatcher @Nullable [] propertyMatchers,
39-
@Nullable CompoundTag tag, DataComponentMatchers dataMatchers) implements Copyable {
41+
@Nullable CompoundTag tag,
42+
DataComponentMatchers dataMatchers) implements Copyable, Rewritable {
4043

4144
public BlockPredicate(@Nullable final HolderSet holderSet, final StatePropertyMatcher @Nullable [] propertyMatchers, @Nullable final CompoundTag tag) {
4245
this(holderSet, propertyMatchers, tag, null);
@@ -96,12 +99,13 @@ public void write(final ByteBuf buffer, final BlockPredicate value) {
9699
}
97100
}
98101

99-
public BlockPredicate rewrite(final Int2IntFunction blockIdRewriter) {
102+
@Override
103+
public BlockPredicate rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
100104
if (holderSet == null || holderSet.hasTagKey()) {
101105
return this;
102106
}
103107

104-
final HolderSet updatedHolders = holderSet.rewrite(blockIdRewriter);
108+
final HolderSet updatedHolders = holderSet.rewrite(Rewritable.blockRewriteFunction(protocol, clientbound));
105109
return new BlockPredicate(updatedHolders, propertyMatchers, tag);
106110
}
107111

api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/Consumable1_21_2.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,20 @@
2222
*/
2323
package com.viaversion.viaversion.api.minecraft.item.data;
2424

25+
import com.viaversion.viaversion.api.connection.UserConnection;
2526
import com.viaversion.viaversion.api.minecraft.Holder;
2627
import com.viaversion.viaversion.api.minecraft.SoundEvent;
28+
import com.viaversion.viaversion.api.protocol.Protocol;
2729
import com.viaversion.viaversion.api.type.Type;
2830
import com.viaversion.viaversion.api.type.Types;
2931
import com.viaversion.viaversion.api.type.types.ArrayType;
3032
import com.viaversion.viaversion.util.Copyable;
33+
import com.viaversion.viaversion.util.Rewritable;
3134
import io.netty.buffer.ByteBuf;
32-
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
3335

3436
public record Consumable1_21_2(float consumeSeconds, int animationType, Holder<SoundEvent> sound,
35-
boolean hasConsumeParticles, ConsumeEffect<?>[] consumeEffects) implements Copyable {
37+
boolean hasConsumeParticles,
38+
ConsumeEffect<?>[] consumeEffects) implements Copyable, Rewritable {
3639

3740
public static final Type<?>[] EFFECT_TYPES = {
3841
ApplyStatusEffects.TYPE,
@@ -111,8 +114,9 @@ public void write(final ByteBuf buffer, final ApplyStatusEffects value) {
111114
};
112115
}
113116

114-
public Consumable1_21_2 rewrite(final Int2IntFunction soundIdRewriteFunction) {
115-
final Holder<SoundEvent> soundHolder = this.sound.updateId(soundIdRewriteFunction);
117+
@Override
118+
public Consumable1_21_2 rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
119+
final Holder<SoundEvent> soundHolder = this.sound.updateId(Rewritable.soundRewriteFunction(protocol, clientbound));
116120
return soundHolder == this.sound ? this : new Consumable1_21_2(consumeSeconds, animationType, soundHolder, hasConsumeParticles, consumeEffects);
117121
}
118122

api/src/main/java/com/viaversion/viaversion/api/minecraft/item/data/Equippable.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,20 @@
2222
*/
2323
package com.viaversion.viaversion.api.minecraft.item.data;
2424

25+
import com.viaversion.viaversion.api.connection.UserConnection;
2526
import com.viaversion.viaversion.api.minecraft.Holder;
2627
import com.viaversion.viaversion.api.minecraft.HolderSet;
2728
import com.viaversion.viaversion.api.minecraft.SoundEvent;
29+
import com.viaversion.viaversion.api.protocol.Protocol;
2830
import com.viaversion.viaversion.api.type.Type;
2931
import com.viaversion.viaversion.api.type.Types;
32+
import com.viaversion.viaversion.util.Rewritable;
3033
import io.netty.buffer.ByteBuf;
31-
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
3234
import org.checkerframework.checker.nullness.qual.Nullable;
3335

3436
public record Equippable(int equipmentSlot, Holder<SoundEvent> soundEvent, @Nullable String model,
3537
@Nullable String cameraOverlay, @Nullable HolderSet allowedEntities, boolean dispensable,
36-
boolean swappable, boolean damageOnHurt, boolean equipOnInteract) {
38+
boolean swappable, boolean damageOnHurt, boolean equipOnInteract) implements Rewritable {
3739

3840
public Equippable(final int equipmentSlot, final Holder<SoundEvent> soundEvent, @Nullable final String model, @Nullable final String cameraOverlay,
3941
@Nullable final HolderSet allowedEntities, final boolean dispensable, final boolean swappable, final boolean damageOnHurt) {
@@ -95,8 +97,9 @@ public void write(final ByteBuf buffer, final Equippable value) {
9597
}
9698
};
9799

98-
public Equippable rewrite(final Int2IntFunction soundIdRewriter) {
99-
final Holder<SoundEvent> soundEvent = this.soundEvent.updateId(soundIdRewriter);
100+
@Override
101+
public Equippable rewrite(final UserConnection connection, final Protocol<?, ?, ?, ?> protocol, final boolean clientbound) {
102+
final Holder<SoundEvent> soundEvent = this.soundEvent.updateId(Rewritable.soundRewriteFunction(protocol, clientbound));
100103
return soundEvent == this.soundEvent ? this : new Equippable(equipmentSlot, soundEvent, model, cameraOverlay, allowedEntities, dispensable, swappable, damageOnHurt, equipOnInteract);
101104
}
102105
}

0 commit comments

Comments
 (0)