From a260e4f89c10a8671c724442a8a837e916ae4158 Mon Sep 17 00:00:00 2001 From: Amine KACIMI Date: Fri, 24 Oct 2025 00:54:58 +0100 Subject: [PATCH] hostile mobs would still spawn on blue/packed ice in certain scenarios - fixes #1701 (#1709) --- .../world/entity/monster/Ghast.java.patch | 14 ++++++++ .../world/entity/monster/Guardian.java.patch | 14 ++++++++ .../world/entity/monster/MagmaCube.java.patch | 14 ++++++++ .../world/entity/monster/Monster.java.patch | 34 +++++++++++++++---- .../world/entity/monster/Slime.java.patch | 14 ++++++++ .../entity/monster/ZombifiedPiglin.java.patch | 20 ++++++++--- .../entity/monster/hoglin/Hoglin.java.patch | 14 ++++++++ .../entity/monster/piglin/Piglin.java.patch | 14 ++++++++ 8 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Ghast.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Guardian.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/MagmaCube.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Slime.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/hoglin/Hoglin.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/piglin/Piglin.java.patch diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Ghast.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Ghast.java.patch new file mode 100644 index 000000000..6c1bf42f5 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Ghast.java.patch @@ -0,0 +1,14 @@ +--- a/net/minecraft/world/entity/monster/Ghast.java ++++ b/net/minecraft/world/entity/monster/Ghast.java +@@ -155,6 +_,11 @@ + public static boolean checkGhastSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { ++ // Purpur start - Config to disable hostile mob spawn on ice ++ if (net.minecraft.world.entity.monster.Monster.canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + return level.getDifficulty() != Difficulty.PEACEFUL && random.nextInt(20) == 0 && checkMobSpawnRules(entityType, level, spawnReason, pos, random); + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Guardian.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Guardian.java.patch new file mode 100644 index 000000000..fb76bfad6 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Guardian.java.patch @@ -0,0 +1,14 @@ +--- a/net/minecraft/world/entity/monster/Guardian.java ++++ b/net/minecraft/world/entity/monster/Guardian.java +@@ -314,6 +_,11 @@ + public static boolean checkGuardianSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { ++ // Purpur start - Config to disable hostile mob spawn on ice ++ if (canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + return (random.nextInt(20) == 0 || !level.canSeeSkyFromBelowWater(pos)) + && level.getDifficulty() != Difficulty.PEACEFUL + && (EntitySpawnReason.isSpawner(spawnReason) || level.getFluidState(pos).is(FluidTags.WATER)) diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/MagmaCube.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/MagmaCube.java.patch new file mode 100644 index 000000000..358fa1924 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/MagmaCube.java.patch @@ -0,0 +1,14 @@ +--- a/net/minecraft/world/entity/monster/MagmaCube.java ++++ b/net/minecraft/world/entity/monster/MagmaCube.java +@@ -31,6 +_,11 @@ + public static boolean checkMagmaCubeSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { ++ // Purpur start - Config to disable hostile mob spawn on ice ++ if (net.minecraft.world.entity.monster.Monster.canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + return level.getDifficulty() != Difficulty.PEACEFUL; + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Monster.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Monster.java.patch index 667afc7cc..8e8c03d48 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Monster.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Monster.java.patch @@ -1,17 +1,39 @@ --- a/net/minecraft/world/entity/monster/Monster.java +++ b/net/minecraft/world/entity/monster/Monster.java -@@ -84,6 +_,14 @@ +@@ -84,6 +_,11 @@ } public static boolean isDarkEnoughToSpawn(ServerLevelAccessor level, BlockPos pos, RandomSource random) { + // Purpur start - Config to disable hostile mob spawn on ice -+ if (!level.getMinecraftWorld().purpurConfig.mobsSpawnOnPackedIce || !level.getMinecraftWorld().purpurConfig.mobsSpawnOnBlueIce) { -+ net.minecraft.world.level.block.state.BlockState spawnBlock = level.getBlockState(pos.below()); -+ if ((!level.getMinecraftWorld().purpurConfig.mobsSpawnOnPackedIce && spawnBlock.is(net.minecraft.world.level.block.Blocks.PACKED_ICE)) || (!level.getMinecraftWorld().purpurConfig.mobsSpawnOnBlueIce && spawnBlock.is(net.minecraft.world.level.block.Blocks.BLUE_ICE))) { -+ return false; -+ } ++ if (canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; + } + // Purpur end - Config to disable hostile mob spawn on ice if (level.getBrightness(LightLayer.SKY, pos) > random.nextInt(32)) { return false; } else { +@@ -109,6 +_,11 @@ + public static boolean checkAnyLightMonsterSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { ++ // Purpur start - Config to disable hostile mob spawn on ice ++ if (canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + return level.getDifficulty() != Difficulty.PEACEFUL && checkMobSpawnRules(entityType, level, spawnReason, pos, random); + } + +@@ -140,4 +_,12 @@ + return ItemStack.EMPTY; + } + } ++ ++ // Purpur start - Config to disable hostile mob spawn on ice ++ public static boolean canSpawnInBlueAndPackedIce(LevelAccessor level, BlockPos pos) { ++ net.minecraft.world.level.block.state.BlockState spawnBlock = level.getBlockState(pos.below()); ++ ++ return (!level.getMinecraftWorld().purpurConfig.mobsSpawnOnPackedIce && spawnBlock.is(net.minecraft.world.level.block.Blocks.PACKED_ICE)) || (!level.getMinecraftWorld().purpurConfig.mobsSpawnOnBlueIce && spawnBlock.is(net.minecraft.world.level.block.Blocks.BLUE_ICE)); ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Slime.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Slime.java.patch new file mode 100644 index 000000000..a35f7c4eb --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Slime.java.patch @@ -0,0 +1,14 @@ +--- a/net/minecraft/world/entity/monster/Slime.java ++++ b/net/minecraft/world/entity/monster/Slime.java +@@ -301,6 +_,11 @@ + public static boolean checkSlimeSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { ++ // Purpur start - Config to disable hostile mob spawn on ice ++ if (net.minecraft.world.entity.monster.Monster.canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + if (level.getDifficulty() != Difficulty.PEACEFUL) { + if (EntitySpawnReason.isSpawner(spawnReason)) { + return checkMobSpawnRules(entityType, level, spawnReason, pos, random); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombifiedPiglin.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombifiedPiglin.java.patch index b090f4bb2..cd9485fcf 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombifiedPiglin.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombifiedPiglin.java.patch @@ -13,16 +13,28 @@ super.customServerAiStep(level); } -@@ -159,6 +_,12 @@ - this.playFirstAngerSoundIn = FIRST_ANGER_SOUND_DELAY.sample(this.random); +@@ -160,6 +_,12 @@ this.ticksUntilNextAlert = ALERT_INTERVAL.sample(this.random); } -+ + + // Purpur start - Toggle for Zombified Piglin death always counting as player kill when angry + if (target instanceof Player player && this.level().purpurConfig.zombifiedPiglinCountAsPlayerKillWhenAngry) { + this.setLastHurtByPlayer(player, this.tickCount); + } + // Purpur end - Toggle for Zombified Piglin death always counting as player kill when angry - ++ return super.setTarget(target, reason); // CraftBukkit } + +@@ -180,6 +_,11 @@ + public static boolean checkZombifiedPiglinSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { ++ // Purpur start - Config to disable hostile mob spawn on ice ++ if (canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + return level.getDifficulty() != Difficulty.PEACEFUL && !level.getBlockState(pos.below()).is(Blocks.NETHER_WART_BLOCK); + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/hoglin/Hoglin.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/hoglin/Hoglin.java.patch new file mode 100644 index 000000000..216434a31 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/hoglin/Hoglin.java.patch @@ -0,0 +1,14 @@ +--- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java ++++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java +@@ -200,6 +_,11 @@ + public static boolean checkHoglinSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { ++ // Purpur start - Config to disable hostile mob spawn on ice ++ if (net.minecraft.world.entity.monster.Monster.canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + return !level.getBlockState(pos.below()).is(Blocks.NETHER_WART_BLOCK); + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/piglin/Piglin.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/piglin/Piglin.java.patch new file mode 100644 index 000000000..1fa00c0ee --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/piglin/Piglin.java.patch @@ -0,0 +1,14 @@ +--- a/net/minecraft/world/entity/monster/piglin/Piglin.java ++++ b/net/minecraft/world/entity/monster/piglin/Piglin.java +@@ -203,6 +_,11 @@ + public static boolean checkPiglinSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { ++ // Purpur start - Config to disable hostile mob spawn on ice ++ if (canSpawnInBlueAndPackedIce(level, pos)) { ++ return false; ++ } ++ // Purpur end - Config to disable hostile mob spawn on ice + return !level.getBlockState(pos.below()).is(Blocks.NETHER_WART_BLOCK); + } +