9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-21 15:59:26 +00:00
Files
SakuraMC/patches/server/0078-Tick-entity-schedulers-only-when-necessary.patch
Samsuik ca5ff29a0d Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@691d452 Fix bundled spark permission check (#11355)
PaperMC/Paper@012c527 Update Velocity natives (#11347)
PaperMC/Paper@953e6e9 Fire BlockExpEvent on grindstone use (#11346)
PaperMC/Paper@10f5879 Change condition check order of entity tracking Y (#11348)
PaperMC/Paper@805a974 Improve console completion with brig suggestions (#9251)
PaperMC/Paper@e0021b1 Fix allowSpiderWorldBorderClimbing world config (#11321)
PaperMC/Paper@3db4758 Check dead flag in isAlive() (#11330)
PaperMC/Paper@21f125f Revert velocity natives to 3.1.2 (#11368)
PaperMC/Paper@0e82527 Fix NPE while trying to respawn an already disconnected player (#11353)
PaperMC/Paper@5d91bef Fix shulkerbox loot table replenish (#11366)
PaperMC/Paper@a8e6a93 Deprecate for removal all OldEnum-related methods (#11371)
PaperMC/Paper@925c3b9 Add FeatureFlag API (#8952)
PaperMC/Paper@426f992 Enchantment is data-driven, so not FeatureDependant (#11377)
PaperMC/Paper@1ba1be7 Update Velocity natives again
PaperMC/Paper@7632de5 Tag Lifecycle Events (#10993)
PaperMC/Paper@b09eaf2 Add Item serialization as json api (#11235)
PaperMC/Paper@971a7a5 Add Decorated Pot Cracked API (#11365)
PaperMC/Paper@61fe23c deprecate isEnabledByFeature in Item/BlockType
PaperMC/Paper@e945cfe Fix PaperServerListPingEvent#getPlayerSample not being populated or used (#11387)
PaperMC/Paper@4ff58c4 Update spark
PaperMC/Paper@d1a72ea Updated Upstream (Bukkit/CraftBukkit/Spigot) (#11405)
PaperMC/Paper@0a53f1d Set default drop behavior for player deaths (#11380)
PaperMC/Paper@951e7dd Fix TrialSpawner forgetting assigned mob when placed by player (#11381)
PaperMC/Paper@13a2395 Fix enable-player-collisions playing sounds when set to false (#11390)
PaperMC/Paper@1348e44 Prevent NPE when serializing unresolved profile (#11407)
PaperMC/Paper@2aaf436 Validate slot in PlayerInventory#setSlot (#11399)
PaperMC/Paper@5c82955 Only mark decorations dirty if a removal actually occurs (#11413)
PaperMC/Paper@c5a1066 Remove wall-time / unused skip tick protection (#11412)
2024-09-22 20:38:14 +01:00

78 lines
4.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samsuik <kfian294ma4@gmail.com>
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 dacf2b2988ce603879fe525a3418ac77f8a663f7..77a55902335d3f2e6544d40b660ae344a61198a9 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
@@ -18,6 +18,7 @@ public final class ServerEntityLookup extends EntityLookup {
private final ServerLevel serverWorld;
public final ReferenceList<Entity> trackerEntities = new ReferenceList<>(EMPTY_ENTITY_ARRAY); // Moonrise - entity tracker
public final ReferenceList<Entity> trackerUnloadedEntities = new ReferenceList<>(EMPTY_ENTITY_ARRAY); // Moonrise - entity tracker
+ public final ReferenceList<org.bukkit.craftbukkit.entity.CraftEntity> scheduledEntities = new ReferenceList<>(); // Sakura - tick entity schedulers only when necessary
public ServerEntityLookup(final ServerLevel world, final LevelCallback<Entity> worldCallback) {
super(world, worldCallback);
@@ -86,6 +87,12 @@ public final class ServerEntityLookup extends EntityLookup {
this.trackerEntities.add(entity);
this.trackerUnloadedEntities.remove(entity);
// Moonrise end - entity tracker
+ // Sakura start - tick entity schedulers only when necessary
+ org.bukkit.craftbukkit.entity.CraftEntity bukkitEntity = entity.getBukkitEntityRaw();
+ if (bukkitEntity != null && bukkitEntity.taskScheduler.hasTask()) {
+ this.scheduledEntities.add(bukkitEntity);
+ }
+ // Sakura end - tick entity schedulers only when necessary
}
@Override
@@ -94,6 +101,11 @@ public final class ServerEntityLookup extends EntityLookup {
this.trackerEntities.remove(entity);
this.trackerUnloadedEntities.add(entity);
// Moonrise end - entity tracker
+ // Sakura start - tick entity schedulers only when necessary
+ if (entity.getBukkitEntityRaw() != null) {
+ this.scheduledEntities.remove(entity.getBukkitEntityRaw());
+ }
+ // Sakura end - 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..ca2e49c4e46e5c05091e11b8254e2ae5787b4e3a 100644
--- a/src/main/java/io/papermc/paper/threadedregions/EntityScheduler.java
+++ b/src/main/java/io/papermc/paper/threadedregions/EntityScheduler.java
@@ -50,6 +50,12 @@ 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();
+ }
+ // 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.
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 0ec9f586a66130227b1a21db3634edd6fe677db4..3091b303327fc58065cf0e341f83364be9da532e 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1734,7 +1734,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
// Paper start - Folia scheduler API
((io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler) Bukkit.getGlobalRegionScheduler()).tick();
getAllLevels().forEach(level -> {
- for (final Entity entity : level.moonrise$getEntityLookup().getAllCopy()) { // Paper - rewrite chunk system
+ // 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();
+ for (final org.bukkit.craftbukkit.entity.CraftEntity bukkitEntity : entityLookup.scheduledEntities) {
+ final Entity entity = bukkitEntity.getHandle();
+ // Sakura end - tick entity schedulers only when necessary
if (entity.isRemoved()) {
continue;
}