aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0510-Fix-Per-World-Difficulty-Remembering-Difficulty.patch
blob: a56d7e3a6a45af24b38cd388675b9f5927134bdd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
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 7ee8074a356df5db227bca78a545d14c5e8794e8..2c66ea1bda456da10d70ed180547bf73b7942f8b 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1645,11 +1645,15 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
         }
     }
 
-    public void a(EnumDifficulty enumdifficulty, boolean flag) {
-        if (flag || !this.saveData.isDifficultyLocked()) {
-            this.saveData.setDifficulty(this.saveData.isHardcore() ? EnumDifficulty.HARD : enumdifficulty);
-            this.updateSpawnFlags();
-            this.getPlayerList().getPlayers().forEach(this::b);
+    // Paper start - fix per world difficulty
+    public void setWorldDifficulty(WorldServer world, EnumDifficulty enumdifficulty, boolean forcefullySet) { this.a(world, enumdifficulty, forcefullySet); }
+    public void a(WorldServer world, EnumDifficulty enumdifficulty, boolean flag) {
+        WorldDataServer worldData = world.worldDataServer;
+        if (flag || !worldData.isDifficultyLocked()) {
+            worldData.setDifficulty(worldData.isHardcore() ? EnumDifficulty.HARD : enumdifficulty);
+            world.setSpawnFlags(worldData.getDifficulty() != EnumDifficulty.PEACEFUL && ((DedicatedServer) this).propertyManager.getProperties().spawnMonsters, this.getSpawnAnimals());
+            //this.getPlayerList().getPlayers().forEach(this::b); // Commented: WorldDataServer#setDifficulty handles updating players' difficulties
+            // Paper end
         }
     }
 
diff --git a/src/main/java/net/minecraft/server/commands/CommandDifficulty.java b/src/main/java/net/minecraft/server/commands/CommandDifficulty.java
index 1773fa44f55c6f6dcda0afceff4db39881861879..4a43b4632a5cb1e3b5659c9c6c44b42d33bbfcd4 100644
--- a/src/main/java/net/minecraft/server/commands/CommandDifficulty.java
+++ b/src/main/java/net/minecraft/server/commands/CommandDifficulty.java
@@ -7,6 +7,7 @@ import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import net.minecraft.commands.CommandListenerWrapper;
 import net.minecraft.network.chat.ChatMessage;
 import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.level.WorldServer;
 import net.minecraft.world.EnumDifficulty;
 
 public class CommandDifficulty {
@@ -41,10 +42,11 @@ public class CommandDifficulty {
     public static int a(CommandListenerWrapper commandlistenerwrapper, EnumDifficulty enumdifficulty) throws CommandSyntaxException {
         MinecraftServer minecraftserver = commandlistenerwrapper.getServer();
 
-        if (minecraftserver.getSaveData().getDifficulty() == enumdifficulty) {
+        WorldServer world = commandlistenerwrapper.getWorld(); // Paper
+        if (world.worldDataServer.getDifficulty() == enumdifficulty) { // Paper
             throw CommandDifficulty.a.create(enumdifficulty.c());
         } else {
-            minecraftserver.a(enumdifficulty, true);
+            minecraftserver.a(world, enumdifficulty, true); // Paper
             commandlistenerwrapper.sendMessage(new ChatMessage("commands.difficulty.success", new Object[]{enumdifficulty.b()}), 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 ec1f36736d79d4054ad7ff4da4e3659f35c811d6..c4df472050622eb2469b2ddb4d2ed917994f6e95 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -362,7 +362,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
 
     @Override
     public void updateWorldSettings() {
-        this.a(this.getDedicatedServerProperties().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/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
index eecf23aa41c8b21fce58ff33a3124186a4fdccd1..74cb85a424703e40a869568bf9c30d26a440b477 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
@@ -3040,7 +3040,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
     public void a(PacketPlayInDifficultyChange packetplayindifficultychange) {
         PlayerConnectionUtils.ensureMainThread(packetplayindifficultychange, this, this.player.getWorldServer());
         if (this.player.k(2) || this.isExemptPlayer()) {
-            this.minecraftServer.a(packetplayindifficultychange.b(), false);
+            //this.minecraftServer.a(packetplayindifficultychange.b(), false); // Paper - don't allow clients to change this
         }
     }