feat: add LuckPerms support to chat handler

This commit is contained in:
2026-08-09 15:28:32 +02:00
parent 4de15842e7
commit 896ec668eb
6 changed files with 106 additions and 14 deletions
+10 -4
View File
@@ -26,17 +26,23 @@ fabricApi {
client = true client = true
} }
} }
repositories { repositories {
mavenCentral()
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
maven {
name = "luckperms"
url = "https://repo.luckperms.net/"
}
} }
dependencies { dependencies {
minecraft "com.mojang:minecraft:${project.minecraft_version}" minecraft "com.mojang:minecraft:${project.minecraft_version}"
implementation "net.fabricmc:fabric-loader:${project.loader_version}" implementation "net.fabricmc:fabric-loader:${project.loader_version}"
implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
compileOnly "net.luckperms:api:5.4"
} }
processResources { processResources {
inputs.property "version", project.version inputs.property "version", project.version
inputs.property "minecraft_version", project.minecraft_version inputs.property "minecraft_version", project.minecraft_version
@@ -0,0 +1,14 @@
{
"required": true,
"minVersion": "0.8",
"package": "org.examp.john.mixin.client",
"compatibilityLevel": "JAVA_25",
"client": [
],
"injectors": {
"defaultRequire": 1
},
"overwrites": {
"requireAnnotations": true
}
}
+35
View File
@@ -0,0 +1,35 @@
{
"schemaVersion": 1,
"id": "localchat",
"version": "${version}",
"name": "localchat",
"description": "",
"authors": [],
"contact": {},
"license": "All-Rights-Reserved",
"icon": "assets/localchat/icon.png",
"environment": "*",
"entrypoints": {
"fabric-datagen": [
"org.examp.john.client.LocalchatDataGenerator"
],
"client": [
"org.examp.john.client.LocalchatClient"
],
"main": [
"org.examp.john.Localchat"
]
},
"mixins": [
"localchat.mixins.json",
{
"config": "localchat.client.mixins.json",
"environment": "client"
}
],
"depends": {
"fabricloader": ">=${loader_version}",
"fabric-api": "*",
"minecraft": "${minecraft_version}"
}
}
@@ -0,0 +1,14 @@
{
"required": true,
"minVersion": "0.8",
"package": "org.examp.john.mixin",
"compatibilityLevel": "JAVA_25",
"mixins": [
],
"injectors": {
"defaultRequire": 1
},
"overwrites": {
"requireAnnotations": true
}
}
+32 -9
View File
@@ -1,19 +1,23 @@
package org.examp.john; package org.examp.john;
import net.fabricmc.fabric.api.message.v1.ServerMessageEvents; import net.fabricmc.fabric.api.message.v1.ServerMessageEvents;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import net.luckperms.api.model.user.User;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import java.util.List; import java.util.List;
public class ChatHandler { public class ChatHandler {
public static void register() {
public static void register() {
final String prefix = "!"; final String prefix = "!";
final float LOCAL_CHAT_RADIUS = 50; final float LOCAL_CHAT_RADIUS = 100;
ServerMessageEvents.ALLOW_CHAT_MESSAGE.register((message, sender, params) -> { ServerMessageEvents.ALLOW_CHAT_MESSAGE.register((message, sender, params) -> {
String text = message.signedContent(); String text = message.signedContent();
@@ -21,20 +25,39 @@ public class ChatHandler {
ServerLevel serverLevel = sender.level(); ServerLevel serverLevel = sender.level();
MinecraftServer server = serverLevel.getServer(); MinecraftServer server = serverLevel.getServer();
List<ServerPlayer> players = server.getPlayerList().getPlayers(); List<ServerPlayer> players = server.getPlayerList().getPlayers();
String nickmane = sender.getDisplayName().getString();
if (text.startsWith(prefix)) {
String playerPrefix = "";
try {
LuckPerms luckPerms = LuckPermsProvider.get();
User user = luckPerms.getUserManager().getUser(sender.getUUID());
if (user != null) {
String metaPrefix = user.getCachedData().getMetaData().getPrefix();
if (metaPrefix != null) {
playerPrefix = metaPrefix;
}
}
} catch (Throwable ignored) {
}
MutableComponent formattedPrefix = Component.literal(playerPrefix.replace("&", "§"));
MutableComponent formattedName = Component.empty()
.append(formattedPrefix)
.append(sender.getDisplayName());
if (text.startsWith(prefix)) {
String actualMessage = text.substring(1).trim(); String actualMessage = text.substring(1).trim();
Component globalMessage = Component.literal(nickmane + ": " + actualMessage); Component globalMessage = Component.empty()
.append(formattedName)
.append(Component.literal(": " + actualMessage));
for (ServerPlayer player : players) { for (ServerPlayer player : players) {
player.sendSystemMessage(globalMessage); player.sendSystemMessage(globalMessage);
} }
} else { } else {
Component localMessage = Component.empty()
Component localMessage = Component.literal(nickmane + ": ") .append(formattedName)
.append(Component.literal(text)).withStyle(ChatFormatting.GRAY); .append(Component.literal(": " + text).withStyle(ChatFormatting.GRAY));
for (ServerPlayer player : players) { for (ServerPlayer player : players) {
if (player.level() == serverLevel && player.distanceTo(sender) <= LOCAL_CHAT_RADIUS) { if (player.level() == serverLevel && player.distanceTo(sender) <= LOCAL_CHAT_RADIUS) {
+1 -1
View File
@@ -13,4 +13,4 @@ public class Localchat implements ModInitializer {
// Тепер ChatHandler викликається з того ж пакета без помилок імпорту // Тепер ChatHandler викликається з того ж пакета без помилок імпорту
ChatHandler.register(); ChatHandler.register();
} }
} }