From ea5cf3e5949ea6494e68cbedb759c6cb3094154b Mon Sep 17 00:00:00 2001 From: EnZaXD <60033407+FlorianMichael@users.noreply.github.com> Date: Tue, 16 Apr 2024 15:55:55 +0200 Subject: [PATCH] Add IdAndData util and replace conversions (#3786) --- .../viaversion/viaversion/util/IdAndData.java | 113 ++++++++++++++++++ .../Protocol1_13To1_12_2.java | 7 +- .../packets/InventoryPackets.java | 11 +- .../packets/WorldPackets.java | 3 +- 4 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 api/src/main/java/com/viaversion/viaversion/util/IdAndData.java diff --git a/api/src/main/java/com/viaversion/viaversion/util/IdAndData.java b/api/src/main/java/com/viaversion/viaversion/util/IdAndData.java new file mode 100644 index 000000000..93c7ae0b1 --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/util/IdAndData.java @@ -0,0 +1,113 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2024 ViaVersion and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.viaversion.viaversion.util; + +import com.google.common.base.Preconditions; +import java.util.Objects; + +public class IdAndData { + + private int id; + private byte data; + + public IdAndData(int id) { + this(id, -1); + } + + public IdAndData(int id, int data) { + Preconditions.checkArgument(data >= 0 && data <= 15, "Data has to be between 0 and 15: (id: " + id + " data: " + data + ")"); + this.id = id; + this.data = (byte) data; + } + + public static int getId(final int rawData) { + return rawData >> 4; + } + + public static int getData(final int rawData) { + return rawData & 15; + } + + public static int toRawData(final int id) { + return id << 4; + } + + public static int removeData(final int data) { + return data & ~15; + } + + public static IdAndData fromRawData(final int rawData) { + return new IdAndData(rawData >> 4, rawData & 15); + } + + public static int toRawData(final int id, final int data) { + return (id << 4) | (data & 15); + } + + public int toRawData() { + return toRawData(id, data); + } + + public IdAndData withData(int data) { + return new IdAndData(this.id, data); + } + + public int getId() { + return id; + } + + public void setId(final int id) { + this.id = id; + } + + public byte getData() { + return data; + } + + public void setData(final byte data) { + this.data = data; + } + + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + IdAndData idAndData = (IdAndData) o; + return id == idAndData.id && data == idAndData.data; + } + + @Override + public int hashCode() { + return Objects.hash(id, data); + } + + @Override + public String toString() { + return "IdAndData{" + + "id=" + id + + ", data=" + data + + '}'; + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index 26b312e52..79c2f5484 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -65,6 +65,7 @@ import com.viaversion.viaversion.rewriter.SoundRewriter; import com.viaversion.viaversion.util.ChatColorUtil; import com.viaversion.viaversion.util.ComponentUtil; import com.viaversion.viaversion.util.GsonUtil; +import com.viaversion.viaversion.util.IdAndData; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -317,7 +318,7 @@ public class Protocol1_13To1_12_2 extends AbstractProtocol> 12; - wrapper.set(Type.INT, 1, WorldPackets.toNewId(blockId << 4 | blockData)); + wrapper.set(Type.INT, 1, WorldPackets.toNewId(IdAndData.toRawData(blockId, blockData))); } }); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java index 02a9e4aeb..63d00a667 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java @@ -39,6 +39,7 @@ import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.data.SoundSource import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.data.SpawnEggRewriter; import com.viaversion.viaversion.rewriter.ItemRewriter; import com.viaversion.viaversion.util.ComponentUtil; +import com.viaversion.viaversion.util.IdAndData; import com.viaversion.viaversion.util.Key; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -270,7 +271,7 @@ public class InventoryPackets extends ItemRewriter> 4) << 16 | oldId & 0xF; + rawId = IdAndData.getId(oldId) << 16 | oldId & 0xF; } } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java index 190b8187b..501c5b642 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/packets/WorldPackets.java @@ -45,6 +45,7 @@ import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.data.ParticleRew import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.providers.BlockEntityProvider; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.providers.PaintingProvider; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.storage.BlockStorage; +import com.viaversion.viaversion.util.IdAndData; import com.viaversion.viaversion.util.Key; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; @@ -569,7 +570,7 @@ public class WorldPackets { if (newId != -1) { return newId; } - newId = Protocol1_13To1_12_2.MAPPINGS.getBlockMappings().getNewId(oldId & ~0xF); // Remove data + newId = Protocol1_13To1_12_2.MAPPINGS.getBlockMappings().getNewId(IdAndData.removeData(oldId)); // Remove data if (newId != -1) { if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) { Via.getPlatform().getLogger().warning("Missing block " + oldId);