aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0452-Fix-Per-World-Difficulty-Remembering-Difficulty.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0452-Fix-Per-World-Difficulty-Remembering-Difficulty.patch')
-rw-r--r--patches/server/0452-Fix-Per-World-Difficulty-Remembering-Difficulty.patch123
1 files changed, 123 insertions, 0 deletions
diff --git a/patches/server/0452-Fix-Per-World-Difficulty-Remembering-Difficulty.patch b/patches/server/0452-Fix-Per-World-Difficulty-Remembering-Difficulty.patch
new file mode 100644
index 0000000000..1e824670c1
--- /dev/null
+++ b/patches/server/0452-Fix-Per-World-Difficulty-Remembering-Difficulty.patch
@@ -0,0 +1,123 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Sun, 28 Jun 2020 03:59:10 -0400
+Subject: [PATCH] Fix Per World Difficulty / Remembering Difficulty
+
+Fixes per world difficulty with /difficulty command and also
+makes it so that the server keeps the last difficulty used instead
+of restoring the server.properties every single load.
+
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index faee8e2a29b4c9cbd62185f401ac7bbd40d8df76..918fdf14080338983b8725bf2619088fd23c332a 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -824,7 +824,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ chunkproviderserver.getLightEngine().setTaskPerBatch(worldserver.paperConfig.lightQueueSize); // Paper - increase light queue size
+ // CraftBukkit start
+ // this.updateMobSpawningFlags();
+- worldserver.setSpawnSettings(this.isSpawningMonsters(), this.isSpawningAnimals());
++ worldserver.setSpawnSettings(worldserver.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && ((DedicatedServer) this).settings.getProperties().spawnMonsters, this.isSpawningAnimals()); // Paper - per level difficulty (from setDifficulty(ServerLevel, Difficulty, boolean))
+
+ this.forceTicks = false;
+ // CraftBukkit end
+@@ -1700,11 +1700,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ }
+ }
+
+- public void setDifficulty(Difficulty difficulty, boolean forceUpdate) {
+- if (forceUpdate || !this.worldData.isDifficultyLocked()) {
+- this.worldData.setDifficulty(this.worldData.isHardcore() ? Difficulty.HARD : difficulty);
+- this.updateMobSpawningFlags();
+- this.getPlayerList().getPlayers().forEach(this::sendDifficultyUpdate);
++ // Paper start - remember per level difficulty
++ public void setDifficulty(ServerLevel level, Difficulty difficulty, boolean forceUpdate) {
++ PrimaryLevelData worldData = level.serverLevelData;
++ if (forceUpdate || !worldData.isDifficultyLocked()) {
++ worldData.setDifficulty(worldData.isHardcore() ? Difficulty.HARD : difficulty);
++ level.setSpawnSettings(worldData.getDifficulty() != Difficulty.PEACEFUL && ((DedicatedServer) this).settings.getProperties().spawnMonsters, this.isSpawningAnimals());
++ // this.getPlayerList().getPlayers().forEach(this::sendDifficultyUpdate);
++ // Paper end
+ }
+ }
+
+@@ -1718,7 +1721,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ while (iterator.hasNext()) {
+ ServerLevel worldserver = (ServerLevel) iterator.next();
+
+- worldserver.setSpawnSettings(this.isSpawningMonsters(), this.isSpawningAnimals());
++ worldserver.setSpawnSettings(worldserver.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && ((DedicatedServer) this).settings.getProperties().spawnMonsters, this.isSpawningAnimals()); // Paper - per level difficulty (from setDifficulty(ServerLevel, Difficulty, boolean))
+ }
+
+ }
+diff --git a/src/main/java/net/minecraft/server/commands/DifficultyCommand.java b/src/main/java/net/minecraft/server/commands/DifficultyCommand.java
+index 33c859df0b669d0c3e97ccba29f17c1ba2166a27..9f03b738aea623fe409ca176397f48be055466da 100644
+--- a/src/main/java/net/minecraft/server/commands/DifficultyCommand.java
++++ b/src/main/java/net/minecraft/server/commands/DifficultyCommand.java
+@@ -35,10 +35,11 @@ public class DifficultyCommand {
+
+ public static int setDifficulty(CommandSourceStack source, Difficulty difficulty) throws CommandSyntaxException {
+ MinecraftServer minecraftServer = source.getServer();
+- if (minecraftServer.getWorldData().getDifficulty() == difficulty) {
++ net.minecraft.server.level.ServerLevel level = source.getLevel(); // Paper
++ if (level.serverLevelData.getDifficulty() == difficulty) { // Paper
+ throw ERROR_ALREADY_DIFFICULT.create(difficulty.getKey());
+ } else {
+- minecraftServer.setDifficulty(difficulty, true);
++ minecraftServer.setDifficulty(level, difficulty, true); // Paper - use world
+ source.sendSuccess(new TranslatableComponent("commands.difficulty.success", difficulty.getDisplayName()), true);
+ return 0;
+ }
+diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+index 2b7ba5d8dda0297c8b35a0cea68c3ae10188e3f2..e968b880e435b8753314d85b919a0abc4f35be25 100644
+--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
++++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+@@ -366,7 +366,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
+
+ @Override
+ public void forceDifficulty() {
+- this.setDifficulty(this.getProperties().difficulty, true);
++ //this.a(this.getDedicatedServerProperties().difficulty, true); // Paper - Don't overwrite level.dat's difficulty, keep current
+ }
+
+ @Override
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 2f13055a39c26fe12d2c1094103186635e536166..6b0cb662d9163c360035e19c5faad59fc72af3c1 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -1116,7 +1116,7 @@ public class ServerPlayer extends Player {
+ this.isChangingDimension = true; // CraftBukkit - Set teleport invulnerability only if player changing worlds
+
+ this.connection.send(new ClientboundRespawnPacket(worldserver.dimensionType(), worldserver.dimension(), BiomeManager.obfuscateSeed(worldserver.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), true));
+- this.connection.send(new ClientboundChangeDifficultyPacket(this.level.getDifficulty(), this.level.getLevelData().isDifficultyLocked()));
++ this.connection.send(new ClientboundChangeDifficultyPacket(worldserver.getDifficulty(), worldserver.getLevelData().isDifficultyLocked())); // Paper - fix difficulty sync issue
+ PlayerList playerlist = this.server.getPlayerList();
+
+ playerlist.sendPlayerPermissionLevel(this);
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 62deb7cc804b97528a74600b1918fc88d71e2966..acffb2c8a4f864da16c65b83a320d8b181bdc2d7 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -3029,7 +3029,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
+ public void handleChangeDifficulty(ServerboundChangeDifficultyPacket packet) {
+ PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel());
+ if (this.player.hasPermissions(2) || this.isSingleplayerOwner()) {
+- this.server.setDifficulty(packet.getDifficulty(), false);
++ //this.minecraftServer.a(packetplayindifficultychange.b(), false); // Paper - don't allow clients to change this
+ }
+ }
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index ed4e566cd18de4f58fcbb54cf2b6ed5ce4895d0a..52fabc8cd1b76a825a13d39f38ca982e252cb39b 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -942,8 +942,8 @@ public final class CraftServer implements Server {
+ org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot
+ com.destroystokyo.paper.PaperConfig.init((File) console.options.valueOf("paper-settings")); // Paper
+ for (ServerLevel world : this.console.getAllLevels()) {
+- world.serverLevelData.setDifficulty(config.difficulty);
+- world.setSpawnSettings(config.spawnMonsters, config.spawnAnimals);
++ // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty
++ world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean))
+ if (this.getTicksPerAnimalSpawns() < 0) {
+ world.ticksPerAnimalSpawns = 400;
+ } else {