Skip to content

Commit 0f408a5

Browse files
committed
Bug fixes.
1 parent 2cba052 commit 0f408a5

5 files changed

Lines changed: 158 additions & 121 deletions

File tree

api/src/main/java/kr/toxicity/libraries/datacomponent/api/wrapper/CompoundTag.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,9 @@
44

55
import java.util.Map;
66

7-
public record CompoundTag(@NotNull Map<String, Tag<?>> tags) {
7+
public record CompoundTag(@NotNull Map<String, Tag<?>> tags) implements Tag<CompoundTag> {
8+
@Override
9+
public CompoundTag value() {
10+
return this;
11+
}
812
}
Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,5 @@
11
package kr.toxicity.libraries.datacomponent.api.wrapper;
22

3-
import org.jetbrains.annotations.NotNull;
4-
5-
import java.util.UUID;
6-
7-
public record Tag<T>(@NotNull Type<T> type, @NotNull T value) {
8-
9-
public static final Type<Byte> BYTE = new Type<>(Byte.class);
10-
public static final Type<Short> SHORT = new Type<>(Short.class);
11-
public static final Type<Integer> INT = new Type<>(Integer.class);
12-
public static final Type<Long> LONG = new Type<>(Long.class);
13-
public static final Type<UUID> UUID = new Type<>(UUID.class);
14-
public static final Type<Float> FLOAT = new Type<>(Float.class);
15-
public static final Type<String> STRING = new Type<>(String.class);
16-
public static final Type<Double> DOUBLE = new Type<>(Double.class);
17-
18-
public static final Type<byte[]> BYTE_ARRAY = new Type<>(byte[].class);
19-
public static final Type<int[]> INT_ARRAY = new Type<>(int[].class);
20-
public static final Type<long[]> LONG_ARRAY = new Type<>(long[].class);
21-
22-
public record Type<T>(@NotNull Class<T> valueType) {
23-
}
3+
public interface Tag<T> {
4+
T value();
245
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package kr.toxicity.libraries.datacomponent.api.wrapper;
2+
3+
public enum UnitTag implements Tag<Unit> {
4+
INSTANCE
5+
;
6+
7+
@Override
8+
public Unit value() {
9+
return Unit.INSTANCE;
10+
}
11+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package kr.toxicity.libraries.datacomponent.api.wrapper;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
5+
import java.util.List;
6+
import java.util.UUID;
7+
8+
public record ValueTag<T>(@NotNull Type<T> type, T value) implements Tag<T> {
9+
10+
public static final Type<Byte> BYTE = new Type<>(Byte.class);
11+
public static final Type<Short> SHORT = new Type<>(Short.class);
12+
public static final Type<Integer> INT = new Type<>(Integer.class);
13+
public static final Type<Long> LONG = new Type<>(Long.class);
14+
public static final Type<java.util.UUID> UUID = new Type<>(UUID.class);
15+
public static final Type<Float> FLOAT = new Type<>(Float.class);
16+
public static final Type<String> STRING = new Type<>(String.class);
17+
public static final Type<Double> DOUBLE = new Type<>(Double.class);
18+
19+
public static final Type<byte[]> BYTE_ARRAY = new Type<>(byte[].class);
20+
public static final Type<int[]> INT_ARRAY = new Type<>(int[].class);
21+
public static final Type<long[]> LONG_ARRAY = new Type<>(long[].class);
22+
@SuppressWarnings("unchecked")
23+
public static final Type<List<Tag<?>>> LIST = (Type<List<Tag<?>>>) new Type(List.class);
24+
25+
public record Type<T>(@NotNull Class<T> valueType) {
26+
}
27+
}

nms/v1_20_R4/src/main/java/kr/toxicity/libraries/datacomponent/nms/v1_20_R4/Converters.java

Lines changed: 113 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -30,137 +30,166 @@ final class Converters {
3030
PaperAdventure::asVanilla,
3131
PaperAdventure::asAdventure
3232
);
33-
private static final Converter<Tag<?>, net.minecraft.nbt.Tag> TAG = Converter.of(
34-
t -> {
35-
var object = t.value();
36-
if (object instanceof Byte value) return ByteTag.valueOf(value);
37-
if (object instanceof Short value) return ShortTag.valueOf(value);
38-
if (object instanceof Integer value) return IntTag.valueOf(value);
39-
if (object instanceof Long value) return LongTag.valueOf(value);
40-
if (object instanceof UUID value) return NbtUtils.createUUID(value);
41-
if (object instanceof Float value) return FloatTag.valueOf(value);
42-
if (object instanceof Double value) return DoubleTag.valueOf(value);
43-
if (object instanceof String value) return StringTag.valueOf(value);
44-
if (object instanceof byte[] value) return new ByteArrayTag(value);
45-
if (object instanceof int[] value) return new IntArrayTag(value);
46-
if (object instanceof long[] value) return new LongArrayTag(value);
47-
throw new UnsupportedOperationException("unsupported type.");
48-
},
49-
t -> {
50-
var getter = new TagValueGetter();
51-
t.accept(getter);
52-
var object = getter.object;
53-
if (object instanceof Byte value) return new Tag<>(Tag.BYTE, value);
54-
if (object instanceof Short value) return new Tag<>(Tag.SHORT, value);
55-
if (object instanceof Integer value) return new Tag<>(Tag.INT, value);
56-
if (object instanceof Long value) return new Tag<>(Tag.LONG, value);
57-
if (object instanceof UUID value) return new Tag<>(Tag.UUID, value);
58-
if (object instanceof Float value) return new Tag<>(Tag.FLOAT, value);
59-
if (object instanceof Double value) return new Tag<>(Tag.DOUBLE, value);
60-
if (object instanceof String value) return new Tag<>(Tag.STRING, value);
61-
if (object instanceof byte[] value) return new Tag<>(Tag.BYTE_ARRAY, value);
62-
if (object instanceof int[] value) return new Tag<>(Tag.INT_ARRAY, value);
63-
if (object instanceof long[] value) return new Tag<>(Tag.LONG_ARRAY, value);
64-
throw new UnsupportedOperationException("unsupported type.");
65-
}
66-
);
6733

6834
@SuppressWarnings("all")
69-
private static class TagValueGetter implements StreamTagVisitor {
35+
private static class TagValueGetter implements TagVisitor {
36+
7037
private Object object;
71-
@Override
72-
public ValueResult visitEnd() {
73-
return ValueResult.BREAK;
74-
}
7538

7639
@Override
77-
public ValueResult visit(String value) {
78-
object = value;
79-
return ValueResult.BREAK;
40+
public void visitString(StringTag element) {
41+
object = element.getAsString();
8042
}
8143

8244
@Override
83-
public ValueResult visit(byte value) {
84-
object = value;
85-
return ValueResult.BREAK;
86-
}
45+
public void visitByte(ByteTag element) {
46+
object = element.getAsByte();
8747

88-
@Override
89-
public ValueResult visit(short value) {
90-
object = value;
91-
return ValueResult.BREAK;
9248
}
9349

9450
@Override
95-
public ValueResult visit(int value) {
96-
object = value;
97-
return ValueResult.BREAK;
51+
public void visitShort(ShortTag element) {
52+
object = element.getAsShort();
53+
9854
}
9955

10056
@Override
101-
public ValueResult visit(long value) {
102-
object = value;
103-
return ValueResult.BREAK;
57+
public void visitInt(IntTag element) {
58+
object = element.getAsInt();
59+
10460
}
10561

10662
@Override
107-
public ValueResult visit(float value) {
108-
object = value;
109-
return ValueResult.BREAK;
63+
public void visitLong(LongTag element) {
64+
object = element.getAsLong();
65+
11066
}
11167

11268
@Override
113-
public ValueResult visit(double value) {
114-
object = value;
115-
return ValueResult.BREAK;
69+
public void visitFloat(FloatTag element) {
70+
object = element.getAsFloat();
71+
11672
}
11773

11874
@Override
119-
public ValueResult visit(byte[] value) {
120-
object = value;
121-
return ValueResult.BREAK;
75+
public void visitDouble(DoubleTag element) {
76+
object = element.getAsDouble();
12277
}
12378

12479
@Override
125-
public ValueResult visit(int[] value) {
126-
object = value;
127-
return ValueResult.BREAK;
80+
public void visitByteArray(ByteArrayTag element) {
81+
object = element.getAsByteArray();
12882
}
12983

13084
@Override
131-
public ValueResult visit(long[] value) {
132-
object = value;
133-
return ValueResult.BREAK;
85+
public void visitIntArray(IntArrayTag element) {
86+
object = element.getAsIntArray();
13487
}
13588

13689
@Override
137-
public ValueResult visitList(TagType<?> entryType, int length) {
138-
return ValueResult.BREAK;
90+
public void visitLongArray(LongArrayTag element) {
91+
object = element.getAsLongArray();
13992
}
14093

14194
@Override
142-
public EntryResult visitEntry(TagType<?> type) {
143-
return EntryResult.BREAK;
95+
public void visitList(ListTag element) {
96+
var list = new ArrayList<>();
97+
element.stream().forEach(t -> {
98+
var visitor = new TagValueGetter();
99+
t.accept(visitor);
100+
list.add(visitor.object);
101+
});
102+
object = list;
144103
}
145104

146105
@Override
147-
public EntryResult visitEntry(TagType<?> type, String key) {
148-
return EntryResult.BREAK;
106+
public void visitCompound(net.minecraft.nbt.CompoundTag compound) {
107+
object = compound;
149108
}
150109

151110
@Override
152-
public EntryResult visitElement(TagType<?> type, int index) {
153-
return EntryResult.BREAK;
111+
public void visitEnd(EndTag element) {
112+
object = element;
154113
}
155-
114+
}
115+
static final Converter<CompoundTag, net.minecraft.nbt.CompoundTag> COMPOUND_TAG = new CompoundTagConverter();
116+
private static class CompoundTagConverter implements Converter<CompoundTag, net.minecraft.nbt.CompoundTag> {
117+
private Tag<?> convert(net.minecraft.nbt.Tag tag) {
118+
var getter = new TagValueGetter();
119+
tag.accept(getter);
120+
var object = getter.object;
121+
if (object instanceof Byte value) return new ValueTag<>(ValueTag.BYTE, value);
122+
if (object instanceof Short value) return new ValueTag<>(ValueTag.SHORT, value);
123+
if (object instanceof Integer value) return new ValueTag<>(ValueTag.INT, value);
124+
if (object instanceof Long value) return new ValueTag<>(ValueTag.LONG, value);
125+
if (object instanceof UUID value) return new ValueTag<>(ValueTag.UUID, value);
126+
if (object instanceof Float value) return new ValueTag<>(ValueTag.FLOAT, value);
127+
if (object instanceof Double value) return new ValueTag<>(ValueTag.DOUBLE, value);
128+
if (object instanceof String value) return new ValueTag<>(ValueTag.STRING, value);
129+
if (object instanceof byte[] value) return new ValueTag<>(ValueTag.BYTE_ARRAY, value);
130+
if (object instanceof int[] value) return new ValueTag<>(ValueTag.INT_ARRAY, value);
131+
if (object instanceof long[] value) return new ValueTag<>(ValueTag.LONG_ARRAY, value);
132+
if (object instanceof List<?> value) {
133+
var list = new ArrayList<Tag<?>>();
134+
for (Object o : value) {
135+
if (o instanceof net.minecraft.nbt.Tag tag1) {
136+
list.add(convert(tag1));
137+
}
138+
}
139+
return new ValueTag<>(ValueTag.LIST, list);
140+
}
141+
if (object instanceof net.minecraft.nbt.CompoundTag tag1) return asWrapper(tag1);
142+
if (object instanceof EndTag) return UnitTag.INSTANCE;
143+
return null;
144+
}
145+
private net.minecraft.nbt.Tag convert(Tag<?> tag) {
146+
var object = tag.value();
147+
if (object instanceof Byte value) return ByteTag.valueOf(value);
148+
if (object instanceof Short value) return ShortTag.valueOf(value);
149+
if (object instanceof Integer value) return IntTag.valueOf(value);
150+
if (object instanceof Long value) return LongTag.valueOf(value);
151+
if (object instanceof UUID value) return NbtUtils.createUUID(value);
152+
if (object instanceof Float value) return FloatTag.valueOf(value);
153+
if (object instanceof Double value) return DoubleTag.valueOf(value);
154+
if (object instanceof String value) return StringTag.valueOf(value);
155+
if (object instanceof byte[] value) return new ByteArrayTag(value);
156+
if (object instanceof int[] value) return new IntArrayTag(value);
157+
if (object instanceof long[] value) return new LongArrayTag(value);
158+
if (object instanceof List<?> value) {
159+
var list = new ArrayList<net.minecraft.nbt.Tag>();
160+
for (Object o : value) {
161+
if (o instanceof Tag<?> tag1) {
162+
list.add(convert(tag1));
163+
}
164+
}
165+
return new ListTag(list, (byte) 0);
166+
}
167+
if (object instanceof CompoundTag tag1) {
168+
System.out.println(tag1);
169+
return asVanilla(tag1);
170+
}
171+
if (object instanceof UnitTag) return EndTag.INSTANCE;
172+
return null;
173+
}
174+
@NotNull
156175
@Override
157-
public ValueResult visitContainerEnd() {
158-
return ValueResult.BREAK;
176+
public net.minecraft.nbt.CompoundTag asVanilla(@NotNull CompoundTag tag) {
177+
var newTag = new net.minecraft.nbt.CompoundTag();
178+
tag.tags().forEach((k, v) -> {
179+
var get = convert(v);
180+
if (get != null) newTag.put(k, get);
181+
});
182+
return newTag;
159183
}
160184

161185
@Override
162-
public ValueResult visitRootEntry(TagType<?> rootType) {
163-
return ValueResult.BREAK;
186+
public @NotNull CompoundTag asWrapper(net.minecraft.nbt.@NotNull CompoundTag compoundTag) {
187+
var map = new HashMap<String, Tag<?>>();
188+
compoundTag.getAllKeys().forEach(k -> {
189+
var get = compoundTag.get(k);
190+
if (get != null) map.put(k, convert(get));
191+
});
192+
return new CompoundTag(map);
164193
}
165194
}
166195

@@ -367,21 +396,6 @@ public net.minecraft.world.effect.MobEffectInstance asVanilla(@NotNull MobEffect
367396
t.damagePerBlock()
368397
)
369398
);
370-
static final Converter<CompoundTag, net.minecraft.nbt.CompoundTag> COMPOUND_TAG = Converter.of(
371-
t -> {
372-
var tag = new net.minecraft.nbt.CompoundTag();
373-
t.tags().forEach((k, v) -> tag.put(k, TAG.asVanilla(v)));
374-
return tag;
375-
},
376-
t -> {
377-
var map = new HashMap<String, Tag<?>>();
378-
t.getAllKeys().forEach(k -> {
379-
var get = t.get(k);
380-
if (get != null) map.put(k, TAG.asWrapper(get));
381-
});
382-
return new CompoundTag(map);
383-
}
384-
);
385399
static final Converter<DyedItemColor, net.minecraft.world.item.component.DyedItemColor> DYED_ITEM_COLOR = Converter.of(
386400
d -> new net.minecraft.world.item.component.DyedItemColor(d.rgb(), d.showInTooltip()),
387401
d -> new DyedItemColor(d.rgb(), d.showInTooltip())

0 commit comments

Comments
 (0)