Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-12-29 09:30:08 +01:00
Fix uuid nbt conversion
Dieser Commit ist enthalten in:
Ursprung
b1b0874c0f
Commit
0d70cdbe15
@ -53,6 +53,7 @@ import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.Clientbou
|
|||||||
import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundConfigurationPackets1_20_2;
|
import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundConfigurationPackets1_20_2;
|
||||||
import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundPackets1_20_2;
|
import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundPackets1_20_2;
|
||||||
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.EntityPacketRewriter1_20_3;
|
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.EntityPacketRewriter1_20_3;
|
||||||
|
import com.viaversion.viaversion.util.GsonUtil;
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -270,11 +271,14 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol<ClientboundPa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @Nullable Tag jsonComponentToTag(@Nullable final JsonElement component) {
|
public static @Nullable Tag jsonComponentToTag(@Nullable JsonElement component) {
|
||||||
// TODO Handle array of different types
|
component = GsonUtil.getGson().fromJson("[{\"text\": \"A\", \"color\": \"red\"}, \"B\", 1, [\"a\"]]", JsonArray.class);
|
||||||
|
Via.getPlatform().getLogger().info("Converting: " + component);
|
||||||
try {
|
try {
|
||||||
// This mostly works:tm:
|
// This mostly works:tm:
|
||||||
return convertToTag(component);
|
final Tag tag = convertToTag(component);
|
||||||
|
Via.getPlatform().getLogger().info("To: " + tag);
|
||||||
|
return tag;
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
Via.getPlatform().getLogger().severe("Error converting component: " + component);
|
Via.getPlatform().getLogger().severe("Error converting component: " + component);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -288,16 +292,12 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol<ClientboundPa
|
|||||||
} else if (element.isJsonObject()) {
|
} else if (element.isJsonObject()) {
|
||||||
final CompoundTag tag = new CompoundTag();
|
final CompoundTag tag = new CompoundTag();
|
||||||
for (final Map.Entry<String, JsonElement> entry : element.getAsJsonObject().entrySet()) {
|
for (final Map.Entry<String, JsonElement> entry : element.getAsJsonObject().entrySet()) {
|
||||||
|
// Not strictly needed, but might as well make it more compact
|
||||||
convertObjectEntry(entry.getKey(), entry.getValue(), tag);
|
convertObjectEntry(entry.getKey(), entry.getValue(), tag);
|
||||||
}
|
}
|
||||||
return tag;
|
return tag;
|
||||||
} else if (element.isJsonArray()) {
|
} else if (element.isJsonArray()) {
|
||||||
// TODO Number arrays
|
return convertJsonArray(element);
|
||||||
final ListTag tag = new ListTag();
|
|
||||||
for (final JsonElement entry : element.getAsJsonArray()) {
|
|
||||||
tag.add(convertToTag(entry));
|
|
||||||
}
|
|
||||||
return tag;
|
|
||||||
} else if (element.isJsonPrimitive()) {
|
} else if (element.isJsonPrimitive()) {
|
||||||
final JsonPrimitive primitive = element.getAsJsonPrimitive();
|
final JsonPrimitive primitive = element.getAsJsonPrimitive();
|
||||||
if (primitive.isString()) {
|
if (primitive.isString()) {
|
||||||
@ -309,7 +309,7 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol<ClientboundPa
|
|||||||
final Number number = primitive.getAsNumber();
|
final Number number = primitive.getAsNumber();
|
||||||
if (number instanceof Integer) {
|
if (number instanceof Integer) {
|
||||||
return new IntTag(number.intValue());
|
return new IntTag(number.intValue());
|
||||||
} else if (number instanceof Byte) { // This could be a boolean, but we can't know
|
} else if (number instanceof Byte) {
|
||||||
return new ByteTag(number.byteValue());
|
return new ByteTag(number.byteValue());
|
||||||
} else if (number instanceof Short) {
|
} else if (number instanceof Short) {
|
||||||
return new ShortTag(number.shortValue());
|
return new ShortTag(number.shortValue());
|
||||||
@ -321,17 +321,55 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol<ClientboundPa
|
|||||||
return new FloatTag(number.floatValue());
|
return new FloatTag(number.floatValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Unhandled json type " + element.getClass().getSimpleName());
|
throw new IllegalArgumentException("Unhandled json type " + element.getClass().getSimpleName() + " with value " + element.getAsString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ListTag convertJsonArray(final JsonElement element) {
|
||||||
|
// TODO Number arrays
|
||||||
|
final ListTag listTag = new ListTag();
|
||||||
|
boolean singleType = true;
|
||||||
|
for (final JsonElement entry : element.getAsJsonArray()) {
|
||||||
|
final Tag convertedEntryTag = convertToTag(entry);
|
||||||
|
if (listTag.getElementType() != null && listTag.getElementType() != convertedEntryTag.getClass()) {
|
||||||
|
singleType = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
listTag.add(convertedEntryTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (singleType) {
|
||||||
|
return listTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generally, vanilla-esque serializers should not produce this format, so it should be rare
|
||||||
|
// Lists are only used for lists of components ("extra" and "with")
|
||||||
|
final ListTag processedListTag = new ListTag();
|
||||||
|
for (final JsonElement entry : element.getAsJsonArray()) {
|
||||||
|
final Tag convertedTag = convertToTag(entry);
|
||||||
|
if (convertedTag instanceof CompoundTag) {
|
||||||
|
processedListTag.add(listTag);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrap all entries in compound tags as lists can only consist of one type of tag
|
||||||
|
final CompoundTag compoundTag = new CompoundTag();
|
||||||
|
compoundTag.put("text", new StringTag());
|
||||||
|
compoundTag.put("extra", convertedTag);
|
||||||
|
}
|
||||||
|
return processedListTag;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void convertObjectEntry(final String key, final JsonElement element, final CompoundTag tag) {
|
private static void convertObjectEntry(final String key, final JsonElement element, final CompoundTag tag) {
|
||||||
if ((key.equals("contents") || key.equals("value")) && element.isJsonObject()) {
|
if ((key.equals("contents")) && element.isJsonObject()) {
|
||||||
// Store show_entity id as int array instead of uuid string
|
// Store show_entity id as int array instead of uuid string
|
||||||
final JsonObject hoverEvent = element.getAsJsonObject();
|
final JsonObject hoverEvent = element.getAsJsonObject();
|
||||||
final JsonElement id = hoverEvent.get("id");
|
final JsonElement id = hoverEvent.remove("id");
|
||||||
final UUID uuid;
|
final UUID uuid;
|
||||||
if (id != null && id.isJsonPrimitive() && (uuid = parseUUID(id.getAsString())) != null) {
|
if (id != null && id.isJsonPrimitive() && (uuid = parseUUID(id.getAsString())) != null) {
|
||||||
tag.put(key, new IntArrayTag(UUIDIntArrayType.uuidToIntArray(uuid)));
|
final CompoundTag convertedTag = (CompoundTag) convertToTag(element);
|
||||||
|
convertedTag.put("id", new IntArrayTag(UUIDIntArrayType.uuidToIntArray(uuid)));
|
||||||
|
tag.put(key, convertedTag);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -364,6 +402,7 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol<ClientboundPa
|
|||||||
}
|
}
|
||||||
return array;
|
return array;
|
||||||
} else if (tag instanceof NumberTag) {
|
} else if (tag instanceof NumberTag) {
|
||||||
|
// TODO Byte could be a boolean
|
||||||
return new JsonPrimitive((Number) tag.getValue());
|
return new JsonPrimitive((Number) tag.getValue());
|
||||||
} else if (tag instanceof StringTag) {
|
} else if (tag instanceof StringTag) {
|
||||||
return new JsonPrimitive(((StringTag) tag).getValue());
|
return new JsonPrimitive(((StringTag) tag).getValue());
|
||||||
@ -393,12 +432,14 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol<ClientboundPa
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void convertCompoundTagEntry(final String key, final Tag tag, final JsonObject object) {
|
private static void convertCompoundTagEntry(final String key, final Tag tag, final JsonObject object) {
|
||||||
if ((key.equals("contents") || key.equals("value")) && tag instanceof CompoundTag) {
|
if ((key.equals("contents")) && tag instanceof CompoundTag) {
|
||||||
// Back to a UUID string
|
// Back to a UUID string
|
||||||
final CompoundTag showEntity = (CompoundTag) tag;
|
final CompoundTag showEntity = (CompoundTag) tag;
|
||||||
final Tag idTag = showEntity.get("id");
|
final Tag idTag = showEntity.remove("id");
|
||||||
if (idTag instanceof IntArrayTag) {
|
if (idTag instanceof IntArrayTag) {
|
||||||
object.addProperty(key, uuidIntsToString(((IntArrayTag) idTag).getValue()));
|
final JsonObject convertedElement = (JsonObject) convertToJson(tag);
|
||||||
|
convertedElement.addProperty("id", uuidIntsToString(((IntArrayTag) idTag).getValue()));
|
||||||
|
object.add(key, convertedElement);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren