9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-06 15:52:03 +00:00

优化落地弹射物

This commit is contained in:
XiaoMoMi
2025-06-09 19:31:58 +08:00
parent a20dac328b
commit 43b2cd3093
8 changed files with 53 additions and 68 deletions

View File

@@ -365,7 +365,7 @@ public class BukkitFurniture implements Furniture {
public static void injectFurnitureEntity(Object nmsEntity) { public static void injectFurnitureEntity(Object nmsEntity) {
try { try {
Object trackedEntity = FastNMS.INSTANCE.field$Entity$trackedEntity(nmsEntity); 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$broadcastSetter.invokeExact(serverEntity, Handlers.DO_NOTHING);
CoreReflections.handle$ServerEntity$updateIntervalSetter.invokeExact(serverEntity, Integer.MAX_VALUE); CoreReflections.handle$ServerEntity$updateIntervalSetter.invokeExact(serverEntity, Integer.MAX_VALUE);
} catch (Throwable e) { } catch (Throwable e) {

View File

@@ -11,4 +11,9 @@ public class BukkitCustomProjectile extends AbstractCustomProjectile {
public BukkitCustomProjectile(ProjectileMeta meta, Projectile projectile, Item<ItemStack> projectileItem) { public BukkitCustomProjectile(ProjectileMeta meta, Projectile projectile, Item<ItemStack> projectileItem) {
super(meta, new BukkitProjectile(projectile), projectileItem); super(meta, new BukkitProjectile(projectile), projectileItem);
} }
@Override
public BukkitProjectile projectile() {
return (BukkitProjectile) super.projectile();
}
} }

View File

@@ -38,11 +38,11 @@ import java.util.concurrent.ConcurrentHashMap;
public class BukkitProjectileManager implements Listener, ProjectileManager { public class BukkitProjectileManager implements Listener, ProjectileManager {
private static BukkitProjectileManager instance; private static BukkitProjectileManager instance;
private final BukkitCraftEngine plugin; private final BukkitCraftEngine plugin;
private final Map<Integer, BukkitCustomProjectile> projectiles; // 会被netty线程访问
private final Map<Integer, BukkitCustomProjectile> projectiles = new ConcurrentHashMap<>();
public BukkitProjectileManager(BukkitCraftEngine plugin) { public BukkitProjectileManager(BukkitCraftEngine plugin) {
this.plugin = plugin; this.plugin = plugin;
this.projectiles = new ConcurrentHashMap<>();
instance = this; instance = this;
} }
@@ -114,7 +114,8 @@ public class BukkitProjectileManager implements Listener, ProjectileManager {
wrapped.getCustomItem().ifPresent(it -> { wrapped.getCustomItem().ifPresent(it -> {
ProjectileMeta meta = it.settings().projectileMeta(); ProjectileMeta meta = it.settings().projectileMeta();
if (meta != null) { 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); new ProjectileInjectTask(projectile);
} }
}); });
@@ -162,9 +163,7 @@ public class BukkitProjectileManager implements Listener, ProjectileManager {
private final Projectile projectile; private final Projectile projectile;
private final SchedulerTask task; private final SchedulerTask task;
private Object cachedServerEntity; private Object cachedServerEntity;
private boolean injected; private int lastInjectedInterval = 0;
private int lastInjectedInterval = -1;
private boolean wasInGround;
public ProjectileInjectTask(Projectile projectile) { public ProjectileInjectTask(Projectile projectile) {
this.projectile = projectile; this.projectile = projectile;
@@ -181,44 +180,35 @@ public class BukkitProjectileManager implements Listener, ProjectileManager {
this.task.cancel(); this.task.cancel();
return; return;
} }
Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(this.projectile); Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(this.projectile);
if (!this.injected) { // 获取server entity
injectProjectile(nmsEntity, 1); if (this.cachedServerEntity == null) {
this.injected = true; Object trackedEntity = FastNMS.INSTANCE.field$Entity$trackedEntity(nmsEntity);
this.lastInjectedInterval = 1; 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); boolean inGround = FastNMS.INSTANCE.method$AbstractArrow$isInGround(nmsEntity);
if (canSpawnParticle(nmsEntity, inGround)) { if (canSpawnParticle(nmsEntity, inGround)) {
this.projectile.getWorld().spawnParticle(ParticleUtils.BUBBLE, this.projectile.getLocation(), 3, 0.1, 0.1, 0.1, 0); this.projectile.getWorld().spawnParticle(ParticleUtils.BUBBLE, this.projectile.getLocation(), 3, 0.1, 0.1, 0.1, 0);
} }
projectileByEntityId(this.projectile.getEntityId()).ifPresent(customProjectile -> { if (inGround) {
customProjectile.setInGroundTime(inGround ? customProjectile.inGroundTime() + 1 : 0); updateProjectileUpdateInterval(Integer.MAX_VALUE);
if (customProjectile.inGroundTime() > 5) { } else {
if (lastInjectedInterval != Integer.MAX_VALUE) { updateProjectileUpdateInterval(1);
injectProjectile(nmsEntity, Integer.MAX_VALUE); }
}
} else if (!inGround && wasInGround) {
if (lastInjectedInterval != 1) {
injectProjectile(nmsEntity, 1);
}
}
this.wasInGround = inGround;
});
} }
private void injectProjectile(Object entity, int updateInterval) { private void updateProjectileUpdateInterval(int updateInterval) {
if (this.cachedServerEntity == null) { if (this.lastInjectedInterval == updateInterval) return;
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 { try {
CoreReflections.handle$ServerEntity$updateIntervalSetter.invokeExact(this.cachedServerEntity, updateInterval); CoreReflections.handle$ServerEntity$updateIntervalSetter.invokeExact(this.cachedServerEntity, updateInterval);
this.lastInjectedInterval = updateInterval; this.lastInjectedInterval = updateInterval;
} catch (Throwable e) { } 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);
} }
} }

View File

@@ -6,7 +6,6 @@ public abstract class AbstractCustomProjectile implements CustomProjectile {
protected final ProjectileMeta meta; protected final ProjectileMeta meta;
protected final Projectile projectile; protected final Projectile projectile;
protected final Item<?> item; protected final Item<?> item;
private int inGroundTime;
protected AbstractCustomProjectile(ProjectileMeta meta, Projectile projectile, Item<?> item) { protected AbstractCustomProjectile(ProjectileMeta meta, Projectile projectile, Item<?> item) {
this.meta = meta; this.meta = meta;
@@ -28,14 +27,4 @@ public abstract class AbstractCustomProjectile implements CustomProjectile {
public Item<?> item() { public Item<?> item() {
return item; return item;
} }
@Override
public int inGroundTime() {
return inGroundTime;
}
@Override
public void setInGroundTime(int inGroundTime) {
this.inGroundTime = inGroundTime;
}
} }

View File

@@ -9,8 +9,4 @@ public interface CustomProjectile {
Projectile projectile(); Projectile projectile();
Item<?> item(); Item<?> item();
int inGroundTime();
void setInGroundTime(int inGroundTime);
} }

View File

@@ -68,9 +68,10 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
this.equipmentsToGenerate = new HashSet<>(); this.equipmentsToGenerate = new HashSet<>();
} }
public void registerDataFunction(Function<Object, ItemDataModifier<I>> function, String... alias) { @Override
public void registerDataType(Function<Object, ItemDataModifier<I>> factory, String... alias) {
for (String a : alias) { for (String a : alias) {
dataFunctions.put(a, function); dataFunctions.put(a, factory);
} }
} }
@@ -432,26 +433,26 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
} }
private void registerFunctions() { private void registerFunctions() {
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false); Map<String, Object> data = MiscUtils.castToMap(obj, false);
String plugin = data.get("plugin").toString(); String plugin = data.get("plugin").toString();
String id = data.get("id").toString(); String id = data.get("id").toString();
ExternalItemProvider<I> provider = AbstractItemManager.this.getExternalItemProvider(plugin); ExternalItemProvider<I> provider = AbstractItemManager.this.getExternalItemProvider(plugin);
return new ExternalModifier<>(id, Objects.requireNonNull(provider, "Item provider " + plugin + " not found")); return new ExternalModifier<>(id, Objects.requireNonNull(provider, "Item provider " + plugin + " not found"));
}, "external"); }, "external");
registerDataFunction((obj) -> { registerDataType((obj) -> {
String name = obj.toString(); String name = obj.toString();
return new CustomNameModifier<>(Config.nonItalic() ? "<!i>" + name : name); return new CustomNameModifier<>(Config.nonItalic() ? "<!i>" + name : name);
}, "custom-name"); }, "custom-name");
registerDataFunction((obj) -> { registerDataType((obj) -> {
String name = obj.toString(); String name = obj.toString();
return new ItemNameModifier<>(Config.nonItalic() ? "<!i>" + name : name); return new ItemNameModifier<>(Config.nonItalic() ? "<!i>" + name : name);
}, "item-name", "display-name"); }, "item-name", "display-name");
registerDataFunction((obj) -> { registerDataType((obj) -> {
List<String> lore = MiscUtils.getAsStringList(obj).stream().map(it -> "<!i>" + it).toList(); List<String> lore = MiscUtils.getAsStringList(obj).stream().map(it -> "<!i>" + it).toList();
return new LoreModifier<>(lore); return new LoreModifier<>(lore);
}, "lore", "display-lore", "description"); }, "lore", "display-lore", "description");
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, List<String>> dynamicLore = new LinkedHashMap<>(); Map<String, List<String>> dynamicLore = new LinkedHashMap<>();
if (obj instanceof Map<?, ?> map) { if (obj instanceof Map<?, ?> map) {
for (Map.Entry<?, ?> entry : map.entrySet()) { for (Map.Entry<?, ?> entry : map.entrySet()) {
@@ -460,7 +461,7 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
} }
return new DynamicLoreModifier<>(dynamicLore); return new DynamicLoreModifier<>(dynamicLore);
}, "dynamic-lore"); }, "dynamic-lore");
registerDataFunction((obj) -> { registerDataType((obj) -> {
if (obj instanceof Integer integer) { if (obj instanceof Integer integer) {
return new DyedColorModifier<>(integer); return new DyedColorModifier<>(integer);
} else { } else {
@@ -468,15 +469,15 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
return new DyedColorModifier<>(MCUtils.fastFloor(vector3f.x) << 16 + MCUtils.fastFloor(vector3f.y) << 8 + MCUtils.fastFloor(vector3f.z)); return new DyedColorModifier<>(MCUtils.fastFloor(vector3f.x) << 16 + MCUtils.fastFloor(vector3f.y) << 8 + MCUtils.fastFloor(vector3f.z));
} }
}, "dyed-color"); }, "dyed-color");
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false); Map<String, Object> data = MiscUtils.castToMap(obj, false);
return new TagsModifier<>(data); return new TagsModifier<>(data);
}, "tags", "tag", "nbt"); }, "tags", "tag", "nbt");
registerDataFunction((obj) -> { registerDataType((obj) -> {
boolean value = TypeUtils.checkType(obj, Boolean.class); boolean value = TypeUtils.checkType(obj, Boolean.class);
return new UnbreakableModifier<>(value); return new UnbreakableModifier<>(value);
}, "unbreakable"); }, "unbreakable");
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false); Map<String, Object> data = MiscUtils.castToMap(obj, false);
List<Enchantment> enchantments = new ArrayList<>(); List<Enchantment> enchantments = new ArrayList<>();
for (Map.Entry<String, Object> e : data.entrySet()) { for (Map.Entry<String, Object> e : data.entrySet()) {
@@ -486,22 +487,22 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
} }
return new EnchantmentModifier<>(enchantments); return new EnchantmentModifier<>(enchantments);
}, "enchantment", "enchantments", "enchant"); }, "enchantment", "enchantments", "enchant");
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false); Map<String, Object> data = MiscUtils.castToMap(obj, false);
String material = data.get("material").toString().toLowerCase(Locale.ENGLISH); String material = data.get("material").toString().toLowerCase(Locale.ENGLISH);
String pattern = data.get("pattern").toString().toLowerCase(Locale.ENGLISH); String pattern = data.get("pattern").toString().toLowerCase(Locale.ENGLISH);
return new TrimModifier<>(material, pattern); return new TrimModifier<>(material, pattern);
}, "trim"); }, "trim");
if (VersionHelper.isOrAbove1_20_5()) { if (VersionHelper.isOrAbove1_20_5()) {
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false); Map<String, Object> data = MiscUtils.castToMap(obj, false);
return new ComponentModifier<>(data); return new ComponentModifier<>(data);
}, "components", "component"); }, "components", "component");
registerDataFunction((obj) -> { registerDataType((obj) -> {
List<String> data = MiscUtils.getAsStringList(obj); List<String> data = MiscUtils.getAsStringList(obj);
return new RemoveComponentModifier<>(data); return new RemoveComponentModifier<>(data);
}, "remove-components", "remove-component"); }, "remove-components", "remove-component");
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false); Map<String, Object> data = MiscUtils.castToMap(obj, false);
int nutrition = ResourceConfigUtils.getAsInt(data.get("nutrition"), "nutrition"); int nutrition = ResourceConfigUtils.getAsInt(data.get("nutrition"), "nutrition");
float saturation = ResourceConfigUtils.getAsFloat(data.get("saturation"), "saturation"); float saturation = ResourceConfigUtils.getAsFloat(data.get("saturation"), "saturation");
@@ -509,24 +510,24 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
}, "food"); }, "food");
} }
if (VersionHelper.isOrAbove1_21()) { if (VersionHelper.isOrAbove1_21()) {
registerDataFunction((obj) -> { registerDataType((obj) -> {
String song = obj.toString(); String song = obj.toString();
return new JukeboxSongModifier<>(new JukeboxPlayable(song, true)); return new JukeboxSongModifier<>(new JukeboxPlayable(song, true));
}, "jukebox-playable"); }, "jukebox-playable");
} }
if (VersionHelper.isOrAbove1_21_2()) { if (VersionHelper.isOrAbove1_21_2()) {
registerDataFunction((obj) -> { registerDataType((obj) -> {
String id = obj.toString(); String id = obj.toString();
return new TooltipStyleModifier<>(Key.of(id)); return new TooltipStyleModifier<>(Key.of(id));
}, "tooltip-style"); }, "tooltip-style");
} }
if (VersionHelper.isOrAbove1_21_2()) { if (VersionHelper.isOrAbove1_21_2()) {
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false); Map<String, Object> data = MiscUtils.castToMap(obj, false);
return new EquippableModifier<>(EquipmentData.fromMap(data)); return new EquippableModifier<>(EquipmentData.fromMap(data));
}, "equippable"); }, "equippable");
} }
registerDataFunction((obj) -> { registerDataType((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false); Map<String, Object> data = MiscUtils.castToMap(obj, false);
Map<String, TextProvider> arguments = new HashMap<>(); Map<String, TextProvider> arguments = new HashMap<>();
for (Map.Entry<String, Object> entry : data.entrySet()) { for (Map.Entry<String, Object> entry : data.entrySet()) {

View File

@@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item;
import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.behavior.ItemBehavior; 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.misc.EquipmentGeneration;
import net.momirealms.craftengine.core.pack.model.ItemModel; import net.momirealms.craftengine.core.pack.model.ItemModel;
import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel;
@@ -14,9 +15,12 @@ import org.incendo.cloud.suggestion.Suggestion;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.*; import java.util.*;
import java.util.function.Function;
public interface ItemManager<T> extends Manageable, ModelGenerator { public interface ItemManager<T> extends Manageable, ModelGenerator {
void registerDataType(Function<Object, ItemDataModifier<T>> factory, String... alias);
ConfigParser parser(); ConfigParser parser();
Map<Key, TreeSet<LegacyOverridesModel>> legacyItemOverrides(); Map<Key, TreeSet<LegacyOverridesModel>> legacyItemOverrides();

View File

@@ -51,7 +51,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3 ahocorasick_version=0.6.3
snake_yaml_version=2.4 snake_yaml_version=2.4
anti_grief_version=0.17 anti_grief_version=0.17
nms_helper_version=0.67.2 nms_helper_version=0.67.3
evalex_version=3.5.0 evalex_version=3.5.0
reactive_streams_version=1.0.4 reactive_streams_version=1.0.4
amazon_awssdk_version=2.31.23 amazon_awssdk_version=2.31.23