aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0389-Fix-Per-World-Difficulty-Remembering-Difficulty.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0389-Fix-Per-World-Difficulty-Remembering-Difficulty.patch')
-rw-r--r--patches/server/0389-Fix-Per-World-Difficulty-Remembering-Difficulty.patch131
1 files changed, 131 insertions, 0 deletions
diff --git a/patches/server/0389-Fix-Per-World-Difficulty-Remembering-Difficulty.patch b/patches/server/0389-Fix-Per-World-Difficulty-Remembering-Difficulty.patch
new file mode 100644
index 0000000000..d7c2053bcb
--- /dev/null
+++ b/patches/server/0389-Fix-Per-World-Difficulty-Remembering-Difficulty.patch
@@ -0,0 +1,131 @@
+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 f786bf10a42fa4e9f610416959c60c52729c277b..21176d6e57ae9e975b1e7de14b3364365cc1012d 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -825,7 +825,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ if (worldserver.getWorld().getKeepSpawnInMemory()) worldloadlistener.stop(); // Paper - Configurable Keep Spawn Loaded range per world
+ // 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
+@@ -1768,11 +1768,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 - 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 - per level difficulty
+ }
+ }
+
+@@ -1786,7 +1789,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 997a96a21440ae72696d68f8031ece4ba487d3ef..3d8584929cee000ae7df10c5bd94f35820e70294 100644
+--- a/src/main/java/net/minecraft/server/commands/DifficultyCommand.java
++++ b/src/main/java/net/minecraft/server/commands/DifficultyCommand.java
+@@ -49,7 +49,7 @@ public class DifficultyCommand {
+ if (worldServer.getDifficulty() == difficulty) { // CraftBukkit
+ throw DifficultyCommand.ERROR_ALREADY_DIFFICULT.create(difficulty.getKey());
+ } else {
+- worldServer.serverLevelData.setDifficulty(difficulty); // CraftBukkit
++ minecraftserver.setDifficulty(worldServer, difficulty, true); // Paper - per level difficulty; don't skip other difficulty-changing logic (fix upstream's fix)
+ source.sendSuccess(() -> {
+ return Component.translatable("commands.difficulty.success", difficulty.getDisplayName());
+ }, true);
+diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+index c41c53ee3b1a8b5c2c41fc9846f557eeb4d10f9b..ebea8a827aad108dd6d4222e8dfd251d2cea657a 100644
+--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
++++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+@@ -325,7 +325,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
+
+ @Override
+ public void forceDifficulty() {
+- this.setDifficulty(this.getProperties().difficulty, true);
++ // this.setDifficulty(this.getProperties().difficulty, true); // Paper - per level difficulty; 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 e5653695a3fbcd260ce44ca37291406a1033a3fa..966b86a2b26a32aad2656d1f2beb6daf5b81b3b1 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -1161,7 +1161,7 @@ public class ServerPlayer extends Player {
+ this.isChangingDimension = true; // CraftBukkit - Set teleport invulnerability only if player changing worlds
+
+ this.connection.send(new ClientboundRespawnPacket(this.createCommonSpawnInfo(worldserver), (byte) 3));
+- this.connection.send(new ClientboundChangeDifficultyPacket(this.level().getDifficulty(), this.level().getLevelData().isDifficultyLocked()));
++ this.connection.send(new ClientboundChangeDifficultyPacket(worldserver.getDifficulty(), this.level().getLevelData().isDifficultyLocked())); // Paper - per level difficulty
+ 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 d78d411879275f11f395b4f9c94b7aab88342236..67e75982d712fdd2f751f2a0fcafba7aec779d74 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -3169,7 +3169,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ public void handleChangeDifficulty(ServerboundChangeDifficultyPacket packet) {
+ PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
+ if (this.player.hasPermissions(2) || this.isSingleplayerOwner()) {
+- this.server.setDifficulty(packet.getDifficulty(), false);
++ // this.server.setDifficulty(packet.getDifficulty(), false); // Paper - per level difficulty; 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 a5c84867708385ae78951872410914835ab3e7e5..edbf53c69bf788c2ac3b7d1be258e37cb801a5f6 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -967,8 +967,8 @@ public final class CraftServer implements Server {
+ org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot
+ this.console.paperConfigurations.reloadConfigs(this.console);
+ 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))
+
+ for (SpawnCategory spawnCategory : SpawnCategory.values()) {
+ if (CraftSpawnCategory.isValidForLimits(spawnCategory)) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+index 6bb9d76f8c5f3dc683caecfbb7c7c2ca41cba659..aac25db85143ba09e96ef0775786732958f42ffb 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+@@ -1134,7 +1134,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void setDifficulty(Difficulty difficulty) {
+- this.getHandle().serverLevelData.setDifficulty(net.minecraft.world.Difficulty.byId(difficulty.getValue()));
++ this.getHandle().getServer().setDifficulty(this.getHandle(), net.minecraft.world.Difficulty.byId(difficulty.getValue()), true); // Paper - per level difficulty; don't skip other difficulty-changing logic
+ }
+
+ @Override