Minecraft 1.21.6-pre1 support

This commit is contained in:
md_5 2025-05-29 21:50:45 +10:00
parent d8f9d81b30
commit 89e66ed648
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
28 changed files with 324 additions and 416 deletions

View File

@ -1,6 +1,6 @@
package net.md_5.bungee.api.event;
import java.util.Map;
import com.google.gson.JsonElement;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@ -34,19 +34,9 @@ public class CustomClickEvent extends Event implements Cancellable
*/
private final String id;
/**
* The raw data as submitted.
* The data as submitted.
*/
private final String rawData;
/**
* The parsed form data.
* <br>
* If a form submission, usually contains a
* {@code CustomClickEvent.ACTION_KEY} key with the ID of the relevant
* submission action.
* <br>
* If not a form submission, then may be null.
*/
private final Map<String, String> parsedData;
private final JsonElement data;
/**
* Cancelled state.
*/

View File

@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.dialog.action.DialogClickAction;
import net.md_5.bungee.api.dialog.action.DialogAction;
/**
* Represents a simple dialog with text and two actions at the bottom (default:
@ -26,11 +26,11 @@ public final class ConfirmationDialog implements Dialog
/**
* The "yes" click action / bottom (appears on the left).
*/
private DialogClickAction yes;
private DialogAction yes;
/**
* The "no" click action / bottom (appears on the right).
*/
private DialogClickAction no;
private DialogAction no;
public ConfirmationDialog(@NonNull DialogBase base)
{

View File

@ -8,6 +8,7 @@ import lombok.NonNull;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.dialog.body.DialogBody;
import net.md_5.bungee.api.dialog.input.DialogInput;
/**
* Represents the title and other options common to all dialogs.
@ -29,6 +30,10 @@ public final class DialogBase
*/
@SerializedName("external_title")
private BaseComponent externalTitle;
/**
* The inputs to the dialog.
*/
private List<DialogInput> inputs;
/**
* The body elements which make up this dialog.
*/
@ -38,9 +43,42 @@ public final class DialogBase
*/
@SerializedName("can_close_with_escape")
private Boolean canCloseWithEscape;
/**
* Whether this dialog should pause the game in single-player mode (default:
* true).
*/
private Boolean pause;
/**
* Action to take after the a click or submit action is performed on the
* dialog (default: close).
*/
@SerializedName("after_action")
private AfterAction afterAction;
public DialogBase(@NonNull BaseComponent title)
{
this( title, null, null, null );
this( title, null, null, null, null, null, null );
}
/**
* Types of action which may be taken after the dialog.
*/
public enum AfterAction
{
/**
* Close the dialog.
*/
@SerializedName("close")
CLOSE,
/**
* Do nothing.
*/
@SerializedName("none")
NONE,
/**
* Show a waiting for response screen.
*/
@SerializedName("wait_for_response")
WAIT_FOR_RESPONSE;
}
}

View File

@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.dialog.action.DialogAction;
/**
* Represents a dialog which contains buttons that link to other dialogs.
@ -29,10 +29,10 @@ public final class DialogListDialog implements Dialog
*/
private List<Dialog> dialogs;
/**
* The {@link ClickEvent} activated when the dialog is cancelled.
* The {@link DialogAction} activated when the dialog is exited.
*/
@SerializedName("on_cancel")
private ClickEvent onCancel;
@SerializedName("exit_action")
private DialogAction exitAction;
/**
* The number of columns for the dialog buttons (default: 2).
*/
@ -48,11 +48,11 @@ public final class DialogListDialog implements Dialog
this( base, Arrays.asList( dialogs ), null, null, null );
}
public DialogListDialog(@NonNull DialogBase base, List<Dialog> dialogs, ClickEvent onCancel, Integer columns, Integer buttonWidth)
public DialogListDialog(@NonNull DialogBase base, List<Dialog> dialogs, DialogAction exitAction, Integer columns, Integer buttonWidth)
{
this.base = base;
this.dialogs = dialogs;
this.onCancel = onCancel;
this.exitAction = exitAction;
columns( columns );
buttonWidth( buttonWidth );
}

View File

@ -9,8 +9,7 @@ import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.dialog.action.DialogClickAction;
import net.md_5.bungee.api.dialog.action.DialogAction;
/**
* Represents a dialog with text a list of action buttons grouped into columns
@ -30,30 +29,30 @@ public final class MultiActionDialog implements Dialog
* The action buttons in the dialog. At least one must be provided.
*/
@NonNull
private List<DialogClickAction> actions;
private List<DialogAction> actions;
/**
* The number of columns for the dialog buttons (default: 2).
*/
private Integer columns;
/**
* The {@link ClickEvent} activated when the dialog is cancelled.
* The {@link DialogAction} activated when the dialog is exited.
*/
@SerializedName("on_cancel")
private ClickEvent onCancel;
@SerializedName("exit_action")
private DialogAction exitAction;
public MultiActionDialog(@NonNull DialogBase base, @NonNull DialogClickAction... actions)
public MultiActionDialog(@NonNull DialogBase base, @NonNull DialogAction... actions)
{
this( base, Arrays.asList( actions ), null, null );
}
public MultiActionDialog(@NonNull DialogBase base, @NonNull List<DialogClickAction> actions, Integer columns, ClickEvent onCancel)
public MultiActionDialog(@NonNull DialogBase base, @NonNull List<DialogAction> actions, Integer columns, DialogAction exitAction)
{
Preconditions.checkArgument( !actions.isEmpty(), "At least one action must be provided" );
this.base = base;
this.actions = actions;
columns( columns );
this.onCancel = onCancel;
this.exitAction = exitAction;
}
public MultiActionDialog columns(Integer columns)

View File

@ -1,71 +0,0 @@
package net.md_5.bungee.api.dialog;
import com.google.common.base.Preconditions;
import java.util.Arrays;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.dialog.action.DialogSubmitAction;
import net.md_5.bungee.api.dialog.input.DialogInput;
/**
* Represents a dialog which contains a variety of inputs and a multiple submit
* buttons at the bottom.
*/
@Data
@ToString
@EqualsAndHashCode
@Accessors(fluent = true)
public final class MultiActionInputFormDialog implements Dialog
{
@Accessors(fluent = false)
@NonNull
private DialogBase base;
/**
* The inputs to the dialog. At least one input must be provided.
*/
@NonNull
private List<DialogInput> inputs;
/**
* The action/submit buttons for the dialog. At least one action must be
* provided.
*/
@NonNull
private List<DialogSubmitAction> actions;
/**
* The amount of columns (default: 2)
*/
private Integer columns;
public MultiActionInputFormDialog(@NonNull DialogBase base, @NonNull DialogInput input, @NonNull DialogSubmitAction action)
{
this( base, Arrays.asList( input ), Arrays.asList( action ), null );
}
public MultiActionInputFormDialog(@NonNull DialogBase base, @NonNull DialogInput input, @NonNull DialogSubmitAction action, Integer columns)
{
this( base, Arrays.asList( input ), Arrays.asList( action ), columns );
}
public MultiActionInputFormDialog(@NonNull DialogBase base, @NonNull List<DialogInput> inputs, @NonNull List<DialogSubmitAction> actions, Integer columns)
{
Preconditions.checkArgument( !inputs.isEmpty(), "At least one input must be provided" );
Preconditions.checkArgument( !actions.isEmpty(), "At least one action must be provided" );
this.base = base;
this.inputs = inputs;
this.actions = actions;
columns( columns );
}
public MultiActionInputFormDialog columns(Integer columns)
{
Preconditions.checkArgument( columns == null || columns > 0, "At least one column is required" );
this.columns = columns;
return this;
}
}

View File

@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.dialog.action.DialogClickAction;
import net.md_5.bungee.api.dialog.action.DialogAction;
/**
* Represents a simple dialog with text and one action at the bottom (default:
@ -26,7 +26,7 @@ public final class NoticeDialog implements Dialog
/**
* The "OK" action button for the dialog.
*/
private DialogClickAction action;
private DialogAction action;
public NoticeDialog(DialogBase base)
{

View File

@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.dialog.action.DialogAction;
/**
* Represents a dialog which shows the links configured/sent from the server.
@ -19,15 +19,19 @@ import net.md_5.bungee.api.chat.ClickEvent;
public final class ServerLinksDialog implements Dialog
{
@NonNull
@Accessors(fluent = false)
private DialogBase base;
/**
* The optional {@link ClickEvent} for this dialog.
* The optional {@link DialogAction} for this dialog.
*/
@SerializedName("on_click")
private ClickEvent onClick;
@SerializedName("action")
private DialogAction action;
/**
* The {@link DialogAction} activated when the dialog is exited.
*/
@SerializedName("exit_action")
private DialogAction exitAction;
/**
* The number of columns for the dialog buttons (default: 2).
*/
@ -43,10 +47,10 @@ public final class ServerLinksDialog implements Dialog
this( base, null, null, null );
}
public ServerLinksDialog(@NonNull DialogBase base, ClickEvent onClick, Integer columns, Integer buttonWidth)
public ServerLinksDialog(@NonNull DialogBase base, DialogAction action, Integer columns, Integer buttonWidth)
{
this.base = base;
this.onClick = onClick;
this.action = action;
columns( columns );
buttonWidth( buttonWidth );
}

View File

@ -1,56 +0,0 @@
package net.md_5.bungee.api.dialog;
import com.google.common.base.Preconditions;
import java.util.Arrays;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.dialog.action.DialogSubmitAction;
import net.md_5.bungee.api.dialog.input.DialogInput;
/**
* Represents a dialog which contains a variety of inputs and a single submit
* button at the bottom.
*/
@Data
@ToString
@EqualsAndHashCode
@Accessors(fluent = true)
public final class SimpleInputFormDialog implements Dialog
{
@NonNull
@Accessors(fluent = false)
private DialogBase base;
/**
* The inputs to the dialog. At least one input must be provided.
*/
@NonNull
private List<DialogInput> inputs;
/**
* The action/submit buttons for the dialog.
*/
private DialogSubmitAction action;
public SimpleInputFormDialog(@NonNull DialogBase base, @NonNull DialogInput... inputs)
{
this( base, null, inputs );
}
public SimpleInputFormDialog(@NonNull DialogBase base, DialogSubmitAction action, @NonNull DialogInput... inputs)
{
this( base, action, Arrays.asList( inputs ) );
}
public SimpleInputFormDialog(@NonNull DialogBase base, DialogSubmitAction action, @NonNull List<DialogInput> inputs)
{
Preconditions.checkArgument( !inputs.isEmpty(), "At least one input must be provided" );
this.base = base;
this.inputs = inputs;
this.action = action;
}
}

View File

@ -11,7 +11,7 @@ import net.md_5.bungee.api.chat.BaseComponent;
*/
@Data
@Accessors(fluent = true)
public class DialogAction
public abstract class DialogAction
{
/**

View File

@ -1,43 +0,0 @@
package net.md_5.bungee.api.dialog.action;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
/**
* Represents a button which may be clicked.
*/
@Data
@Accessors(fluent = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class DialogClickAction extends DialogAction
{
/**
* The optional action to take on click.
*/
@SerializedName("on_click")
private ClickEvent onClick;
public DialogClickAction(@NonNull BaseComponent label)
{
this( null, label );
}
public DialogClickAction(ClickEvent onClick, @NonNull BaseComponent label)
{
this( onClick, label, null, null );
}
public DialogClickAction(ClickEvent onClick, @NonNull BaseComponent label, BaseComponent tooltip, Integer width)
{
super( label, tooltip, width );
this.onClick = onClick;
}
}

View File

@ -1,47 +0,0 @@
package net.md_5.bungee.api.dialog.action;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.dialog.submit.DialogSubmission;
/**
* Represents a dialog button associated with the submission of a form dialog
* containing inputs.
*/
@Data
@Accessors(fluent = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class DialogSubmitAction extends DialogAction
{
/**
* The ID of the button, used to distinguish submissions initiated via
* different buttons on the dialog.
*/
@NonNull
private String id;
/**
* The submission action to take.
*/
@NonNull
@SerializedName("on_submit")
private DialogSubmission onSubmit;
public DialogSubmitAction(@NonNull String id, @NonNull DialogSubmission onSubmit, @NonNull BaseComponent label)
{
this( id, onSubmit, label, null, null );
}
public DialogSubmitAction(@NonNull String id, @NonNull DialogSubmission onSubmit, @NonNull BaseComponent label, BaseComponent tooltip, Integer width)
{
super( label, tooltip, width );
this.id = id;
this.onSubmit = onSubmit;
}
}

View File

@ -0,0 +1,35 @@
package net.md_5.bungee.api.dialog.action;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.dialog.dynamic.DynamicType;
/**
* Represents a static dialog action.
*/
@Data
@Accessors(fluent = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class DynamicAction extends DialogAction
{
@NonNull
private DynamicType action;
public DynamicAction(@NonNull BaseComponent label, BaseComponent tooltip, Integer width, @NonNull DynamicType action)
{
super( label, tooltip, width );
this.action = action;
}
public DynamicAction(@NonNull BaseComponent label, @NonNull DynamicType action)
{
super( label );
this.action = action;
}
}

View File

@ -0,0 +1,44 @@
package net.md_5.bungee.api.dialog.action;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import org.jetbrains.annotations.ApiStatus;
/**
* Represents a static dialog action.
*/
@Data
@Accessors(fluent = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class StaticAction extends DialogAction
{
@NonNull
private ChatClickEventWrapper action;
public StaticAction(@NonNull BaseComponent label, BaseComponent tooltip, Integer width, @NonNull ClickEvent action)
{
super( label, tooltip, width );
this.action = new ChatClickEventWrapper( action );
}
public StaticAction(@NonNull BaseComponent label, @NonNull ClickEvent action)
{
super( label );
this.action = new ChatClickEventWrapper( action );
}
@Data
@ApiStatus.Internal
public static final class ChatClickEventWrapper
{
private final ClickEvent event;
}
}

View File

@ -1,5 +1,6 @@
package net.md_5.bungee.api.dialog.submit;
package net.md_5.bungee.api.dialog.dynamic;
import com.google.gson.JsonElement;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
@ -7,13 +8,13 @@ import lombok.ToString;
import lombok.experimental.Accessors;
/**
* Submits the form with the given ID and all values as a payload.
* Submits the dialog with the given ID and values as a payload.
*/
@Data
@Accessors(fluent = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class CustomFormSubmission extends DialogSubmission
public class Custom extends DynamicType
{
/**
@ -21,10 +22,14 @@ public class CustomFormSubmission extends DialogSubmission
*/
@NonNull
private String id;
/**
* Fields to be added to the submission payload.
*/
private JsonElement additions;
public CustomFormSubmission(@NonNull String id)
public Custom(@NonNull String id)
{
super( "minecraft:custom_form" );
super( "dynamic/custom" );
this.id = id;
}
}

View File

@ -1,4 +1,4 @@
package net.md_5.bungee.api.dialog.submit;
package net.md_5.bungee.api.dialog.dynamic;
import lombok.Data;
import lombok.NonNull;
@ -10,7 +10,7 @@ import org.jetbrains.annotations.ApiStatus;
*/
@Data
@Accessors(fluent = true)
public class DialogSubmission
public class DynamicType
{
/**

View File

@ -1,4 +1,4 @@
package net.md_5.bungee.api.dialog.submit;
package net.md_5.bungee.api.dialog.dynamic;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -7,14 +7,14 @@ import lombok.ToString;
import lombok.experimental.Accessors;
/**
* Executes a command on form submission. If the command requires a permission
* Executes a command. If the command requires a permission
* higher than 0, a confirmation dialog will be shown by the client.
*/
@Data
@Accessors(fluent = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class CommandTemplateSubmission extends DialogSubmission
public class RunCommand extends DynamicType
{
/**
@ -28,9 +28,9 @@ public class CommandTemplateSubmission extends DialogSubmission
@NonNull
private String template;
public CommandTemplateSubmission(@NonNull String template)
public RunCommand(@NonNull String template)
{
super( "minecraft:command_template" );
super( "dynamic/run_command" );
this.template = template;
}
}

View File

@ -0,0 +1,4 @@
/**
* Represents the various dynamic actions of dialogs.
*/
package net.md_5.bungee.api.dialog.dynamic;

View File

@ -1,42 +0,0 @@
package net.md_5.bungee.api.dialog.submit;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.ToString;
import lombok.experimental.Accessors;
/**
* Submits the form with the given ID and a single payload specified by the
* template.
*/
@Data
@Accessors(fluent = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class CustomTemplateSubmission extends DialogSubmission
{
/**
* The namespaced key of the submission.
*/
@NonNull
private String id;
/**
* The template to be applied, where variables of the form
* <code>$(key)</code> will be replaced by their
* {@link net.md_5.bungee.api.dialog.input.DialogInput#key} value.
* <br>
* The <code>action</code> key is special and will be replaced with the
* {@link net.md_5.bungee.api.dialog.action.DialogSubmitAction#id}.
*/
@NonNull
private String template;
public CustomTemplateSubmission(@NonNull String id, @NonNull String template)
{
super( "minecraft:custom_template" );
this.id = id;
this.template = template;
}
}

View File

@ -1,4 +0,0 @@
/**
* Represents the various submissions actions of form dialogs.
*/
package net.md_5.bungee.api.dialog.submit;

View File

@ -50,7 +50,7 @@ public class ProtocolConstants
public static final int MINECRAFT_1_21_2 = 768;
public static final int MINECRAFT_1_21_4 = 769;
public static final int MINECRAFT_1_21_5 = 770;
public static final int MINECRAFT_1_21_6 = 1073742075;
public static final int MINECRAFT_1_21_6 = 1073742076;
public static final List<String> SUPPORTED_VERSIONS;
public static final List<Integer> SUPPORTED_VERSION_IDS;

View File

@ -9,6 +9,7 @@ import net.md_5.bungee.protocol.AbstractPacketHandler;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.Protocol;
import net.md_5.bungee.protocol.ProtocolConstants;
import se.llbit.nbt.Tag;
@Data
@NoArgsConstructor
@ -18,20 +19,20 @@ public class CustomClickAction extends DefinedPacket
{
private String id;
private String data;
private Tag data;
@Override
public void read(ByteBuf buf, Protocol protocol, ProtocolConstants.Direction direction, int protocolVersion)
{
id = readString( buf );
data = readNullable( DefinedPacket::readString, buf );
data = readNullable( (buf0) -> readTag( buf0, protocolVersion ), buf );
}
@Override
public void write(ByteBuf buf, Protocol protocol, ProtocolConstants.Direction direction, int protocolVersion)
{
writeString( id, buf );
writeNullable( data, DefinedPacket::writeString, buf );
writeNullable( data, (data0, buf0) -> writeTag( data0, buf0, protocolVersion ), buf );
}
@Override

View File

@ -1,7 +1,6 @@
package net.md_5.bungee.connection;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.mojang.brigadier.context.StringRange;
import com.mojang.brigadier.suggestion.Suggestion;
import com.mojang.brigadier.suggestion.Suggestions;
@ -9,7 +8,6 @@ import io.netty.channel.Channel;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.ServerConnection;
@ -31,6 +29,7 @@ import net.md_5.bungee.netty.PacketHandler;
import net.md_5.bungee.protocol.PacketWrapper;
import net.md_5.bungee.protocol.Protocol;
import net.md_5.bungee.protocol.ProtocolConstants;
import net.md_5.bungee.protocol.TagUtil;
import net.md_5.bungee.protocol.packet.Chat;
import net.md_5.bungee.protocol.packet.ClientChat;
import net.md_5.bungee.protocol.packet.ClientCommand;
@ -48,6 +47,7 @@ import net.md_5.bungee.protocol.packet.TabCompleteRequest;
import net.md_5.bungee.protocol.packet.TabCompleteResponse;
import net.md_5.bungee.protocol.packet.UnsignedClientCommand;
import net.md_5.bungee.util.AllowedCharacters;
import se.llbit.nbt.SpecificTag;
public class UpstreamBridge extends PacketHandler
{
@ -385,29 +385,7 @@ public class UpstreamBridge extends PacketHandler
@Override
public void handle(CustomClickAction customClickAction) throws Exception
{
Map<String, String> data = null;
if ( customClickAction.getData() != null )
{
ImmutableMap.Builder<String, String> parsed = ImmutableMap.builder();
String[] lines = customClickAction.getData().split( "\n" );
for ( String line : lines )
{
String[] split = line.split( "\t", 2 );
if ( split.length > 1 )
{
parsed.put( split[0], split[1] );
}
}
data = parsed.buildOrThrow();
if ( data.isEmpty() )
{
data = null;
}
}
CustomClickEvent event = new CustomClickEvent( con, customClickAction.getId(), customClickAction.getData(), data );
CustomClickEvent event = new CustomClickEvent( con, customClickAction.getId(), TagUtil.toJson( (SpecificTag) customClickAction.getData() ) );
if ( bungee.getPluginManager().callEvent( event ).isCancelled() )
{
throw CancelSendSignal.INSTANCE;

View File

@ -12,12 +12,9 @@ import java.util.IdentityHashMap;
import java.util.Locale;
import lombok.RequiredArgsConstructor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ClickEventCustom;
import net.md_5.bungee.api.chat.ComponentStyle;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.hover.content.Content;
import net.md_5.bungee.api.dialog.chat.ShowDialogClickEvent;
@RequiredArgsConstructor
public class BaseComponentSerializer
@ -44,36 +41,12 @@ public class BaseComponentSerializer
}
if ( clickEvent != null )
{
ClickEvent.Action action = ClickEvent.Action.valueOf( clickEvent.get( "action" ).getAsString().toUpperCase( Locale.ROOT ) );
if ( newClickEvent )
{
switch ( action )
{
case OPEN_URL:
component.setClickEvent( new ClickEvent( action, clickEvent.get( "url" ).getAsString() ) );
break;
case RUN_COMMAND:
case SUGGEST_COMMAND:
component.setClickEvent( new ClickEvent( action, clickEvent.get( "command" ).getAsString() ) );
break;
case CHANGE_PAGE:
int page = clickEvent.get( "page" ).getAsInt();
Preconditions.checkArgument( page >= 0, "Page number has to be positive" );
component.setClickEvent( new ClickEvent( action, Integer.toString( page ) ) );
break;
case SHOW_DIALOG:
component.setClickEvent( context.deserialize( clickEvent.get( "dialog" ), ShowDialogClickEvent.class ) );
break;
case CUSTOM:
component.setClickEvent( new ClickEventCustom( clickEvent.get( "id" ).getAsString(), ( clickEvent.has( "payload" ) ) ? clickEvent.get( "payload" ).getAsString() : null ) );
break;
default:
component.setClickEvent( new ClickEvent( action, ( clickEvent.has( "value" ) ) ? clickEvent.get( "value" ).getAsString() : "" ) );
break;
}
component.setClickEvent( ClickEventSerializer.NEW.deserialize( clickEvent, context ) );
} else
{
component.setClickEvent( new ClickEvent( action, ( clickEvent.has( "value" ) ) ? clickEvent.get( "value" ).getAsString() : "" ) );
component.setClickEvent( ClickEventSerializer.OLD.deserialize( clickEvent, context ) );
}
}
@ -171,50 +144,17 @@ public class BaseComponentSerializer
//Events
if ( component.getClickEvent() != null )
{
JsonObject clickEvent = new JsonObject();
String actionName = component.getClickEvent().getAction().toString().toLowerCase( Locale.ROOT );
clickEvent.addProperty( "action", actionName.toLowerCase( Locale.ROOT ) );
switch ( serializer.getVersion() )
{
case V1_21_5:
ClickEvent.Action action = ClickEvent.Action.valueOf( actionName.toUpperCase( Locale.ROOT ) );
switch ( action )
{
case OPEN_URL:
clickEvent.addProperty( "url", component.getClickEvent().getValue() );
break;
case RUN_COMMAND:
case SUGGEST_COMMAND:
clickEvent.addProperty( "command", component.getClickEvent().getValue() );
break;
case CHANGE_PAGE:
clickEvent.addProperty( "page", Integer.parseInt( component.getClickEvent().getValue() ) );
break;
case SHOW_DIALOG:
clickEvent.add( "dialog", context.serialize( component.getClickEvent() ) );
break;
case CUSTOM:
ClickEventCustom custom = (ClickEventCustom) component.getClickEvent();
clickEvent.addProperty( "id", custom.getValue() );
if ( custom.getPayload() != null )
{
clickEvent.addProperty( "payload", custom.getPayload() );
}
break;
default:
clickEvent.addProperty( "value", component.getClickEvent().getValue() );
break;
}
object.add( "click_event", clickEvent );
object.add( "click_event", ClickEventSerializer.NEW.serialize( component.getClickEvent(), context ) );
break;
case V1_16:
clickEvent.addProperty( "value", component.getClickEvent().getValue() );
object.add( "clickEvent", clickEvent );
object.add( "clickEvent", ClickEventSerializer.OLD.serialize( component.getClickEvent(), context ) );
break;
default:
throw new IllegalArgumentException( "Unknown version " + serializer.getVersion() );
}
}
if ( component.getHoverEvent() != null )
{

View File

@ -0,0 +1,108 @@
package net.md_5.bungee.chat;
import com.google.common.base.Preconditions;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import java.util.Locale;
import lombok.Data;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ClickEventCustom;
import net.md_5.bungee.api.dialog.chat.ShowDialogClickEvent;
@Data
public class ClickEventSerializer
{
public static final ClickEventSerializer OLD = new ClickEventSerializer( ClickType.OLD );
public static final ClickEventSerializer NEW = new ClickEventSerializer( ClickType.NEW );
public static final ClickEventSerializer DIALOG = new ClickEventSerializer( ClickType.DIALOG );
//
public enum ClickType
{
OLD, NEW, DIALOG;
}
private final ClickType type;
public ClickEvent deserialize(JsonObject clickEvent, JsonDeserializationContext context) throws JsonParseException
{
ClickEvent.Action action = ClickEvent.Action.valueOf( clickEvent.get( ( type == ClickType.DIALOG ) ? "type" : "action" ).getAsString().toUpperCase( Locale.ROOT ) );
switch ( type )
{
case NEW:
case DIALOG:
switch ( action )
{
case OPEN_URL:
return new ClickEvent( action, clickEvent.get( "url" ).getAsString() );
case RUN_COMMAND:
case SUGGEST_COMMAND:
return new ClickEvent( action, clickEvent.get( "command" ).getAsString() );
case CHANGE_PAGE:
int page = clickEvent.get( "page" ).getAsInt();
Preconditions.checkArgument( page >= 0, "Page number has to be positive" );
return new ClickEvent( action, Integer.toString( page ) );
case SHOW_DIALOG:
return context.deserialize( clickEvent.get( "dialog" ), ShowDialogClickEvent.class );
case CUSTOM:
return new ClickEventCustom( clickEvent.get( "id" ).getAsString(), ( clickEvent.has( "payload" ) ) ? clickEvent.get( "payload" ).getAsString() : null );
default:
return new ClickEvent( action, ( clickEvent.has( "value" ) ) ? clickEvent.get( "value" ).getAsString() : "" );
}
case OLD:
return new ClickEvent( action, ( clickEvent.has( "value" ) ) ? clickEvent.get( "value" ).getAsString() : "" );
default:
throw new IllegalArgumentException( "Unknown serializer type" );
}
}
public JsonElement serialize(ClickEvent src, JsonSerializationContext context)
{
JsonObject clickEvent = new JsonObject();
String actionName = src.getAction().toString().toLowerCase( Locale.ROOT );
clickEvent.addProperty( ( type == ClickType.DIALOG ) ? "type" : "action", actionName.toLowerCase( Locale.ROOT ) );
switch ( type )
{
case NEW:
case DIALOG:
ClickEvent.Action action = ClickEvent.Action.valueOf( actionName.toUpperCase( Locale.ROOT ) );
switch ( action )
{
case OPEN_URL:
clickEvent.addProperty( "url", src.getValue() );
break;
case RUN_COMMAND:
case SUGGEST_COMMAND:
clickEvent.addProperty( "command", src.getValue() );
break;
case CHANGE_PAGE:
clickEvent.addProperty( "page", Integer.parseInt( src.getValue() ) );
break;
case SHOW_DIALOG:
clickEvent.add( "dialog", context.serialize( src ) );
break;
case CUSTOM:
ClickEventCustom custom = (ClickEventCustom) src;
clickEvent.addProperty( "id", custom.getValue() );
if ( custom.getPayload() != null )
{
clickEvent.addProperty( "payload", custom.getPayload() );
}
break;
default:
clickEvent.addProperty( "value", src.getValue() );
break;
}
break;
case OLD:
clickEvent.addProperty( "value", src.getValue() );
break;
default:
throw new IllegalArgumentException( "Unknown serializer type" );
}
return clickEvent;
}
}

View File

@ -30,6 +30,7 @@ import net.md_5.bungee.api.chat.hover.content.Text;
import net.md_5.bungee.api.chat.hover.content.TextSerializer;
import net.md_5.bungee.api.dialog.Dialog;
import net.md_5.bungee.api.dialog.chat.ShowDialogClickEvent;
import net.md_5.bungee.dialog.ChatClickEventWrapperSerializer;
import net.md_5.bungee.dialog.DialogSerializer;
import net.md_5.bungee.dialog.ShowDialogClickEventSerializer;
import org.jetbrains.annotations.ApiStatus;
@ -67,6 +68,7 @@ public class VersionedComponentSerializer implements JsonDeserializer<BaseCompon
// Dialogs
registerTypeAdapter( Dialog.class, dialogSerializer ).
registerTypeAdapter( ShowDialogClickEvent.class, new ShowDialogClickEventSerializer() ).
registerTypeAdapter( ChatClickEventWrapperSerializer.class, new ChatClickEventWrapperSerializer() ).
create();
}

View File

@ -0,0 +1,27 @@
package net.md_5.bungee.dialog;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
import net.md_5.bungee.api.dialog.action.StaticAction;
import net.md_5.bungee.chat.ClickEventSerializer;
public class ChatClickEventWrapperSerializer implements JsonDeserializer<StaticAction.ChatClickEventWrapper>, JsonSerializer<StaticAction.ChatClickEventWrapper>
{
@Override
public StaticAction.ChatClickEventWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
return new StaticAction.ChatClickEventWrapper( ClickEventSerializer.DIALOG.deserialize( json.getAsJsonObject(), context ) );
}
@Override
public JsonElement serialize(StaticAction.ChatClickEventWrapper src, Type typeOfSrc, JsonSerializationContext context)
{
return ClickEventSerializer.DIALOG.serialize( src.event(), context );
}
}

View File

@ -22,16 +22,14 @@ import net.md_5.bungee.api.dialog.Dialog;
import net.md_5.bungee.api.dialog.DialogBase;
import net.md_5.bungee.api.dialog.DialogListDialog;
import net.md_5.bungee.api.dialog.MultiActionDialog;
import net.md_5.bungee.api.dialog.MultiActionInputFormDialog;
import net.md_5.bungee.api.dialog.NoticeDialog;
import net.md_5.bungee.api.dialog.ServerLinksDialog;
import net.md_5.bungee.api.dialog.SimpleInputFormDialog;
import net.md_5.bungee.chat.VersionedComponentSerializer;
@RequiredArgsConstructor
public class DialogSerializer implements JsonDeserializer<Dialog>, JsonSerializer<Dialog>
{
private static final ThreadLocal<Set<Dialog>> serializedDialogs = new ThreadLocal<Set<Dialog>>();
private static final ThreadLocal<Set<Dialog>> serializedDialogs = new ThreadLocal<>();
private static final BiMap<String, Class<? extends Dialog>> TYPES;
private final VersionedComponentSerializer serializer;
@ -44,8 +42,6 @@ public class DialogSerializer implements JsonDeserializer<Dialog>, JsonSerialize
builder.put( "minecraft:multi_action", MultiActionDialog.class );
builder.put( "minecraft:server_links", ServerLinksDialog.class );
builder.put( "minecraft:dialog_list", DialogListDialog.class );
builder.put( "minecraft:simple_input_form", SimpleInputFormDialog.class );
builder.put( "minecraft:multi_action_input_form", MultiActionInputFormDialog.class );
TYPES = builder.build();
}
@ -108,7 +104,7 @@ public class DialogSerializer implements JsonDeserializer<Dialog>, JsonSerialize
boolean first = serializedDialogs.get() == null;
if ( first )
{
serializedDialogs.set( Collections.newSetFromMap( new IdentityHashMap<Dialog, Boolean>() ) );
serializedDialogs.set( Collections.newSetFromMap( new IdentityHashMap<>() ) );
}
try