9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-26 02:19:23 +00:00

添加以op身份执行

This commit is contained in:
XiaoMoMi
2025-08-25 16:05:51 +08:00
parent 1469f87690
commit 0049b1c421
5 changed files with 24 additions and 11 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -23,27 +23,30 @@ public class CommandFunction<CTX extends Context> extends AbstractConditionalFun
private final PlayerSelector<CTX> selector;
private final boolean asPlayer;
private final boolean asEvent;
private final boolean asOp;
public CommandFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, List<TextProvider> command, boolean asPlayer, boolean asEvent) {
public CommandFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, List<TextProvider> 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<CTX extends Context> extends AbstractConditionalFun
List<TextProvider> 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);
}
}
}