API for creating command sender which forwards feedback
This commit is contained in:
@ -0,0 +1,111 @@
|
|||||||
|
package io.papermc.paper.commands;
|
||||||
|
|
||||||
|
import io.papermc.paper.adventure.PaperAdventure;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import net.kyori.adventure.audience.MessageType;
|
||||||
|
import net.kyori.adventure.identity.Identity;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||||
|
import net.minecraft.commands.CommandSource;
|
||||||
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.phys.Vec2;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.craftbukkit.CraftServer;
|
||||||
|
import org.bukkit.craftbukkit.command.ServerCommandSender;
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
import org.checkerframework.framework.qual.DefaultQualifier;
|
||||||
|
|
||||||
|
@DefaultQualifier(NonNull.class)
|
||||||
|
public final class FeedbackForwardingSender extends ServerCommandSender {
|
||||||
|
private final Consumer<? super Component> feedback;
|
||||||
|
private final CraftServer server;
|
||||||
|
|
||||||
|
public FeedbackForwardingSender(final Consumer<? super Component> feedback, final CraftServer server) {
|
||||||
|
super(((ServerCommandSender) server.getConsoleSender()).perm);
|
||||||
|
this.server = server;
|
||||||
|
this.feedback = feedback;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendMessage(final String message) {
|
||||||
|
this.sendMessage(LegacyComponentSerializer.legacySection().deserialize(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendMessage(final String... messages) {
|
||||||
|
for (final String message : messages) {
|
||||||
|
this.sendMessage(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendMessage(final Identity identity, final Component message, final MessageType type) {
|
||||||
|
this.feedback.accept(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "FeedbackForwardingSender";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component name() {
|
||||||
|
return Component.text(this.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isOp() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setOp(final boolean value) {
|
||||||
|
throw new UnsupportedOperationException("Cannot change operator status of " + this.getClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommandSourceStack asVanilla() {
|
||||||
|
final @Nullable ServerLevel overworld = this.server.getServer().overworld();
|
||||||
|
return new CommandSourceStack(
|
||||||
|
new Source(this),
|
||||||
|
overworld == null ? Vec3.ZERO : Vec3.atLowerCornerOf(overworld.getSharedSpawnPos()),
|
||||||
|
Vec2.ZERO,
|
||||||
|
overworld,
|
||||||
|
4,
|
||||||
|
this.getName(),
|
||||||
|
net.minecraft.network.chat.Component.literal(this.getName()),
|
||||||
|
this.server.getServer(),
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private record Source(FeedbackForwardingSender sender) implements CommandSource {
|
||||||
|
@Override
|
||||||
|
public void sendSystemMessage(final net.minecraft.network.chat.Component message) {
|
||||||
|
this.sender.sendMessage(Identity.nil(), PaperAdventure.asAdventure(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean acceptsSuccess() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean acceptsFailure() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldInformAdmins() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommandSender getBukkitSender(final CommandSourceStack stack) {
|
||||||
|
return this.sender;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2165,6 +2165,13 @@ public final class CraftServer implements Server {
|
|||||||
return this.console.console;
|
return this.console.console;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Paper start
|
||||||
|
@Override
|
||||||
|
public CommandSender createCommandSender(final java.util.function.Consumer<? super net.kyori.adventure.text.Component> feedback) {
|
||||||
|
return new io.papermc.paper.commands.FeedbackForwardingSender(feedback, this);
|
||||||
|
}
|
||||||
|
// Paper end
|
||||||
|
|
||||||
public EntityMetadataStore getEntityMetadata() {
|
public EntityMetadataStore getEntityMetadata() {
|
||||||
return this.entityMetadata;
|
return this.entityMetadata;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import org.bukkit.permissions.PermissionAttachmentInfo;
|
|||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
public abstract class ServerCommandSender implements CommandSender {
|
public abstract class ServerCommandSender implements CommandSender {
|
||||||
private final PermissibleBase perm;
|
public final PermissibleBase perm; // Paper
|
||||||
private net.kyori.adventure.pointer.Pointers adventure$pointers; // Paper - implement pointers
|
private net.kyori.adventure.pointer.Pointers adventure$pointers; // Paper - implement pointers
|
||||||
|
|
||||||
protected ServerCommandSender() {
|
protected ServerCommandSender() {
|
||||||
|
|||||||
@ -86,6 +86,11 @@ public final class VanillaCommandWrapper extends BukkitCommand {
|
|||||||
if (sender instanceof ProxiedCommandSender) {
|
if (sender instanceof ProxiedCommandSender) {
|
||||||
return ((ProxiedNativeCommandSender) sender).getHandle();
|
return ((ProxiedNativeCommandSender) sender).getHandle();
|
||||||
}
|
}
|
||||||
|
// Paper start
|
||||||
|
if (sender instanceof io.papermc.paper.commands.FeedbackForwardingSender feedback) {
|
||||||
|
return feedback.asVanilla();
|
||||||
|
}
|
||||||
|
// Paper end
|
||||||
|
|
||||||
throw new IllegalArgumentException("Cannot make " + sender + " a vanilla command listener");
|
throw new IllegalArgumentException("Cannot make " + sender + " a vanilla command listener");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user