From 21b964af4e211d62a919c806c8b92e691183e84f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Villim?= <40277164+vill28@users.noreply.github.com> Date: Sat, 26 Nov 2022 17:59:04 +0100 Subject: [PATCH] Added ability to control player's insomnia and phantoms spawning (#6500) --- patches/server/0004-Paper-config-files.patch | 7 +- ...ntrol-player-s-insomnia-and-phantoms.patch | 67 +++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 patches/server/0948-Ability-to-control-player-s-insomnia-and-phantoms.patch diff --git a/patches/server/0004-Paper-config-files.patch b/patches/server/0004-Paper-config-files.patch index 237526d8b3..d5fff4fb10 100644 --- a/patches/server/0004-Paper-config-files.patch +++ b/patches/server/0004-Paper-config-files.patch @@ -1444,10 +1444,10 @@ index 0000000000000000000000000000000000000000..1bb16fc7598cd53e822d84b69d6a9727 +} diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java new file mode 100644 -index 0000000000000000000000000000000000000000..7e995bb83a06e302fd70a8e6f079e3ac55c60473 +index 0000000000000000000000000000000000000000..5982dda61e07f1661b0a68d0ba1fcc1122e8d428 --- /dev/null +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -@@ -0,0 +1,468 @@ +@@ -0,0 +1,471 @@ +package io.papermc.paper.configuration; + +import com.google.common.collect.HashBasedTable; @@ -1692,6 +1692,9 @@ index 0000000000000000000000000000000000000000..7e995bb83a06e302fd70a8e6f079e3ac + public boolean enderDragonsDeathAlwaysPlacesDragonEgg = false; + public boolean phantomsDoNotSpawnOnCreativePlayers = true; + public boolean phantomsOnlyAttackInsomniacs = true; ++ public int playerInsomniaStartTicks = 72000; ++ public int phantomsSpawnAttemptMinSeconds = 60; ++ public int phantomsSpawnAttemptMaxSeconds = 119; + public boolean parrotsAreUnaffectedByPlayerMovement = false; + public double zombieVillagerInfectionChance = -1.0; + public MobsCanAlwaysPickUpLoot mobsCanAlwaysPickUpLoot; diff --git a/patches/server/0948-Ability-to-control-player-s-insomnia-and-phantoms.patch b/patches/server/0948-Ability-to-control-player-s-insomnia-and-phantoms.patch new file mode 100644 index 0000000000..1c762bdb6f --- /dev/null +++ b/patches/server/0948-Ability-to-control-player-s-insomnia-and-phantoms.patch @@ -0,0 +1,67 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jan Villim +Date: Sat, 22 Jan 2022 17:56:19 +0100 +Subject: [PATCH] Ability to control player's insomnia and phantoms + + +diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java +index a00c3d96f2fc7131d1f4afa7af4e41ace3cfce89..72abebff2018cde2922e97ad6478f93da9aed3ec 100644 +--- a/src/main/java/net/minecraft/world/entity/EntitySelector.java ++++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java +@@ -27,7 +27,18 @@ public final class EntitySelector { + return !entity.isSpectator(); + }; + public static final Predicate CAN_BE_COLLIDED_WITH = EntitySelector.NO_SPECTATORS.and(Entity::canBeCollidedWith); +- public static Predicate isInsomniac = (player) -> net.minecraft.util.Mth.clamp(((net.minecraft.server.level.ServerPlayer) player).getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE) >= 72000; // Paper ++ // Paper start ++ public static Predicate isInsomniac = (player) -> { ++ net.minecraft.server.level.ServerPlayer serverPlayer = (net.minecraft.server.level.ServerPlayer) player; ++ int playerInsomniaTicks = serverPlayer.getLevel().paperConfig().entities.behavior.playerInsomniaStartTicks; ++ ++ if (playerInsomniaTicks <= 0) { ++ return false; ++ } ++ ++ return net.minecraft.util.Mth.clamp(serverPlayer.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE) >= playerInsomniaTicks; ++ }; ++ // Paper end + + private EntitySelector() {} + // Paper start +diff --git a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java +index 2093d08bccbfbe096ea24cc4f70cbfdfa07d6a56..ee299451437822544f0c79cc878110c959ec5dc4 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java +@@ -35,13 +35,22 @@ public class PhantomSpawner implements CustomSpawner { + } else if (!world.getGameRules().getBoolean(GameRules.RULE_DOINSOMNIA)) { + return 0; + } else { ++ // Paper start ++ if (world.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds <= 0) { ++ return 0; ++ } ++ // Paper end + RandomSource randomsource = world.random; + + --this.nextTick; + if (this.nextTick > 0) { + return 0; + } else { +- this.nextTick += (60 + randomsource.nextInt(60)) * 20; ++ // Paper start ++ 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 + if (world.getSkyDarken() < 5 && world.dimensionType().hasSkyLight()) { + return 0; + } else { +@@ -62,7 +71,7 @@ public class PhantomSpawner implements CustomSpawner { + int j = Mth.clamp(serverstatisticmanager.getValue(Stats.CUSTOM.get(Stats.TIME_SINCE_REST)), (int) 1, Integer.MAX_VALUE); + boolean flag2 = true; + +- if (randomsource.nextInt(j) >= 72000) { ++ if (randomsource.nextInt(j) >= world.paperConfig().entities.behavior.playerInsomniaStartTicks) { // Paper + 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);