79 lines
		
	
	
	
		
			6.8 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			6.8 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
						|
From: Mariell Hoversholm <proximyst@proximyst.com>
 | 
						|
Date: Sat, 16 May 2020 10:05:30 +0200
 | 
						|
Subject: [PATCH] Add permission for command blocks
 | 
						|
 | 
						|
 | 
						|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
 | 
						|
index cd6f34ee326228036f8c025e4e6d04e0c15ba06f..2f0d56c78584abe27ef050258827103fb60d5785 100644
 | 
						|
--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
 | 
						|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
 | 
						|
@@ -400,7 +400,7 @@ public class ServerPlayerGameMode {
 | 
						|
             BlockEntity tileentity = this.level.getBlockEntity(pos);
 | 
						|
             Block block = iblockdata.getBlock();
 | 
						|
 
 | 
						|
-            if (block instanceof GameMasterBlock && !this.player.canUseGameMasterBlocks()) {
 | 
						|
+            if (block instanceof GameMasterBlock && !this.player.canUseGameMasterBlocks() && !(block instanceof net.minecraft.world.level.block.CommandBlock && (this.player.isCreative() && this.player.getBukkitEntity().hasPermission("minecraft.commandblock")))) { // Paper - command block permission
 | 
						|
                 this.level.sendBlockUpdated(pos, iblockdata, iblockdata, 3);
 | 
						|
                 return false;
 | 
						|
             } else if (this.player.blockActionRestricted(this.level, pos, this.gameModeForPlayer)) {
 | 
						|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
 | 
						|
index be496398916fc84abf7950a8613297413c2436bc..2003c95bf5f25ff6f09dd3ae569b3aff8c24ab49 100644
 | 
						|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
 | 
						|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
 | 
						|
@@ -809,7 +809,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
 | 
						|
         PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
 | 
						|
         if (!this.server.isCommandBlockEnabled()) {
 | 
						|
             this.player.sendSystemMessage(Component.translatable("advMode.notEnabled"));
 | 
						|
-        } else if (!this.player.canUseGameMasterBlocks()) {
 | 
						|
+        } else if (!this.player.canUseGameMasterBlocks() && (!this.player.isCreative() || !this.player.getBukkitEntity().hasPermission("minecraft.commandblock"))) { // Paper - command block permission
 | 
						|
             this.player.sendSystemMessage(Component.translatable("advMode.notAllowed"));
 | 
						|
         } else {
 | 
						|
             BaseCommandBlock commandblocklistenerabstract = null;
 | 
						|
@@ -876,7 +876,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
 | 
						|
         PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
 | 
						|
         if (!this.server.isCommandBlockEnabled()) {
 | 
						|
             this.player.sendSystemMessage(Component.translatable("advMode.notEnabled"));
 | 
						|
-        } else if (!this.player.canUseGameMasterBlocks()) {
 | 
						|
+        } else if (!this.player.canUseGameMasterBlocks() && (!this.player.isCreative() || !this.player.getBukkitEntity().hasPermission("minecraft.commandblock"))) { // Paper - command block permission
 | 
						|
             this.player.sendSystemMessage(Component.translatable("advMode.notAllowed"));
 | 
						|
         } else {
 | 
						|
             BaseCommandBlock commandblocklistenerabstract = packet.getCommandBlock(this.player.level());
 | 
						|
diff --git a/src/main/java/net/minecraft/world/level/BaseCommandBlock.java b/src/main/java/net/minecraft/world/level/BaseCommandBlock.java
 | 
						|
index 2d0eac7a8aa94ed6c4ec024bc6024440cbeac702..e40069d937de5fd00741ae6873abeecc46b93732 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/level/BaseCommandBlock.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/level/BaseCommandBlock.java
 | 
						|
@@ -203,7 +203,7 @@ public abstract class BaseCommandBlock implements CommandSource {
 | 
						|
     }
 | 
						|
 
 | 
						|
     public InteractionResult usedBy(Player player) {
 | 
						|
-        if (!player.canUseGameMasterBlocks()) {
 | 
						|
+        if (!player.canUseGameMasterBlocks() && (!player.isCreative() || !player.getBukkitEntity().hasPermission("minecraft.commandblock"))) { // Paper - command block permission
 | 
						|
             return InteractionResult.PASS;
 | 
						|
         } else {
 | 
						|
             if (player.getCommandSenderWorld().isClientSide) {
 | 
						|
diff --git a/src/main/java/net/minecraft/world/level/block/CommandBlock.java b/src/main/java/net/minecraft/world/level/block/CommandBlock.java
 | 
						|
index 0530b2a6324ec3ac0b3929aab7c0fa89de8bd9b9..ec1a8c60ccac50e5131f937c4262128fd2768331 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/level/block/CommandBlock.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/level/block/CommandBlock.java
 | 
						|
@@ -141,7 +141,7 @@ public class CommandBlock extends BaseEntityBlock implements GameMasterBlock {
 | 
						|
     protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
 | 
						|
         BlockEntity tileentity = world.getBlockEntity(pos);
 | 
						|
 
 | 
						|
-        if (tileentity instanceof CommandBlockEntity && player.canUseGameMasterBlocks()) {
 | 
						|
+        if (tileentity instanceof CommandBlockEntity && (player.canUseGameMasterBlocks() || (player.isCreative() && player.getBukkitEntity().hasPermission("minecraft.commandblock")))) { // Paper - command block permission
 | 
						|
             player.openCommandBlock((CommandBlockEntity) tileentity);
 | 
						|
             return InteractionResult.sidedSuccess(world.isClientSide);
 | 
						|
         } else {
 | 
						|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/permissions/CraftDefaultPermissions.java b/src/main/java/org/bukkit/craftbukkit/util/permissions/CraftDefaultPermissions.java
 | 
						|
index 245ad120a36b6defca7e6889faae1ca5fc33d0c7..e0e61115ada9a49d4c528c5d4e02a1ca571d9531 100644
 | 
						|
--- a/src/main/java/org/bukkit/craftbukkit/util/permissions/CraftDefaultPermissions.java
 | 
						|
+++ b/src/main/java/org/bukkit/craftbukkit/util/permissions/CraftDefaultPermissions.java
 | 
						|
@@ -16,6 +16,7 @@ public final class CraftDefaultPermissions {
 | 
						|
         DefaultPermissions.registerPermission(CraftDefaultPermissions.ROOT + ".nbt.copy", "Gives the user the ability to copy NBT in creative", org.bukkit.permissions.PermissionDefault.TRUE, parent);
 | 
						|
         DefaultPermissions.registerPermission(CraftDefaultPermissions.ROOT + ".debugstick", "Gives the user the ability to use the debug stick in creative", org.bukkit.permissions.PermissionDefault.OP, parent);
 | 
						|
         DefaultPermissions.registerPermission(CraftDefaultPermissions.ROOT + ".debugstick.always", "Gives the user the ability to use the debug stick in all game modes", org.bukkit.permissions.PermissionDefault.FALSE/* , parent */); // Paper - should not have this parent, as it's not a "vanilla" utility
 | 
						|
+        DefaultPermissions.registerPermission(CraftDefaultPermissions.ROOT + ".commandblock", "Gives the user the ability to use command blocks.", org.bukkit.permissions.PermissionDefault.OP, parent); // Paper
 | 
						|
         // Spigot end
 | 
						|
         parent.recalculatePermissibles();
 | 
						|
     }
 |