Change to provide deserializable implementations with inbuilt converters and split either-sourced and new-only-sourced.

This commit is contained in:
Janmm14 2024-06-21 00:28:37 +02:00
parent c6c9e72282
commit 21cd21565c
No known key found for this signature in database
GPG Key ID: 5FCB9CF9B38164EA
12 changed files with 242 additions and 47 deletions

View File

@ -26,7 +26,10 @@ import net.md_5.bungee.protocol.data.NumberFormat;
import net.md_5.bungee.protocol.data.PlayerPublicKey;
import net.md_5.bungee.protocol.data.Property;
import net.md_5.bungee.protocol.util.ChatDeserializable;
import net.md_5.bungee.protocol.util.ChatFunctionDeserializable;
import net.md_5.bungee.protocol.util.ChatDeserializableJson;
import net.md_5.bungee.protocol.util.ChatDeserializableTag;
import net.md_5.bungee.protocol.util.ChatNewDeserializable;
import net.md_5.bungee.protocol.util.ChatNewDeserializableTag;
import net.md_5.bungee.protocol.util.Either;
import net.md_5.bungee.protocol.util.TagUtil;
import se.llbit.nbt.ErrorTag;
@ -103,7 +106,7 @@ public abstract class DefinedPacket
public static Either<String, ChatDeserializable> readEitherBaseComponent(ByteBuf buf, int protocolVersion, boolean string)
{
return ( string ) ? Either.left( readString( buf ) ) : Either.right( readBaseComponent( buf, protocolVersion ) );
return string ? Either.left( readString( buf ) ) : Either.right( readBaseComponent( buf, protocolVersion ) );
}
public static ChatDeserializable readBaseComponent(ByteBuf buf, int protocolVersion)
@ -115,14 +118,10 @@ public abstract class DefinedPacket
{
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_20_3 )
{
SpecificTag nbt = (SpecificTag) readTag( buf, protocolVersion );
return new ChatFunctionDeserializable( Either.right( nbt ), (ov) -> ComponentSerializer.deserialize( TagUtil.toJson( ov.getRight() ) ) );
return new ChatDeserializableTag( (SpecificTag) readTag( buf, protocolVersion ) );
} else
{
String string = readString( buf, maxStringLength );
return new ChatFunctionDeserializable( Either.left( string ), (ov) -> ComponentSerializer.deserialize( ov.getLeft() ) );
return new ChatDeserializableJson( readString( buf, maxStringLength ) );
}
}
@ -147,6 +146,13 @@ public abstract class DefinedPacket
}
}
public static ChatNewDeserializable readNewBaseComponent(ByteBuf buf, int protocolVersion)
{
SpecificTag nbt = (SpecificTag) readTag( buf, protocolVersion );
return new ChatNewDeserializableTag( nbt );
}
public static ComponentStyle readComponentStyle(ByteBuf buf, int protocolVersion)
{
SpecificTag nbt = (SpecificTag) readTag( buf, protocolVersion );
@ -227,6 +233,19 @@ public abstract class DefinedPacket
}
}
public static void writeNewBaseComponent(ChatNewDeserializable message, ByteBuf buf, int protocolVersion)
{
SpecificTag nbt;
if ( message.hasDeserialized() )
{
nbt = TagUtil.fromJson( ComponentSerializer.toJson( message.get() ) );
} else
{
nbt = message.original();
}
writeTag( nbt, buf, protocolVersion );
}
public static void writeComponentStyle(ComponentStyle style, ByteBuf buf, int protocolVersion)
{
JsonElement json = ComponentSerializer.toJson( style );

View File

@ -11,8 +11,7 @@ import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.Protocol;
import net.md_5.bungee.protocol.ProtocolConstants;
import net.md_5.bungee.protocol.util.ChatDeserializable;
import net.md_5.bungee.protocol.util.ChatFunctionDeserializable;
import net.md_5.bungee.protocol.util.Either;
import net.md_5.bungee.protocol.util.ChatDeserializableJson;
@Data
@NoArgsConstructor
@ -28,8 +27,7 @@ public class Kick extends DefinedPacket
{
if ( protocol == Protocol.LOGIN )
{
String json = readString( buf );
message = new ChatFunctionDeserializable( Either.left( json ), (ov) -> ComponentSerializer.deserialize( ov.getLeft() ) );
message = new ChatDeserializableJson( readString( buf ) );
} else
{
message = readBaseComponent( buf, protocolVersion );

View File

@ -8,7 +8,7 @@ import lombok.NoArgsConstructor;
import net.md_5.bungee.protocol.AbstractPacketHandler;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.ProtocolConstants;
import net.md_5.bungee.protocol.util.ChatDeserializable;
import net.md_5.bungee.protocol.util.ChatNewDeserializable;
import net.md_5.bungee.protocol.util.Either;
@Data
@ -27,13 +27,13 @@ public class ServerLinks extends DefinedPacket
links = new Link[ len ];
for ( int i = 0; i < len; i++ )
{
Either<LinkType, ChatDeserializable> type;
Either<LinkType, ChatNewDeserializable> type;
if ( buf.readBoolean() )
{
type = Either.left( LinkType.values()[readVarInt( buf )] );
} else
{
type = Either.right( readBaseComponent( buf, protocolVersion ) );
type = Either.right( readNewBaseComponent( buf, protocolVersion ) );
}
String url = readString( buf );
@ -47,7 +47,7 @@ public class ServerLinks extends DefinedPacket
writeVarInt( links.length, buf );
for ( Link link : links )
{
Either<LinkType, ChatDeserializable> type = link.getTypeRaw();
Either<LinkType, ChatNewDeserializable> type = link.getType();
if ( type.isLeft() )
{
buf.writeBoolean( true );
@ -55,7 +55,7 @@ public class ServerLinks extends DefinedPacket
} else
{
buf.writeBoolean( false );
writeBaseComponent( type.getRight(), buf, protocolVersion );
writeNewBaseComponent( type.getRight(), buf, protocolVersion );
}
writeString( link.getUrl(), buf );
}
@ -86,7 +86,7 @@ public class ServerLinks extends DefinedPacket
public static class Link
{
private final Either<LinkType, ChatDeserializable> typeRaw;
private final Either<LinkType, ChatNewDeserializable> type;
private final String url;
}
}

View File

@ -5,4 +5,8 @@ import se.llbit.nbt.SpecificTag;
public interface ChatDeserializable extends Deserializable<Either<String, SpecificTag>, BaseComponent>
{
default ChatNewDeserializable cloneAsNew()
{
return new ChatNewComponentDeserializable( get() );
}
}

View File

@ -0,0 +1,26 @@
package net.md_5.bungee.protocol.util;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.chat.ComponentSerializer;
import org.jetbrains.annotations.NotNull;
@ToString
@EqualsAndHashCode(callSuper = true)
public class ChatDeserializableJson extends ChatCapturingDeserializable
{
public ChatDeserializableJson(@NonNull String chatJson)
{
super( Either.left( chatJson ) );
}
@NotNull
@Override
public BaseComponent deserialize()
{
return ComponentSerializer.deserialize( original().getLeft() );
}
}

View File

@ -0,0 +1,27 @@
package net.md_5.bungee.protocol.util;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.chat.ComponentSerializer;
import org.jetbrains.annotations.NotNull;
import se.llbit.nbt.SpecificTag;
@ToString
@EqualsAndHashCode(callSuper = true)
public class ChatDeserializableTag extends ChatCapturingDeserializable
{
public ChatDeserializableTag(@NonNull SpecificTag chatTag)
{
super( Either.right( chatTag ) );
}
@NotNull
@Override
public BaseComponent deserialize()
{
return ComponentSerializer.deserialize( TagUtil.toJson( original().getRight() ) );
}
}

View File

@ -1,29 +0,0 @@
package net.md_5.bungee.protocol.util;
import java.util.function.Function;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import net.md_5.bungee.api.chat.BaseComponent;
import org.jetbrains.annotations.NotNull;
import se.llbit.nbt.SpecificTag;
@ToString
@EqualsAndHashCode(callSuper = true)
public class ChatFunctionDeserializable extends ChatCapturingDeserializable
{
private final Function<Either<String, SpecificTag>, BaseComponent> function;
public ChatFunctionDeserializable(@NonNull Either<String, SpecificTag> ov, Function<Either<String, SpecificTag>, BaseComponent> supplier)
{
super( ov );
this.function = supplier;
}
@NotNull
@Override
public BaseComponent deserialize()
{
return function.apply( original() );
}
}

View File

@ -0,0 +1,49 @@
package net.md_5.bungee.protocol.util;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import net.md_5.bungee.api.chat.BaseComponent;
import se.llbit.nbt.SpecificTag;
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
public abstract class ChatNewCapturingDeserializable implements ChatNewDeserializable
{
@NonNull
private final SpecificTag original;
private BaseComponent deserialized;
/**
* Method called to get the deserialized value. Called only once unless multiple threads are calling get() at the
* same time.
*
* @return the deserialized value
*/
@NonNull
protected abstract BaseComponent deserialize();
@Override
public final BaseComponent get()
{
if ( !hasDeserialized() )
{
return deserialized = deserialize();
}
return deserialized;
}
@Override
public final boolean hasDeserialized()
{
return deserialized != null;
}
@Override
public final SpecificTag original()
{
return original;
}
}

View File

@ -0,0 +1,33 @@
package net.md_5.bungee.protocol.util;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import net.md_5.bungee.api.chat.BaseComponent;
import se.llbit.nbt.SpecificTag;
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
public class ChatNewComponentDeserializable implements ChatNewDeserializable
{
private final BaseComponent value;
@Override
public BaseComponent get()
{
return value;
}
@Override
public SpecificTag original()
{
return null;
}
@Override
public boolean hasDeserialized()
{
return true;
}
}

View File

@ -0,0 +1,8 @@
package net.md_5.bungee.protocol.util;
import net.md_5.bungee.api.chat.BaseComponent;
import se.llbit.nbt.SpecificTag;
public interface ChatNewDeserializable extends Deserializable<SpecificTag, BaseComponent>
{
}

View File

@ -0,0 +1,27 @@
package net.md_5.bungee.protocol.util;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.chat.ComponentSerializer;
import org.jetbrains.annotations.NotNull;
import se.llbit.nbt.SpecificTag;
@ToString
@EqualsAndHashCode(callSuper = true)
public class ChatNewDeserializableTag extends ChatNewCapturingDeserializable
{
public ChatNewDeserializableTag(@NonNull SpecificTag chatTag)
{
super( chatTag );
}
@NotNull
@Override
public BaseComponent deserialize()
{
return ComponentSerializer.deserialize( TagUtil.toJson( original() ) );
}
}

View File

@ -0,0 +1,33 @@
package net.md_5.bungee.protocol.util;
import net.md_5.bungee.api.chat.BaseComponent;
import se.llbit.nbt.SpecificTag;
class ChatNewOldAdapter implements ChatDeserializable
{
private final ChatNewDeserializable newDeserializable;
public ChatNewOldAdapter(ChatNewDeserializable newDeserializable)
{
this.newDeserializable = newDeserializable;
}
@Override
public BaseComponent get()
{
return newDeserializable.get();
}
@Override
public Either<String, SpecificTag> original()
{
return Either.right( newDeserializable.original() );
}
@Override
public boolean hasDeserialized()
{
return newDeserializable.hasDeserialized();
}
}