Skip to content

Commit 136868d

Browse files
Pass executor context properly for command block usage
1 parent 4ca58a4 commit 136868d

File tree

3 files changed

+78
-11
lines changed

3 files changed

+78
-11
lines changed

fabric/src/main/java/me/moros/bending/fabric/platform/CommandSender.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727

2828
public sealed class CommandSender implements ForwardingAudience.Single permits PlayerCommandSender {
2929
private final CommandSourceStack stack;
30+
private final Audience audience;
3031

31-
private CommandSender(CommandSourceStack source) {
32+
private CommandSender(CommandSourceStack source, Audience audience) {
3233
this.stack = source;
34+
this.audience = audience;
3335
}
3436

3537
public CommandSourceStack stack() {
@@ -38,19 +40,20 @@ public CommandSourceStack stack() {
3840

3941
@Override
4042
public Audience audience() {
41-
return stack;
43+
return audience;
4244
}
4345

4446
public static final class PlayerCommandSender extends CommandSender {
45-
private PlayerCommandSender(CommandSourceStack stack) {
46-
super(stack);
47+
private PlayerCommandSender(CommandSourceStack stack, ServerPlayer player) {
48+
super(stack, player);
4749
}
4850
}
4951

5052
public static CommandSender from(CommandSourceStack stack) {
51-
if (stack.getPlayer() instanceof ServerPlayer) {
52-
return new PlayerCommandSender(stack);
53+
ServerPlayer player = stack.getPlayer();
54+
if (player != null) {
55+
return new PlayerCommandSender(stack, player);
5356
}
54-
return new CommandSender(stack);
57+
return new CommandSender(stack, stack);
5558
}
5659
}

paper/src/main/java/me/moros/bending/paper/PaperBending.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
import me.moros.bending.paper.platform.BrigadierSetup;
4545
import me.moros.bending.paper.platform.BukkitPermissionInitializer;
4646
import me.moros.bending.paper.platform.BukkitPlatform;
47+
import me.moros.bending.paper.platform.CommandSender;
48+
import me.moros.bending.paper.platform.CommandSender.PlayerCommandSender;
4749
import me.moros.bending.paper.protection.ProtectionInitializer;
4850
import me.moros.tasker.paper.PaperExecutor;
4951
import org.bstats.bukkit.Metrics;
@@ -53,8 +55,9 @@
5355
import org.bukkit.Server;
5456
import org.bukkit.entity.Player;
5557
import org.bukkit.plugin.ServicePriority;
58+
import org.incendo.cloud.SenderMapper;
5659
import org.incendo.cloud.execution.ExecutionCoordinator;
57-
import org.incendo.cloud.paper.LegacyPaperCommandManager;
60+
import org.incendo.cloud.paper.PaperCommandManager;
5861

5962
final class PaperBending extends AbstractBending<BendingBootstrap> {
6063
PaperBending(BendingBootstrap parent, Path dir, Logger logger) {
@@ -76,10 +79,11 @@ void onPluginEnable() {
7679
pluginManager.registerEvents(new ConnectionListener(logger(), game), parent);
7780
pluginManager.registerEvents(new WorldListener(game), parent);
7881

79-
var manager = LegacyPaperCommandManager.createNative(parent, ExecutionCoordinator.simpleCoordinator());
80-
manager.registerBrigadier();
82+
var manager = PaperCommandManager.builder(SenderMapper.create(CommandSender::from, CommandSender::stack))
83+
.executionCoordinator(ExecutionCoordinator.simpleCoordinator())
84+
.buildOnEnable(parent);
8185
BrigadierSetup.setup(manager);
82-
Commander.create(manager, Player.class, this).init();
86+
Commander.create(manager, PlayerCommandSender.class, this).init();
8387

8488
parent.getServer().getServicesManager().register(Game.class, game, parent, ServicePriority.Normal);
8589
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Copyright 2020-2026 Moros
3+
*
4+
* This file is part of Bending.
5+
*
6+
* Bending is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Affero General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* Bending is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Affero General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Affero General Public License
17+
* along with Bending. If not, see <https://www.gnu.org/licenses/>.
18+
*/
19+
20+
package me.moros.bending.paper.platform;
21+
22+
import io.papermc.paper.command.brigadier.CommandSourceStack;
23+
import me.moros.bending.paper.platform.CommandSender.PlayerCommandSender;
24+
import net.kyori.adventure.audience.Audience;
25+
import net.kyori.adventure.audience.ForwardingAudience;
26+
import org.bukkit.entity.Player;
27+
28+
public sealed class CommandSender implements ForwardingAudience.Single permits PlayerCommandSender {
29+
private final CommandSourceStack stack;
30+
private final Audience audience;
31+
32+
private CommandSender(CommandSourceStack source, Audience audience) {
33+
this.stack = source;
34+
this.audience = audience;
35+
}
36+
37+
public CommandSourceStack stack() {
38+
return this.stack;
39+
}
40+
41+
@Override
42+
public Audience audience() {
43+
return audience;
44+
}
45+
46+
public static final class PlayerCommandSender extends CommandSender {
47+
private PlayerCommandSender(CommandSourceStack stack, Player player) {
48+
super(stack, player);
49+
}
50+
}
51+
52+
public static CommandSender from(CommandSourceStack stack) {
53+
if (stack.getExecutor() instanceof Player player) {
54+
return new PlayerCommandSender(stack, player);
55+
} else if (stack.getSender() instanceof Player player) {
56+
return new PlayerCommandSender(stack, player);
57+
}
58+
return new CommandSender(stack, stack.getSender());
59+
}
60+
}

0 commit comments

Comments
 (0)