From 539dcd7d8f24cd68a64865a24e9a0ebaf246eb95 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 24 May 2025 17:37:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 6 +---- .../item/behavior/BukkitItemBehaviors.java | 1 + .../bukkit/util/ParticleUtils.java | 23 +++++++++++++++++++ .../craftengine/bukkit/world/BukkitWorld.java | 2 +- .../craftengine/core/item/Helmet.java | 15 ++++++++++++ .../craftengine/core/item/ItemSettings.java | 16 +++++++++++++ .../core/item/behavior/ItemBehavior.java | 5 ++++ .../core/pack/AbstractPackManager.java | 4 ++-- .../core/pack/LoadingSequence.java | 4 +++- .../craftengine/core/pack/Pack.java | 2 +- .../core/pack/ResourceLocation.java | 2 +- .../core/plugin/config/Config.java | 8 +++---- .../context/function/LevelerExpFunction.java | 4 ++-- gradle.properties | 2 +- 14 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/Helmet.java diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 209d0ad90..48742ce2d 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -65,11 +65,7 @@ resource-pack: - BetterModel/build merge-external-zip-files: - CustomNameplates/resourcepack.zip - exclude-file-suffixes: - - "md" - - "psd" - - "bbmodel" - - "db" + exclude-file-extensions: ["md", "psd", "bbmodel", "db", "ini"] delivery: # Send the resource pack on joining the server send-on-join: true diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java index f8081572b..91dc42d40 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java @@ -10,6 +10,7 @@ public class BukkitItemBehaviors extends ItemBehaviors { public static final Key FURNITURE_ITEM = Key.from("craftengine:furniture_item"); public static final Key WATER_BUCKET_ITEM = Key.from("craftengine:water_bucket_item"); public static final Key BUCKET_ITEM = Key.from("craftengine:bucket_item"); + public static final Key HAT_ITEM = Key.from("craftengine:hat_item"); public static void init() { register(EMPTY, EmptyItemBehavior.FACTORY); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java index e0ba3ccd0..a15f0091f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java @@ -1,14 +1,23 @@ package net.momirealms.craftengine.bukkit.util; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.particle.*; import org.bukkit.Location; import org.bukkit.Particle; import org.bukkit.Vibration; import org.bukkit.World; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; public final class ParticleUtils { + private static final Map CACHE = new HashMap<>(); + private ParticleUtils() {} public static Particle getParticle(String particle) { @@ -24,6 +33,20 @@ public final class ParticleUtils { } } + @Nullable + public static Particle getParticle(Key particle) { + return CACHE.computeIfAbsent(particle, k -> { + try { + Object nmsParticle = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$PARTICLE_TYPE, KeyUtils.toResourceLocation(particle)); + if (nmsParticle == null) return null; + return FastNMS.INSTANCE.method$CraftParticle$toBukkit(nmsParticle); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to get particle: " + particle, e); + return null; + } + }); + } + public static final Particle HAPPY_VILLAGER = getParticle("HAPPY_VILLAGER"); public static final Particle BUBBLE = getParticle("BUBBLE"); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java index 218b01d34..7008c0825 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java @@ -105,7 +105,7 @@ public class BukkitWorld implements World { @Override public void spawnParticle(Position location, Key particle, int count, double xOffset, double yOffset, double zOffset, double speed, @Nullable ParticleData extraData, @NotNull Context context) { - Particle particleType = Registry.PARTICLE_TYPE.get(KeyUtils.toNamespacedKey(particle)); + Particle particleType = ParticleUtils.getParticle(particle); if (particleType == null) return; org.bukkit.World platformWorld = platformWorld(); platformWorld.spawnParticle(particleType, location.x(), location.y(), location.z(), count, xOffset, yOffset, zOffset, speed, extraData == null ? null : ParticleUtils.toBukkitParticleData(extraData, context, platformWorld, location.x(), location.y(), location.z())); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Helmet.java b/core/src/main/java/net/momirealms/craftengine/core/item/Helmet.java new file mode 100644 index 000000000..0235c411e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Helmet.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.sound.SoundData; + +public class Helmet { + private final SoundData equipSound; + + public Helmet(SoundData equipSound) { + this.equipSound = equipSound; + } + + public SoundData equipSound() { + return equipSound; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java index c2f41b13c..a9f93ebb5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.core.item.modifier.EquippableModifier; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -28,6 +29,7 @@ public class ItemSettings { boolean canPlaceRelatedVanillaBlock = false; ProjectileMeta projectileMeta; boolean dyeable = true; + Helmet helmet = null; private ItemSettings() {} @@ -105,6 +107,11 @@ public class ItemSettings { return anvilRepairItems; } + @Nullable + public Helmet helmet() { + return helmet; + } + @Nullable public EquipmentGeneration equipment() { return equipment; @@ -155,6 +162,11 @@ public class ItemSettings { return this; } + public ItemSettings helmet(Helmet helmet) { + this.helmet = helmet; + return this; + } + @FunctionalInterface public interface Modifier { @@ -229,6 +241,10 @@ public class ItemSettings { String type = args.getOrDefault("type", "none").toString(); return settings -> settings.projectileMeta(new ProjectileMeta(customTridentItemId, displayType, scale, translation, rotation, type)); })); + registerFactory("helmet", (value -> { + Map args = MiscUtils.castToMap(value, false); + return settings -> settings.helmet(new Helmet(SoundData.create(args.getOrDefault("equip-sound", "minecraft:intentionally_empty"), 1f, 1f))); + })); registerFactory("dyeable", (value -> { boolean bool = (boolean) value; return settings -> settings.dyeable(bool); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java index 3c73c14e7..cd243ad72 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java @@ -15,4 +15,9 @@ public abstract class ItemBehavior { public InteractionResult use(World world, Player player, InteractionHand hand) { return InteractionResult.PASS; } + + // TODO + public InteractionResult useOnEntity() { + return InteractionResult.PASS; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index ae5ed2825..d0ded6b10 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -1208,7 +1208,7 @@ public abstract class AbstractPackManager implements PackManager { private void processRegularFile(Path file, BasicFileAttributes attrs, Path sourceFolder, @Nullable FileSystem fs, Map> conflictChecker, Map previousFiles) throws IOException { - if (Config.excludeFileSuffixes().contains(FileUtils.getExtension(file))) { + if (Config.excludeFileExtensions().contains(FileUtils.getExtension(file))) { return; } CachedAssetFile cachedAsset = previousFiles.get(file); @@ -1237,7 +1237,7 @@ public abstract class AbstractPackManager implements PackManager { if (entryAttrs.isDirectory()) { return FileVisitResult.CONTINUE; } - if (Config.excludeFileSuffixes().contains(FileUtils.getExtension(entry))) { + if (Config.excludeFileExtensions().contains(FileUtils.getExtension(entry))) { return FileVisitResult.CONTINUE; } Path entryPathInZip = zipRoot.relativize(entry); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java b/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java index b684aa54f..496ce89e6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java @@ -1,6 +1,8 @@ package net.momirealms.craftengine.core.pack; -public class LoadingSequence { +public final class LoadingSequence { + private LoadingSequence() {} + public static final int TEMPLATE = 0; public static final int GLOBAL_VAR = 10; public static final int LANG = 20; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java b/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java index 3953b2076..331469c9e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java @@ -12,7 +12,7 @@ import java.nio.file.Path; * This class provides access to the resource pack folder * and configuration folder within the specified directory. */ -public class Pack { +public final class Pack { private final Path folder; private final PackMeta meta; private final boolean enabled; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/ResourceLocation.java b/core/src/main/java/net/momirealms/craftengine/core/pack/ResourceLocation.java index 471e5ead5..4e580df18 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/ResourceLocation.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/ResourceLocation.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.pack; -public class ResourceLocation { +public final class ResourceLocation { public static boolean isValid(final String resourceLocation) { int index = resourceLocation.indexOf(":"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index c42a25a44..d081b5e87 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -56,7 +56,7 @@ public class Config { protected List resource_pack$duplicated_files_handler; protected List resource_pack$merge_external_folders; protected List resource_pack$merge_external_zips; - protected Set resource_pack$exclude_file_suffixes; + protected Set resource_pack$exclude_file_extensions; protected boolean resource_pack$protection$crash_tools$method_1; protected boolean resource_pack$protection$crash_tools$method_2; @@ -218,7 +218,7 @@ public class Config { resource_pack$supported_version$max = getVersion(config.get("resource-pack.supported-version.max", "LATEST").toString()); resource_pack$merge_external_folders = config.getStringList("resource-pack.merge-external-folders"); resource_pack$merge_external_zips = config.getStringList("resource-pack.merge-external-zip-files"); - resource_pack$exclude_file_suffixes = new HashSet<>(config.getStringList("resource-pack.exclude-file-suffixes", List.of("md", "psd", "bbmodel", "db"))); + resource_pack$exclude_file_extensions = new HashSet<>(config.getStringList("resource-pack.exclude-file-extensions")); resource_pack$delivery$send_on_join = config.getBoolean("resource-pack.delivery.send-on-join", true); resource_pack$delivery$resend_on_upload = config.getBoolean("resource-pack.delivery.resend-on-upload", true); resource_pack$delivery$kick_if_declined = config.getBoolean("resource-pack.delivery.kick-if-declined", true); @@ -468,8 +468,8 @@ public class Config { return instance.resource_pack$merge_external_zips; } - public static Set excludeFileSuffixes() { - return instance.resource_pack$exclude_file_suffixes; + public static Set excludeFileExtensions() { + return instance.resource_pack$exclude_file_extensions; } public static boolean kickOnDeclined() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java index 9d9edff9e..dd369f792 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java @@ -56,8 +56,8 @@ public class LevelerExpFunction extends AbstractConditional @Override public Function create(Map arguments) { Object count = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.function.leveler_exp.missing_count"); - String leveler = ResourceConfigUtils.requireNonEmptyStringOrThrow("leveler", "warning.config.function.leveler_exp.missing_leveler"); - String plugin = ResourceConfigUtils.requireNonEmptyStringOrThrow("plugin", "warning.config.function.leveler_exp.missing_plugin"); + String leveler = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("leveler"), "warning.config.function.leveler_exp.missing_leveler"); + String plugin = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("plugin"), "warning.config.function.leveler_exp.missing_plugin"); return new LevelerExpFunction<>(NumberProviders.fromObject(count), leveler, plugin, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); } } diff --git a/gradle.properties b/gradle.properties index 9571f5bed..3bb2f44ca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,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.65.25 +nms_helper_version=0.65.26 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23