9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 12:29:15 +00:00

refactor(bukkit): 优化字体管理器中表情解析逻辑

This commit is contained in:
jhqwqmc
2025-04-10 22:00:53 +08:00
parent a904b63c40
commit 7963288c1d

View File

@@ -129,13 +129,13 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
if (renameText == null || renameText.isEmpty()) return;
Component itemName = Component.text(renameText);
final int[] parsedCount = {0};
processComponent(itemName, player, parsedCount[0], (text) -> {
if (parsedCount[0]++ >= Config.maxEmojiParsed()) return;
MutableInt parsedCount = new MutableInt(0);
processComponent(itemName, player, parsedCount, (text) -> {
if (parsedCount.value >= Config.maxEmojiParsed()) return;
Item<ItemStack> wrapped = this.plugin.itemManager().wrap(result);
wrapped.customName(AdventureHelper.componentToJson(text));
event.setResult(wrapped.loadCopy());
}, (count) -> parsedCount[0]++);
});
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
@@ -144,8 +144,8 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
Player player = event.getPlayer();
BookMeta newBookMeta = event.getNewBookMeta();
List<?> pages = newBookMeta.pages();
final boolean[] replacedBookMeta = {false};
final int[] parsedCount = {0};
MutableBoolean replacedBookMeta = new MutableBoolean(false);
MutableInt parsedCount = new MutableInt(0);
for (int i = 0; i < pages.size(); i++) {
int finalIndex = i;
JsonElement json = ComponentUtils.paperAdventureToJsonElement(pages.get(i));
@@ -153,9 +153,9 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
if (primitive.isString() && primitive.getAsString().isEmpty()) continue;
}
Component page = AdventureHelper.jsonElementToComponent(json);
processComponent(page, player, parsedCount[0], (text) -> {
processComponent(page, player, parsedCount, (text) -> {
try {
replacedBookMeta[0] = true;
replacedBookMeta.value = true;
Reflections.method$BookMeta$page.invoke(
newBookMeta, finalIndex + 1,
ComponentUtils.jsonElementToPaperAdventure(AdventureHelper.componentToJsonElement(text))
@@ -163,10 +163,10 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
} catch (IllegalAccessException | InvocationTargetException e) {
this.plugin.logger().warn("Failed to set book page", e);
}
}, (count) -> parsedCount[0]++);
if (parsedCount[0] > Config.maxEmojiParsed()) break;
});
if (parsedCount.value > Config.maxEmojiParsed()) break;
}
if (replacedBookMeta[0]) {
if (replacedBookMeta.value) {
event.setNewBookMeta(newBookMeta);
}
}
@@ -175,13 +175,13 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
public void onSignChange(SignChangeEvent event) {
Player player = event.getPlayer();
List<Component> lines = event.lines();
final int[] parsedCount = {0};
MutableInt parsedCount = new MutableInt(0);
for (int i = 0; i < lines.size(); i++) {
int finalIndex = i;
JsonElement json = ComponentUtils.paperAdventureToJsonElement(lines.get(i));
if (json.toString().isEmpty()) continue;
Component line = AdventureHelper.jsonElementToComponent(json);
processComponent(line, player, parsedCount[0], (text) -> {
processComponent(line, player, parsedCount, (text) -> {
try {
Reflections.method$SignChangeEvent$line.invoke(
event, finalIndex,
@@ -190,28 +190,22 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
} catch (IllegalAccessException | InvocationTargetException e) {
plugin.logger().warn("Failed to set sign line", e);
}
}, (count) -> parsedCount[0]++);
if (parsedCount[0] > Config.maxEmojiParsed()) break;
});
if (parsedCount.value > Config.maxEmojiParsed()) break;
}
}
private void processComponent(Component text, Player player, int parsedCount, Consumer<Component> consumer, Consumer<Integer> parsedCountConsumer) {
if (parsedCount > Config.maxEmojiParsed()) return;
private void processComponent(Component text, Player player, MutableInt parsedCount, Consumer<Component> consumer) {
if (parsedCount.value > Config.maxEmojiParsed()) return;
Component textReplaced = text;
Set<String> processedKeywords = new HashSet<>();
for (Token token : super.emojiKeywordTrie.tokenize(AdventureHelper.componentToJson(text))) {
if (!token.isMatch()) continue;
if (!token.isMatch() || parsedCount.value > Config.maxEmojiParsed()) continue;
String keyword = token.getFragment();
parsedCountConsumer.accept(parsedCount++);
if (parsedCount > Config.maxEmojiParsed()) return;
if (processedKeywords.contains(keyword)) continue;
Emoji emoji = super.emojiMapper.get(keyword);
if (emoji == null) {
parsedCountConsumer.accept(parsedCount--);
continue;
}
if (emoji == null) continue;
if (emoji.permission() != null && !player.hasPermission(Objects.requireNonNull(emoji.permission()))) {
parsedCountConsumer.accept(parsedCount--);
continue;
}
textReplaced = textReplaced.replaceText(builder -> {
@@ -226,9 +220,20 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
});
consumer.accept(textReplaced);
processedKeywords.add(keyword);
parsedCount.value++;
}
}
private static final class MutableInt {
int value;
MutableInt(int value) { this.value = value; }
}
private static final class MutableBoolean {
boolean value;
MutableBoolean(boolean value) { this.value = value; }
}
@SuppressWarnings("UnstableApiUsage")
private void processChatEvent(AsyncChatDecorateEvent event) {
Player player = event.player();