Skip to content

Commit c335021

Browse files
committed
Correctly read per-world gamerule for command blocks
The introduced gamerules for command block and spawner block were reading from the servers gamerules instead of the level gamerules. This is already fixed in .11 as mojang completely removed the gamerule access on MinecraftServer, however needs fixing in .10.
1 parent 2f7f139 commit c335021

File tree

9 files changed

+78
-22
lines changed

9 files changed

+78
-22
lines changed

paper-server/patches/features/0001-Moonrise-optimisation-patches.patch

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23067,7 +23067,7 @@ index 13424bce076493f146bdc5fd0b1f2e09805bd5e7..2de7072c8ccc005e514673bba494b64d
2306723067
thread1 -> {
2306823068
DedicatedServer dedicatedServer1 = new DedicatedServer(
2306923069
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
23070-
index 0a5d39bb84d3abefb37f7a0aaf56cdde10029596..8c5ddf67eaf04a1e67de21af25a8fadd19005281 100644
23070+
index 09272efcb581a849e093a368be2fa40eec53088c..f7d1237343833e2cf8af388acbfd49304258fae4 100644
2307123071
--- a/net/minecraft/server/MinecraftServer.java
2307223072
+++ b/net/minecraft/server/MinecraftServer.java
2307323073
@@ -177,7 +177,7 @@ import net.minecraft.world.phys.Vec2;
@@ -23315,7 +23315,7 @@ index 0a5d39bb84d3abefb37f7a0aaf56cdde10029596..8c5ddf67eaf04a1e67de21af25a8fadd
2331523315
return true;
2331623316
} else {
2331723317
boolean ret = false; // Paper - force execution of all worlds, do not just bias the first
23318-
@@ -2577,6 +2693,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23318+
@@ -2579,6 +2695,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2331923319
}
2332023320
}
2332123321

@@ -26253,7 +26253,7 @@ index 9dbb7c744030fb8d6891780a0928c8cca2a2b68d..f019f1330f9f1e6aa98ef3f914833769
2625326253
if (!passengers.equals(this.lastPassengers)) {
2625426254
this.synchronizer
2625526255
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
26256-
index f33692697c33fd475f40e8074413e481ea4781f7..629b00ee85f10bfb60acbbe7ac16f130bfe99376 100644
26256+
index 436e1c7ead4dd815fc7d5f8114b6b9bff3e9d4c7..168c29e3f251ec85cc1b25682f6588f39fdd7958 100644
2625726257
--- a/net/minecraft/server/level/ServerLevel.java
2625826258
+++ b/net/minecraft/server/level/ServerLevel.java
2625926259
@@ -175,7 +175,7 @@ import net.minecraft.world.ticks.LevelTicks;
@@ -29257,7 +29257,7 @@ index 300f3ed58109219d97846082941b860585f66fed..9175a7e4e6076626cb46144c5858c2f2
2925729257

2925829258
// Paper start - Affects Spawning API
2925929259
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
29260-
index 2a25f07c536890cf73dfce01bf043c5ec36480c3..39947ac2fae9a088d1fbc5c72d6ac520bfb97cf3 100644
29260+
index 1a2755fe70e970fd3da2ca74191bf8b83a5b6e3c..7a249a82c884e52304bb35d92fff87109a7d9aa3 100644
2926129261
--- a/net/minecraft/world/level/Level.java
2926229262
+++ b/net/minecraft/world/level/Level.java
2926329263
@@ -82,6 +82,7 @@ import net.minecraft.world.level.storage.LevelData;

paper-server/patches/features/0016-Add-Alternate-Current-redstone-implementation.patch

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2326,7 +2326,7 @@ index 0000000000000000000000000000000000000000..298076a0db4e6ee6e4775ac43bf749d9
23262326
+ }
23272327
+}
23282328
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
2329-
index 3e5a9db2316be9f614844ae185cd2b1e1238f975..f32cc24c073f86464434890c7437c212c732437e 100644
2329+
index e5365cad2b8476b6054f89ff3a0ba0d51431590d..c4aed8a8c4d4a02a960478882c8d670075011a73 100644
23302330
--- a/net/minecraft/server/level/ServerLevel.java
23312331
+++ b/net/minecraft/server/level/ServerLevel.java
23322332
@@ -221,6 +221,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -2352,13 +2352,14 @@ index 3e5a9db2316be9f614844ae185cd2b1e1238f975..f32cc24c073f86464434890c7437c212
23522352
@Override
23532353
public void onCreated(Entity entity) {
23542354
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
2355-
index 439abba4f371343dfd8e5ede7c20050ca049fcd2..96fa7390a4bcfa7bdf2cf5346f2de895ac085203 100644
2355+
index 7ba08b317b0ac7ed15ecbc477f2402a2dbe526d5..b75c6ae764d88640ddd520c1345634b0365fff60 100644
23562356
--- a/net/minecraft/world/level/Level.java
23572357
+++ b/net/minecraft/world/level/Level.java
2358-
@@ -2078,6 +2078,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
2359-
return this.palettedContainerFactory;
2360-
}
2361-
2358+
@@ -2082,6 +2082,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
2359+
public abstract boolean isCommandBlockEnabled();
2360+
public abstract boolean isSpawnerBlockEnabled();
2361+
// Paper end - per level game rules
2362+
+
23622363
+ // Paper start - optimize redstone (Alternate Current)
23632364
+ public alternate.current.wire.WireHandler getWireHandler() {
23642365
+ // This method is overridden in ServerLevel.
@@ -2369,10 +2370,9 @@ index 439abba4f371343dfd8e5ede7c20050ca049fcd2..96fa7390a4bcfa7bdf2cf5346f2de895
23692370
+ return null;
23702371
+ }
23712372
+ // Paper end - optimize redstone (Alternate Current)
2372-
+
2373+
23732374
public static enum ExplosionInteraction implements StringRepresentable {
23742375
NONE("none"),
2375-
BLOCK("block"),
23762376
diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java
23772377
index 07d2b9b7ebea9827ef7a535c090b311a3c27d5c6..a07d9237d227fe6d419d8a9bc44fc623b244ad3e 100644
23782378
--- a/net/minecraft/world/level/block/RedStoneWireBlock.java

paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1225,7 +1225,19 @@
12251225
public boolean isPvpAllowed() {
12261226
return this.getGameRules().getBoolean(GameRules.RULE_PVP);
12271227
}
1228-
@@ -1415,10 +_,20 @@
1228+
@@ -1405,20 +_,32 @@
1229+
return true;
1230+
}
1231+
1232+
+ @io.papermc.paper.annotation.DoNotUse // Paper - do not use server wide gamerule, instead use server level specific one
1233+
public boolean isCommandBlockEnabled() {
1234+
return this.getGameRules().getBoolean(GameRules.RULE_COMMAND_BLOCKS_ENABLED);
1235+
}
1236+
1237+
+ @io.papermc.paper.annotation.DoNotUse // Paper - do not use server wide gamerule, instead use server level specific one
1238+
public boolean isSpawnerBlockEnabled() {
1239+
return this.getGameRules().getBoolean(GameRules.RULE_SPAWNER_BLOCKS_ENABLED);
1240+
}
12291241

12301242
@Override
12311243
public String getMotd() {

paper-server/patches/sources/net/minecraft/server/level/ServerLevel.java.patch

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,7 @@
11901190
}
11911191

11921192
@Override
1193-
@@ -1892,4 +_,24 @@
1193+
@@ -1892,4 +_,34 @@
11941194
entity.updateDynamicGameEventListener(DynamicGameEventListener::move);
11951195
}
11961196
}
@@ -1214,4 +1214,14 @@
12141214
+ this.lagCompensationTick = (System.nanoTime() - MinecraftServer.SERVER_INIT) / (java.util.concurrent.TimeUnit.MILLISECONDS.toNanos(50L));
12151215
+ }
12161216
+ // Paper end - lag compensation
1217+
+
1218+
+ // Paper start - per level game rules
1219+
+ public boolean isCommandBlockEnabled() {
1220+
+ return this.getGameRules().getBoolean(GameRules.RULE_COMMAND_BLOCKS_ENABLED);
1221+
+ }
1222+
+
1223+
+ public boolean isSpawnerBlockEnabled() {
1224+
+ return this.getGameRules().getBoolean(GameRules.RULE_SPAWNER_BLOCKS_ENABLED);
1225+
+ }
1226+
+ // Paper end - per level game rules
12171227
}

paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -519,18 +519,24 @@
519519
}
520520
);
521521
}
522-
@@ -596,7 +_,7 @@
522+
@@ -594,9 +_,9 @@
523+
@Override
524+
public void handleSetCommandBlock(ServerboundSetCommandBlockPacket packet) {
523525
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
524-
if (!this.server.isCommandBlockEnabled()) {
526+
- if (!this.server.isCommandBlockEnabled()) {
527+
+ if (!player.level().isCommandBlockEnabled()) { // Paper - per level game rules - enabled command blocks
525528
this.player.sendSystemMessage(Component.translatable("advMode.notEnabled"));
526529
- } else if (!this.player.canUseGameMasterBlocks()) {
527530
+ } else if (!this.player.canUseGameMasterBlocks() && (!this.player.isCreative() || !this.player.getBukkitEntity().hasPermission("minecraft.commandblock"))) { // Paper - command block permission
528531
this.player.sendSystemMessage(Component.translatable("advMode.notAllowed"));
529532
} else {
530533
BaseCommandBlock baseCommandBlock = null;
531-
@@ -651,7 +_,7 @@
534+
@@ -649,9 +_,9 @@
535+
@Override
536+
public void handleSetCommandMinecart(ServerboundSetCommandMinecartPacket packet) {
532537
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
533-
if (!this.server.isCommandBlockEnabled()) {
538+
- if (!this.server.isCommandBlockEnabled()) {
539+
+ if (!this.player.level().isCommandBlockEnabled()) { // Paper - per level game rules - enabled command blocks
534540
this.player.sendSystemMessage(Component.translatable("advMode.notEnabled"));
535541
- } else if (!this.player.canUseGameMasterBlocks()) {
536542
+ } else if (!this.player.canUseGameMasterBlocks() && (!this.player.isCreative() || !this.player.getBukkitEntity().hasPermission("minecraft.commandblock"))) { // Paper - command block permission

paper-server/patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
--- a/net/minecraft/world/item/SpawnEggItem.java
22
+++ b/net/minecraft/world/item/SpawnEggItem.java
3-
@@ -68,6 +_,7 @@
3+
@@ -61,13 +_,14 @@
4+
EntityType<?> type = this.getType(itemInHand);
5+
if (type == null) {
6+
return InteractionResult.FAIL;
7+
- } else if (!serverLevel.getServer().isSpawnerBlockEnabled()) {
8+
+ } else if (!serverLevel.isSpawnerBlockEnabled()) { // Paper - per level game rules - spawner block enabled
9+
if (context.getPlayer() instanceof ServerPlayer serverPlayer) {
10+
serverPlayer.sendSystemMessage(Component.translatable("advMode.notEnabled.spawner"));
11+
}
412

513
return InteractionResult.FAIL;
614
} else {

paper-server/patches/sources/net/minecraft/world/level/BaseCommandBlock.java.patch

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010

1111
public int getSuccessCount() {
1212
return this.successCount;
13+
@@ -101,7 +_,7 @@
14+
} else {
15+
this.successCount = 0;
16+
MinecraftServer server = this.getLevel().getServer();
17+
- if (server.isCommandBlockEnabled() && !StringUtil.isNullOrEmpty(this.command)) {
18+
+ if (level.isCommandBlockEnabled() && !StringUtil.isNullOrEmpty(this.command)) { // Paper - per level game rules - enabled command blocks
19+
try {
20+
this.lastOutput = null;
21+
1322
@@ -112,7 +_,13 @@
1423
this.successCount++;
1524
}

paper-server/patches/sources/net/minecraft/world/level/BaseSpawner.java.patch

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@
2121
}
2222

2323
public void serverTick(ServerLevel level, BlockPos pos) {
24+
- if (this.isNearPlayer(level, pos) && level.getServer().isSpawnerBlockEnabled()) {
25+
- if (this.spawnDelay == -1) {
2426
+ if (spawnCount <= 0 || maxNearbyEntities <= 0) return; // Paper - Ignore impossible spawn tick
2527
+ // Paper start - Configurable mob spawner tick rate
2628
+ if (spawnDelay > 0 && --tickDelay > 0) return;
2729
+ tickDelay = level.paperConfig().tickRates.mobSpawner;
2830
+ if (tickDelay == -1) { return; } // If disabled
2931
+ // Paper end - Configurable mob spawner tick rate
30-
if (this.isNearPlayer(level, pos) && level.getServer().isSpawnerBlockEnabled()) {
31-
- if (this.spawnDelay == -1) {
32+
+ if (this.isNearPlayer(level, pos) && level.isSpawnerBlockEnabled()) { // Paper - per level game rules - spawner block enabled
3233
+ if (this.spawnDelay < -tickDelay) { // Paper - Configurable mob spawner tick rate
3334
this.delay(level, pos);
3435
}

paper-server/patches/sources/net/minecraft/world/level/Level.java.patch

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,17 @@
518518
this.getChunkAt(blockPos).addAndRegisterBlockEntity(blockEntity);
519519
}
520520
}
521-
@@ -1039,7 +_,8 @@
521+
@@ -1034,12 +_,18 @@
522+
return this.palettedContainerFactory;
523+
}
524+
525+
+ // Paper start - per level game rules
526+
+ public abstract boolean isCommandBlockEnabled();
527+
+ public abstract boolean isSpawnerBlockEnabled();
528+
+ // Paper end - per level game rules
529+
+
530+
public static enum ExplosionInteraction implements StringRepresentable {
531+
NONE("none"),
522532
BLOCK("block"),
523533
MOB("mob"),
524534
TNT("tnt"),

0 commit comments

Comments
 (0)