mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 15:30:19 +01:00
c6aa61ee18
Updated Upstream (Bukkit/CraftBukkit/Spigot) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: b9df8e9f SPIGOT-7933: Improve custom Minecart max speed fc496179 Fix InstrumentTest 7c0ec598 PR-1075: Make Art an interface c389f5a4 PR-1074: Make Sound an interface CraftBukkit Changes: df1efc0bb SPIGOT-7945: `Bukkit#dispatchCommand` throws `UnsupportedOperationException` 285df6e85 SPIGOT-7933: Improve custom Minecart max speed a0f3d4e50 SPIGOT-7940: Recipe book errors after reload 9e0618ec2 SPIGOT-7937: Cannot spawn minecart during world generation with minecart_improvements enabled 1eb4d28da SPIGOT-7941: Fix resistance over 4 amplify causing issues in damage 52b99158a PR-1504: Make Art an interface e18ae35f1 PR-1502: Make Sound an interface Spigot Changes: e65d67a7 SPIGOT-7934: Item entities start "bouncing" under certain conditions
170 lines
6.7 KiB
Diff
170 lines
6.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
|
Date: Tue, 1 Feb 2022 15:51:55 -0700
|
|
Subject: [PATCH] API for creating command sender which forwards feedback
|
|
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/commands/FeedbackForwardingSender.java b/src/main/java/io/papermc/paper/commands/FeedbackForwardingSender.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..e3a5f1ec376319bdfda87fa27ae217bff3914292
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/commands/FeedbackForwardingSender.java
|
|
@@ -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;
|
|
+ }
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
index 23b2233f7435f03902e640152cc6fe1501fb3820..c89aee30e4a4f4eec48e23b04e0558e17d95587c 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -2165,6 +2165,13 @@ public final class CraftServer implements Server {
|
|
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() {
|
|
return this.entityMetadata;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
|
|
index 7f22950ae61436e91a59cd29a345809c42bbe739..1e3091687735b461d3b6a313ab8761127981d3e8 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
|
|
@@ -12,7 +12,7 @@ import org.bukkit.permissions.PermissionAttachmentInfo;
|
|
import org.bukkit.plugin.Plugin;
|
|
|
|
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
|
|
|
|
protected ServerCommandSender() {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
|
|
index 732655bf8dd279167f799e01b1516b4dd5fa7464..4d4a1ac9d75908bbd105a1e5756d2c0932b2d238 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
|
|
@@ -86,6 +86,11 @@ public final class VanillaCommandWrapper extends BukkitCommand {
|
|
if (sender instanceof ProxiedCommandSender) {
|
|
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");
|
|
}
|