From a39e5980cae5c260808219623fdb1510b7ee6649 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 10 Apr 2025 02:46:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=93=81=E7=A0=A7?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/font/BukkitFontManager.java | 67 +++++++++++++++++++ .../core/font/AbstractFontManager.java | 4 +- .../core/util/AdventureHelper.java | 11 +++ 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index d193d46aa..26d33fc0b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -5,21 +5,34 @@ import io.papermc.paper.event.player.AsyncChatDecorateEvent; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.LegacyInventoryUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.font.AbstractFontManager; +import net.momirealms.craftengine.core.font.Emoji; +import net.momirealms.craftengine.core.font.EmojiParameters; import net.momirealms.craftengine.core.font.FontManager; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.CharacterUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.util.context.PlayerContext; +import org.ahocorasick.trie.Token; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; +import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.view.AnvilView; import java.lang.reflect.InvocationTargetException; import java.util.Map; +import java.util.Objects; public class BukkitFontManager extends AbstractFontManager implements Listener { private final BukkitCraftEngine plugin; @@ -65,6 +78,60 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { } } + @SuppressWarnings("UnstableApiUsage") + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onAnvilRename(PrepareAnvilEvent event) { + if (super.emojiKeywordTrie == null) { + return; + } + ItemStack result = event.getResult(); + if (result == null) return; + Player player; + try { + player = (Player) Reflections.method$InventoryView$getPlayer.invoke(VersionHelper.isVersionNewerThan1_21() ? event.getView() : LegacyInventoryUtils.getView(event)); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to get inventory viewer", e); + return; + } + + String renameText; + if (VersionHelper.isVersionNewerThan1_21_2()) { + AnvilView anvilView = event.getView(); + renameText = anvilView.getRenameText(); + } else { + renameText = LegacyInventoryUtils.getRenameText(event.getInventory()); + } + + if (renameText == null || renameText.isEmpty()) return; + + Component itemName = Component.text(renameText); + boolean replaced = false; + for (Token token : super.emojiKeywordTrie.tokenize(renameText)) { + if (!token.isMatch()) continue; + Emoji emoji = super.emojiMapper.get(token.getFragment()); + if (emoji == null) continue; + if (emoji.permission() != null && !player.hasPermission(Objects.requireNonNull(emoji.permission()))) { + continue; + } + itemName = itemName.replaceText(builder -> { + builder.matchLiteral(token.getFragment()) + .replacement(AdventureHelper.miniMessage().deserialize( + emoji.content(), + PlayerContext.of(plugin.adapt(player), ContextHolder.builder() + .withOptionalParameter(EmojiParameters.EMOJI, emoji.emojiImage()) + .withParameter(EmojiParameters.KEYWORD, emoji.keywords().get(0)) + .build()).tagResolvers() + )) ; + }); + replaced = true; + } + + if (!replaced) return; + Item wrapped = this.plugin.itemManager().wrap(result); + wrapped.customName(AdventureHelper.componentToJson(itemName)); + event.setResult(wrapped.loadCopy()); + } + @SuppressWarnings("UnstableApiUsage") private void processChatEvent(AsyncChatDecorateEvent event) { Player player = event.player(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index df2e565b8..767058d65 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -32,9 +32,9 @@ public abstract class AbstractFontManager implements FontManager { private OffsetFont offsetFont; private Trie imageTagTrie; - private Trie emojiKeywordTrie; + protected Trie emojiKeywordTrie; private Map tagMapper; - private Map emojiMapper; + protected Map emojiMapper; public AbstractFontManager(CraftEngine plugin) { this.plugin = plugin; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java index d69c82d01..95cff2708 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -6,6 +6,7 @@ import net.kyori.adventure.key.Key; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.text.serializer.json.JSONOptions; import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer; @@ -19,12 +20,14 @@ public class AdventureHelper { public static final String EMPTY_COMPONENT = componentToJson(Component.empty()); private final MiniMessage miniMessage; private final MiniMessage miniMessageStrict; + private final MiniMessage miniMessageCustom; private final GsonComponentSerializer gsonComponentSerializer; private final NBTComponentSerializer nbtComponentSerializer; private AdventureHelper() { this.miniMessage = MiniMessage.builder().build(); this.miniMessageStrict = MiniMessage.builder().strict(true).build(); + this.miniMessageCustom = MiniMessage.builder().tags(TagResolver.empty()).build(); GsonComponentSerializer.Builder builder = GsonComponentSerializer.builder(); if (!VersionHelper.isVersionNewerThan1_20_5()) { builder.legacyHoverEventSerializer(NBTLegacyHoverEventSerializer.get()); @@ -56,6 +59,14 @@ public class AdventureHelper { return getInstance().miniMessage; } + public static MiniMessage customMiniMessage() { + return getInstance().miniMessageCustom; + } + + public static MiniMessage strictMiniMessage() { + return getInstance().miniMessageStrict; + } + /** * Retrieves the GsonComponentSerializer instance. * From af8d0a6fc3970a1c812f813c38c9d07416441a04 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 10 Apr 2025 03:14:36 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E8=83=BD=E5=90=AC=E5=88=B0hit=E5=A3=B0?= =?UTF-8?q?=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/user/BukkitServerPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 721f4b1c8..d1f9487b3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -425,7 +425,7 @@ public class BukkitServerPlayer extends Player { Object soundType = Reflections.field$BlockBehaviour$soundType.get(blockOwner); Object soundEvent = Reflections.field$SoundType$hitSound.get(soundType); Object soundId = Reflections.field$SoundEvent$location.get(soundEvent); - level().playBlockSound(new Vec3d(this.destroyPos.x(), this.destroyPos.y(), this.destroyPos.z()), Key.of(soundId.toString()), 0.5F, 0.5F); + player.playSound(location, soundId.toString(), SoundCategory.BLOCKS, 0.5F, 0.5F); this.lastHitBlockTime = currentTick; }