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:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user