Skip to content

Commit 425edfa

Browse files
More CommandBlock API (#5746)
1 parent 3b2b835 commit 425edfa

File tree

4 files changed

+260
-0
lines changed

4 files changed

+260
-0
lines changed

patches/api/0007-Adventure.patch

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,49 @@ index dd0fef9155077ce6df7bdadc9e4152008f700a3b..92e8b0b1ccebdc2646337114793ea9f3
11031103
/**
11041104
* Returns a list of entities within a bounding box centered around a
11051105
* Location.
1106+
diff --git a/src/main/java/org/bukkit/block/CommandBlock.java b/src/main/java/org/bukkit/block/CommandBlock.java
1107+
index 372c0bd5a4d7800a11c24c95e39fe376a96232bf..73dce588d1f7a5048300073bf8c2b14d6da1e857 100644
1108+
--- a/src/main/java/org/bukkit/block/CommandBlock.java
1109+
+++ b/src/main/java/org/bukkit/block/CommandBlock.java
1110+
@@ -33,7 +33,9 @@ public interface CommandBlock extends TileState {
1111+
* by default is "@".
1112+
*
1113+
* @return Name of this CommandBlock.
1114+
+ * @deprecated in favour of {@link #name()}
1115+
*/
1116+
+ @Deprecated // Paper
1117+
@NotNull
1118+
public String getName();
1119+
1120+
@@ -43,6 +45,28 @@ public interface CommandBlock extends TileState {
1121+
* same as setting it to "@".
1122+
*
1123+
* @param name New name for this CommandBlock.
1124+
+ * @deprecated in favour of {@link #name(net.kyori.adventure.text.Component)}
1125+
*/
1126+
+ @Deprecated // Paper
1127+
public void setName(@Nullable String name);
1128+
+
1129+
+ // Paper start
1130+
+ /**
1131+
+ * Gets the name of this CommandBlock. The name is used with commands
1132+
+ * that this CommandBlock executes. This name will never be null, and
1133+
+ * by default is a {@link net.kyori.adventure.text.TextComponent} containing {@code @}.
1134+
+ *
1135+
+ * @return Name of this CommandBlock.
1136+
+ */
1137+
+ public @NotNull net.kyori.adventure.text.Component name();
1138+
+
1139+
+ /**
1140+
+ * Sets the name of this CommandBlock. The name is used with commands
1141+
+ * that this CommandBlock executes. Setting the name to null is the
1142+
+ * same as setting it to a {@link net.kyori.adventure.text.TextComponent} containing {@code @}.
1143+
+ *
1144+
+ * @param name New name for this CommandBlock.
1145+
+ */
1146+
+ public void name(@Nullable net.kyori.adventure.text.Component name);
1147+
+ // Paper end
1148+
}
11061149
diff --git a/src/main/java/org/bukkit/block/Sign.java b/src/main/java/org/bukkit/block/Sign.java
11071150
index ab6b0ec328e94bf65a0dafd0403e5ee3b870296c..c8d37184d8e882a4084a1bfef85faa330588600b 100644
11081151
--- a/src/main/java/org/bukkit/block/Sign.java
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Jake Potrebic <jake.m.potrebic@gmail.com>
3+
Date: Fri, 28 May 2021 21:47:39 -0700
4+
Subject: [PATCH] More CommandBlock API
5+
6+
7+
diff --git a/src/main/java/io/papermc/paper/command/CommandBlockHolder.java b/src/main/java/io/papermc/paper/command/CommandBlockHolder.java
8+
new file mode 100644
9+
index 0000000000000000000000000000000000000000..09e57f495e3cbf3c6f434d12ab34830862faeb88
10+
--- /dev/null
11+
+++ b/src/main/java/io/papermc/paper/command/CommandBlockHolder.java
12+
@@ -0,0 +1,58 @@
13+
+package io.papermc.paper.command;
14+
+
15+
+import net.kyori.adventure.text.Component;
16+
+import org.jetbrains.annotations.NotNull;
17+
+import org.jetbrains.annotations.Nullable;
18+
+
19+
+public interface CommandBlockHolder {
20+
+
21+
+ /**
22+
+ * Gets the command that this CommandBlock will run when powered.
23+
+ * This will never return null. If the CommandBlock does not have a
24+
+ * command, an empty String will be returned instead.
25+
+ *
26+
+ * @return Command that this CommandBlock will run when activated.
27+
+ */
28+
+ @NotNull
29+
+ String getCommand();
30+
+
31+
+ /**
32+
+ * Sets the command that this CommandBlock will run when powered.
33+
+ * Setting the command to null is the same as setting it to an empty
34+
+ * String.
35+
+ *
36+
+ * @param command Command that this CommandBlock will run when activated.
37+
+ */
38+
+ void setCommand(@Nullable String command);
39+
+
40+
+ /**
41+
+ * Gets the last output from this command block.
42+
+ *
43+
+ * @return the last output
44+
+ */
45+
+ @NotNull
46+
+ Component lastOutput();
47+
+
48+
+ /**
49+
+ * Sets the last output from this command block.
50+
+ *
51+
+ * @param lastOutput the last output
52+
+ */
53+
+ void lastOutput(@Nullable Component lastOutput);
54+
+
55+
+ /**
56+
+ * Gets the success count from this command block.
57+
+ * @see <a href="https://minecraft.fandom.com/wiki/Command_Block#Success_count">Command_Block#Success_count</a>
58+
+ *
59+
+ * @return the success count
60+
+ */
61+
+ int getSuccessCount();
62+
+
63+
+ /**
64+
+ * Sets the success count from this command block.
65+
+ * @see <a href="https://minecraft.fandom.com/wiki/Command_Block#Success_count">Command_Block#Success_count</a>
66+
+ *
67+
+ * @param successCount the success count
68+
+ */
69+
+ void setSuccessCount(int successCount);
70+
+}
71+
diff --git a/src/main/java/org/bukkit/block/CommandBlock.java b/src/main/java/org/bukkit/block/CommandBlock.java
72+
index 73dce588d1f7a5048300073bf8c2b14d6da1e857..d63da691fb8cfa04bb699adb2eb55278e8b76200 100644
73+
--- a/src/main/java/org/bukkit/block/CommandBlock.java
74+
+++ b/src/main/java/org/bukkit/block/CommandBlock.java
75+
@@ -6,7 +6,7 @@ import org.jetbrains.annotations.Nullable;
76+
/**
77+
* Represents a captured state of a command block.
78+
*/
79+
-public interface CommandBlock extends TileState {
80+
+public interface CommandBlock extends TileState, io.papermc.paper.command.CommandBlockHolder { // Paper
81+
82+
/**
83+
* Gets the command that this CommandBlock will run when powered.
84+
diff --git a/src/main/java/org/bukkit/entity/minecart/CommandMinecart.java b/src/main/java/org/bukkit/entity/minecart/CommandMinecart.java
85+
index 91cab8b13d5bba34007f124838b32a1df58c5ac7..6a6021ad3a0e6aaf51f5144fa126e81bada9cfcf 100644
86+
--- a/src/main/java/org/bukkit/entity/minecart/CommandMinecart.java
87+
+++ b/src/main/java/org/bukkit/entity/minecart/CommandMinecart.java
88+
@@ -4,7 +4,7 @@ import org.bukkit.entity.Minecart;
89+
import org.jetbrains.annotations.NotNull;
90+
import org.jetbrains.annotations.Nullable;
91+
92+
-public interface CommandMinecart extends Minecart {
93+
+public interface CommandMinecart extends Minecart, io.papermc.paper.command.CommandBlockHolder { // Paper
94+
95+
/**
96+
* Gets the command that this CommandMinecart will run when activated.

patches/server/0011-Adventure.patch

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,6 +1926,27 @@ index 449f42b324e31e1a28562b1fe99416f8925f5204..c35e1964a295032623cf9cb6ade84e69
19261926
@Override
19271927
public String getCustomName() {
19281928
BeaconBlockEntity beacon = this.getSnapshot();
1929+
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
1930+
index 94ebc38a7f7bf9b08f4469f0c239fe8774249faf..c7af598a039f0d41aa4d1943714ed06986828c2a 100644
1931+
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
1932+
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
1933+
@@ -35,4 +35,16 @@ public class CraftCommandBlock extends CraftBlockEntityState<CommandBlockEntity>
1934+
public void setName(String name) {
1935+
getSnapshot().getCommandBlock().setName(CraftChatMessage.fromStringOrNull(name != null ? name : "@"));
1936+
}
1937+
+
1938+
+ // Paper start
1939+
+ @Override
1940+
+ public net.kyori.adventure.text.Component name() {
1941+
+ return io.papermc.paper.adventure.PaperAdventure.asAdventure(getSnapshot().getCommandBlock().getName());
1942+
+ }
1943+
+
1944+
+ @Override
1945+
+ public void name(net.kyori.adventure.text.Component name) {
1946+
+ getSnapshot().getCommandBlock().setName(name == null ? new net.minecraft.network.chat.TextComponent("@") : io.papermc.paper.adventure.PaperAdventure.asVanilla(name));
1947+
+ }
1948+
+ // Paper end
1949+
}
19291950
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java
19301951
index 16a0f6e390a7415635e3573c1f79f7d78e5ef859..b1edc96d7e0444e72b79f190982de1d1bb5987f3 100644
19311952
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Jake Potrebic <jake.m.potrebic@gmail.com>
3+
Date: Thu, 23 Sep 2021 10:40:09 -0700
4+
Subject: [PATCH] More CommmandBlock API
5+
6+
7+
diff --git a/src/main/java/io/papermc/paper/commands/PaperCommandBlockHolder.java b/src/main/java/io/papermc/paper/commands/PaperCommandBlockHolder.java
8+
new file mode 100644
9+
index 0000000000000000000000000000000000000000..0b42306f17bf8850a13a51067c2d19e7583187e5
10+
--- /dev/null
11+
+++ b/src/main/java/io/papermc/paper/commands/PaperCommandBlockHolder.java
12+
@@ -0,0 +1,33 @@
13+
+package io.papermc.paper.commands;
14+
+
15+
+import io.papermc.paper.adventure.PaperAdventure;
16+
+import io.papermc.paper.command.CommandBlockHolder;
17+
+import net.kyori.adventure.text.Component;
18+
+import net.minecraft.world.level.BaseCommandBlock;
19+
+import org.jetbrains.annotations.NotNull;
20+
+import org.jetbrains.annotations.Nullable;
21+
+
22+
+public interface PaperCommandBlockHolder extends CommandBlockHolder {
23+
+
24+
+ BaseCommandBlock getCommandBlockHandle();
25+
+
26+
+ @Override
27+
+ default @NotNull Component lastOutput() {
28+
+ return PaperAdventure.asAdventure(getCommandBlockHandle().getLastOutput());
29+
+ }
30+
+
31+
+ @Override
32+
+ default void lastOutput(@Nullable Component lastOutput) {
33+
+ getCommandBlockHandle().setLastOutput(PaperAdventure.asVanilla(lastOutput));
34+
+ }
35+
+
36+
+ @Override
37+
+ default int getSuccessCount() {
38+
+ return getCommandBlockHandle().getSuccessCount();
39+
+ }
40+
+
41+
+ @Override
42+
+ default void setSuccessCount(int successCount) {
43+
+ getCommandBlockHandle().setSuccessCount(successCount);
44+
+ }
45+
+}
46+
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
47+
index c7af598a039f0d41aa4d1943714ed06986828c2a..ed10b13b29880459d68b6a7a60a5a9e1e1107d71 100644
48+
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
49+
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
50+
@@ -6,7 +6,7 @@ import org.bukkit.block.Block;
51+
import org.bukkit.block.CommandBlock;
52+
import org.bukkit.craftbukkit.util.CraftChatMessage;
53+
54+
-public class CraftCommandBlock extends CraftBlockEntityState<CommandBlockEntity> implements CommandBlock {
55+
+public class CraftCommandBlock extends CraftBlockEntityState<CommandBlockEntity> implements CommandBlock, io.papermc.paper.commands.PaperCommandBlockHolder {
56+
57+
public CraftCommandBlock(Block block) {
58+
super(block, CommandBlockEntity.class);
59+
@@ -46,5 +46,10 @@ public class CraftCommandBlock extends CraftBlockEntityState<CommandBlockEntity>
60+
public void name(net.kyori.adventure.text.Component name) {
61+
getSnapshot().getCommandBlock().setName(name == null ? new net.minecraft.network.chat.TextComponent("@") : io.papermc.paper.adventure.PaperAdventure.asVanilla(name));
62+
}
63+
+
64+
+ @Override
65+
+ public net.minecraft.world.level.BaseCommandBlock getCommandBlockHandle() {
66+
+ return getSnapshot().getCommandBlock();
67+
+ }
68+
// Paper end
69+
}
70+
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java
71+
index f9863e138994f6c7a7975a852f106faa96d52315..b709a1d909c189f60d0c3aa97b4b96623e7c1db0 100644
72+
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java
73+
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java
74+
@@ -14,7 +14,7 @@ import org.bukkit.permissions.PermissionAttachment;
75+
import org.bukkit.permissions.PermissionAttachmentInfo;
76+
import org.bukkit.plugin.Plugin;
77+
78+
-public class CraftMinecartCommand extends CraftMinecart implements CommandMinecart {
79+
+public class CraftMinecartCommand extends CraftMinecart implements CommandMinecart, io.papermc.paper.commands.PaperCommandBlockHolder {
80+
private final PermissibleBase perm = new PermissibleBase(this);
81+
82+
public CraftMinecartCommand(CraftServer server, MinecartCommandBlock entity) {
83+
@@ -70,6 +70,17 @@ public class CraftMinecartCommand extends CraftMinecart implements CommandMineca
84+
public net.kyori.adventure.text.@org.jetbrains.annotations.NotNull Component name() {
85+
return io.papermc.paper.adventure.PaperAdventure.asAdventure(this.getHandle().getCommandBlock().getName());
86+
}
87+
+
88+
+ @Override
89+
+ public net.minecraft.world.level.BaseCommandBlock getCommandBlockHandle() {
90+
+ return getHandle().getCommandBlock();
91+
+ }
92+
+
93+
+ @Override
94+
+ public void lastOutput(net.kyori.adventure.text.Component lastOutput) {
95+
+ io.papermc.paper.commands.PaperCommandBlockHolder.super.lastOutput(lastOutput);
96+
+ getCommandBlockHandle().onUpdated();
97+
+ }
98+
// Paper end
99+
100+
@Override

0 commit comments

Comments
 (0)