fix: repair chat code and add **text** italic formatting to chat

This commit is contained in:
2026-10-03 19:23:21 +02:00
parent 64bd3141dc
commit dc4da670ee
3 changed files with 56 additions and 6 deletions
+1 -1
View File
@@ -65,7 +65,7 @@ public class AntiAbuse {
double spread = Math.max(b[1] - b[0], b[3] - b[2]); double spread = Math.max(b[1] - b[0], b[3] - b[2]);
if (spread > DISTANCE_THRESHOLD) { if (spread > DISTANCE_THRESHOLD) {
Localchat.magicModLog.warn( MSNexus.magicModLog.warn(
"[ANTI-ABUSE] Гравець {} ймовірно шукає інших: " "[ANTI-ABUSE] Гравець {} ймовірно шукає інших: "
+ "'{}' ×{} разів, переміщення ~{} блоків", + "'{}' ×{} разів, переміщення ~{} блоків",
player.getName().getString(), player.getName().getString(),
+52 -2
View File
@@ -5,8 +5,11 @@ import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.LuckPermsProvider;
import net.luckperms.api.model.user.User; import net.luckperms.api.model.user.User;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.HoverEvent;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import org.examp.john.stealth.StealthStorage; import org.examp.john.stealth.StealthStorage;
@@ -32,7 +35,7 @@ public class ChatHandler {
Component globalMessage = Component.empty() Component globalMessage = Component.empty()
.append(formattedName) .append(formattedName)
.append(Component.literal(": ")) .append(Component.literal(": "))
.append(buildMentionMessage(actualMessage, players)); .append(buildFormattedMessage(actualMessage, players));
for (ServerPlayer player : players) { for (ServerPlayer player : players) {
player.sendSystemMessage(globalMessage); player.sendSystemMessage(globalMessage);
@@ -65,7 +68,7 @@ public class ChatHandler {
Component localMessage = Component.empty() Component localMessage = Component.empty()
.append(formattedName) .append(formattedName)
.append(Component.literal(": ").withStyle(ChatFormatting.GRAY)) .append(Component.literal(": ").withStyle(ChatFormatting.GRAY))
.append(buildMentionMessage(text, players).withStyle(ChatFormatting.GRAY)); .append(buildFormattedMessage(text, players).withStyle(ChatFormatting.GRAY));
sender.sendSystemMessage(localMessage); sender.sendSystemMessage(localMessage);
for (ServerPlayer hearer : hearers) { for (ServerPlayer hearer : hearers) {
@@ -87,6 +90,38 @@ public class ChatHandler {
}); });
} }
/**
* Парсить текст між ** і робить його курсивом, поєднуючи з підсвіткою згадок гравців.
* Приклад: "привіт **світе** як справи?" -> "привіт [курсив]світе[/курсив] як справи?"
*/
private static MutableComponent buildFormattedMessage(String text, List<ServerPlayer> 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<ServerPlayer> 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<ServerPlayer> onlinePlayers) { private static MutableComponent buildMentionMessage(String text, List<ServerPlayer> onlinePlayers) {
List<ServerPlayer> sorted = onlinePlayers.stream() List<ServerPlayer> sorted = onlinePlayers.stream()
.sorted(Comparator.comparingInt((ServerPlayer p) -> p.getName().getString().length()).reversed()) .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) { private static MutableComponent buildFormattedName(ServerPlayer player) {
String prefix = ""; String prefix = "";
try { try {
@@ -3,7 +3,7 @@ package org.examp.john.stealth;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException; import com.google.gson.JsonSyntaxException;
import org.examp.john.Localchat; import org.examp.john.MSNexus;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
@@ -45,7 +45,7 @@ public class StealthStorage {
} }
} }
} catch (IOException | JsonSyntaxException | IllegalArgumentException e) { } catch (IOException | JsonSyntaxException | IllegalArgumentException e) {
Localchat.magicModLog.warn("Не вдалося прочитати stealth.json: {}", e.getMessage()); MSNexus.magicModLog.warn("Не вдалося прочитати stealth.json: {}", e.getMessage());
data = new HashMap<>(); data = new HashMap<>();
} }
} }
@@ -78,7 +78,7 @@ public class StealthStorage {
GSON.toJson(raw, writer); GSON.toJson(raw, writer);
} }
} catch (IOException e) { } catch (IOException e) {
Localchat.magicModLog.error("Не вдалося зберегти stealth.json: {}", e.getMessage()); MSNexus.magicModLog.error("Не вдалося зберегти stealth.json: {}", e.getMessage());
} }
} }
} }