Skip to content

Commit 5278f8b

Browse files
committed
Remove enchantments with level 0 in 1.21->1.21.2
1 parent 8fdae33 commit 5278f8b

File tree

3 files changed

+67
-2
lines changed

3 files changed

+67
-2
lines changed

common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/BlockItemPacketRewriter1_21_2.java

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.viaversion.nbt.tag.ByteTag;
2121
import com.viaversion.nbt.tag.CompoundTag;
22+
import com.viaversion.nbt.tag.IntArrayTag;
2223
import com.viaversion.nbt.tag.ListTag;
2324
import com.viaversion.nbt.tag.StringTag;
2425
import com.viaversion.nbt.tag.Tag;
@@ -39,6 +40,7 @@
3940
import com.viaversion.viaversion.api.minecraft.item.Item;
4041
import com.viaversion.viaversion.api.minecraft.item.data.Consumable1_21_2;
4142
import com.viaversion.viaversion.api.minecraft.item.data.DamageResistant;
43+
import com.viaversion.viaversion.api.minecraft.item.data.Enchantments;
4244
import com.viaversion.viaversion.api.minecraft.item.data.FoodProperties1_20_5;
4345
import com.viaversion.viaversion.api.minecraft.item.data.FoodProperties1_21_2;
4446
import com.viaversion.viaversion.api.minecraft.item.data.Instrument1_20_5;
@@ -64,6 +66,8 @@
6466
import com.viaversion.viaversion.util.Key;
6567
import com.viaversion.viaversion.util.TagUtil;
6668
import com.viaversion.viaversion.util.Unit;
69+
import it.unimi.dsi.fastutil.ints.IntArrayList;
70+
import it.unimi.dsi.fastutil.ints.IntList;
6771
import java.util.ArrayList;
6872
import java.util.Arrays;
6973
import 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

common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/ComponentRewriter1_21_2.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.viaversion.nbt.tag.CompoundTag;
2121
import com.viaversion.nbt.tag.ListTag;
22+
import com.viaversion.nbt.tag.NumberTag;
2223
import com.viaversion.nbt.tag.StringTag;
2324
import com.viaversion.nbt.tag.Tag;
2425
import com.viaversion.viaversion.api.connection.UserConnection;
@@ -62,6 +63,13 @@ protected void handleShowItem(final UserConnection connection, final CompoundTag
6263
food.remove("effects");
6364
}
6465

66+
67+
final CompoundTag enchantments = TagUtil.getNamespacedCompoundTag(componentsTag, "enchantments");
68+
if (enchantments != null) {
69+
final CompoundTag levels = enchantments.getCompoundTag("levels");
70+
levels.entrySet().removeIf(entry -> ((NumberTag) entry.getValue()).asInt() == 0);
71+
}
72+
6573
TagUtil.removeNamespaced(componentsTag, "fire_resistant");
6674
TagUtil.removeNamespaced(componentsTag, "lock");
6775

common/src/main/java/com/viaversion/viaversion/util/TagUtil.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
*/
1818
package com.viaversion.viaversion.util;
1919

20+
import com.viaversion.nbt.tag.ByteTag;
2021
import com.viaversion.nbt.tag.CompoundTag;
2122
import com.viaversion.nbt.tag.ListTag;
23+
import com.viaversion.nbt.tag.NumberTag;
2224
import com.viaversion.nbt.tag.StringTag;
2325
import com.viaversion.nbt.tag.Tag;
2426
import java.util.Map;
@@ -79,6 +81,11 @@ public static boolean containsNamespaced(final CompoundTag tag, final String key
7981
return stringTag != null ? stringTag : tag.getStringTag(Key.stripMinecraftNamespace(key));
8082
}
8183

84+
public static @Nullable NumberTag getNamespacedNumberTag(final CompoundTag tag, final String key) {
85+
final NumberTag numberTag = tag.getNumberTag(Key.namespaced(key));
86+
return numberTag != null ? numberTag : tag.getNumberTag(Key.stripMinecraftNamespace(key));
87+
}
88+
8289
public static Tag handleDeep(final Tag tag, final TagUpdater consumer) {
8390
return handleDeep(null, tag, consumer);
8491
}

0 commit comments

Comments
 (0)