From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sat, 10 Oct 2020 14:29:55 -0500
Subject: [PATCH] Configurable daylight cycle


diff --git a/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutUpdateTime.java b/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutUpdateTime.java
index 3086ee023685781d94e2fb99fc8dff5264f01165..74c1047305cac5673e274096709c757ede4605f4 100644
--- a/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutUpdateTime.java
+++ b/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutUpdateTime.java
@@ -7,7 +7,7 @@ import net.minecraft.network.protocol.Packet;
 public class PacketPlayOutUpdateTime implements Packet<PacketListenerPlayOut> {
 
     private long a; private final void setWorldAge(final long age) { this.a = age; } private final long getWorldAge() { return this.a; } // Paper - OBFHELPER
-    private long b;
+    private long b; public void setPlayerTime(long time) { this.b = time; } // Purpur
 
     public PacketPlayOutUpdateTime() {}
 
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
index 373b4c24e105c343f9ba125514853a0d0dbdc524..9a2cc5dfcfaefc8a257a85c0bc09456074ff76c2 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -64,6 +64,7 @@ import net.minecraft.network.protocol.game.PacketPlayOutExplosion;
 import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange;
 import net.minecraft.network.protocol.game.PacketPlayOutNamedSoundEffect;
 import net.minecraft.network.protocol.game.PacketPlayOutSpawnPosition;
+import net.minecraft.network.protocol.game.PacketPlayOutUpdateTime;
 import net.minecraft.network.protocol.game.PacketPlayOutWorldEvent;
 import net.minecraft.network.protocol.game.PacketPlayOutWorldParticles;
 import net.minecraft.resources.MinecraftKey;
@@ -213,6 +214,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
     private final EnderDragonBattle dragonBattle;
     private final StructureManager structureManager;
     private final boolean Q;
+    private double fakeTime; // Purpur
 
 
     // CraftBukkit start
@@ -604,6 +606,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
         this.getServer().addWorld(this.getWorld()); // CraftBukkit
 
         this.asyncChunkTaskManager = new com.destroystokyo.paper.io.chunk.ChunkTaskManager(this); // Paper
+        this.fakeTime = this.worldDataServer.getDayTime(); // Purpur
     }
 
     // Tuinity start - optimise collision
@@ -1191,7 +1194,21 @@ public class WorldServer extends World implements GeneratorAccessSeed {
             this.nextTickListBlock.nextTick(); // Paper
             this.nextTickListFluid.nextTick(); // Paper
             this.worldDataServer.u().a(this.server, i);
-            if (this.worldData.q().getBoolean(GameRules.DO_DAYLIGHT_CYCLE)) {
+            // Purpur start
+            WorldServer world = this.worldDataServer.world;
+            if (world.getGameRules().getBoolean(GameRules.DO_DAYLIGHT_CYCLE)) {
+                double incrementTimeBy = 12000.0D / (double) (world.isDay() ? world.purpurConfig.daytimeTicks : world.purpurConfig.nighttimeTicks);
+                if (incrementTimeBy != 1.0D) {
+                    this.fakeTime += incrementTimeBy;
+                    this.setDayTime(this.fakeTime);
+                    PacketPlayOutUpdateTime packet = new PacketPlayOutUpdateTime(world.getTime(), world.getDayTime(), true);
+                    for (EntityHuman entityhuman : world.players) {
+                        EntityPlayer player = (EntityPlayer) entityhuman;
+                        packet.setPlayerTime(player.getPlayerTime());
+                        player.playerConnection.sendPacket(packet);
+                    }
+                } else
+                // Purpur end
                 this.setDayTime(this.worldData.getDayTime() + 1L);
             }
 
@@ -1200,6 +1217,12 @@ public class WorldServer extends World implements GeneratorAccessSeed {
 
     public void setDayTime(long i) {
         this.worldDataServer.setDayTime(i);
+        // Purpur start
+        this.fakeTime = i;
+    }
+    public void setDayTime(double i) {
+        this.worldDataServer.setDayTime((long) i);
+        // Purpur end
     }
 
     public void doMobSpawning(boolean flag, boolean flag1) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 8dda3c6aab016c52cf8cc2ee663087cbe9099681..21bc5f3b398b824a66e089e408e6759d33c30511 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -116,6 +116,13 @@ public class PurpurWorldConfig {
         }
     }
 
+    public int daytimeTicks = 12000;
+    public int nighttimeTicks = 12000;
+    private void daytimeCycleSettings() {
+        daytimeTicks = getInt("gameplay-mechanics.daylight-cycle-ticks.daytime", daytimeTicks);
+        nighttimeTicks = getInt("gameplay-mechanics.daylight-cycle-ticks.nighttime", nighttimeTicks);
+    }
+
     public int entityLifeSpan = 0;
     private void entitySettings() {
         entityLifeSpan = getInt("gameplay-mechanics.entity-lifespan", entityLifeSpan);
