2021-06-11 14:02:28 +02:00
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
2024-10-31 22:30:18 +01:00
index 3d2c70ab9938555c976588b0a98901d57876e51e..99b5877fc2f568929b35aa10638173bbef27503b 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
2024-10-31 22:30:18 +01:00
@@ -850,7 +850,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2024-04-24 08:44:48 +02:00
worldloadlistener.stop();
2021-10-01 02:46:37 +02:00
// CraftBukkit start
2021-11-24 13:30:55 +01:00
// this.updateMobSpawningFlags();
2024-10-23 16:55:24 +02:00
- worldserver.setSpawnSettings(this.isSpawningMonsters());
+ worldserver.setSpawnSettings(worldserver.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && ((DedicatedServer) this).settings.getProperties().spawnMonsters); // Paper - per level difficulty (from setDifficulty(ServerLevel, Difficulty, boolean))
2021-10-01 02:46:37 +02:00
this.forceTicks = false;
// CraftBukkit end
2024-10-27 18:11:15 +01:00
@@ -1890,11 +1890,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2021-06-11 14:02:28 +02:00
}
}
2021-06-14 10:37:14 +02:00
- public void setDifficulty(Difficulty difficulty, boolean forceUpdate) {
2021-06-11 14:02:28 +02:00
- if (forceUpdate || !this.worldData.isDifficultyLocked()) {
2021-06-14 10:37:14 +02:00
- this.worldData.setDifficulty(this.worldData.isHardcore() ? Difficulty.HARD : difficulty);
2021-06-11 14:02:28 +02:00
- this.updateMobSpawningFlags();
- this.getPlayerList().getPlayers().forEach(this::sendDifficultyUpdate);
2024-01-20 23:13:41 +01:00
+ // Paper start - per level difficulty
2021-06-14 10:37:14 +02:00
+ public void setDifficulty(ServerLevel level, Difficulty difficulty, boolean forceUpdate) {
+ PrimaryLevelData worldData = level.serverLevelData;
+ if (forceUpdate || !worldData.isDifficultyLocked()) {
+ worldData.setDifficulty(worldData.isHardcore() ? Difficulty.HARD : difficulty);
2024-10-25 13:19:23 +02:00
+ level.setSpawnSettings(worldData.getDifficulty() != Difficulty.PEACEFUL && ((DedicatedServer) this).settings.getProperties().spawnMonsters);
2021-06-14 10:37:14 +02:00
+ // this.getPlayerList().getPlayers().forEach(this::sendDifficultyUpdate);
2024-01-20 23:13:41 +01:00
+ // Paper end - per level difficulty
2021-06-11 14:02:28 +02:00
}
}
2024-10-27 18:11:15 +01:00
@@ -1908,7 +1911,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2021-10-01 02:46:37 +02:00
while (iterator.hasNext()) {
ServerLevel worldserver = (ServerLevel) iterator.next();
2024-10-23 16:55:24 +02:00
- worldserver.setSpawnSettings(this.isSpawningMonsters());
+ worldserver.setSpawnSettings(worldserver.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && ((DedicatedServer) this).settings.getProperties().spawnMonsters); // Paper - per level difficulty (from setDifficulty(ServerLevel, Difficulty, boolean))
2021-10-01 02:46:37 +02:00
}
}
2021-06-11 14:02:28 +02:00
diff --git a/src/main/java/net/minecraft/server/commands/DifficultyCommand.java b/src/main/java/net/minecraft/server/commands/DifficultyCommand.java
2024-01-20 23:13:41 +01:00
index 997a96a21440ae72696d68f8031ece4ba487d3ef..3d8584929cee000ae7df10c5bd94f35820e70294 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/server/commands/DifficultyCommand.java
+++ b/src/main/java/net/minecraft/server/commands/DifficultyCommand.java
2023-06-08 01:20:26 +02:00
@@ -49,7 +49,7 @@ public class DifficultyCommand {
2022-03-01 06:43:03 +01:00
if (worldServer.getDifficulty() == difficulty) { // CraftBukkit
throw DifficultyCommand.ERROR_ALREADY_DIFFICULT.create(difficulty.getKey());
2021-06-11 14:02:28 +02:00
} else {
2022-03-01 06:43:03 +01:00
- worldServer.serverLevelData.setDifficulty(difficulty); // CraftBukkit
2024-01-20 23:13:41 +01:00
+ minecraftserver.setDifficulty(worldServer, difficulty, true); // Paper - per level difficulty; don't skip other difficulty-changing logic (fix upstream's fix)
2023-06-08 01:20:26 +02:00
source.sendSuccess(() -> {
return Component.translatable("commands.difficulty.success", difficulty.getDisplayName());
}, true);
2021-06-11 14:02:28 +02:00
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
2024-10-27 18:11:15 +01:00
index fe1975675189c6d1a63c42b7959fa40b5ac95ef8..9a3e73a5c206b78dfcf6f41a47b614342e52acc8 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
2024-10-27 18:11:15 +01:00
@@ -337,7 +337,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
2021-06-11 14:02:28 +02:00
@Override
public void forceDifficulty() {
- this.setDifficulty(this.getProperties().difficulty, true);
2024-01-20 23:13:41 +01:00
+ // this.setDifficulty(this.getProperties().difficulty, true); // Paper - per level difficulty; Don't overwrite level.dat's difficulty, keep current
2021-06-11 14:02:28 +02:00
}
@Override
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
2024-10-27 18:11:15 +01:00
index 0884f71d3264c2a09d2a0958d4751962e4156526..8bb1b0e7caa938170169379ce22f21c1c772db60 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
2024-10-27 18:11:15 +01:00
@@ -3308,7 +3308,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
2021-06-11 14:02:28 +02:00
public void handleChangeDifficulty(ServerboundChangeDifficultyPacket packet) {
2023-06-08 01:20:26 +02:00
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
2021-06-11 14:02:28 +02:00
if (this.player.hasPermissions(2) || this.isSingleplayerOwner()) {
- this.server.setDifficulty(packet.getDifficulty(), false);
2024-01-20 23:13:41 +01:00
+ // this.server.setDifficulty(packet.getDifficulty(), false); // Paper - per level difficulty; don't allow clients to change this
2021-06-11 14:02:28 +02:00
}
}
2021-10-01 02:46:37 +02:00
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
2024-11-11 20:17:36 +01:00
index ca8eb3216c4331a95ab44f923f6b49641662505f..9905555f249db72649bde8401835dd816ed7b428 100644
2021-10-01 02:46:37 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
2024-10-27 18:11:15 +01:00
@@ -1000,8 +1000,8 @@ public final class CraftServer implements Server {
2023-10-27 01:34:58 +02:00
org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot
2022-06-09 10:51:45 +02:00
this.console.paperConfigurations.reloadConfigs(this.console);
2021-10-01 02:46:37 +02:00
for (ServerLevel world : this.console.getAllLevels()) {
- world.serverLevelData.setDifficulty(config.difficulty);
2024-10-23 16:55:24 +02:00
- world.setSpawnSettings(config.spawnMonsters);
2021-10-01 02:46:37 +02:00
+ // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty
2024-10-23 16:55:24 +02:00
+ world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean))
2022-02-12 14:20:33 +01:00
for (SpawnCategory spawnCategory : SpawnCategory.values()) {
if (CraftSpawnCategory.isValidForLimits(spawnCategory)) {
2022-11-01 19:29:52 +01:00
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
2024-11-29 02:39:40 +01:00
index 0e074cabe81a7135773c59dbdd5607247fa8bf16..f3ebea4d228d53057e2480a59eda5774eba03bb4 100644
2022-11-01 19:29:52 +01:00
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
2024-11-11 20:17:36 +01:00
@@ -1169,7 +1169,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
2022-11-01 19:29:52 +01:00
@Override
public void setDifficulty(Difficulty difficulty) {
- this.getHandle().serverLevelData.setDifficulty(net.minecraft.world.Difficulty.byId(difficulty.getValue()));
2024-01-20 23:13:41 +01:00
+ 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
2022-11-01 19:29:52 +01:00
}
@Override