From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Ivan Pekov Date: Mon, 4 Jan 2021 20:12:36 +0200 Subject: [PATCH] Optimised hallowen checker diff --git a/src/main/java/net/minecraft/server/EntityBat.java b/src/main/java/net/minecraft/server/EntityBat.java index 0a59e02d762a096cb3de62e0f8105cc5a5fab8d4..bdcbdc21f986852277dcc41a2b0f385f8caeb9f7 100644 --- a/src/main/java/net/minecraft/server/EntityBat.java +++ b/src/main/java/net/minecraft/server/EntityBat.java @@ -222,11 +222,16 @@ public class EntityBat extends EntityAmbient { } private static boolean eJ() { + // Yatopia start - optimised halloween checker + /* LocalDate localdate = LocalDate.now(); int i = localdate.get(ChronoField.DAY_OF_MONTH); int j = localdate.get(ChronoField.MONTH_OF_YEAR); return j == 10 && i >= 20 || j == 11 && i <= 3; + */ + return org.yatopiamc.yatopia.server.entity.HalloweenChecker.isHalloweenSeason(); + // Yatopia end } @Override diff --git a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java index f73304240a626f3f7d9355e6e5f2963a06c4bb7d..3ca3280d4a4d3cd8e0b4aff8431d8fe5904d23a4 100644 --- a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java +++ b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java @@ -109,11 +109,15 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR this.eL(); this.setCanPickupLoot(this.world.paperConfig.skeletonsAlwaysCanPickUpLoot || this.random.nextFloat() < 0.55F * difficultydamagescaler.d()); // Paper if (this.getEquipment(EnumItemSlot.HEAD).isEmpty()) { + /* // Yatopia start - optimised halloween checker LocalDate localdate = LocalDate.now(); int i = localdate.get(ChronoField.DAY_OF_MONTH); int j = localdate.get(ChronoField.MONTH_OF_YEAR); if (j == 10 && i == 31 && this.random.nextFloat() < 0.25F) { + */ + if (org.yatopiamc.yatopia.server.entity.HalloweenChecker.isHalloweenDay() && this.random.nextFloat() < 0.25F) { + // Yatopia end this.setSlot(EnumItemSlot.HEAD, new ItemStack(this.random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); this.dropChanceArmor[EnumItemSlot.HEAD.b()] = 0.0F; } diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java index 752e39ad94ea9e8254853a3fda846be2bd436918..f470650838ab0e349a7ffc79fcb4b84460d32832 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -472,11 +472,15 @@ public class EntityZombie extends EntityMonster { } if (this.getEquipment(EnumItemSlot.HEAD).isEmpty()) { + /* // Yatopia start - optimised halloween checker LocalDate localdate = LocalDate.now(); int i = localdate.get(ChronoField.DAY_OF_MONTH); int j = localdate.get(ChronoField.MONTH_OF_YEAR); if (j == 10 && i == 31 && this.random.nextFloat() < 0.25F) { + */ + if (org.yatopiamc.yatopia.server.entity.HalloweenChecker.isHalloweenDay() && this.random.nextFloat() < 0.25F) { + // Yatopia end this.setSlot(EnumItemSlot.HEAD, new ItemStack(this.random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); this.dropChanceArmor[EnumItemSlot.HEAD.b()] = 0.0F; } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index dac1e68dc8dac578605470c148fd028792d54932..581b675fae4ca8a3d774f4353d1e58fc31b557c7 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1339,6 +1339,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant + * Checks whether or not it is halloween at a specific rate rather than every time when + * a entity is being spawned. + *

+ * The rate changes depending on how much TPS the server has. By default, the rate is every + * 2 hours, or every 144k ticks (if the server has _that_ much uptime) + * + * @author MrIvanPlays + */ +public class HalloweenChecker { + + private static boolean halloweenSeason = false; + private static boolean halloweenDay = false; + + private static int delay = (20 * 60 * 60) * 2; + private static int lastCheckTick = -delay; + + public static void tick() { + if (MinecraftServer.currentTick % 100 == 0) { + // update the delay every 100 ticks + if (MinecraftServer.TPS >= 20) { + delay = (20 * 60 * 60) * 2; + } + if (MinecraftServer.TPS < 15) { + delay = delay + (20 * 60 * 15); + } + if (MinecraftServer.TPS < 10) { + delay = delay + (20 * 60 * 30); + } + } + if (MinecraftServer.currentTick - lastCheckTick > delay) { + LocalDate now = LocalDate.now(); + int day = now.getDayOfMonth(); + int month = now.get(ChronoField.MONTH_OF_YEAR); + + halloweenDay = (month == 10) && (day == 31); + halloweenSeason = ((month == 10) && (day >= 20)) || ((month == 11) && (day <= 3)); + + lastCheckTick = MinecraftServer.currentTick; + } + } + + public static boolean isHalloweenSeason() { + return halloweenSeason; + } + + public static boolean isHalloweenDay() { + return halloweenDay; + } + +}