From d1369750e249c152ad8cca893386d5aab697748d Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Sat, 14 Dec 2024 15:00:16 -0800 Subject: [PATCH] net.minecraft.world.level.levelgen --- .../levelgen/DensityFunctions.java.patch | 48 +++++----- .../level/levelgen/FlatLevelSource.java.patch | 28 ++++++ .../NoiseBasedChunkGenerator.java.patch | 2 +- .../level/levelgen/PatrolSpawner.java.patch | 91 +++++++++++++++++++ .../level/levelgen/PhantomSpawner.java.patch | 67 ++++++++++++++ .../level/levelgen/FlatLevelSource.java.patch | 38 -------- .../level/levelgen/PatrolSpawner.java.patch | 79 ---------------- .../level/levelgen/PhantomSpawner.java.patch | 68 -------------- 8 files changed, 211 insertions(+), 210 deletions(-) rename paper-server/patches/{unapplied => sources}/net/minecraft/world/level/levelgen/DensityFunctions.java.patch (51%) create mode 100644 paper-server/patches/sources/net/minecraft/world/level/levelgen/FlatLevelSource.java.patch rename paper-server/patches/{unapplied => sources}/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java.patch (94%) create mode 100644 paper-server/patches/sources/net/minecraft/world/level/levelgen/PatrolSpawner.java.patch create mode 100644 paper-server/patches/sources/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch delete mode 100644 paper-server/patches/unapplied/net/minecraft/world/level/levelgen/FlatLevelSource.java.patch delete mode 100644 paper-server/patches/unapplied/net/minecraft/world/level/levelgen/PatrolSpawner.java.patch delete mode 100644 paper-server/patches/unapplied/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch diff --git a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/DensityFunctions.java.patch b/paper-server/patches/sources/net/minecraft/world/level/levelgen/DensityFunctions.java.patch similarity index 51% rename from paper-server/patches/unapplied/net/minecraft/world/level/levelgen/DensityFunctions.java.patch rename to paper-server/patches/sources/net/minecraft/world/level/levelgen/DensityFunctions.java.patch index 3f778b5424..96d7029c39 100644 --- a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/DensityFunctions.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/levelgen/DensityFunctions.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/levelgen/DensityFunctions.java +++ b/net/minecraft/world/level/levelgen/DensityFunctions.java -@@ -509,6 +509,16 @@ +@@ -506,6 +_,16 @@ ); private static final float ISLAND_THRESHOLD = -0.9F; private final SimplexNoise islandNoise; @@ -17,36 +17,36 @@ public EndIslandDensityFunction(long seed) { RandomSource randomSource = new LegacyRandomSource(seed); -@@ -521,15 +531,29 @@ - int j = z / 2; - int k = x % 2; - int l = z % 2; -- float f = 100.0F - Mth.sqrt((float)(x * x + z * z)) * 8.0F; -+ float f = 100.0F - Mth.sqrt((long) x * (long) x + (long) z * (long) z) * 8.0F; // Paper - cast ints to long to avoid integer overflow +@@ -518,15 +_,29 @@ + int i1 = z / 2; + int i2 = x % 2; + int i3 = z % 2; +- float f = 100.0F - Mth.sqrt(x * x + z * z) * 8.0F; ++ float f = 100.0F - Mth.sqrt((long)x * (long)x + (long)z * (long)z) * 8.0F; // Paper - cast ints to long to avoid integer overflow f = Mth.clamp(f, -100.0F, 80.0F); -+ NoiseCache cache = noiseCache.get().computeIfAbsent(sampler, noiseKey -> new NoiseCache()); // Paper - Perf: Optimize end generation - for (int m = -12; m <= 12; m++) { - for (int n = -12; n <= 12; n++) { - long o = (long)(i + m); - long p = (long)(j + n); -- if (o * o + p * p > 4096L && sampler.getValue((double)o, (double)p) < -0.9F) { -- float g = (Mth.abs((float)o) * 3439.0F + Mth.abs((float)p) * 147.0F) % 13.0F + 9.0F; ++ NoiseCache cache = noiseCache.get().computeIfAbsent(noise, noiseKey -> new NoiseCache()); // Paper - Perf: Optimize end generation + for (int i4 = -12; i4 <= 12; i4++) { + for (int i5 = -12; i5 <= 12; i5++) { + long l = i + i4; + long l1 = i1 + i5; +- if (l * l + l1 * l1 > 4096L && noise.getValue(l, l1) < -0.9F) { +- float f1 = (Mth.abs((float)l) * 3439.0F + Mth.abs((float)l1) * 147.0F) % 13.0F + 9.0F; + // Paper start - Perf: Optimize end generation by using a noise cache -+ long key = net.minecraft.world.level.ChunkPos.asLong((int) o, (int) p); ++ long key = net.minecraft.world.level.ChunkPos.asLong((int) l, (int) l); + int index = (int) it.unimi.dsi.fastutil.HashCommon.mix(key) & 8191; -+ float g = Float.MIN_VALUE; ++ float f1 = Float.MIN_VALUE; + if (cache.keys[index] == key) { -+ g = cache.values[index]; ++ f1 = cache.values[index]; + } else { -+ if (o * o + p * p > 4096L && sampler.getValue((double)o, (double)p) < -0.9F) { -+ g = (Mth.abs((float)o) * 3439.0F + Mth.abs((float)p) * 147.0F) % 13.0F + 9.0F; ++ if (l * l + l1 * l1 > 4096L && noise.getValue((double)l, (double)l1) < -0.9F) { ++ f1 = (Mth.abs((float)l) * 3439.0F + Mth.abs((float)l1) * 147.0F) % 13.0F + 9.0F; + } + cache.keys[index] = key; -+ cache.values[index] = g; ++ cache.values[index] = f1; + } -+ if (g != Float.MIN_VALUE) { ++ if (f1 != Float.MIN_VALUE) { + // Paper end - Perf: Optimize end generation - float h = (float)(k - m * 2); - float q = (float)(l - n * 2); - float r = 100.0F - Mth.sqrt(h * h + q * q) * g; + float f2 = i2 - i4 * 2; + float f3 = i3 - i5 * 2; + float f4 = 100.0F - Mth.sqrt(f2 * f2 + f3 * f3) * f1; diff --git a/paper-server/patches/sources/net/minecraft/world/level/levelgen/FlatLevelSource.java.patch b/paper-server/patches/sources/net/minecraft/world/level/levelgen/FlatLevelSource.java.patch new file mode 100644 index 0000000000..f1cd4a895b --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/level/levelgen/FlatLevelSource.java.patch @@ -0,0 +1,28 @@ +--- a/net/minecraft/world/level/levelgen/FlatLevelSource.java ++++ b/net/minecraft/world/level/levelgen/FlatLevelSource.java +@@ -33,17 +_,22 @@ + private final FlatLevelGeneratorSettings settings; + + public FlatLevelSource(FlatLevelGeneratorSettings settings) { +- super(new FixedBiomeSource(settings.getBiome()), Util.memoize(settings::adjustGenerationSettings)); ++ // CraftBukkit start ++ this(settings, new FixedBiomeSource(settings.getBiome())); ++ } ++ public FlatLevelSource(FlatLevelGeneratorSettings settings, net.minecraft.world.level.biome.BiomeSource biomeSource) { ++ super(biomeSource, Util.memoize(settings::adjustGenerationSettings)); ++ // CraftBukkit end + this.settings = settings; + } + + @Override +- public ChunkGeneratorStructureState createState(HolderLookup structureSetLookup, RandomState randomState, long seed) { ++ public ChunkGeneratorStructureState createState(HolderLookup structureSetLookup, RandomState randomState, long seed, org.spigotmc.SpigotWorldConfig conf) { // Spigot + Stream> stream = this.settings + .structureOverrides() + .map(HolderSet::stream) + .orElseGet(() -> structureSetLookup.listElements().map(reference -> (Holder)reference)); +- return ChunkGeneratorStructureState.createForFlat(randomState, seed, this.biomeSource, stream); ++ return ChunkGeneratorStructureState.createForFlat(randomState, seed, this.biomeSource, stream, conf); // Spigot + } + + @Override diff --git a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java.patch b/paper-server/patches/sources/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java.patch similarity index 94% rename from paper-server/patches/unapplied/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java.patch rename to paper-server/patches/sources/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java.patch index e3e53c8dde..18943c3caa 100644 --- a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java +++ b/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java -@@ -1,3 +1,4 @@ +@@ -1,3 +_,4 @@ +// keep package net.minecraft.world.level.levelgen; diff --git a/paper-server/patches/sources/net/minecraft/world/level/levelgen/PatrolSpawner.java.patch b/paper-server/patches/sources/net/minecraft/world/level/levelgen/PatrolSpawner.java.patch new file mode 100644 index 0000000000..0e1624f5dc --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/level/levelgen/PatrolSpawner.java.patch @@ -0,0 +1,91 @@ +--- a/net/minecraft/world/level/levelgen/PatrolSpawner.java ++++ b/net/minecraft/world/level/levelgen/PatrolSpawner.java +@@ -20,28 +_,66 @@ + + @Override + public int tick(ServerLevel level, boolean spawnEnemies, boolean spawnFriendlies) { ++ if (level.paperConfig().entities.behavior.pillagerPatrols.disable || level.paperConfig().entities.behavior.pillagerPatrols.spawnChance == 0) return 0; // Paper - Add option to disable pillager patrols & Pillager patrol spawn settings and per player options + if (!spawnEnemies) { + return 0; + } else if (!level.getGameRules().getBoolean(GameRules.RULE_DO_PATROL_SPAWNING)) { + return 0; + } else { + RandomSource randomSource = level.random; +- this.nextTick--; +- if (this.nextTick > 0) { +- return 0; +- } else { +- this.nextTick = this.nextTick + 12000 + randomSource.nextInt(1200); +- long l = level.getDayTime() / 24000L; +- if (l < 5L || !level.isDay()) { +- return 0; +- } else if (randomSource.nextInt(5) != 0) { +- return 0; +- } else { +- int size = level.players().size(); ++ // this.nextTick--; ++ // if (this.nextTick > 0) { ++ // return 0; ++ // } else { ++ // this.nextTick = this.nextTick + 12000 + randomSource.nextInt(1200); ++ // long l = level.getDayTime() / 24000L; ++ // if (l < 5L || !level.isDay()) { ++ // return 0; ++ // } else if (randomSource.nextInt(5) != 0) { ++ // Paper start - Pillager patrol spawn settings and per player options ++ // Random player selection moved up for per player spawning and configuration ++ int size = level.players().size(); ++ if (size < 1) { ++ return 0; ++ } ++ ++ net.minecraft.server.level.ServerPlayer player = level.players().get(randomSource.nextInt(size)); ++ if (player.isSpectator()) { ++ return 0; ++ } ++ ++ int patrolSpawnDelay; ++ if (level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) { ++ --player.patrolSpawnDelay; ++ patrolSpawnDelay = player.patrolSpawnDelay; ++ } else { ++ this.nextTick--; ++ patrolSpawnDelay = this.nextTick; ++ } ++ if (patrolSpawnDelay > 0) { ++ return 0; ++ } else { ++ long days; ++ if (level.paperConfig().entities.behavior.pillagerPatrols.start.perPlayer) { ++ days = player.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.PLAY_TIME)) / 24000L; // PLAY_ONE_MINUTE is actually counting in ticks, a misnomer by Mojang ++ } else { ++ days = level.getDayTime() / 24000L; ++ } ++ if (level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) { ++ player.patrolSpawnDelay += level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomSource.nextInt(1200); ++ } else { ++ this.nextTick += level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomSource.nextInt(1200); ++ } ++ ++ if (days < level.paperConfig().entities.behavior.pillagerPatrols.start.day || !level.isDay()) { ++ return 0; ++ } else if (randomSource.nextDouble() >= level.paperConfig().entities.behavior.pillagerPatrols.spawnChance) { ++ // Paper end - Pillager patrol spawn settings and per player options ++ return 0; ++ } else { + if (size < 1) { + return 0; + } else { +- Player player = level.players().get(randomSource.nextInt(size)); + if (player.isSpectator()) { + return 0; + } else if (level.isCloseToVillage(player.blockPosition(), 2)) { +@@ -104,7 +_,7 @@ + + patrollingMonster.setPos(pos.getX(), pos.getY(), pos.getZ()); + patrollingMonster.finalizeSpawn(level, level.getCurrentDifficultyAt(pos), EntitySpawnReason.PATROL, null); +- level.addFreshEntityWithPassengers(patrollingMonster); ++ level.addFreshEntityWithPassengers(patrollingMonster, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.PATROL); // CraftBukkit + return true; + } else { + return false; diff --git a/paper-server/patches/sources/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch b/paper-server/patches/sources/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch new file mode 100644 index 0000000000..80e3eeee2e --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch @@ -0,0 +1,67 @@ +--- a/net/minecraft/world/level/levelgen/PhantomSpawner.java ++++ b/net/minecraft/world/level/levelgen/PhantomSpawner.java +@@ -28,19 +_,28 @@ + } else if (!level.getGameRules().getBoolean(GameRules.RULE_DOINSOMNIA)) { + return 0; + } else { ++ // Paper start - Ability to control player's insomnia and phantoms ++ if (level.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds <= 0) { ++ return 0; ++ } ++ // Paper end - Ability to control player's insomnia and phantoms + RandomSource randomSource = level.random; + this.nextTick--; + if (this.nextTick > 0) { + return 0; + } else { +- this.nextTick = this.nextTick + (60 + randomSource.nextInt(60)) * 20; ++ // Paper start - Ability to control player's insomnia and phantoms ++ int spawnAttemptMinSeconds = level.paperConfig().entities.behavior.phantomsSpawnAttemptMinSeconds; ++ int spawnAttemptMaxSeconds = level.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds; ++ this.nextTick += (spawnAttemptMinSeconds + randomSource.nextInt(spawnAttemptMaxSeconds - spawnAttemptMinSeconds + 1)) * 20; ++ // Paper end - Ability to control player's insomnia and phantoms + if (level.getSkyDarken() < 5 && level.dimensionType().hasSkyLight()) { + return 0; + } else { + int i = 0; + + for (ServerPlayer serverPlayer : level.players()) { +- if (!serverPlayer.isSpectator()) { ++ if (!serverPlayer.isSpectator() && (!level.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !serverPlayer.isCreative())) { // Paper - Add phantom creative and insomniac controls + BlockPos blockPos = serverPlayer.blockPosition(); + if (!level.dimensionType().hasSkyLight() || blockPos.getY() >= level.getSeaLevel() && level.canSeeSky(blockPos)) { + DifficultyInstance currentDifficultyAt = level.getCurrentDifficultyAt(blockPos); +@@ -48,7 +_,7 @@ + ServerStatsCounter stats = serverPlayer.getStats(); + int i1 = Mth.clamp(stats.getValue(Stats.CUSTOM.get(Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE); + int i2 = 24000; +- if (randomSource.nextInt(i1) >= 72000) { ++ if (randomSource.nextInt(i1) >= level.paperConfig().entities.behavior.playerInsomniaStartTicks) { // Paper - Ability to control player's insomnia and phantoms + BlockPos blockPos1 = blockPos.above(20 + randomSource.nextInt(15)) + .east(-10 + randomSource.nextInt(21)) + .south(-10 + randomSource.nextInt(21)); +@@ -59,13 +_,23 @@ + int i3 = 1 + randomSource.nextInt(currentDifficultyAt.getDifficulty().getId() + 1); + + for (int i4 = 0; i4 < i3; i4++) { ++ // Paper start - PhantomPreSpawnEvent ++ com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent event = new com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent(io.papermc.paper.util.MCUtil.toLocation(level, blockPos1), serverPlayer.getBukkitEntity(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL); ++ if (!event.callEvent()) { ++ if (event.shouldAbortSpawn()) { ++ break; ++ } ++ continue; ++ } ++ // Paper end - PhantomPreSpawnEvent + Phantom phantom = EntityType.PHANTOM.create(level, EntitySpawnReason.NATURAL); + if (phantom != null) { ++ phantom.setSpawningEntity(serverPlayer.getUUID()); // Paper - PhantomPreSpawnEvent + phantom.moveTo(blockPos1, 0.0F, 0.0F); + spawnGroupData = phantom.finalizeSpawn( + level, currentDifficultyAt, EntitySpawnReason.NATURAL, spawnGroupData + ); +- level.addFreshEntityWithPassengers(phantom); ++ level.addFreshEntityWithPassengers(phantom, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL); // CraftBukkit + i++; + } + } diff --git a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/FlatLevelSource.java.patch b/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/FlatLevelSource.java.patch deleted file mode 100644 index da8a1b29d5..0000000000 --- a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/FlatLevelSource.java.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- a/net/minecraft/world/level/levelgen/FlatLevelSource.java -+++ b/net/minecraft/world/level/levelgen/FlatLevelSource.java -@@ -34,22 +34,28 @@ - private final FlatLevelGeneratorSettings settings; - - public FlatLevelSource(FlatLevelGeneratorSettings config) { -- FixedBiomeSource worldchunkmanagerhell = new FixedBiomeSource(config.getBiome()); -+ // CraftBukkit start -+ // WorldChunkManagerHell worldchunkmanagerhell = new WorldChunkManagerHell(generatorsettingsflat.getBiome()); - -- Objects.requireNonNull(config); -- super(worldchunkmanagerhell, Util.memoize(config::adjustGenerationSettings)); -- this.settings = config; -+ // Objects.requireNonNull(generatorsettingsflat); -+ this(config, new FixedBiomeSource(config.getBiome())); - } - -+ public FlatLevelSource(FlatLevelGeneratorSettings generatorsettingsflat, net.minecraft.world.level.biome.BiomeSource worldchunkmanager) { -+ super(worldchunkmanager, Util.memoize(generatorsettingsflat::adjustGenerationSettings)); -+ // CraftBukkit end -+ this.settings = generatorsettingsflat; -+ } -+ - @Override -- public ChunkGeneratorStructureState createState(HolderLookup structureSetRegistry, RandomState noiseConfig, long seed) { -+ public ChunkGeneratorStructureState createState(HolderLookup holderlookup, RandomState randomstate, long i, org.spigotmc.SpigotWorldConfig conf) { // Spigot - Stream> stream = (Stream) this.settings.structureOverrides().map(HolderSet::stream).orElseGet(() -> { -- return structureSetRegistry.listElements().map((holder_c) -> { -+ return holderlookup.listElements().map((holder_c) -> { - return holder_c; - }); - }); - -- return ChunkGeneratorStructureState.createForFlat(noiseConfig, seed, this.biomeSource, stream); -+ return ChunkGeneratorStructureState.createForFlat(randomstate, i, this.biomeSource, stream, conf); // Spigot - } - - @Override diff --git a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/PatrolSpawner.java.patch b/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/PatrolSpawner.java.patch deleted file mode 100644 index 9d044b3016..0000000000 --- a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/PatrolSpawner.java.patch +++ /dev/null @@ -1,79 +0,0 @@ ---- a/net/minecraft/world/level/levelgen/PatrolSpawner.java -+++ b/net/minecraft/world/level/levelgen/PatrolSpawner.java -@@ -24,6 +24,7 @@ - - @Override - public int tick(ServerLevel world, boolean spawnMonsters, boolean spawnAnimals) { -+ if (world.paperConfig().entities.behavior.pillagerPatrols.disable || world.paperConfig().entities.behavior.pillagerPatrols.spawnChance == 0) return 0; // Paper - Add option to disable pillager patrols & Pillager patrol spawn settings and per player options - if (!spawnMonsters) { - return 0; - } else if (!world.getGameRules().getBoolean(GameRules.RULE_DO_PATROL_SPAWNING)) { -@@ -31,23 +32,51 @@ - } else { - RandomSource randomsource = world.random; - -- --this.nextTick; -- if (this.nextTick > 0) { -+ // Paper start - Pillager patrol spawn settings and per player options -+ // Random player selection moved up for per player spawning and configuration -+ int j = world.players().size(); -+ if (j < 1) { - return 0; -+ } -+ -+ net.minecraft.server.level.ServerPlayer entityhuman = world.players().get(randomsource.nextInt(j)); -+ if (entityhuman.isSpectator()) { -+ return 0; -+ } -+ -+ int patrolSpawnDelay; -+ if (world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) { -+ --entityhuman.patrolSpawnDelay; -+ patrolSpawnDelay = entityhuman.patrolSpawnDelay; - } else { -- this.nextTick += 12000 + randomsource.nextInt(1200); -- long i = world.getDayTime() / 24000L; -+ this.nextTick--; -+ patrolSpawnDelay = this.nextTick; -+ } - -- if (i >= 5L && world.isDay()) { -- if (randomsource.nextInt(5) != 0) { -+ if (patrolSpawnDelay > 0) { -+ return 0; -+ } else { -+ long days; -+ if (world.paperConfig().entities.behavior.pillagerPatrols.start.perPlayer) { -+ days = entityhuman.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.PLAY_TIME)) / 24000L; // PLAY_ONE_MINUTE is actually counting in ticks, a misnomer by Mojang -+ } else { -+ days = world.getDayTime() / 24000L; -+ } -+ if (world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) { -+ entityhuman.patrolSpawnDelay += world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomsource.nextInt(1200); -+ } else { -+ this.nextTick += world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomsource.nextInt(1200); -+ } -+ -+ if (days >= world.paperConfig().entities.behavior.pillagerPatrols.start.day && world.isDay()) { -+ if (randomsource.nextDouble() >= world.paperConfig().entities.behavior.pillagerPatrols.spawnChance) { -+ // Paper end - Pillager patrol spawn settings and per player options - return 0; - } else { -- int j = world.players().size(); - - if (j < 1) { - return 0; - } else { -- Player entityhuman = (Player) world.players().get(randomsource.nextInt(j)); - - if (entityhuman.isSpectator()) { - return 0; -@@ -116,7 +145,7 @@ - - entitymonsterpatrolling.setPos((double) pos.getX(), (double) pos.getY(), (double) pos.getZ()); - entitymonsterpatrolling.finalizeSpawn(world, world.getCurrentDifficultyAt(pos), EntitySpawnReason.PATROL, (SpawnGroupData) null); -- world.addFreshEntityWithPassengers(entitymonsterpatrolling); -+ world.addFreshEntityWithPassengers(entitymonsterpatrolling, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.PATROL); // CraftBukkit - return true; - } else { - return false; diff --git a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch b/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch deleted file mode 100644 index e3cf03e4f8..0000000000 --- a/paper-server/patches/unapplied/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch +++ /dev/null @@ -1,68 +0,0 @@ ---- a/net/minecraft/world/level/levelgen/PhantomSpawner.java -+++ b/net/minecraft/world/level/levelgen/PhantomSpawner.java -@@ -32,13 +32,22 @@ - } else if (!world.getGameRules().getBoolean(GameRules.RULE_DOINSOMNIA)) { - return 0; - } else { -+ // Paper start - Ability to control player's insomnia and phantoms -+ if (world.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds <= 0) { -+ return 0; -+ } -+ // Paper end - Ability to control player's insomnia and phantoms - RandomSource randomsource = world.random; - - --this.nextTick; - if (this.nextTick > 0) { - return 0; - } else { -- this.nextTick += (60 + randomsource.nextInt(60)) * 20; -+ // Paper start - Ability to control player's insomnia and phantoms -+ int spawnAttemptMinSeconds = world.paperConfig().entities.behavior.phantomsSpawnAttemptMinSeconds; -+ int spawnAttemptMaxSeconds = world.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds; -+ this.nextTick += (spawnAttemptMinSeconds + randomsource.nextInt(spawnAttemptMaxSeconds - spawnAttemptMinSeconds + 1)) * 20; -+ // Paper end - Ability to control player's insomnia and phantoms - if (world.getSkyDarken() < 5 && world.dimensionType().hasSkyLight()) { - return 0; - } else { -@@ -48,7 +57,7 @@ - while (iterator.hasNext()) { - ServerPlayer entityplayer = (ServerPlayer) iterator.next(); - -- if (!entityplayer.isSpectator()) { -+ if (!entityplayer.isSpectator() && (!world.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !entityplayer.isCreative())) { // Paper - Add phantom creative and insomniac controls - BlockPos blockposition = entityplayer.blockPosition(); - - if (!world.dimensionType().hasSkyLight() || blockposition.getY() >= world.getSeaLevel() && world.canSeeSky(blockposition)) { -@@ -59,7 +68,7 @@ - int j = Mth.clamp(serverstatisticmanager.getValue(Stats.CUSTOM.get(Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE); - boolean flag2 = true; - -- if (randomsource.nextInt(j) >= 72000) { -+ if (randomsource.nextInt(j) >= world.paperConfig().entities.behavior.playerInsomniaStartTicks) { // Paper - Ability to control player's insomnia and phantoms - BlockPos blockposition1 = blockposition.above(20 + randomsource.nextInt(15)).east(-10 + randomsource.nextInt(21)).south(-10 + randomsource.nextInt(21)); - BlockState iblockdata = world.getBlockState(blockposition1); - FluidState fluid = world.getFluidState(blockposition1); -@@ -69,12 +78,22 @@ - int k = 1 + randomsource.nextInt(difficultydamagescaler.getDifficulty().getId() + 1); - - for (int l = 0; l < k; ++l) { -+ // Paper start - PhantomPreSpawnEvent -+ com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent event = new com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent(io.papermc.paper.util.MCUtil.toLocation(world, blockposition1), entityplayer.getBukkitEntity(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL); -+ if (!event.callEvent()) { -+ if (event.shouldAbortSpawn()) { -+ break; -+ } -+ continue; -+ } -+ // Paper end - PhantomPreSpawnEvent - Phantom entityphantom = (Phantom) EntityType.PHANTOM.create(world, EntitySpawnReason.NATURAL); - - if (entityphantom != null) { -+ entityphantom.setSpawningEntity(entityplayer.getUUID()); // Paper - PhantomPreSpawnEvent - entityphantom.moveTo(blockposition1, 0.0F, 0.0F); - groupdataentity = entityphantom.finalizeSpawn(world, difficultydamagescaler, EntitySpawnReason.NATURAL, groupdataentity); -- world.addFreshEntityWithPassengers(entityphantom); -+ world.addFreshEntityWithPassengers(entityphantom, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL); // CraftBukkit - ++i; - } - }