mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-18 20:53:09 +01:00
8c5b837e05
Firstly, the old methods all routed to the CompletableFuture method. However, the CF method could not guarantee that if the caller was off-main that the future would be "completed" on-main. Since the callback methods used the CF one, this meant that the callback methods did not guarantee that the callbacks were to be called on the main thread. Now, all methods route to getChunkAtAsync(x, z, gen, urgent, cb) so that the methods with the callback are guaranteed to invoke the callback on the main thread. The CF behavior remains unchanged; it may still appear to complete on main if invoked off-main. Secondly, remove the scheduleOnMain invocation in the async chunk completion. This unnecessarily delays the callback by 1 tick. Thirdly, add getChunksAtAsync(minX, minZ, maxX, maxZ, ...) which will load chunks within an area. This method is provided as a helper as keeping all chunks loaded within an area can be complicated to implement for plugins (due to the lacking ticket API), and is already implemented internally anyways. Fourthly, remove the ticket addition that occured with getChunkAt and getChunkAtAsync. The ticket addition may delay the unloading of the chunk unnecessarily. It also fixes a very rare timing bug where the future/callback would be completed after the chunk unloads.
90 lines
6.6 KiB
Diff
90 lines
6.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Mon, 24 Jan 2022 15:32:02 -0800
|
|
Subject: [PATCH] Fix cmd permission levels for command blocks
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java
|
|
index f31c5d665678c3163ed4469f8e9d395b890c1bbe..fc0c60b22844ed010aede2fa125b9fa440d3de80 100644
|
|
--- a/src/main/java/net/minecraft/commands/CommandSourceStack.java
|
|
+++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java
|
|
@@ -206,10 +206,29 @@ public class CommandSourceStack implements ExecutionCommandSource<CommandSourceS
|
|
return this.permissionLevel >= level;
|
|
}
|
|
|
|
+ // Paper start - Fix permission levels for command blocks
|
|
+ private boolean forceRespectPermissionLevel() {
|
|
+ return this.source == CommandSource.NULL || (this.source instanceof final net.minecraft.world.level.BaseCommandBlock commandBlock && commandBlock.getLevel().paperConfig().commandBlocks.forceFollowPermLevel);
|
|
+ }
|
|
+ // Paper end - Fix permission levels for command blocks
|
|
+
|
|
// CraftBukkit start
|
|
public boolean hasPermission(int i, String bukkitPermission) {
|
|
- // World is null when loading functions
|
|
- return ((this.getLevel() == null || !this.getLevel().getCraftServer().ignoreVanillaPermissions) && this.permissionLevel >= i) || this.getBukkitSender().hasPermission(bukkitPermission);
|
|
+ // Paper start - Fix permission levels for command blocks
|
|
+ final java.util.function.BooleanSupplier hasBukkitPerm = () -> this.source == CommandSource.NULL /*treat NULL as having all bukkit perms*/ || this.getBukkitSender().hasPermission(bukkitPermission); // lazily check bukkit perms to the benefit of custom permission setups
|
|
+ // if the server is null, we must check the vanilla perm level system
|
|
+ // if ignoreVanillaPermissions is true, we can skip vanilla perms and just run the bukkit perm check
|
|
+ //noinspection ConstantValue
|
|
+ if (this.getServer() == null || !this.getServer().server.ignoreVanillaPermissions) { // server & level are null for command function loading
|
|
+ final boolean hasPermLevel = this.permissionLevel >= i;
|
|
+ if (this.forceRespectPermissionLevel()) { // NULL CommandSource and command blocks (if setting is enabled) should always pass the vanilla perm check
|
|
+ return hasPermLevel && hasBukkitPerm.getAsBoolean();
|
|
+ } else { // otherwise check vanilla perm first then bukkit perm, matching upstream behavior
|
|
+ return hasPermLevel || hasBukkitPerm.getAsBoolean();
|
|
+ }
|
|
+ }
|
|
+ return hasBukkitPerm.getAsBoolean();
|
|
+ // Paper end - Fix permission levels for command blocks
|
|
}
|
|
// CraftBukkit end
|
|
|
|
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
|
|
index fd12046fab797fd845ad8521f94147480dfba5da..fe9f638db3525893beed565ef9b7ac2fc76318bd 100644
|
|
--- a/src/main/java/net/minecraft/commands/Commands.java
|
|
+++ b/src/main/java/net/minecraft/commands/Commands.java
|
|
@@ -300,16 +300,7 @@ public class Commands {
|
|
String[] args = command.split(" ");
|
|
if (args.length == 0) return; // Paper - empty commands shall not be dispatched
|
|
|
|
- String cmd = args[0];
|
|
- if (cmd.startsWith("minecraft:")) cmd = cmd.substring("minecraft:".length());
|
|
- if (cmd.startsWith("bukkit:")) cmd = cmd.substring("bukkit:".length());
|
|
-
|
|
- // Block disallowed commands
|
|
- if (cmd.equalsIgnoreCase("stop") || cmd.equalsIgnoreCase("kick") || cmd.equalsIgnoreCase("op")
|
|
- || cmd.equalsIgnoreCase("deop") || cmd.equalsIgnoreCase("ban") || cmd.equalsIgnoreCase("ban-ip")
|
|
- || cmd.equalsIgnoreCase("pardon") || cmd.equalsIgnoreCase("pardon-ip") || cmd.equalsIgnoreCase("reload")) {
|
|
- return;
|
|
- }
|
|
+ // Paper - Fix permission levels for command blocks
|
|
|
|
// Handle vanilla commands;
|
|
if (sender.getLevel().getCraftServer().getCommandBlockOverride(args[0])) {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java
|
|
index d7321275cf963ba4fd838226c7f705ea0f2e1ac6..56bae8ea1e7b115e85a701209f3badbd29912b28 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java
|
|
@@ -133,7 +133,7 @@ public class MinecartCommandBlock extends AbstractMinecart {
|
|
|
|
@Override
|
|
public CommandSourceStack createCommandSourceStack() {
|
|
- return new CommandSourceStack(this, MinecartCommandBlock.this.position(), MinecartCommandBlock.this.getRotationVector(), this.getLevel(), 2, this.getName().getString(), MinecartCommandBlock.this.getDisplayName(), this.getLevel().getServer(), MinecartCommandBlock.this);
|
|
+ return new CommandSourceStack(this, MinecartCommandBlock.this.position(), MinecartCommandBlock.this.getRotationVector(), this.getLevel(), this.getLevel().paperConfig().commandBlocks.permissionsLevel, this.getName().getString(), MinecartCommandBlock.this.getDisplayName(), this.getLevel().getServer(), MinecartCommandBlock.this); // Paper - configurable command block perm level
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java
|
|
index faa0a3248217fb27dae5b918099f8a63eee6f586..a02c5feb8f2ffe6bb6070650a45762476e1ff9ac 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java
|
|
@@ -58,7 +58,7 @@ public class CommandBlockEntity extends BlockEntity {
|
|
public CommandSourceStack createCommandSourceStack() {
|
|
Direction enumdirection = (Direction) CommandBlockEntity.this.getBlockState().getValue(CommandBlock.FACING);
|
|
|
|
- return new CommandSourceStack(this, Vec3.atCenterOf(CommandBlockEntity.this.worldPosition), new Vec2(0.0F, enumdirection.toYRot()), this.getLevel(), 2, this.getName().getString(), this.getName(), this.getLevel().getServer(), (Entity) null);
|
|
+ return new CommandSourceStack(this, Vec3.atCenterOf(CommandBlockEntity.this.worldPosition), new Vec2(0.0F, enumdirection.toYRot()), this.getLevel(), this.getLevel().paperConfig().commandBlocks.permissionsLevel, this.getName().getString(), this.getName(), this.getLevel().getServer(), (Entity) null); // Paper - configurable command block perm level
|
|
}
|
|
|
|
@Override
|