From 5961e16cf91b892947104b7dc3b98fd86907faf4 Mon Sep 17 00:00:00 2001 From: APairOfMoons <84629346+APairOfMoons@users.noreply.github.com> Date: Mon, 6 Jul 2026 15:00:49 +0800 Subject: [PATCH] Feat: Add @All reminder. --- .../ChatInsertRemindAllFormat.java | 66 +++++++++++++++++++ .../chatplus/util/TextStyleFormatter.java | 33 ++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/main/java/cn/revaria/chatplus/format/formats/insertformats/ChatInsertRemindAllFormat.java diff --git a/src/main/java/cn/revaria/chatplus/format/formats/insertformats/ChatInsertRemindAllFormat.java b/src/main/java/cn/revaria/chatplus/format/formats/insertformats/ChatInsertRemindAllFormat.java new file mode 100644 index 0000000..097d926 --- /dev/null +++ b/src/main/java/cn/revaria/chatplus/format/formats/insertformats/ChatInsertRemindAllFormat.java @@ -0,0 +1,66 @@ +package cn.revaria.chatplus.format.formats.insertformats; + +import cn.revaria.chatplus.ChatPlus; +import cn.revaria.chatplus.format.ChatFormatType; +import cn.revaria.chatplus.format.formats.ChatInsertFormat; +import net.minecraft.ChatFormatting; +import net.minecraft.core.Holder; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.TextColor; +import net.minecraft.network.protocol.game.ClientboundSoundPacket; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; + +public class ChatInsertRemindAllFormat implements ChatInsertFormat { + + private final String reminderText; + private boolean soundPlayed = false; + + private final int startingIndex; + private final ChatFormatType formatType = ChatFormatType.INSERT; + + public ChatInsertRemindAllFormat(int startingIndex, String reminderText) { + this.startingIndex = startingIndex; + + this.reminderText = reminderText; + } + + @Override + public MutableComponent getInsertComponent() { + if (!soundPlayed) { + soundPlayed = true; + + for (ServerPlayer player : ChatPlus.getServer().getPlayerList().getPlayers()) { + player.connection.send(new ClientboundSoundPacket( + Holder.direct(SoundEvent.createVariableRangeEvent(Identifier.fromNamespaceAndPath("minecraft", "entity.experience_orb.pickup"))), + SoundSource.MASTER, + player.position().x, + player.position().y, + player.position().z, + 3, + 1, + player.level().getRandom().nextLong() + )); + } + } + + return Component.literal("@").append(reminderText) + .withColor(TextColor.GREEN) + .withStyle(ChatFormatting.BOLD); + } + @Override + public int startingIndex() { + return startingIndex; + } + @Override + public ChatFormatType formatType() { + return formatType; + } + @Override + public ChatInsertFormat copy() { + return new ChatInsertRemindAllFormat(startingIndex, reminderText); + } +} diff --git a/src/main/java/cn/revaria/chatplus/util/TextStyleFormatter.java b/src/main/java/cn/revaria/chatplus/util/TextStyleFormatter.java index 1c75dd7..f9378b6 100644 --- a/src/main/java/cn/revaria/chatplus/util/TextStyleFormatter.java +++ b/src/main/java/cn/revaria/chatplus/util/TextStyleFormatter.java @@ -7,6 +7,7 @@ import net.minecraft.network.chat.contents.LiteralContents; import cn.revaria.chatplus.ChatPlus; import cn.revaria.chatplus.format.formats.ChatInsertFormat; import cn.revaria.chatplus.format.formats.insertformats.ChatInsertReminderFormat; +import cn.revaria.chatplus.format.formats.insertformats.ChatInsertRemindAllFormat; import cn.revaria.chatplus.format.ChatFormat; import cn.revaria.chatplus.format.ChatFormatType; import cn.revaria.chatplus.format.formats.ChatColorFormat; @@ -274,6 +275,38 @@ public class TextStyleFormatter { } } + if (character == '@') { + + if (sourceRawText.startsWith("All", i + 1) + || sourceRawText.startsWith("ALL", i + 1) + || sourceRawText.startsWith("all", i + 1)) { + + if (!formatsTableOutput.containsKey(currentIndex)) { + formatsTableOutput.put(currentIndex, new ArrayList<>()); + } + formatsTableOutput.get(currentIndex).add(new ChatInsertRemindAllFormat( + currentIndex, + "All" + )); + + i += 3; + continue; + } + if (sourceRawText.startsWith("所有人", i + 1)) { + + if (!formatsTableOutput.containsKey(currentIndex)) { + formatsTableOutput.put(currentIndex, new ArrayList<>()); + } + formatsTableOutput.get(currentIndex).add(new ChatInsertRemindAllFormat( + currentIndex, + "所有人" + )); + + i += 3; + continue; + } + } + if ((character >= '0' && character <= '9') || (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z')