9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

Merge branch 'Xiao-MoMi:dev' into dev

This commit is contained in:
jhqwqmc
2025-04-10 03:20:02 +08:00
committed by GitHub
4 changed files with 81 additions and 3 deletions

View File

@@ -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<ItemStack> 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();

View File

@@ -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;
}

View File

@@ -32,9 +32,9 @@ public abstract class AbstractFontManager implements FontManager {
private OffsetFont offsetFont;
private Trie imageTagTrie;
private Trie emojiKeywordTrie;
protected Trie emojiKeywordTrie;
private Map<String, Component> tagMapper;
private Map<String, Emoji> emojiMapper;
protected Map<String, Emoji> emojiMapper;
public AbstractFontManager(CraftEngine plugin) {
this.plugin = plugin;

View File

@@ -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.
*