From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jan Villim <jan.villim@student.tuke.sk>
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<Entity> CAN_BE_COLLIDED_WITH = EntitySelector.NO_SPECTATORS.and(Entity::canBeCollidedWith);
-    public static Predicate<Player> 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<Player> 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 24fa62da17ad6c84d45c6fb726305a87df85d2aa..1c3718d9244513d9fc795dceb564a81375734557 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);
