1919
2020import com .viaversion .nbt .tag .ByteTag ;
2121import com .viaversion .nbt .tag .CompoundTag ;
22+ import com .viaversion .nbt .tag .IntArrayTag ;
2223import com .viaversion .nbt .tag .ListTag ;
2324import com .viaversion .nbt .tag .StringTag ;
2425import com .viaversion .nbt .tag .Tag ;
3940import com .viaversion .viaversion .api .minecraft .item .Item ;
4041import com .viaversion .viaversion .api .minecraft .item .data .Consumable1_21_2 ;
4142import com .viaversion .viaversion .api .minecraft .item .data .DamageResistant ;
43+ import com .viaversion .viaversion .api .minecraft .item .data .Enchantments ;
4244import com .viaversion .viaversion .api .minecraft .item .data .FoodProperties1_20_5 ;
4345import com .viaversion .viaversion .api .minecraft .item .data .FoodProperties1_21_2 ;
4446import com .viaversion .viaversion .api .minecraft .item .data .Instrument1_20_5 ;
6466import com .viaversion .viaversion .util .Key ;
6567import com .viaversion .viaversion .util .TagUtil ;
6668import com .viaversion .viaversion .util .Unit ;
69+ import it .unimi .dsi .fastutil .ints .IntArrayList ;
70+ import it .unimi .dsi .fastutil .ints .IntList ;
6771import java .util .ArrayList ;
6872import java .util .Arrays ;
6973import java .util .Collections ;
@@ -421,10 +425,32 @@ public Item handleItemToClient(final UserConnection connection, final Item item)
421425 // Add data components to fix issues in older protocols
422426 appendItemDataFixComponents (connection , item );
423427
428+ final StructuredDataContainer data = item .dataContainer ();
429+ final Enchantments enchantments = data .get (StructuredDataKey .ENCHANTMENTS );
430+ if (enchantments != null && enchantments .size () != 0 ) {
431+ // Level 0 is no longer allowed
432+ final IntList enchantmentIds = new IntArrayList ();
433+ enchantments .enchantments ().int2IntEntrySet ().removeIf (entry -> {
434+ if (entry .getIntValue () == 0 ) {
435+ enchantmentIds .add (entry .getIntKey ());
436+ return true ;
437+ }
438+ return false ;
439+ });
440+
441+ if (!enchantmentIds .isEmpty ()) {
442+ final IntArrayTag enchantmentIdsTag = new IntArrayTag (enchantmentIds .toIntArray ());
443+ saveTag (createCustomTag (item ), enchantmentIdsTag , "0_enchants" );
444+ }
445+ if (enchantments .size () == 0 && !data .has (StructuredDataKey .ENCHANTMENT_GLINT_OVERRIDE )) {
446+ data .set (StructuredDataKey .ENCHANTMENT_GLINT_OVERRIDE , true );
447+ saveTag (createCustomTag (item ), new ByteTag (true ), "remove_glint" );
448+ }
449+ }
450+
424451 // Item name is now overridden by custom implemented display names (compass, player head, potion, shield, tipped arrow)
425452 final int identifier = item .identifier ();
426453 if (identifier == 952 || identifier == 1147 || identifier == 1039 || identifier == 1203 || identifier == 1200 || identifier == 1204 || identifier == 1202 ) {
427- final StructuredDataContainer data = item .dataContainer ();
428454 final Tag itemName = data .get (StructuredDataKey .ITEM_NAME );
429455 if (itemName != null && !data .has (StructuredDataKey .CUSTOM_NAME )) {
430456 final CompoundTag name = new CompoundTag ();
@@ -450,12 +476,36 @@ public Item handleItemToServer(final UserConnection connection, final Item item)
450476
451477 final StructuredDataContainer dataContainer = item .dataContainer ();
452478 final CompoundTag customData = dataContainer .get (StructuredDataKey .CUSTOM_DATA );
453- if (customData != null && customData .remove (nbtTagName ("remove_custom_name" )) != null ) {
479+ if (customData == null ) {
480+ return item ;
481+ }
482+
483+ if (customData .remove (nbtTagName ("remove_custom_name" )) != null ) {
454484 dataContainer .remove (StructuredDataKey .CUSTOM_NAME );
455485 if (customData .isEmpty ()) {
456486 dataContainer .remove (StructuredDataKey .CUSTOM_DATA );
457487 }
458488 }
489+
490+ final IntArrayTag emptyEnchantments = customData .getIntArrayTag (nbtTagName ("0_enchants" ));
491+ if (emptyEnchantments != null ) {
492+ Enchantments enchantments = dataContainer .get (StructuredDataKey .ENCHANTMENTS );
493+ if (enchantments == null ) {
494+ enchantments = new Enchantments (true );
495+ dataContainer .set (StructuredDataKey .ENCHANTMENTS , enchantments );
496+ }
497+ for (final int enchantmentId : emptyEnchantments .getValue ()) {
498+ enchantments .enchantments ().put (enchantmentId , 0 );
499+ }
500+ customData .remove (nbtTagName ("0_enchants" ));
501+
502+ if (customData .remove (nbtTagName ("remove_glint" )) != null ) {
503+ dataContainer .remove (StructuredDataKey .ENCHANTMENT_GLINT_OVERRIDE );
504+ }
505+ if (customData .isEmpty ()) {
506+ dataContainer .remove (StructuredDataKey .CUSTOM_DATA );
507+ }
508+ }
459509 return item ;
460510 }
461511
0 commit comments