mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-30 12:29:15 +00:00
再优化
This commit is contained in:
@@ -10,10 +10,7 @@ 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.EmojiComponentProcessResult;
|
||||
import net.momirealms.craftengine.core.font.EmojiTextProcessResult;
|
||||
import net.momirealms.craftengine.core.font.FontManager;
|
||||
import net.momirealms.craftengine.core.font.*;
|
||||
import net.momirealms.craftengine.core.item.Item;
|
||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||
import net.momirealms.craftengine.core.util.AdventureHelper;
|
||||
@@ -95,7 +92,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
|
||||
if (!event.getPlayer().hasPermission(FontManager.BYPASS_COMMAND)) {
|
||||
IllegalCharacterProcessResult result = processIllegalCharacters(event.getMessage());
|
||||
if (result.has()) {
|
||||
event.setMessage(result.newText());
|
||||
event.setMessage(result.text());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,10 +122,6 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
|
||||
}
|
||||
|
||||
if (renameText == null || renameText.isEmpty()) return;
|
||||
IllegalCharacterProcessResult processResult = processIllegalCharacters(renameText);
|
||||
if (processResult.has()) {
|
||||
renameText = processResult.newText();
|
||||
}
|
||||
Component itemName = Component.text(renameText);
|
||||
EmojiComponentProcessResult replaceProcessResult = replaceComponentEmoji(itemName, plugin.adapt(player), renameText);
|
||||
if (replaceProcessResult.changed()) {
|
||||
@@ -203,7 +196,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
|
||||
if (!player.hasPermission(FontManager.BYPASS_CHAT)) {
|
||||
IllegalCharacterProcessResult result = processIllegalCharacters(processResult.text());
|
||||
if (result.has()) {
|
||||
Object component = ComponentUtils.jsonToPaperAdventure(result.newText());
|
||||
Object component = ComponentUtils.jsonToPaperAdventure(result.text());
|
||||
Reflections.method$AsyncChatDecorateEvent$result.invoke(event, component);
|
||||
} else if (hasChanged) {
|
||||
Object component = ComponentUtils.jsonToPaperAdventure(processResult.text());
|
||||
@@ -217,51 +210,4 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private IllegalCharacterProcessResult processIllegalCharacters(String raw) {
|
||||
boolean hasIllegal = false;
|
||||
// replace illegal image usage
|
||||
Map<String, Component> tokens = matchTags(raw);
|
||||
if (!tokens.isEmpty()) {
|
||||
for (Map.Entry<String, Component> entry : tokens.entrySet()) {
|
||||
raw = raw.replace(entry.getKey(), "*");
|
||||
hasIllegal = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.isDefaultFontInUse()) {
|
||||
// replace illegal codepoint
|
||||
char[] chars = raw.toCharArray();
|
||||
int[] codepoints = CharacterUtils.charsToCodePoints(chars);
|
||||
int[] newCodepoints = new int[codepoints.length];
|
||||
|
||||
for (int i = 0; i < codepoints.length; i++) {
|
||||
int codepoint = codepoints[i];
|
||||
if (!isIllegalCodepoint(codepoint)) {
|
||||
newCodepoints[i] = codepoint;
|
||||
} else {
|
||||
newCodepoints[i] = '*';
|
||||
hasIllegal = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasIllegal) {
|
||||
return IllegalCharacterProcessResult.has(new String(newCodepoints, 0, newCodepoints.length));
|
||||
}
|
||||
} else if (hasIllegal) {
|
||||
return IllegalCharacterProcessResult.has(raw);
|
||||
}
|
||||
return IllegalCharacterProcessResult.not();
|
||||
}
|
||||
|
||||
public record IllegalCharacterProcessResult(boolean has, String newText) {
|
||||
|
||||
public static IllegalCharacterProcessResult has(String newText) {
|
||||
return new IllegalCharacterProcessResult(true, newText);
|
||||
}
|
||||
|
||||
public static IllegalCharacterProcessResult not() {
|
||||
return new IllegalCharacterProcessResult(false, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import net.momirealms.craftengine.bukkit.util.*;
|
||||
import net.momirealms.craftengine.core.block.ImmutableBlockState;
|
||||
import net.momirealms.craftengine.core.entity.player.InteractionHand;
|
||||
import net.momirealms.craftengine.core.font.FontManager;
|
||||
import net.momirealms.craftengine.core.font.IllegalCharacterProcessResult;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||
import net.momirealms.craftengine.core.plugin.network.ConnectionState;
|
||||
@@ -1640,21 +1641,21 @@ public class PacketConsumers {
|
||||
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> RENAME_ITEM = (user, event, packet) -> {
|
||||
try {
|
||||
if (!Config.filterAnvil()) return;
|
||||
if (((BukkitServerPlayer) user).hasPermission(FontManager.BYPASS_ANVIL)) {
|
||||
return;
|
||||
}
|
||||
String message = (String) Reflections.field$ServerboundRenameItemPacket$name.get(packet);
|
||||
if (message != null && !message.isEmpty()) {
|
||||
FontManager manager = CraftEngine.instance().imageManager();
|
||||
if (!manager.isDefaultFontInUse()) return;
|
||||
// check bypass
|
||||
if (((BukkitServerPlayer) user).hasPermission(FontManager.BYPASS_ANVIL)) {
|
||||
return;
|
||||
}
|
||||
runIfContainsIllegalCharacter(message, manager, (s) -> {
|
||||
FontManager manager = CraftEngine.instance().imageManager();
|
||||
IllegalCharacterProcessResult result = manager.processIllegalCharacters(message);
|
||||
if (result.has()) {
|
||||
try {
|
||||
Reflections.field$ServerboundRenameItemPacket$name.set(packet, s);
|
||||
Reflections.field$ServerboundRenameItemPacket$name.set(packet, result.text());
|
||||
} catch (ReflectiveOperationException e) {
|
||||
CraftEngine.instance().logger().warn("Failed to replace chat", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
CraftEngine.instance().logger().warn("Failed to handle ServerboundRenameItemPacket", e);
|
||||
@@ -1665,20 +1666,19 @@ public class PacketConsumers {
|
||||
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SIGN_UPDATE = (user, event, packet) -> {
|
||||
try {
|
||||
if (!Config.filterSign()) return;
|
||||
String[] lines = (String[]) Reflections.field$ServerboundSignUpdatePacket$lines.get(packet);
|
||||
FontManager manager = CraftEngine.instance().imageManager();
|
||||
if (!manager.isDefaultFontInUse()) return;
|
||||
// check bypass
|
||||
if (((BukkitServerPlayer) user).hasPermission(FontManager.BYPASS_SIGN)) {
|
||||
return;
|
||||
}
|
||||
String[] lines = (String[]) Reflections.field$ServerboundSignUpdatePacket$lines.get(packet);
|
||||
FontManager manager = CraftEngine.instance().imageManager();
|
||||
if (!manager.isDefaultFontInUse()) return;
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
String line = lines[i];
|
||||
if (line != null && !line.isEmpty()) {
|
||||
try {
|
||||
int lineIndex = i;
|
||||
runIfContainsIllegalCharacter(line, manager, (s) -> lines[lineIndex] = s);
|
||||
} catch (Exception ignore) {
|
||||
IllegalCharacterProcessResult result = manager.processIllegalCharacters(line);
|
||||
if (result.has()) {
|
||||
lines[i] = result.text();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1763,25 +1763,6 @@ public class PacketConsumers {
|
||||
return hasIllegal ? Pair.of(true, new String(newCodepoints, 0, newCodepoints.length)) : Pair.of(false, original);
|
||||
}
|
||||
|
||||
private static void runIfContainsIllegalCharacter(String string, FontManager manager, Consumer<String> callback) {
|
||||
if (string.isEmpty()) return;
|
||||
int[] codepoints = CharacterUtils.charsToCodePoints(string.toCharArray());
|
||||
int[] newCodepoints = new int[codepoints.length];
|
||||
boolean hasIllegal = false;
|
||||
for (int i = 0; i < codepoints.length; i++) {
|
||||
int codepoint = codepoints[i];
|
||||
if (!manager.isIllegalCodepoint(codepoint)) {
|
||||
newCodepoints[i] = codepoint;
|
||||
} else {
|
||||
newCodepoints[i] = '*';
|
||||
hasIllegal = true;
|
||||
}
|
||||
}
|
||||
if (hasIllegal) {
|
||||
callback.accept(new String(newCodepoints, 0, newCodepoints.length));
|
||||
}
|
||||
}
|
||||
|
||||
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> CUSTOM_PAYLOAD = (user, event, packet) -> {
|
||||
try {
|
||||
if (!VersionHelper.isVersionNewerThan1_20_5()) return;
|
||||
|
||||
Reference in New Issue
Block a user