From dc4da670ee2f7231521a25a77942a389a579b2a4 Mon Sep 17 00:00:00 2001 From: John Etherfield Date: Sat, 3 Oct 2026 19:23:21 +0200 Subject: [PATCH] fix: repair chat code and add **text** italic formatting to chat --- src/main/java/org/examp/john/AntiAbuse.java | 2 +- src/main/java/org/examp/john/ChatHandler.java | 54 ++++++++++++++++++- .../examp/john/stealth/StealthStorage.java | 6 +-- 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/examp/john/AntiAbuse.java b/src/main/java/org/examp/john/AntiAbuse.java index 5a47ad7..db139a1 100644 --- a/src/main/java/org/examp/john/AntiAbuse.java +++ b/src/main/java/org/examp/john/AntiAbuse.java @@ -65,7 +65,7 @@ public class AntiAbuse { double spread = Math.max(b[1] - b[0], b[3] - b[2]); if (spread > DISTANCE_THRESHOLD) { - Localchat.magicModLog.warn( + MSNexus.magicModLog.warn( "[ANTI-ABUSE] Гравець {} ймовірно шукає інших: " + "'{}' ×{} разів, переміщення ~{} блоків", player.getName().getString(), diff --git a/src/main/java/org/examp/john/ChatHandler.java b/src/main/java/org/examp/john/ChatHandler.java index db75e7b..1e38aa0 100644 --- a/src/main/java/org/examp/john/ChatHandler.java +++ b/src/main/java/org/examp/john/ChatHandler.java @@ -5,8 +5,11 @@ import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.model.user.User; import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import org.examp.john.stealth.StealthStorage; @@ -32,7 +35,7 @@ public class ChatHandler { Component globalMessage = Component.empty() .append(formattedName) .append(Component.literal(": ")) - .append(buildMentionMessage(actualMessage, players)); + .append(buildFormattedMessage(actualMessage, players)); for (ServerPlayer player : players) { player.sendSystemMessage(globalMessage); @@ -65,7 +68,7 @@ public class ChatHandler { Component localMessage = Component.empty() .append(formattedName) .append(Component.literal(": ").withStyle(ChatFormatting.GRAY)) - .append(buildMentionMessage(text, players).withStyle(ChatFormatting.GRAY)); + .append(buildFormattedMessage(text, players).withStyle(ChatFormatting.GRAY)); sender.sendSystemMessage(localMessage); for (ServerPlayer hearer : hearers) { @@ -87,6 +90,38 @@ public class ChatHandler { }); } + /** + * Парсить текст між ** і робить його курсивом, поєднуючи з підсвіткою згадок гравців. + * Приклад: "привіт **світе** як справи?" -> "привіт [курсив]світе[/курсив] як справи?" + */ + private static MutableComponent buildFormattedMessage(String text, List players) { + MutableComponent result = Component.empty(); + StringBuilder buffer = new StringBuilder(); + boolean italic = false; + + for (int i = 0; i < text.length(); i++) { + if (i + 1 < text.length() && text.charAt(i) == '*' && text.charAt(i + 1) == '*') { + appendFormattedSegment(result, buffer.toString(), players, italic); + buffer.setLength(0); + italic = !italic; + i++; + } else { + buffer.append(text.charAt(i)); + } + } + appendFormattedSegment(result, buffer.toString(), players, italic); + + return result; + } + + private static void appendFormattedSegment(MutableComponent result, String segment, List players, boolean italic) { + MutableComponent parsed = buildMentionMessage(segment, players); + if (italic) { + parsed.withStyle(Style.EMPTY.withItalic(true)); + } + result.append(parsed); + } + private static MutableComponent buildMentionMessage(String text, List onlinePlayers) { List sorted = onlinePlayers.stream() .sorted(Comparator.comparingInt((ServerPlayer p) -> p.getName().getString().length()).reversed()) @@ -139,6 +174,21 @@ public class ChatHandler { ); } + private static String getLuckPermsPrefix(ServerPlayer player) { + try { + LuckPerms luckPerms = LuckPermsProvider.get(); + User user = luckPerms.getUserManager().getUser(player.getUUID()); + if (user != null) { + String metaPrefix = user.getCachedData().getMetaData().getPrefix(); + if (metaPrefix != null) { + return metaPrefix; + } + } + } catch (Throwable ignored) { + } + return ""; + } + private static MutableComponent buildFormattedName(ServerPlayer player) { String prefix = ""; try { diff --git a/src/main/java/org/examp/john/stealth/StealthStorage.java b/src/main/java/org/examp/john/stealth/StealthStorage.java index d26c9b7..c273f9f 100644 --- a/src/main/java/org/examp/john/stealth/StealthStorage.java +++ b/src/main/java/org/examp/john/stealth/StealthStorage.java @@ -3,7 +3,7 @@ package org.examp.john.stealth; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; -import org.examp.john.Localchat; +import org.examp.john.MSNexus; import java.io.IOException; import java.io.Reader; @@ -45,7 +45,7 @@ public class StealthStorage { } } } catch (IOException | JsonSyntaxException | IllegalArgumentException e) { - Localchat.magicModLog.warn("Не вдалося прочитати stealth.json: {}", e.getMessage()); + MSNexus.magicModLog.warn("Не вдалося прочитати stealth.json: {}", e.getMessage()); data = new HashMap<>(); } } @@ -78,7 +78,7 @@ public class StealthStorage { GSON.toJson(raw, writer); } } catch (IOException e) { - Localchat.magicModLog.error("Не вдалося зберегти stealth.json: {}", e.getMessage()); + MSNexus.magicModLog.error("Не вдалося зберегти stealth.json: {}", e.getMessage()); } } }