@@ -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