mirror of
https://github.com/SparklyPower/SparklyPaper.git
synced 2025-12-20 15:39:32 +00:00
208 lines
10 KiB
Diff
208 lines
10 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: MrPowerGamerBR <git@mrpowergamerbr.com>
|
|
Date: Tue, 21 Nov 2023 16:50:04 -0300
|
|
Subject: [PATCH] Spooky month optimizations
|
|
|
|
The quintessential patch that other performance forks also have for... some reason??? I thought that this optimization was too funny to not do it in SparklyPaper.
|
|
|
|
Caches when Bat's spooky season starts and ends, and when Skeleton and Zombies halloween starts and ends. The epoch is updated every 90 days. If your server is running for 90+ days straight without restarts, congratulations!
|
|
|
|
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 4820e5ae050966d89a0d0b587c83537d4a1e1393..f43060555bf02f13268b284606045fce2b3e911a 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -315,6 +315,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
public static final long SERVER_INIT = System.nanoTime();
|
|
// Paper end - lag compensation
|
|
public final Set<Entity> 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 extends MinecraftServer> S spin(Function<Thread, S> serverFactory) {
|
|
AtomicReference<S> atomicreference = new AtomicReference();
|
|
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
|
index b69860955a6c1efb68b17e1fc9b0c42771f40e15..734fd1ced38a16649177bb941e76d9ca66dceac5 100644
|
|
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
|
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
|
@@ -227,6 +227,10 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
|
}
|
|
net.sparklypower.sparklypaper.SparklyPaperCommands.INSTANCE.registerCommands(this);
|
|
// SparklyPaper end
|
|
+ // SparklyPaper start - Spooky month optimizations
|
|
+ halloweenManager.startHalloweenEpochTask();
|
|
+ halloweenManager.waitUntilEpochHasBeenUpdated();
|
|
+ // SparklyPaper end
|
|
com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // load version history now
|
|
io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // init PaperBrigadierProvider
|
|
// Paper end
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
|
|
index 6b614818b14ecfc8fc82b523eeb7e21fdf9bf1ba..2588e7eb1f55d3f01f4f8d794a59f3ba16f5985a 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
|
|
@@ -231,7 +231,7 @@ public class Bat extends AmbientCreature {
|
|
int i = world.getMaxLocalRawBrightness(pos);
|
|
byte b0 = 4;
|
|
|
|
- if (Bat.isHalloween()) {
|
|
+ if (world.getServer().halloweenManager.isSpookySeason()) { // SparklyPaper - Spooky month optimizations
|
|
b0 = 7;
|
|
} else if (random.nextBoolean()) {
|
|
return false;
|
|
@@ -241,6 +241,8 @@ public class Bat extends AmbientCreature {
|
|
}
|
|
}
|
|
|
|
+ // SparklyPaper - Spooky month optimizations
|
|
+ /*
|
|
private static boolean isHalloween() {
|
|
LocalDate localdate = LocalDate.now();
|
|
int i = localdate.get(ChronoField.DAY_OF_MONTH);
|
|
@@ -248,6 +250,7 @@ public class Bat extends AmbientCreature {
|
|
|
|
return j == 10 && i >= 20 || j == 11 && i <= 3;
|
|
}
|
|
+ */
|
|
|
|
@Override
|
|
protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
|
index b319021b22c5dceba6199ed27814b2dcf47b8d50..4e7f19215bafc8ff6b06abc08076a154df5307aa 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
|
@@ -162,10 +162,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
|
|
this.setCanPickUpLoot(this.level().paperConfig().entities.behavior.mobsCanAlwaysPickUpLoot.skeletons || randomsource.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); // Paper
|
|
if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) {
|
|
LocalDate localdate = LocalDate.now();
|
|
- int i = localdate.get(ChronoField.DAY_OF_MONTH);
|
|
- int j = localdate.get(ChronoField.MONTH_OF_YEAR);
|
|
+ // SparklyPaper start - Spooky month optimizations
|
|
+ // int i = localdate.get(ChronoField.DAY_OF_MONTH);
|
|
+ // int j = localdate.get(ChronoField.MONTH_OF_YEAR);
|
|
|
|
- if (j == 10 && i == 31 && randomsource.nextFloat() < 0.25F) {
|
|
+ if (this.getServer().halloweenManager.isHalloween() /* j == 10 && i == 31 */&& randomsource.nextFloat() < 0.25F) {
|
|
+ // SparklyPaper end
|
|
this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(randomsource.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN));
|
|
this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
|
|
index 753defa8f8b48d004a2a53b2fc322fd9c083d95e..cc7073efaa9984c95b125878df94556b1e865c7a 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
|
|
@@ -553,10 +553,11 @@ public class Zombie extends Monster {
|
|
|
|
if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) {
|
|
LocalDate localdate = LocalDate.now();
|
|
- int i = localdate.get(ChronoField.DAY_OF_MONTH);
|
|
- int j = localdate.get(ChronoField.MONTH_OF_YEAR);
|
|
+ // SparklyPaper start - Spooky month optimizations
|
|
+ // int i = localdate.get(ChronoField.DAY_OF_MONTH);
|
|
+ // int j = localdate.get(ChronoField.MONTH_OF_YEAR);
|
|
|
|
- if (j == 10 && i == 31 && randomsource.nextFloat() < 0.25F) {
|
|
+ if (this.getServer().halloweenManager.isHalloween() /* j == 10 && i == 31 */&& randomsource.nextFloat() < 0.25F) {
|
|
this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(randomsource.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN));
|
|
this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F;
|
|
}
|
|
diff --git a/src/main/kotlin/net/sparklypower/sparklypaper/HalloweenManager.kt b/src/main/kotlin/net/sparklypower/sparklypaper/HalloweenManager.kt
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..8dd82e727872c0d6c4d0827ac63d5fecb9218c61
|
|
--- /dev/null
|
|
+++ b/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
|