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:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user