Finish up things

This commit is contained in:
Nassim Jahnke 2023-12-27 17:30:27 +01:00
parent dc2986600c
commit f2f357b2ae
No known key found for this signature in database
GPG Key ID: EF6771C01F6EF02F
1 changed files with 58 additions and 27 deletions

View File

@ -17,11 +17,17 @@
*/ */
package com.viaversion.viaversion.util; package com.viaversion.viaversion.util;
import com.github.steveice10.opennbt.tag.builtin.StringTag;
import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.opennbt.tag.builtin.Tag;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.viaversion.viaversion.api.Via;
import java.util.logging.Level;
import net.lenni0451.mcstructs.snbt.SNbtSerializer;
import net.lenni0451.mcstructs.text.ATextComponent; import net.lenni0451.mcstructs.text.ATextComponent;
import net.lenni0451.mcstructs.text.Style; import net.lenni0451.mcstructs.text.Style;
import net.lenni0451.mcstructs.text.events.hover.AHoverEvent;
import net.lenni0451.mcstructs.text.events.hover.impl.TextHoverEvent;
import net.lenni0451.mcstructs.text.serializer.LegacyStringDeserializer; import net.lenni0451.mcstructs.text.serializer.LegacyStringDeserializer;
import net.lenni0451.mcstructs.text.serializer.TextComponentCodec; import net.lenni0451.mcstructs.text.serializer.TextComponentCodec;
import net.lenni0451.mcstructs.text.serializer.TextComponentSerializer; import net.lenni0451.mcstructs.text.serializer.TextComponentSerializer;
@ -48,20 +54,46 @@ public final class ComponentUtil {
public static @Nullable JsonElement tagToJson(@Nullable final Tag tag) { public static @Nullable JsonElement tagToJson(@Nullable final Tag tag) {
final ATextComponent component = TextComponentCodec.V1_20_3.deserializeNbtTree(NBTConverter.viaToMcStructs(tag)); final ATextComponent component = TextComponentCodec.V1_20_3.deserializeNbtTree(NBTConverter.viaToMcStructs(tag));
return component != null ? TextComponentSerializer.V1_19_4.serializeJson(component) : null; return component != null ? SerializerVersion.V1_19_4.toJson(component) : null;
} }
public static @Nullable Tag jsonToTag(@Nullable final JsonElement element) { public static @Nullable Tag jsonToTag(@Nullable final JsonElement element) {
final ATextComponent component = TextComponentSerializer.V1_19_4.deserialize(element); if (element == null) {
return component != null ? NBTConverter.mcStructsToVia(TextComponentCodec.V1_20_3.serializeNbt(component)) : null; return null;
}
try {
final ATextComponent component = TextComponentSerializer.V1_19_4.deserialize(element);
return NBTConverter.mcStructsToVia(TextComponentCodec.V1_20_3.serializeNbt(component));
} catch (final Exception e) {
Via.getPlatform().getLogger().log(Level.SEVERE, "Error converting component: " + element, e);
return new StringTag("<error>");
}
}
public static @Nullable JsonElement convertJson(@Nullable final JsonElement element, final SerializerVersion from, final SerializerVersion to) {
final ATextComponent component = from.jsonSerializer.deserialize(element);
if (element == null) {
return null;
}
if (from.ordinal() >= SerializerVersion.V1_16.ordinal() && to.ordinal() < SerializerVersion.V1_16.ordinal()) {
// Convert hover event to legacy format
final Style style = component.getStyle();
final AHoverEvent hoverEvent = style.getHoverEvent();
if (hoverEvent != null && !(hoverEvent instanceof TextHoverEvent)) {
style.setHoverEvent(hoverEvent.toLegacy(to.jsonSerializer, to.snbtSerializer));
}
}
return to.toJson(component);
} }
public static JsonElement legacyToJson(final String message) { public static JsonElement legacyToJson(final String message) {
return TextComponentSerializer.V1_12.serializeJson(LegacyStringDeserializer.parse(message, true)); return SerializerVersion.V1_12.toJson(LegacyStringDeserializer.parse(message, true));
} }
public static String legacyToJsonString(final String legacyText) { public static String legacyToJsonString(final String message) {
return legacyToJsonString(legacyText, false); return legacyToJsonString(message, false);
} }
public static String legacyToJsonString(final String message, final boolean itemData) { public static String legacyToJsonString(final String message, final boolean itemData) {
@ -81,36 +113,35 @@ public final class ComponentUtil {
} }
public enum SerializerVersion { public enum SerializerVersion {
V1_8(TextComponentSerializer.V1_8), V1_8(TextComponentSerializer.V1_8, SNbtSerializer.V1_8),
V1_9(TextComponentSerializer.V1_9), V1_9(TextComponentSerializer.V1_9, SNbtSerializer.V1_8),
V1_12(TextComponentSerializer.V1_12), V1_12(TextComponentSerializer.V1_12, SNbtSerializer.V1_12),
V1_14(TextComponentSerializer.V1_14), V1_14(TextComponentSerializer.V1_14, SNbtSerializer.V1_14),
V1_15(TextComponentSerializer.V1_15), V1_15(TextComponentSerializer.V1_15, SNbtSerializer.V1_14),
V1_16(TextComponentSerializer.V1_16), V1_16(TextComponentSerializer.V1_16, SNbtSerializer.V1_14),
V1_17(TextComponentSerializer.V1_17), V1_17(TextComponentSerializer.V1_17, SNbtSerializer.V1_14),
V1_18(TextComponentSerializer.V1_18), V1_18(TextComponentSerializer.V1_18, SNbtSerializer.V1_14),
V1_19_4(TextComponentSerializer.V1_19_4), V1_19_4(TextComponentSerializer.V1_19_4, SNbtSerializer.V1_14),
V1_20_3(TextComponentCodec.V1_20_3); V1_20_3(TextComponentCodec.V1_20_3, SNbtSerializer.V1_14);
private final TextComponentSerializer serializer; private final TextComponentSerializer jsonSerializer;
private final SNbtSerializer<?> snbtSerializer;
private final TextComponentCodec codec; private final TextComponentCodec codec;
SerializerVersion(final TextComponentSerializer serializer) { SerializerVersion(final TextComponentSerializer jsonSerializer, final SNbtSerializer<?> snbtSerializer) {
this.serializer = serializer; this.jsonSerializer = jsonSerializer;
this.snbtSerializer = snbtSerializer;
this.codec = null; this.codec = null;
} }
SerializerVersion(final TextComponentCodec codec) { SerializerVersion(final TextComponentCodec codec, final SNbtSerializer<?> snbtSerializer) {
this.serializer = codec.asSerializer();
this.codec = codec; this.codec = codec;
this.jsonSerializer = codec.asSerializer();
this.snbtSerializer = snbtSerializer;
} }
public TextComponentSerializer serializer() { public JsonElement toJson(final ATextComponent component) {
return serializer; return jsonSerializer.serializeJson(component);
}
public @Nullable TextComponentCodec codec() {
return codec;
} }
} }
} }