diff --git a/patches/server/0010-Blazingly-Simple-Farm-Checks.patch b/patches/server/0010-Blazingly-Simple-Farm-Checks.patch index 9b013b4..78007d8 100644 --- a/patches/server/0010-Blazingly-Simple-Farm-Checks.patch +++ b/patches/server/0010-Blazingly-Simple-Farm-Checks.patch @@ -4,19 +4,6 @@ Date: Mon, 20 Nov 2023 20:17:56 -0300 Subject: [PATCH] Blazingly Simple Farm Checks -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 1148b3ab0a582fff17f0101516df4b5037b49aba..9bcd4069eed4fcfce82cab01a7c116dfe0cd8911 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -317,7 +317,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop entitiesWithScheduledTasks = java.util.concurrent.ConcurrentHashMap.newKeySet(); // SparklyPaper - skip EntityScheduler's executeTick checks if there isn't any tasks to be run (concurrent because plugins may schedule tasks async) -- -+ - public static S spin(Function serverFactory) { - AtomicReference atomicreference = new AtomicReference(); - Thread thread = new io.papermc.paper.util.TickThread(() -> { // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java index 112d2feba5f75a2a873b595617780515945c10e4..d19d6e0082c3dba2581aab4911cfe9d36dc22453 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java diff --git a/patches/server/0011-Spooky-month-optimizations.patch b/patches/server/0011-Spooky-month-optimizations.patch index 05803d8..2eac4f9 100644 --- a/patches/server/0011-Spooky-month-optimizations.patch +++ b/patches/server/0011-Spooky-month-optimizations.patch @@ -10,17 +10,19 @@ Caches when Bat's spooky season starts and ends, and when Skeleton and Zombies h Avoids unnecessary date checks, even tho that this shouldn't really improve performance that much... unless you have a lot of bats/zombies/skeletons spawning. diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 9bcd4069eed4fcfce82cab01a7c116dfe0cd8911..b635a473d2a19bbefc24e86455ec6735b9a8c9cc 100644 +index 1148b3ab0a582fff17f0101516df4b5037b49aba..b635a473d2a19bbefc24e86455ec6735b9a8c9cc 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -317,6 +317,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop entitiesWithScheduledTasks = java.util.concurrent.ConcurrentHashMap.newKeySet(); // SparklyPaper - skip EntityScheduler's executeTick checks if there isn't any tasks to be run (concurrent because plugins may schedule tasks async) +- + public net.sparklypower.sparklypaper.HalloweenManager halloweenManager = new net.sparklypower.sparklypaper.HalloweenManager(); // SparklyPaper - Spooky month optimizations - ++ public static S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); + Thread thread = new io.papermc.paper.util.TickThread(() -> { // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java index ac8565be2334efe48d5bdc3f58bf60fb9f715da7..859faaf21635caca2a2ab471ac3d4569f04ba69b 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -205,3 +207,103 @@ index 0000000000000000000000000000000000000000..8dd82e727872c0d6c4d0827ac63d5fec + } +} \ No newline at end of file +diff --git a/src/src/main/kotlin/net/sparklypower/sparklypaper/HalloweenManager.kt b/src/src/main/kotlin/net/sparklypower/sparklypaper/HalloweenManager.kt +new file mode 100644 +index 0000000000000000000000000000000000000000..8dd82e727872c0d6c4d0827ac63d5fecb9218c61 +--- /dev/null ++++ b/src/src/main/kotlin/net/sparklypower/sparklypaper/HalloweenManager.kt +@@ -0,0 +1,93 @@ ++package net.sparklypower.sparklypaper ++ ++import com.mojang.logging.LogUtils ++import java.time.LocalDateTime ++import java.time.Month ++import java.time.ZoneOffset ++import java.util.concurrent.* ++ ++class HalloweenManager { ++ companion object { ++ private val LOGGER = LogUtils.getLogger() ++ } ++ private var spookySeasonStartEpoch = 0L ++ private var spookySeasonEndEpoch = 0L ++ private var halloweenStartEpoch = 0L ++ private var halloweenEndEpoch = 0L ++ private var executor = Executors.newSingleThreadScheduledExecutor(object: ThreadFactory { ++ override fun newThread(p0: Runnable): Thread { ++ val thread = Thread(p0) ++ thread.name = "halloween-timer-updater" ++ thread.priority = 1 // Minimum priority ++ return thread ++ } ++ }) ++ private var latch = CountDownLatch(1) ++ ++ fun startHalloweenEpochTask() { ++ var isFirst = true ++ executor.scheduleAtFixedRate({ ++ updateEpoch() ++ if (isFirst) ++ latch.countDown() ++ isFirst = false ++ }, 0L, 90L, TimeUnit.DAYS) // Every 90 days ++ } ++ ++ fun waitUntilEpochHasBeenUpdated() { ++ latch.await() ++ } ++ ++ fun updateEpoch() { ++ LOGGER.info("Updating Spooky Season and Halloween Time") ++ this.spookySeasonStartEpoch = getEpochMillisAtDate(20, Month.OCTOBER, false) ++ this.spookySeasonEndEpoch = getEpochMillisAtDate(3, Month.NOVEMBER, true) ++ this.halloweenStartEpoch = getEpochMillisAtDate(31, Month.OCTOBER, false) ++ this.halloweenEndEpoch = getEpochMillisAtDate(31, Month.OCTOBER, true) ++ LOGGER.info("Updated Spooky Season and Halloween Time!") ++ } ++ ++ fun isSpookySeason() = System.currentTimeMillis() in spookySeasonStartEpoch until spookySeasonEndEpoch ++ fun isHalloween() = System.currentTimeMillis() in halloweenStartEpoch until halloweenEndEpoch ++ ++ private fun getEpochMillisAtDate(dayOfMonth: Int, month: Month, isEnd: Boolean): Long { ++ // Get the current year ++ val currentYear = LocalDateTime.now().year ++ ++ // Define the target date (20/10/CurrentYear at midnight) ++ val targetDate = LocalDateTime.of( ++ currentYear, ++ month, ++ dayOfMonth, ++ if (isEnd) ++ 23 ++ else ++ 0, ++ if (isEnd) ++ 59 ++ else ++ 0, ++ if (isEnd) ++ 59 ++ else ++ 0, ++ if (isEnd) ++ 999_999_999 ++ else ++ 0, ++ ) ++ ++ // Check if the target date is in the past ++ val now = LocalDateTime.now() ++ val adjustedDate = if (now.isAfter(targetDate)) { ++ // If in the past, adjust to the same date in the next year ++ targetDate.plusYears(1) ++ } else { ++ // If in the future or today, use the original target date ++ targetDate ++ } ++ ++ // Convert the adjusted date to epoch time in milliseconds ++ return adjustedDate.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli() ++ } ++} +\ No newline at end of file