17
17
18
18
package com .comphenix .protocol .wrappers .nbt ;
19
19
20
+ import com .comphenix .protocol .utility .MinecraftVersion ;
20
21
import com .comphenix .protocol .wrappers .collection .ConvertedList ;
21
22
import com .comphenix .protocol .wrappers .nbt .io .NbtBinarySerializer ;
22
23
import com .google .common .base .Joiner ;
@@ -103,7 +104,9 @@ public static <T> NbtList<T> fromList(String name, Collection<? extends T> eleme
103
104
*/
104
105
public WrappedList (Object handle ) {
105
106
this .container = new WrappedElement <>(handle );
106
- this .elementType = container .getSubType ();
107
+ if (!MinecraftVersion .v1_21_5 .atOrAbove ()) {
108
+ this .elementType = container .getSubType ();
109
+ }
107
110
}
108
111
109
112
/**
@@ -113,7 +116,9 @@ public WrappedList(Object handle) {
113
116
*/
114
117
public WrappedList (Object handle , String name ) {
115
118
this .container = new WrappedElement <>(handle , name );
116
- this .elementType = container .getSubType ();
119
+ if (!MinecraftVersion .v1_21_5 .atOrAbove ()) {
120
+ this .elementType = container .getSubType ();
121
+ }
117
122
}
118
123
119
124
@ Override
@@ -141,13 +146,28 @@ public NbtType getType() {
141
146
142
147
@ Override
143
148
public NbtType getElementType () {
144
- return elementType ;
149
+ if (!MinecraftVersion .v1_21_5 .atOrAbove ()) {
150
+ return elementType ;
151
+ } else {
152
+ List <NbtBase <TType >> value = getValue ();
153
+ NbtType type = NbtType .TAG_END ;
154
+ for (NbtBase <TType > entry : value ) {
155
+ if (type == NbtType .TAG_END ) {
156
+ type = entry .getType ();
157
+ } else if (type != entry .getType ()) {
158
+ return NbtType .TAG_COMPOUND ;
159
+ }
160
+ }
161
+ return type ;
162
+ }
145
163
}
146
164
147
165
@ Override
148
166
public void setElementType (NbtType type ) {
149
167
this .elementType = type ;
150
- container .setSubType (type );
168
+ if (!MinecraftVersion .v1_21_5 .atOrAbove ()) {
169
+ container .setSubType (type );
170
+ }
151
171
}
152
172
153
173
@ Override
@@ -171,14 +191,16 @@ private void verifyElement(NbtBase<TType> element) {
171
191
if (!element .getName ().equals (EMPTY_NAME ))
172
192
throw new IllegalArgumentException ("Cannot add a the named NBT tag " + element + " to a list." );
173
193
174
- // Check element type
175
- if (getElementType () != NbtType .TAG_END ) {
176
- if (!element .getType ().equals (getElementType ())) {
177
- throw new IllegalArgumentException (
178
- "Cannot add " + element + " of " + element .getType () + " to a list of type " + getElementType ());
194
+ if (!MinecraftVersion .v1_21_5 .atOrAbove ()) {
195
+ // Check element type
196
+ if (getElementType () != NbtType .TAG_END ) {
197
+ if (!element .getType ().equals (getElementType ())) {
198
+ throw new IllegalArgumentException (
199
+ "Cannot add " + element + " of " + element .getType () + " to a list of type " + getElementType ());
200
+ }
201
+ } else {
202
+ container .setSubType (element .getType ());
179
203
}
180
- } else {
181
- container .setSubType (element .getType ());
182
204
}
183
205
}
184
206
@@ -235,16 +257,21 @@ public NbtBase<List<NbtBase<TType>>> deepClone() {
235
257
}
236
258
237
259
@ Override
238
- @ SuppressWarnings ("unchecked" )
239
260
public void addClosest (Object value ) {
240
- if (getElementType () == NbtType .TAG_END )
261
+ if (elementType == NbtType .TAG_END )
241
262
throw new IllegalStateException ("This list has not been typed yet." );
242
-
263
+
264
+ addClosest (value , elementType );
265
+ }
266
+
267
+ @ Override
268
+ @ SuppressWarnings ("unchecked" )
269
+ public void addClosest (Object value , NbtType type ) {
243
270
if (value instanceof Number ) {
244
271
Number number = (Number ) value ;
245
272
246
273
// Convert the number
247
- switch (getElementType () ) {
274
+ switch (type ) {
248
275
case TAG_BYTE : add (number .byteValue ()); break ;
249
276
case TAG_SHORT : add (number .shortValue ()); break ;
250
277
case TAG_INT : add (number .intValue ()); break ;
@@ -262,7 +289,7 @@ public void addClosest(Object value) {
262
289
263
290
} else {
264
291
// Just add it
265
- add ((NbtBase <TType >) NbtFactory .ofWrapper (getElementType () , EMPTY_NAME , value ));
292
+ add ((NbtBase <TType >) NbtFactory .ofWrapper (type , EMPTY_NAME , value ));
266
293
}
267
294
}
268
295
@@ -355,7 +382,7 @@ public void setValue(List<NbtBase<TType>> newValue) {
355
382
}
356
383
357
384
// Update the sub type as well
358
- if (lastElement != null ) {
385
+ if (lastElement != null && ! MinecraftVersion . v1_21_5 . atOrAbove () ) {
359
386
container .setSubType (lastElement .getType ());
360
387
}
361
388
}
0 commit comments