From 665924d1b1666563680b51a38630dcab8a1457fe Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sat, 7 Jun 2025 15:39:34 +0800 Subject: [PATCH] =?UTF-8?q?perf(entity):=20=E4=BC=98=E5=8C=96=E6=8A=95?= =?UTF-8?q?=E5=B0=84=E7=89=A9=E5=8F=91=E5=8C=85=E8=BF=87=E5=A4=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projectile/BukkitProjectileManager.java | 47 ++++++++++++------- .../plugin/network/BukkitNetworkManager.java | 2 +- .../plugin/network/PacketConsumers.java | 2 +- .../projectile/AbstractCustomProjectile.java | 11 +++++ .../entity/projectile/CustomProjectile.java | 4 ++ 5 files changed, 47 insertions(+), 19 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 b86c2324d..217775d55 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 @@ -161,6 +161,7 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { public class ProjectileInjectTask implements Runnable { private final Projectile projectile; private final SchedulerTask task; + private Object cachedServerEntity; private boolean injected; public ProjectileInjectTask(Projectile projectile) { @@ -180,30 +181,42 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { } Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(this.projectile); if (!this.injected) { - Object trackedEntity = FastNMS.INSTANCE.field$Entity$trackedEntity(nmsEntity); - if (trackedEntity == null) { - return; - } - Object serverEntity = FastNMS.INSTANCE.filed$ChunkMap$TrackedEntity$serverEntity(trackedEntity); - if (serverEntity == null) { - return; - } - try { - CoreReflections.field$ServerEntity$updateInterval.set(serverEntity, 1); - this.injected = true; - } catch (ReflectiveOperationException e) { - plugin.logger().warn("Failed to update server entity tracking interval", e); - } + injectProjectile(nmsEntity, 1); + this.injected = true; } - if (canSpawnParticle(nmsEntity)) { + boolean inGround = FastNMS.INSTANCE.method$AbstractArrow$isInGround(nmsEntity); + if (canSpawnParticle(nmsEntity, inGround)) { this.projectile.getWorld().spawnParticle(ParticleUtils.BUBBLE, this.projectile.getLocation(), 3, 0.1, 0.1, 0.1, 0); } + 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; + } + }); + } + + private void injectProjectile(Object entity, int updateInterval) { + if (this.cachedServerEntity == null) { + Object trackedEntity = FastNMS.INSTANCE.field$Entity$trackedEntity(entity); + if (trackedEntity == null) return; + Object serverEntity = FastNMS.INSTANCE.filed$ChunkMap$TrackedEntity$serverEntity(trackedEntity); + if (serverEntity == null) return; + this.cachedServerEntity = serverEntity; + } + try { + CoreReflections.handle$ServerEntity$updateIntervalSetter.invokeExact(this.cachedServerEntity, updateInterval); + } catch (Throwable e) { + plugin.logger().warn("Failed to update server entity tracking interval", e); + } } - private static boolean canSpawnParticle(Object nmsEntity) { + private static boolean canSpawnParticle(Object nmsEntity, boolean inGround) { if (!FastNMS.INSTANCE.field$Entity$wasTouchingWater(nmsEntity)) return false; if (CoreReflections.clazz$AbstractArrow.isInstance(nmsEntity)) { - return !FastNMS.INSTANCE.method$AbstractArrow$isInGround(nmsEntity); + return !inGround; } return true; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 5f72e032e..7718ddde6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -176,7 +176,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_OBJECTIVE_1_20_3 : PacketConsumers.SET_OBJECTIVE_1_20, this.packetIds.clientboundSetObjectivePacket()); registerS2CByteBufPacketConsumer(PacketConsumers.SET_SCORE_1_20_3, VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1); registerS2CByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); - registerS2CByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.ADD_ENTITY, this.packetIds.clientboundAddEntityPacket()); registerS2CByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); registerS2CByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket()); registerS2CByteBufPacketConsumer(PacketConsumers.CONTAINER_SET_CONTENT, this.packetIds.clientboundContainerSetContentPacket()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index a11ce2e94..a34aa1c44 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -1458,7 +1458,7 @@ public class PacketConsumers { } } - public static final BiConsumer ADD_ENTITY_BYTEBUFFER = (user, event) -> { + public static final BiConsumer ADD_ENTITY = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); buf.readVarInt(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/AbstractCustomProjectile.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/AbstractCustomProjectile.java index 117367a84..b61980d16 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/AbstractCustomProjectile.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/AbstractCustomProjectile.java @@ -6,6 +6,7 @@ public abstract class AbstractCustomProjectile implements CustomProjectile { protected final ProjectileMeta meta; protected final Projectile projectile; protected final Item item; + private int inGroundTime; protected AbstractCustomProjectile(ProjectileMeta meta, Projectile projectile, Item item) { this.meta = meta; @@ -27,4 +28,14 @@ public abstract class AbstractCustomProjectile implements CustomProjectile { public Item item() { return item; } + + @Override + public int inGroundTime() { + return inGroundTime; + } + + @Override + public void setInGroundTime(int inGroundTime) { + this.inGroundTime = inGroundTime; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/CustomProjectile.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/CustomProjectile.java index 661f2d4ac..057c932ef 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/CustomProjectile.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/CustomProjectile.java @@ -9,4 +9,8 @@ public interface CustomProjectile { Projectile projectile(); Item item(); + + int inGroundTime(); + + void setInGroundTime(int inGroundTime); }