From 215cbc631077ec8e352f5ddc67f8b50f59a9fd50 Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Wed, 27 Sep 2023 11:30:35 +1000 Subject: [PATCH] Fix 1.20.2 custom potion effect handling Fixes #3448 --- .../BlockItemPacketRewriter1_20_2.java | 171 ++++++++++++------ .../util/PotionEffects.java | 83 +++++++++ 2 files changed, 198 insertions(+), 56 deletions(-) create mode 100644 common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/util/PotionEffects.java diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/BlockItemPacketRewriter1_20_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/BlockItemPacketRewriter1_20_2.java index 572f0db3c..478958e0d 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/BlockItemPacketRewriter1_20_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/rewriter/BlockItemPacketRewriter1_20_2.java @@ -19,7 +19,10 @@ package com.viaversion.viaversion.protocols.protocol1_20_2to1_20.rewriter; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.NumberTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.viaversion.viaversion.api.data.ParticleMappings; import com.viaversion.viaversion.api.data.entity.EntityTracker; import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity; @@ -38,51 +41,14 @@ import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.rewriter.Recip import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.Protocol1_20_2To1_20; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundPackets1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.type.ChunkType1_20_2; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.util.PotionEffects; import com.viaversion.viaversion.rewriter.BlockRewriter; import com.viaversion.viaversion.rewriter.ItemRewriter; -import com.viaversion.viaversion.util.Key; import com.viaversion.viaversion.util.MathUtil; import org.checkerframework.checker.nullness.qual.Nullable; public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter { - public static final String[] POTION_EFFECTS = { - "", // No effect - "speed", - "slowness", - "haste", - "mining_fatigue", - "strength", - "instant_health", - "instant_damage", - "jump_boost", - "nausea", - "regeneration", - "resistance", - "fire_resistance", - "water_breathing", - "invisibility", - "blindness", - "night_vision", - "hunger", - "weakness", - "poison", - "wither", - "health_boost", - "absorption", - "saturation", - "glowing", - "levitation", - "luck", - "unluck", - "slow_falling", - "conduit_power", - "dolphins_grace", - "bad_omen", - "hero_of_the_village", - "darkness" - }; - public BlockItemPacketRewriter1_20_2(final Protocol1_20_2To1_20 protocol) { super(protocol); } @@ -151,8 +117,12 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter { - wrapper.write(Type.ITEM1_20_2_VAR_INT_ARRAY, wrapper.read(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT)); // Items - wrapper.write(Type.ITEM1_20_2, wrapper.read(Type.FLAT_VAR_INT_ITEM)); // Carried item + final Item[] items = wrapper.read(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT); + for (final Item item : items) { + handleItemToClient(item); + } + wrapper.write(Type.ITEM1_20_2_VAR_INT_ARRAY, items); + wrapper.write(Type.ITEM1_20_2, handleItemToClient(wrapper.read(Type.FLAT_VAR_INT_ITEM))); // Carried item }); } }); @@ -162,7 +132,7 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter wrapper.write(Type.ITEM1_20_2, handleItemToClient(wrapper.read(Type.FLAT_VAR_INT_ITEM)))); } }); protocol.registerClientbound(ClientboundPackets1_19_4.ADVANCEMENTS, wrapper -> { @@ -179,7 +149,7 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter wrapper.write(Type.FLAT_VAR_INT_ITEM, handleItemToServer(wrapper.read(Type.ITEM1_20_2)))); // 1 - Clicked Item } }); protocol.registerClientbound(ClientboundPackets1_19_4.SPAWN_PARTICLE, new PacketHandlers() { @@ -280,7 +250,7 @@ public final class BlockItemPacketRewriter1_20_2 extends ItemRewriter= 1 && id < POTION_EFFECTS.length ? Key.namespaced(POTION_EFFECTS[id]) : "minecraft:luck"; - } } \ No newline at end of file diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/util/PotionEffects.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/util/PotionEffects.java new file mode 100644 index 000000000..5291305b7 --- /dev/null +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/util/PotionEffects.java @@ -0,0 +1,83 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2023 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.viaversion.viaversion.protocols.protocol1_20_2to1_20.util; + +import com.viaversion.viaversion.util.Key; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import org.checkerframework.checker.nullness.qual.Nullable; + +public final class PotionEffects { + + private static final Object2IntMap KEY_TO_ID = new Object2IntOpenHashMap<>(); + private static final String[] POTION_EFFECTS = { + "", // No effect + "speed", + "slowness", + "haste", + "mining_fatigue", + "strength", + "instant_health", + "instant_damage", + "jump_boost", + "nausea", + "regeneration", + "resistance", + "fire_resistance", + "water_breathing", + "invisibility", + "blindness", + "night_vision", + "hunger", + "weakness", + "poison", + "wither", + "health_boost", + "absorption", + "saturation", + "glowing", + "levitation", + "luck", + "unluck", + "slow_falling", + "conduit_power", + "dolphins_grace", + "bad_omen", + "hero_of_the_village", + "darkness" + }; + + static { + for (int i = 1; i < POTION_EFFECTS.length; i++) { + final String effect = POTION_EFFECTS[i]; + KEY_TO_ID.put(effect, i); + } + } + + public static @Nullable String idToKey(final int id) { + return id >= 1 && id < POTION_EFFECTS.length ? Key.namespaced(POTION_EFFECTS[id]) : null; + } + + public static String idToKeyOrLuck(final int id) { + return id >= 1 && id < POTION_EFFECTS.length ? Key.namespaced(POTION_EFFECTS[id]) : "minecraft:luck"; + } + + public static int keyToId(final String key) { + return KEY_TO_ID.getInt(Key.stripMinecraftNamespace(key)); + } +}