Use one PermissibleBase for all command blocks

Inspired by Spigot commit 4bd27f7d0f8dcffab0062741416a612ea258dc68 by FrozenBrain.
This commit is contained in:
md_5 2023-12-23 08:28:06 +11:00
parent 5876cca442
commit f90ce621ef
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
2 changed files with 26 additions and 5 deletions

View File

@ -7,16 +7,32 @@ import org.bukkit.block.Block;
import org.bukkit.command.BlockCommandSender; import org.bukkit.command.BlockCommandSender;
import org.bukkit.craftbukkit.block.CraftBlock; import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.permissions.PermissibleBase;
import org.bukkit.permissions.ServerOperator;
/** /**
* Represents input from a command block * Represents input from a command block
*/ */
public class CraftBlockCommandSender extends ServerCommandSender implements BlockCommandSender { public class CraftBlockCommandSender extends ServerCommandSender implements BlockCommandSender {
// For performance reasons, use one PermissibleBase for all command blocks.
private static final PermissibleBase SHARED_PERM = new PermissibleBase(new ServerOperator() {
@Override
public boolean isOp() {
return true;
}
@Override
public void setOp(boolean value) {
throw new UnsupportedOperationException("Cannot change operator status of a block");
}
});
private final CommandListenerWrapper block; private final CommandListenerWrapper block;
private final TileEntity tile; private final TileEntity tile;
public CraftBlockCommandSender(CommandListenerWrapper commandBlockListenerAbstract, TileEntity tile) { public CraftBlockCommandSender(CommandListenerWrapper commandBlockListenerAbstract, TileEntity tile) {
super(); super(SHARED_PERM);
this.block = commandBlockListenerAbstract; this.block = commandBlockListenerAbstract;
this.tile = tile; this.tile = tile;
} }
@ -47,12 +63,12 @@ public class CraftBlockCommandSender extends ServerCommandSender implements Bloc
@Override @Override
public boolean isOp() { public boolean isOp() {
return true; return SHARED_PERM.isOp();
} }
@Override @Override
public void setOp(boolean value) { public void setOp(boolean value) {
throw new UnsupportedOperationException("Cannot change operator status of a block"); SHARED_PERM.setOp(value);
} }
public CommandListenerWrapper getWrapper() { public CommandListenerWrapper getWrapper() {

View File

@ -12,9 +12,14 @@ import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public abstract class ServerCommandSender implements CommandSender { public abstract class ServerCommandSender implements CommandSender {
private final PermissibleBase perm = new PermissibleBase(this); private final PermissibleBase perm;
public ServerCommandSender() { protected ServerCommandSender() {
this.perm = new PermissibleBase(this);
}
protected ServerCommandSender(PermissibleBase perm) {
this.perm = perm;
} }
@Override @Override