From 0049b1c421707dfb810103671994aad3eac51534 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 25 Aug 2025 16:05:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BB=A5op=E8=BA=AB=E4=BB=BD?= =?UTF-8?q?=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/injector/BlockGenerator.java | 1 - .../bukkit/plugin/user/BukkitServerPlayer.java | 16 ++++++++++++++-- .../bukkit/world/BukkitExistingBlock.java | 2 -- .../craftengine/core/entity/player/Player.java | 2 +- .../plugin/context/function/CommandFunction.java | 14 +++++++++----- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java index 059ce70fd..e05bada17 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java @@ -34,7 +34,6 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.Field; import java.util.concurrent.Callable; -import java.util.function.BiConsumer; import java.util.function.Function; public final class BlockGenerator { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 839e5d926..d9bdc7478 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -956,8 +956,20 @@ public class BukkitServerPlayer extends Player { } @Override - public void performCommand(String command) { - platformPlayer().performCommand(command); + public void performCommand(String command, boolean asOp) { + org.bukkit.entity.Player player = platformPlayer(); + if (asOp) { + boolean isOp = player.isOp(); + player.setOp(true); + try { + player.performCommand(command); + } catch (Throwable t) { + this.plugin.logger().warn("Failed to perform command '" + command + "' for " + this.name() + " as operator", t); + } + player.setOp(isOp); + } else { + player.performCommand(command); + } } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitExistingBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitExistingBlock.java index 10b63da33..3013d73d1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitExistingBlock.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitExistingBlock.java @@ -18,9 +18,7 @@ import net.momirealms.craftengine.core.world.ExistingBlock; import net.momirealms.craftengine.core.world.World; import org.bukkit.Location; import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Optional; diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index 8bbcbb73b..b0adb4685 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -112,7 +112,7 @@ public abstract class Player extends AbstractEntity implements NetWorkUser { public abstract void unloadCurrentResourcePack(); - public abstract void performCommand(String command); + public abstract void performCommand(String command, boolean asOp); public abstract void performCommandAsEvent(String command); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java index ce444cd36..2447d64ff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java @@ -23,27 +23,30 @@ public class CommandFunction extends AbstractConditionalFun private final PlayerSelector selector; private final boolean asPlayer; private final boolean asEvent; + private final boolean asOp; - public CommandFunction(List> predicates, @Nullable PlayerSelector selector, List command, boolean asPlayer, boolean asEvent) { + public CommandFunction(List> predicates, @Nullable PlayerSelector selector, List command, + boolean asPlayer, boolean asEvent, boolean asOp) { super(predicates); this.command = command; this.selector = selector; this.asPlayer = asPlayer; this.asEvent = asEvent; + this.asOp = asOp; } @Override public void runInternal(CTX ctx) { - if (this.asPlayer) { + if (this.asPlayer || this.asOp) { if (this.selector == null) { ctx.getOptionalParameter(DirectContextParameters.PLAYER) .ifPresent(player -> executeCommands( - ctx, this.asEvent ? player::performCommandAsEvent : player::performCommand + ctx, this.asEvent ? player::performCommandAsEvent : command1 -> player.performCommand(command1, this.asOp) )); } else { for (Player viewer : this.selector.get(ctx)) { RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer, ContextHolder.EMPTY)); - executeCommands(relationalContext, this.asEvent ? viewer::performCommandAsEvent : viewer::performCommand); + executeCommands(relationalContext, this.asEvent ? viewer::performCommandAsEvent : command1 -> viewer.performCommand(command1, this.asOp)); } } } else { @@ -77,7 +80,8 @@ public class CommandFunction extends AbstractConditionalFun List commands = MiscUtils.getAsStringList(command).stream().map(TextProviders::fromString).toList(); boolean asPlayer = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("as-player", false), "as-player"); boolean asEvent = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("as-event", false), "as-event"); - return new CommandFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), commands, asPlayer, asEvent); + boolean asOp = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("as-op", false), "as-op"); + return new CommandFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), commands, asPlayer, asEvent, asOp); } } }