From 43b2cd30933e2f2c0ed923978ca3386cd03189fa Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 9 Jun 2025 19:31:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=90=BD=E5=9C=B0=E5=BC=B9?= =?UTF-8?q?=E5=B0=84=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/furniture/BukkitFurniture.java | 2 +- .../projectile/BukkitCustomProjectile.java | 5 ++ .../projectile/BukkitProjectileManager.java | 54 ++++++++----------- .../projectile/AbstractCustomProjectile.java | 11 ---- .../entity/projectile/CustomProjectile.java | 4 -- .../core/item/AbstractItemManager.java | 39 +++++++------- .../craftengine/core/item/ItemManager.java | 4 ++ gradle.properties | 2 +- 8 files changed, 53 insertions(+), 68 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java index 8f4df2e9c..3531c73fa 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java @@ -365,7 +365,7 @@ public class BukkitFurniture implements Furniture { public static void injectFurnitureEntity(Object nmsEntity) { try { Object trackedEntity = FastNMS.INSTANCE.field$Entity$trackedEntity(nmsEntity); - Object serverEntity = FastNMS.INSTANCE.filed$ChunkMap$TrackedEntity$serverEntity(trackedEntity); + Object serverEntity = FastNMS.INSTANCE.field$ChunkMap$TrackedEntity$serverEntity(trackedEntity); CoreReflections.handle$ServerEntity$broadcastSetter.invokeExact(serverEntity, Handlers.DO_NOTHING); CoreReflections.handle$ServerEntity$updateIntervalSetter.invokeExact(serverEntity, Integer.MAX_VALUE); } catch (Throwable e) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitCustomProjectile.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitCustomProjectile.java index 45c4193bd..a75f4ee63 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitCustomProjectile.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitCustomProjectile.java @@ -11,4 +11,9 @@ public class BukkitCustomProjectile extends AbstractCustomProjectile { public BukkitCustomProjectile(ProjectileMeta meta, Projectile projectile, Item projectileItem) { super(meta, new BukkitProjectile(projectile), projectileItem); } + + @Override + public BukkitProjectile projectile() { + return (BukkitProjectile) super.projectile(); + } } 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 0bf5e8b2f..90b3760be 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 @@ -38,11 +38,11 @@ import java.util.concurrent.ConcurrentHashMap; public class BukkitProjectileManager implements Listener, ProjectileManager { private static BukkitProjectileManager instance; private final BukkitCraftEngine plugin; - private final Map projectiles; + // 会被netty线程访问 + private final Map projectiles = new ConcurrentHashMap<>(); public BukkitProjectileManager(BukkitCraftEngine plugin) { this.plugin = plugin; - this.projectiles = new ConcurrentHashMap<>(); instance = this; } @@ -114,7 +114,8 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { wrapped.getCustomItem().ifPresent(it -> { ProjectileMeta meta = it.settings().projectileMeta(); if (meta != null) { - this.projectiles.put(projectile.getEntityId(), new BukkitCustomProjectile(meta, projectile, wrapped)); + BukkitCustomProjectile customProjectile = new BukkitCustomProjectile(meta, projectile, wrapped); + this.projectiles.put(projectile.getEntityId(), customProjectile); new ProjectileInjectTask(projectile); } }); @@ -162,9 +163,7 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { private final Projectile projectile; private final SchedulerTask task; private Object cachedServerEntity; - private boolean injected; - private int lastInjectedInterval = -1; - private boolean wasInGround; + private int lastInjectedInterval = 0; public ProjectileInjectTask(Projectile projectile) { this.projectile = projectile; @@ -181,44 +180,35 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { this.task.cancel(); return; } + Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(this.projectile); - if (!this.injected) { - injectProjectile(nmsEntity, 1); - this.injected = true; - this.lastInjectedInterval = 1; + // 获取server entity + if (this.cachedServerEntity == null) { + Object trackedEntity = FastNMS.INSTANCE.field$Entity$trackedEntity(nmsEntity); + if (trackedEntity == null) return; + Object serverEntity = FastNMS.INSTANCE.field$ChunkMap$TrackedEntity$serverEntity(trackedEntity); + if (serverEntity == null) return; + this.cachedServerEntity = serverEntity; } + 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) { - if (lastInjectedInterval != Integer.MAX_VALUE) { - injectProjectile(nmsEntity, Integer.MAX_VALUE); - } - } else if (!inGround && wasInGround) { - if (lastInjectedInterval != 1) { - injectProjectile(nmsEntity, 1); - } - } - this.wasInGround = inGround; - }); + if (inGround) { + updateProjectileUpdateInterval(Integer.MAX_VALUE); + } else { + updateProjectileUpdateInterval(1); + } } - 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; - } + private void updateProjectileUpdateInterval(int updateInterval) { + if (this.lastInjectedInterval == updateInterval) return; 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); + BukkitProjectileManager.this.plugin.logger().warn("Failed to update server entity update interval for " + this.projectile.getType().getKey() + "[" + this.projectile.getUniqueId() + "]", e); } } 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 b61980d16..117367a84 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,7 +6,6 @@ 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; @@ -28,14 +27,4 @@ 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 057c932ef..661f2d4ac 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,8 +9,4 @@ public interface CustomProjectile { Projectile projectile(); Item item(); - - int inGroundTime(); - - void setInGroundTime(int inGroundTime); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index 407ea7c69..0522776f5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -68,9 +68,10 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl this.equipmentsToGenerate = new HashSet<>(); } - public void registerDataFunction(Function> function, String... alias) { + @Override + public void registerDataType(Function> factory, String... alias) { for (String a : alias) { - dataFunctions.put(a, function); + dataFunctions.put(a, factory); } } @@ -432,26 +433,26 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl } private void registerFunctions() { - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); String plugin = data.get("plugin").toString(); String id = data.get("id").toString(); ExternalItemProvider provider = AbstractItemManager.this.getExternalItemProvider(plugin); return new ExternalModifier<>(id, Objects.requireNonNull(provider, "Item provider " + plugin + " not found")); }, "external"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { String name = obj.toString(); return new CustomNameModifier<>(Config.nonItalic() ? "" + name : name); }, "custom-name"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { String name = obj.toString(); return new ItemNameModifier<>(Config.nonItalic() ? "" + name : name); }, "item-name", "display-name"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { List lore = MiscUtils.getAsStringList(obj).stream().map(it -> "" + it).toList(); return new LoreModifier<>(lore); }, "lore", "display-lore", "description"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map> dynamicLore = new LinkedHashMap<>(); if (obj instanceof Map map) { for (Map.Entry entry : map.entrySet()) { @@ -460,7 +461,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl } return new DynamicLoreModifier<>(dynamicLore); }, "dynamic-lore"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { if (obj instanceof Integer integer) { return new DyedColorModifier<>(integer); } else { @@ -468,15 +469,15 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl return new DyedColorModifier<>(MCUtils.fastFloor(vector3f.x) << 16 + MCUtils.fastFloor(vector3f.y) << 8 + MCUtils.fastFloor(vector3f.z)); } }, "dyed-color"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); return new TagsModifier<>(data); }, "tags", "tag", "nbt"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { boolean value = TypeUtils.checkType(obj, Boolean.class); return new UnbreakableModifier<>(value); }, "unbreakable"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); List enchantments = new ArrayList<>(); for (Map.Entry e : data.entrySet()) { @@ -486,22 +487,22 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl } return new EnchantmentModifier<>(enchantments); }, "enchantment", "enchantments", "enchant"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); String material = data.get("material").toString().toLowerCase(Locale.ENGLISH); String pattern = data.get("pattern").toString().toLowerCase(Locale.ENGLISH); return new TrimModifier<>(material, pattern); }, "trim"); if (VersionHelper.isOrAbove1_20_5()) { - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); return new ComponentModifier<>(data); }, "components", "component"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { List data = MiscUtils.getAsStringList(obj); return new RemoveComponentModifier<>(data); }, "remove-components", "remove-component"); - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); int nutrition = ResourceConfigUtils.getAsInt(data.get("nutrition"), "nutrition"); float saturation = ResourceConfigUtils.getAsFloat(data.get("saturation"), "saturation"); @@ -509,24 +510,24 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl }, "food"); } if (VersionHelper.isOrAbove1_21()) { - registerDataFunction((obj) -> { + registerDataType((obj) -> { String song = obj.toString(); return new JukeboxSongModifier<>(new JukeboxPlayable(song, true)); }, "jukebox-playable"); } if (VersionHelper.isOrAbove1_21_2()) { - registerDataFunction((obj) -> { + registerDataType((obj) -> { String id = obj.toString(); return new TooltipStyleModifier<>(Key.of(id)); }, "tooltip-style"); } if (VersionHelper.isOrAbove1_21_2()) { - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); return new EquippableModifier<>(EquipmentData.fromMap(data)); }, "equippable"); } - registerDataFunction((obj) -> { + registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); Map arguments = new HashMap<>(); for (Map.Entry entry : data.entrySet()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index 0ab35daea..4aaf4e6df 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; import net.momirealms.craftengine.core.pack.model.ItemModel; import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; @@ -14,9 +15,12 @@ import org.incendo.cloud.suggestion.Suggestion; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Function; public interface ItemManager extends Manageable, ModelGenerator { + void registerDataType(Function> factory, String... alias); + ConfigParser parser(); Map> legacyItemOverrides(); diff --git a/gradle.properties b/gradle.properties index 2b2f692e9..3f60ecde5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.67.2 +nms_helper_version=0.67.3 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23