From 655fc3d9b1b33354a24fb0e075d558835c8cc0bb Mon Sep 17 00:00:00 2001 From: Cryptite Date: Fri, 29 Oct 2021 10:23:02 -0500 Subject: [PATCH] Block Mob Spawns globally by EntityType patch --- patches/server/0001-Build-Changes.patch | 4 +- ...ment-updates-if-only-durability-chan.patch | 4 +- .../0006-Allow-opening-covered-chests.patch | 4 +- .../server/0014-Smooth-World-Teleports.patch | 4 +- ...ck-Mob-Spawns-globally-by-EntityType.patch | 88 +++++++++++++++++++ 5 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 patches/server/0016-Block-Mob-Spawns-globally-by-EntityType.patch diff --git a/patches/server/0001-Build-Changes.patch b/patches/server/0001-Build-Changes.patch index 576097a60..25948fd43 100644 --- a/patches/server/0001-Build-Changes.patch +++ b/patches/server/0001-Build-Changes.patch @@ -38,10 +38,10 @@ index 13f89bdaf1ada33060b1ee4d6f2860ec194b68a4..2de428cb94a8637242ef93f007f77e03 workingDir = rootProject.layout.projectDirectory.dir( providers.gradleProperty("runWorkDir").forUseAtConfigurationTime().orElse("run") diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index c8876b000a03f18e7a140167ed4505a9843a8d14..9f72d4d8f1b00f9ab1e93406fcb9921c5d4769a6 100644 +index 7636b0ae9031e06fd8b4a0c359a45a17e6e075de..6ae168b82f83b7bb1f357e132e24c35f813b1acf 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1721,7 +1721,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements +@@ -356,9 +356,10 @@ public class ChestBlock extends AbstractChestBlock implements } private static boolean isBlockedChestByBlock(BlockGetter world, BlockPos pos) { diff --git a/patches/server/0014-Smooth-World-Teleports.patch b/patches/server/0014-Smooth-World-Teleports.patch index 220d88607..9e7212efe 100644 --- a/patches/server/0014-Smooth-World-Teleports.patch +++ b/patches/server/0014-Smooth-World-Teleports.patch @@ -17,10 +17,10 @@ index 11f46c1b8f4c8414e0667d1873542c17d6e01f2a..fda2fedb0a24800e2690bba13d44c1cb public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index ea1f7c8bf220982a086d4ae1663ae445b8c6cebd..56f38c24d6d7699eff364755bc064a940fcceadf 100644 +index eaa005c1c9b4386bcdbe1d6eb28c3eca7635066c..86d00fdee17bce31a5caf370ede8a2dbc42e440b 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -939,11 +939,11 @@ public abstract class PlayerList { +@@ -940,11 +940,11 @@ public abstract class PlayerList { } // CraftBukkit start LevelData worlddata = worldserver1.getLevelData(); diff --git a/patches/server/0016-Block-Mob-Spawns-globally-by-EntityType.patch b/patches/server/0016-Block-Mob-Spawns-globally-by-EntityType.patch new file mode 100644 index 000000000..a42064ba0 --- /dev/null +++ b/patches/server/0016-Block-Mob-Spawns-globally-by-EntityType.patch @@ -0,0 +1,88 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Cryptite +Date: Fri, 29 Oct 2021 10:22:23 -0500 +Subject: [PATCH] Block Mob Spawns globally by EntityType + + +diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java +index 0277627e97b51e20470ccf578cee48470e06a34b..c73bbfdd44f674b221574782cb8d6c3c02283f91 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java +@@ -662,4 +662,16 @@ public class PaperConfig { + private static void sendFullPosForHardCollidingEntities() { + sendFullPosForHardCollidingEntities = getBoolean("settings.send-full-pos-for-hard-colliding-entities", true); + } ++ ++ // Slice start ++ public static java.util.Set> globalBlockedMobSpawnTypes = new java.util.HashSet<>(); ++ ++ private static void globalBlockedMobSpawnTypes() { ++ java.util.List list = getList("settings.global-blocked-mobspawn-types", java.util.Collections.emptyList()); ++ for (String type : list) { ++ java.util.Optional> entityType = net.minecraft.world.entity.EntityType.byString(type.toLowerCase()); ++ entityType.ifPresent(eType -> globalBlockedMobSpawnTypes.add(eType)); ++ } ++ } ++ // Slice end + } +diff --git a/src/main/java/net/minecraft/world/level/biome/MobSpawnSettings.java b/src/main/java/net/minecraft/world/level/biome/MobSpawnSettings.java +index 86528ff031014e788d72a8bf7c1c9443512096bb..ff5c6d262b0e5d4fad85edd060460f087bd6e5e8 100644 +--- a/src/main/java/net/minecraft/world/level/biome/MobSpawnSettings.java ++++ b/src/main/java/net/minecraft/world/level/biome/MobSpawnSettings.java +@@ -41,9 +41,10 @@ public class MobSpawnSettings { + }), Codec.BOOL.fieldOf("player_spawn_friendly").orElse(false).forGetter(MobSpawnSettings::playerSpawnFriendly)).apply(instance, MobSpawnSettings::new); + }); + private final float creatureGenerationProbability; +- private final Map> spawners; +- private final Map, MobSpawnSettings.MobSpawnCost> mobSpawnCosts; ++ private Map> spawners; // Slice ++ private Map, MobSpawnSettings.MobSpawnCost> mobSpawnCosts; // Slice + private final boolean playerSpawnFriendly; ++ private boolean stripped; // Slice + + MobSpawnSettings(float creatureSpawnProbability, Map> spawners, Map, MobSpawnSettings.MobSpawnCost> spawnCosts, boolean playerSpawnFriendly) { + this.creatureGenerationProbability = creatureSpawnProbability; +@@ -52,7 +53,43 @@ public class MobSpawnSettings { + this.playerSpawnFriendly = playerSpawnFriendly; + } + ++ // Slice start ++ // This very stupid thing is because Mob Spawning Biome data is statically registered before CraftServer ++ // is even created. As a result, we need to lazily rebuild our spawning data here which is very cool and very ++ // stupid. But it should only really happen once up front, so isn't the end of the world ++ private void stripSpawnData() { ++ if (com.destroystokyo.paper.PaperConfig.globalBlockedMobSpawnTypes.isEmpty()) { ++ stripped = true; ++ return; ++ } ++ ++ Map, MobSpawnSettings.MobSpawnCost> finalMobSpawnCosts = new java.util.HashMap<>(); ++ for (Entry, MobSpawnSettings.MobSpawnCost> entry : mobSpawnCosts.entrySet()) { ++ if (!com.destroystokyo.paper.PaperConfig.globalBlockedMobSpawnTypes.contains(entry.getKey())) { ++ finalMobSpawnCosts.put(entry.getKey(), entry.getValue()); ++ } ++ } ++ this.mobSpawnCosts = ImmutableMap.copyOf(finalMobSpawnCosts); ++ ++ Map> finalSpawners = new java.util.HashMap<>(); ++ for (Entry> entry : spawners.entrySet()) { ++ List finalSpawnerData = new java.util.ArrayList<>(); ++ for (SpawnerData spawnerData : entry.getValue().unwrap()) { ++ if (!com.destroystokyo.paper.PaperConfig.globalBlockedMobSpawnTypes.contains(spawnerData.type)) { ++ finalSpawnerData.add(spawnerData); ++ } ++ } ++ ++ finalSpawners.put(entry.getKey(), finalSpawnerData.isEmpty() ? EMPTY_MOB_LIST : WeightedRandomList.create(finalSpawnerData)); ++ } ++ ++ this.spawners = ImmutableMap.copyOf(finalSpawners); ++ stripped = true; ++ } ++ // Slice end ++ + public WeightedRandomList getMobs(MobCategory spawnGroup) { ++ if (!stripped) stripSpawnData(); // Slice + return this.spawners.getOrDefault(spawnGroup, EMPTY_MOB_LIST); + } +