fix: repair chat code and add **text** italic formatting to chat
This commit is contained in:
@@ -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(),
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user