Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-12-29 01:20:15 +01:00
Add IdAndData util and replace conversions (#3786)
Dieser Commit ist enthalten in:
Ursprung
2586788bf6
Commit
ea5cf3e594
113
api/src/main/java/com/viaversion/viaversion/util/IdAndData.java
Normale Datei
113
api/src/main/java/com/viaversion/viaversion/util/IdAndData.java
Normale Datei
@ -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 +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
@ -65,6 +65,7 @@ import com.viaversion.viaversion.rewriter.SoundRewriter;
|
|||||||
import com.viaversion.viaversion.util.ChatColorUtil;
|
import com.viaversion.viaversion.util.ChatColorUtil;
|
||||||
import com.viaversion.viaversion.util.ComponentUtil;
|
import com.viaversion.viaversion.util.ComponentUtil;
|
||||||
import com.viaversion.viaversion.util.GsonUtil;
|
import com.viaversion.viaversion.util.GsonUtil;
|
||||||
|
import com.viaversion.viaversion.util.IdAndData;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -317,7 +318,7 @@ public class Protocol1_13To1_12_2 extends AbstractProtocol<ClientboundPackets1_1
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
int newItem = MAPPINGS.getItemMappings().getNewId(item << 4 | i);
|
int newItem = MAPPINGS.getItemMappings().getNewId(IdAndData.toRawData(item, i));
|
||||||
if (newItem != -1) {
|
if (newItem != -1) {
|
||||||
PacketWrapper packet = wrapper.create(ClientboundPackets1_13.COOLDOWN);
|
PacketWrapper packet = wrapper.create(ClientboundPackets1_13.COOLDOWN);
|
||||||
packet.write(Type.VAR_INT, newItem);
|
packet.write(Type.VAR_INT, newItem);
|
||||||
@ -342,11 +343,11 @@ public class Protocol1_13To1_12_2 extends AbstractProtocol<ClientboundPackets1_1
|
|||||||
int id = wrapper.get(Type.INT, 0);
|
int id = wrapper.get(Type.INT, 0);
|
||||||
int data = wrapper.get(Type.INT, 1);
|
int data = wrapper.get(Type.INT, 1);
|
||||||
if (id == 1010) { // Play record
|
if (id == 1010) { // Play record
|
||||||
wrapper.set(Type.INT, 1, getMappingData().getItemMappings().getNewId(data << 4));
|
wrapper.set(Type.INT, 1, getMappingData().getItemMappings().getNewId(IdAndData.toRawData(data)));
|
||||||
} else if (id == 2001) { // Block break + block break sound
|
} else if (id == 2001) { // Block break + block break sound
|
||||||
int blockId = data & 0xFFF;
|
int blockId = data & 0xFFF;
|
||||||
int blockData = data >> 12;
|
int blockData = data >> 12;
|
||||||
wrapper.set(Type.INT, 1, WorldPackets.toNewId(blockId << 4 | blockData));
|
wrapper.set(Type.INT, 1, WorldPackets.toNewId(IdAndData.toRawData(blockId, blockData)));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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.protocols.protocol1_13to1_12_2.data.SpawnEggRewriter;
|
||||||
import com.viaversion.viaversion.rewriter.ItemRewriter;
|
import com.viaversion.viaversion.rewriter.ItemRewriter;
|
||||||
import com.viaversion.viaversion.util.ComponentUtil;
|
import com.viaversion.viaversion.util.ComponentUtil;
|
||||||
|
import com.viaversion.viaversion.util.IdAndData;
|
||||||
import com.viaversion.viaversion.util.Key;
|
import com.viaversion.viaversion.util.Key;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -270,7 +271,7 @@ public class InventoryPackets extends ItemRewriter<ClientboundPackets1_12_1, Ser
|
|||||||
// Save original id
|
// Save original id
|
||||||
int originalId = (item.identifier() << 16 | item.data() & 0xFFFF);
|
int originalId = (item.identifier() << 16 | item.data() & 0xFFFF);
|
||||||
|
|
||||||
int rawId = (item.identifier() << 4 | item.data() & 0xF);
|
int rawId = IdAndData.toRawData(item.identifier(), item.data());
|
||||||
|
|
||||||
// NBT Additions
|
// NBT Additions
|
||||||
if (isDamageable(item.identifier())) {
|
if (isDamageable(item.identifier())) {
|
||||||
@ -458,9 +459,9 @@ public class InventoryPackets extends ItemRewriter<ClientboundPackets1_12_1, Ser
|
|||||||
tag.put(nbtTagName(), new IntTag(originalId)); // Data will be lost, saving original id
|
tag.put(nbtTagName(), new IntTag(originalId)); // Data will be lost, saving original id
|
||||||
}
|
}
|
||||||
if (item.identifier() == 31 && item.data() == 0) { // Shrub was removed
|
if (item.identifier() == 31 && item.data() == 0) { // Shrub was removed
|
||||||
rawId = 32 << 4; // Dead Bush
|
rawId = IdAndData.toRawData(32); // Dead Bush
|
||||||
} else if (Protocol1_13To1_12_2.MAPPINGS.getItemMappings().getNewId(rawId & ~0xF) != -1) {
|
} else if (Protocol1_13To1_12_2.MAPPINGS.getItemMappings().getNewId(IdAndData.removeData(rawId)) != -1) {
|
||||||
rawId &= ~0xF; // Remove data
|
rawId = IdAndData.removeData(rawId);
|
||||||
} else {
|
} else {
|
||||||
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
|
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
|
||||||
Via.getPlatform().getLogger().warning("Failed to get 1.13 item for " + item.identifier());
|
Via.getPlatform().getLogger().warning("Failed to get 1.13 item for " + item.identifier());
|
||||||
@ -538,7 +539,7 @@ public class InventoryPackets extends ItemRewriter<ClientboundPackets1_12_1, Ser
|
|||||||
tag.put("EntityTag", entityTag);
|
tag.put("EntityTag", entityTag);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rawId = (oldId >> 4) << 16 | oldId & 0xF;
|
rawId = IdAndData.getId(oldId) << 16 | oldId & 0xF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.BlockEntityProvider;
|
||||||
import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.providers.PaintingProvider;
|
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.protocols.protocol1_13to1_12_2.storage.BlockStorage;
|
||||||
|
import com.viaversion.viaversion.util.IdAndData;
|
||||||
import com.viaversion.viaversion.util.Key;
|
import com.viaversion.viaversion.util.Key;
|
||||||
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
|
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
|
||||||
import it.unimi.dsi.fastutil.ints.IntSet;
|
import it.unimi.dsi.fastutil.ints.IntSet;
|
||||||
@ -569,7 +570,7 @@ public class WorldPackets {
|
|||||||
if (newId != -1) {
|
if (newId != -1) {
|
||||||
return newId;
|
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 (newId != -1) {
|
||||||
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
|
if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) {
|
||||||
Via.getPlatform().getLogger().warning("Missing block " + oldId);
|
Via.getPlatform().getLogger().warning("Missing block " + oldId);
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren