From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samsuik Date: Fri, 13 Sep 2024 17:22:51 +0100 Subject: [PATCH] Tick entity schedulers only when necessary diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/server/ServerEntityLookup.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/server/ServerEntityLookup.java index 58d9187adc188b693b6becc400f766e069bf1bf5..8b7860390717c3d2a3c0f3d2b081799bcd3d65c1 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/server/ServerEntityLookup.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/server/ServerEntityLookup.java @@ -19,6 +19,22 @@ public final class ServerEntityLookup extends EntityLookup { private final ServerLevel serverWorld; public final ReferenceList trackerEntities = new ReferenceList<>(EMPTY_ENTITY_ARRAY); // Moonrise - entity tracker + // Sakura start - tick entity schedulers only when necessary + public final ReferenceList scheduledEntities = new ReferenceList<>(); + + public void entityStartScheduled(final Entity entity) { + org.bukkit.craftbukkit.entity.CraftEntity bukkitEntity = entity.getBukkitEntityRaw(); + if (bukkitEntity != null && bukkitEntity.taskScheduler.hasTask()) { + this.scheduledEntities.add(bukkitEntity); + } + } + + public void entityEndScheduled(final Entity entity) { + if (entity.getBukkitEntityRaw() != null) { + this.scheduledEntities.remove(entity.getBukkitEntityRaw()); + } + } + // Sakura end - tick entity schedulers only when necessary public ServerEntityLookup(final ServerLevel world, final LevelCallback worldCallback) { super(world, worldCallback); @@ -90,6 +106,7 @@ public final class ServerEntityLookup extends EntityLookup { // Moonrise start - entity tracker this.trackerEntities.add(entity); // Moonrise end - entity tracker + this.entityStartScheduled(entity); // Sakura - tick entity schedulers only when necessary } @Override @@ -97,6 +114,7 @@ public final class ServerEntityLookup extends EntityLookup { // Moonrise start - entity tracker this.trackerEntities.remove(entity); // Moonrise end - entity tracker + this.entityEndScheduled(entity); // Sakura - tick entity schedulers only when necessary } @Override diff --git a/src/main/java/io/papermc/paper/threadedregions/EntityScheduler.java b/src/main/java/io/papermc/paper/threadedregions/EntityScheduler.java index c03608fec96b51e1867f43d8f42e5aefb1520e46..32ac34e6ca4a7443e894369fee349911ebc1cf52 100644 --- a/src/main/java/io/papermc/paper/threadedregions/EntityScheduler.java +++ b/src/main/java/io/papermc/paper/threadedregions/EntityScheduler.java @@ -50,6 +50,22 @@ public final class EntityScheduler { this.entity = Validate.notNull(entity); } + // Sakura start - tick entity schedulers only when necessary + public boolean hasTask() { + return !this.currentlyExecuting.isEmpty() || !this.oneTimeDelayed.isEmpty(); + } + + private void newScheduledTask() { + net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> { + Entity handle = this.entity.getHandleRaw(); + net.minecraft.server.level.ServerLevel level = (net.minecraft.server.level.ServerLevel) handle.level(); + ca.spottedleaf.moonrise.patches.chunk_system.level.entity.server.ServerEntityLookup entityLookup = (ca.spottedleaf.moonrise.patches.chunk_system.level.entity.server.ServerEntityLookup) level.moonrise$getEntityLookup(); + + entityLookup.entityStartScheduled(handle); + }); + } + // Sakura end - tick entity schedulers only when necessary + /** * Retires the scheduler, preventing new tasks from being scheduled and invoking the retired callback * on all currently scheduled tasks. @@ -128,6 +144,7 @@ public final class EntityScheduler { return new ArrayList<>(); }).add(task); } + this.newScheduledTask(); // Sakura - tick entity schedulers only when necessary return true; } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 56357e253247d19c108a7f753058fa3eba0302ee..c2c0cd8ae1afd90d9b08adec3cb127b13ce60331 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1824,7 +1824,17 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { - for (final Entity entity : level.getEntities().getAll()) { + // Sakura start - tick entity schedulers only when necessary + final ca.spottedleaf.moonrise.patches.chunk_system.level.entity.server.ServerEntityLookup entityLookup = (ca.spottedleaf.moonrise.patches.chunk_system.level.entity.server.ServerEntityLookup) level.moonrise$getEntityLookup(); + final Iterator entityIterator = entityLookup.scheduledEntities.iterator(); + while (entityIterator.hasNext()) { + final org.bukkit.craftbukkit.entity.CraftEntity scheduledEntity = entityIterator.next(); + final Entity entity = scheduledEntity.getHandle(); + if (!scheduledEntity.taskScheduler.hasTask()) { + entityIterator.remove(); + continue; + } + // Sakura end - tick entity schedulers only when necessary if (entity.isRemoved()) { continue; }