1717
1818package com .comphenix .protocol .wrappers .nbt ;
1919
20+ import com .comphenix .protocol .utility .MinecraftVersion ;
2021import com .comphenix .protocol .wrappers .collection .ConvertedList ;
2122import com .comphenix .protocol .wrappers .nbt .io .NbtBinarySerializer ;
2223import com .google .common .base .Joiner ;
@@ -103,7 +104,9 @@ public static <T> NbtList<T> fromList(String name, Collection<? extends T> eleme
103104 */
104105 public WrappedList (Object handle ) {
105106 this .container = new WrappedElement <>(handle );
106- this .elementType = container .getSubType ();
107+ if (!MinecraftVersion .v1_21_5 .atOrAbove ()) {
108+ this .elementType = container .getSubType ();
109+ }
107110 }
108111
109112 /**
@@ -113,7 +116,9 @@ public WrappedList(Object handle) {
113116 */
114117 public WrappedList (Object handle , String name ) {
115118 this .container = new WrappedElement <>(handle , name );
116- this .elementType = container .getSubType ();
119+ if (!MinecraftVersion .v1_21_5 .atOrAbove ()) {
120+ this .elementType = container .getSubType ();
121+ }
117122 }
118123
119124 @ Override
@@ -141,13 +146,28 @@ public NbtType getType() {
141146
142147 @ Override
143148 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+ }
145163 }
146164
147165 @ Override
148166 public void setElementType (NbtType type ) {
149167 this .elementType = type ;
150- container .setSubType (type );
168+ if (!MinecraftVersion .v1_21_5 .atOrAbove ()) {
169+ container .setSubType (type );
170+ }
151171 }
152172
153173 @ Override
@@ -171,14 +191,16 @@ private void verifyElement(NbtBase<TType> element) {
171191 if (!element .getName ().equals (EMPTY_NAME ))
172192 throw new IllegalArgumentException ("Cannot add a the named NBT tag " + element + " to a list." );
173193
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 ());
179203 }
180- } else {
181- container .setSubType (element .getType ());
182204 }
183205 }
184206
@@ -235,16 +257,21 @@ public NbtBase<List<NbtBase<TType>>> deepClone() {
235257 }
236258
237259 @ Override
238- @ SuppressWarnings ("unchecked" )
239260 public void addClosest (Object value ) {
240- if (getElementType () == NbtType .TAG_END )
261+ if (elementType == NbtType .TAG_END )
241262 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 ) {
243270 if (value instanceof Number ) {
244271 Number number = (Number ) value ;
245272
246273 // Convert the number
247- switch (getElementType () ) {
274+ switch (type ) {
248275 case TAG_BYTE : add (number .byteValue ()); break ;
249276 case TAG_SHORT : add (number .shortValue ()); break ;
250277 case TAG_INT : add (number .intValue ()); break ;
@@ -262,7 +289,7 @@ public void addClosest(Object value) {
262289
263290 } else {
264291 // Just add it
265- add ((NbtBase <TType >) NbtFactory .ofWrapper (getElementType () , EMPTY_NAME , value ));
292+ add ((NbtBase <TType >) NbtFactory .ofWrapper (type , EMPTY_NAME , value ));
266293 }
267294 }
268295
@@ -355,7 +382,7 @@ public void setValue(List<NbtBase<TType>> newValue) {
355382 }
356383
357384 // Update the sub type as well
358- if (lastElement != null ) {
385+ if (lastElement != null && ! MinecraftVersion . v1_21_5 . atOrAbove () ) {
359386 container .setSubType (lastElement .getType ());
360387 }
361388 }
0 commit comments