From b6023fba40e4c30fb8fe4e6b9302e925086170bf Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sat, 7 Jun 2025 15:59:20 +0800 Subject: [PATCH] =?UTF-8?q?perf(entity):=20=E4=BC=98=E5=8C=96=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projectile/BukkitProjectileManager.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java index 217775d55..0bf5e8b2f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java @@ -163,6 +163,8 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { private final SchedulerTask task; private Object cachedServerEntity; private boolean injected; + private int lastInjectedInterval = -1; + private boolean wasInGround; public ProjectileInjectTask(Projectile projectile) { this.projectile = projectile; @@ -183,6 +185,7 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { if (!this.injected) { injectProjectile(nmsEntity, 1); this.injected = true; + this.lastInjectedInterval = 1; } boolean inGround = FastNMS.INSTANCE.method$AbstractArrow$isInGround(nmsEntity); if (canSpawnParticle(nmsEntity, inGround)) { @@ -191,10 +194,15 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { projectileByEntityId(this.projectile.getEntityId()).ifPresent(customProjectile -> { customProjectile.setInGroundTime(inGround ? customProjectile.inGroundTime() + 1 : 0); if (customProjectile.inGroundTime() > 5) { - injectProjectile(nmsEntity, Integer.MAX_VALUE); - } else { - this.injected = false; + if (lastInjectedInterval != Integer.MAX_VALUE) { + injectProjectile(nmsEntity, Integer.MAX_VALUE); + } + } else if (!inGround && wasInGround) { + if (lastInjectedInterval != 1) { + injectProjectile(nmsEntity, 1); + } } + this.wasInGround = inGround; }); } @@ -208,6 +216,7 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { } try { CoreReflections.handle$ServerEntity$updateIntervalSetter.invokeExact(this.cachedServerEntity, updateInterval); + this.lastInjectedInterval = updateInterval; } catch (Throwable e) { plugin.logger().warn("Failed to update server entity tracking interval", e); }