Complete config redesign and feature additions
🎨 Config Redesign: - Unified style for all config files with beautiful headers - Consistent color scheme using gradients throughout - Improved readability with proper sections and comments - Fixed color formatting issues ✨ New Features: - SkinsRestorer integration for custom skins support - Head emoji system (:head_nickname: and @head nickname) - Clear chat message configuration command (/clearchatconfig) - Enhanced custom commands with more examples - Improved emoji system with 200+ emojis 📝 Documentation: - Completely rewritten README.md with modern styling - Added comprehensive feature descriptions - Detailed command and permission tables - Configuration examples and usage guides - Professional formatting and structure 🔧 Technical Improvements: - Fixed compilation errors - Improved code organization - Better error handling - Enhanced compatibility All configs now follow consistent MiniMessage gradient styling!
This commit is contained in:
parent
e616667c78
commit
01d8c3a2e7
34 changed files with 2650 additions and 1563 deletions
|
|
@ -30,6 +30,8 @@ public final class LoChat extends JavaPlugin {
|
|||
private GradientModule gradientModule;
|
||||
private LibertyBansHook libertyBansHook;
|
||||
private MuteManager muteManager;
|
||||
private HeadEmojiManager headEmojiManager;
|
||||
private com.loki.lochat.integrations.SkinsRestorerHook skinsRestorerHook;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
|
|
@ -52,6 +54,10 @@ public final class LoChat extends JavaPlugin {
|
|||
chatManager = new ChatManager(this);
|
||||
autoMessageManager = new AutoMessageManager(this);
|
||||
|
||||
// Инициализация интеграций
|
||||
skinsRestorerHook = new com.loki.lochat.integrations.SkinsRestorerHook(this);
|
||||
headEmojiManager = new com.loki.lochat.managers.HeadEmojiManager(this);
|
||||
|
||||
// Инициализация модуля градиентов (интегрированный LoPreff)
|
||||
gradientModule = new GradientModule(this);
|
||||
if (gradientModule.init()) {
|
||||
|
|
@ -130,6 +136,14 @@ public final class LoChat extends JavaPlugin {
|
|||
MuteBlameCommand muteBlameCommand = new MuteBlameCommand(this);
|
||||
getCommand("lmuteblame").setExecutor(muteBlameCommand);
|
||||
getCommand("lmuteblame").setTabCompleter(muteBlameCommand);
|
||||
|
||||
// Команда настройки очистки чата
|
||||
ClearChatConfigCommand clearChatConfigCommand = new ClearChatConfigCommand(this);
|
||||
getCommand("clearchatconfig").setExecutor(clearChatConfigCommand);
|
||||
getCommand("clearchatconfig").setTabCompleter(clearChatConfigCommand);
|
||||
|
||||
// Внутренняя команда для информации об игроке
|
||||
getCommand("lochat").setExecutor(new PlayerInfoCommand(this));
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
|
|
@ -211,4 +225,12 @@ public final class LoChat extends JavaPlugin {
|
|||
return muteManager;
|
||||
}
|
||||
|
||||
public HeadEmojiManager getHeadEmojiManager() {
|
||||
return headEmojiManager;
|
||||
}
|
||||
|
||||
public com.loki.lochat.integrations.SkinsRestorerHook getSkinsRestorerHook() {
|
||||
return skinsRestorerHook;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,10 +25,11 @@ public class ClearChatCommand implements CommandExecutor {
|
|||
player.sendMessage("");
|
||||
}
|
||||
|
||||
// Уведомление
|
||||
player.sendMessage(ChatFormatter.parse(
|
||||
plugin.getMessageConfig().get("clearchat.cleared", "{player}", sender.getName())
|
||||
));
|
||||
// Уведомление (если включено)
|
||||
if (plugin.getConfigManager().isClearChatMessageEnabled()) {
|
||||
String message = plugin.getConfigManager().getClearChatMessage();
|
||||
player.sendMessage(ChatFormatter.parse(message.replace("{player}", sender.getName())));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,89 @@
|
|||
package com.loki.lochat.commands;
|
||||
|
||||
import com.loki.lochat.LoChat;
|
||||
import com.loki.lochat.utils.ChatFormatter;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Команда для настройки сообщения очистки чата
|
||||
* /clearchatconfig <enable|disable|message> [текст]
|
||||
*/
|
||||
public class ClearChatConfigCommand implements CommandExecutor, TabCompleter {
|
||||
|
||||
private final LoChat plugin;
|
||||
|
||||
public ClearChatConfigCommand(LoChat plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||
if (!sender.hasPermission("lochat.clearchat.config")) {
|
||||
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length == 0) {
|
||||
sender.sendMessage(ChatFormatter.parse("&6Использование:"));
|
||||
sender.sendMessage(ChatFormatter.parse("&e/clearchatconfig enable &7- включить сообщение"));
|
||||
sender.sendMessage(ChatFormatter.parse("&e/clearchatconfig disable &7- отключить сообщение"));
|
||||
sender.sendMessage(ChatFormatter.parse("&e/clearchatconfig message <текст> &7- установить сообщение"));
|
||||
sender.sendMessage(ChatFormatter.parse("&e/clearchatconfig status &7- показать статус"));
|
||||
return true;
|
||||
}
|
||||
|
||||
String action = args[0].toLowerCase();
|
||||
|
||||
switch (action) {
|
||||
case "enable" -> {
|
||||
plugin.getConfigManager().setClearChatMessageEnabled(true);
|
||||
sender.sendMessage(ChatFormatter.parse("&aСообщение очистки чата включено"));
|
||||
}
|
||||
case "disable" -> {
|
||||
plugin.getConfigManager().setClearChatMessageEnabled(false);
|
||||
sender.sendMessage(ChatFormatter.parse("&cСообщение очистки чата отключено"));
|
||||
}
|
||||
case "message" -> {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(ChatFormatter.parse("&cУкажите текст сообщения!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
|
||||
plugin.getConfigManager().setClearChatMessage(message);
|
||||
sender.sendMessage(ChatFormatter.parse("&aСообщение установлено: &f" + message));
|
||||
}
|
||||
case "status" -> {
|
||||
boolean enabled = plugin.getConfigManager().isClearChatMessageEnabled();
|
||||
String message = plugin.getConfigManager().getClearChatMessage();
|
||||
|
||||
sender.sendMessage(ChatFormatter.parse("&6Статус сообщения очистки чата:"));
|
||||
sender.sendMessage(ChatFormatter.parse("&eВключено: " + (enabled ? "&aДа" : "&cНет")));
|
||||
sender.sendMessage(ChatFormatter.parse("&eСообщение: &f" + message));
|
||||
}
|
||||
default -> {
|
||||
sender.sendMessage(ChatFormatter.parse("&cНеизвестная команда! Используйте: enable, disable, message, status"));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
|
||||
if (args.length == 1) {
|
||||
return Arrays.asList("enable", "disable", "message", "status").stream()
|
||||
.filter(s -> s.toLowerCase().startsWith(args[0].toLowerCase()))
|
||||
.toList();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
package com.loki.lochat.commands;
|
||||
|
||||
import com.loki.lochat.LoChat;
|
||||
import com.loki.lochat.utils.ChatFormatter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Команда для показа информации об игроке (используется при клике на голову)
|
||||
*/
|
||||
public class PlayerInfoCommand implements CommandExecutor {
|
||||
|
||||
private final LoChat plugin;
|
||||
|
||||
public PlayerInfoCommand(LoChat plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||
if (args.length < 2 || !args[0].equals("playerinfo")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
String targetName = args[1];
|
||||
Player target = Bukkit.getPlayer(targetName);
|
||||
|
||||
if (target == null || !target.isOnline()) {
|
||||
sender.sendMessage(ChatFormatter.parse("§cИгрок не найден или не в сети"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// Показываем информацию об игроке
|
||||
sender.sendMessage(ChatFormatter.parse("§6=== Информация об игроке ==="));
|
||||
sender.sendMessage(ChatFormatter.parse("§eИмя: §f" + target.getName()));
|
||||
sender.sendMessage(ChatFormatter.parse("§eОтображаемое имя: §f" + target.getDisplayName()));
|
||||
sender.sendMessage(ChatFormatter.parse("§eУровень: §f" + target.getLevel()));
|
||||
sender.sendMessage(ChatFormatter.parse("§eЗдоровье: §f" + Math.round(target.getHealth()) + "/20"));
|
||||
sender.sendMessage(ChatFormatter.parse("§eМир: §f" + target.getWorld().getName()));
|
||||
|
||||
// Если есть градиентный модуль, показываем градиентное имя
|
||||
if (plugin.getGradientModule() != null) {
|
||||
String gradientName = plugin.getGradientModule().getFormattedName(target);
|
||||
sender.sendMessage(ChatFormatter.parse("§eГрадиентное имя: " + gradientName));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -80,6 +80,17 @@ public class ConfigManager {
|
|||
config.set("automessages.random", false);
|
||||
}
|
||||
|
||||
if (!config.contains("clearchat.message.enabled")) {
|
||||
config.set("clearchat.message.enabled", true);
|
||||
config.set("clearchat.message.text", "CADFЧат очищен администратором {player}");
|
||||
}
|
||||
|
||||
if (!config.contains("head-emoji.enabled")) {
|
||||
config.set("head-emoji.enabled", true);
|
||||
config.set("head-emoji.allow-player-heads", true);
|
||||
config.set("head-emoji.max-heads-per-message", 3);
|
||||
}
|
||||
|
||||
if (!config.contains("lopreff.enabled")) {
|
||||
config.set("lopreff.enabled", true);
|
||||
config.set("lopreff.use-gradient-name", true);
|
||||
|
|
@ -223,6 +234,25 @@ public class ConfigManager {
|
|||
public String getFilterReplacement() {
|
||||
return config.getString("filter.replacement", "***");
|
||||
}
|
||||
|
||||
// Clear chat
|
||||
public boolean isClearChatMessageEnabled() {
|
||||
return config.getBoolean("clearchat.message.enabled", true);
|
||||
}
|
||||
|
||||
public void setClearChatMessageEnabled(boolean enabled) {
|
||||
config.set("clearchat.message.enabled", enabled);
|
||||
plugin.saveConfig();
|
||||
}
|
||||
|
||||
public String getClearChatMessage() {
|
||||
return config.getString("clearchat.message.text", "CADFЧат очищен администратором {player}");
|
||||
}
|
||||
|
||||
public void setClearChatMessage(String message) {
|
||||
config.set("clearchat.message.text", message);
|
||||
plugin.saveConfig();
|
||||
}
|
||||
|
||||
// Anti-spam
|
||||
public boolean isAntiSpamEnabled() {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,82 @@
|
|||
package com.loki.lochat.integrations;
|
||||
|
||||
import com.loki.lochat.LoChat;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/**
|
||||
* Интеграция с SkinsRestorer для получения скинов игроков
|
||||
* Использует рефлексию для совместимости без прямой зависимости
|
||||
*/
|
||||
public class SkinsRestorerHook {
|
||||
|
||||
private final LoChat plugin;
|
||||
private Object skinsAPI;
|
||||
private Method getSkinDataMethod;
|
||||
private boolean enabled = false;
|
||||
|
||||
public SkinsRestorerHook(LoChat plugin) {
|
||||
this.plugin = plugin;
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
try {
|
||||
Plugin skinsPlugin = Bukkit.getPluginManager().getPlugin("SkinsRestorer");
|
||||
if (skinsPlugin == null || !skinsPlugin.isEnabled()) {
|
||||
plugin.getLogger().info("SkinsRestorer не найден");
|
||||
return;
|
||||
}
|
||||
|
||||
// Пытаемся получить API через рефлексию
|
||||
Class<?> apiClass = Class.forName("net.skinsrestorer.api.SkinsRestorerAPI");
|
||||
Method getApiMethod = apiClass.getMethod("getApi");
|
||||
skinsAPI = getApiMethod.invoke(null);
|
||||
|
||||
getSkinDataMethod = skinsAPI.getClass().getMethod("getSkinData", String.class);
|
||||
|
||||
enabled = true;
|
||||
plugin.getLogger().info("SkinsRestorer подключен!");
|
||||
} catch (Exception e) {
|
||||
plugin.getLogger().info("SkinsRestorer не найден или несовместимая версия");
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает текстуру скина игрока
|
||||
* @param player игрок
|
||||
* @return URL текстуры или null
|
||||
*/
|
||||
public String getPlayerSkinTexture(Player player) {
|
||||
if (!enabled) return null;
|
||||
|
||||
try {
|
||||
Object property = getSkinDataMethod.invoke(skinsAPI, player.getName());
|
||||
if (property != null) {
|
||||
Method getValueMethod = property.getClass().getMethod("getValue");
|
||||
return (String) getValueMethod.invoke(property);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Игнорируем ошибки получения скина
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает URL головы игрока для отображения
|
||||
* @param playerName имя игрока
|
||||
* @return URL головы
|
||||
*/
|
||||
public String getPlayerHeadUrl(String playerName) {
|
||||
// Используем стандартные сервисы для получения голов
|
||||
return "https://minotar.net/helm/" + playerName + "/8.png";
|
||||
}
|
||||
}
|
||||
|
|
@ -98,6 +98,13 @@ public class ChatListener implements Listener {
|
|||
// ===== SPY =====
|
||||
plugin.getSpyManager().sendToSpies(player, processedMessage, isGlobal);
|
||||
|
||||
// ===== HEAD EMOJI =====
|
||||
// Обрабатываем головы игроков, если функция включена
|
||||
if (plugin.getHeadEmojiManager().isHeadEmojiEnabled() &&
|
||||
plugin.getHeadEmojiManager().canUseHeadEmoji(player)) {
|
||||
processedMessage = plugin.getHeadEmojiManager().processHeads(processedMessage, player);
|
||||
}
|
||||
|
||||
// ===== SEND =====
|
||||
if (isGlobal) {
|
||||
plugin.getChatManager().sendGlobalMessage(player, processedMessage);
|
||||
|
|
|
|||
193
src/main/java/com/loki/lochat/managers/HeadEmojiManager.java
Normal file
193
src/main/java/com/loki/lochat/managers/HeadEmojiManager.java
Normal file
|
|
@ -0,0 +1,193 @@
|
|||
package com.loki.lochat.managers;
|
||||
|
||||
import com.loki.lochat.LoChat;
|
||||
import com.loki.lochat.integrations.SkinsRestorerHook;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Менеджер для обработки голов игроков в чате
|
||||
* Поддерживает рисование головы из смайликов и отправку голов игроков
|
||||
*/
|
||||
public class HeadEmojiManager {
|
||||
|
||||
private final LoChat plugin;
|
||||
private final SkinsRestorerHook skinsHook;
|
||||
|
||||
// Паттерны для поиска голов игроков
|
||||
private static final Pattern HEAD_PATTERN = Pattern.compile(":head_([a-zA-Z0-9_]{3,16}):");
|
||||
private static final Pattern PLAYER_HEAD_PATTERN = Pattern.compile("@head\\s+([a-zA-Z0-9_]{3,16})");
|
||||
|
||||
// ASCII арт для головы игрока (8x8 пикселей)
|
||||
private static final String[] HEAD_TEMPLATE = {
|
||||
"████████",
|
||||
"██░░░░██",
|
||||
"██░██░██",
|
||||
"██░░░░██",
|
||||
"██░██░██",
|
||||
"██░░░░██",
|
||||
"██████████",
|
||||
"████████"
|
||||
};
|
||||
|
||||
public HeadEmojiManager(LoChat plugin) {
|
||||
this.plugin = plugin;
|
||||
this.skinsHook = new SkinsRestorerHook(plugin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Обрабатывает сообщение и заменяет головы игроков
|
||||
*/
|
||||
public Component processHeads(Component message, Player sender) {
|
||||
String plainText = net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText().serialize(message);
|
||||
|
||||
// Обрабатываем :head_nickname:
|
||||
plainText = processHeadEmojis(plainText);
|
||||
|
||||
// Обрабатываем @head nickname
|
||||
plainText = processPlayerHeadCommands(plainText, sender);
|
||||
|
||||
return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(plainText);
|
||||
}
|
||||
|
||||
/**
|
||||
* Обрабатывает :head_nickname: паттерны
|
||||
*/
|
||||
private String processHeadEmojis(String message) {
|
||||
Matcher matcher = HEAD_PATTERN.matcher(message);
|
||||
StringBuffer result = new StringBuffer();
|
||||
|
||||
while (matcher.find()) {
|
||||
String playerName = matcher.group(1);
|
||||
Player target = Bukkit.getPlayer(playerName);
|
||||
|
||||
if (target != null && target.isOnline()) {
|
||||
String headEmoji = generateHeadEmoji(target);
|
||||
matcher.appendReplacement(result, headEmoji);
|
||||
} else {
|
||||
// Если игрок не найден, оставляем как есть
|
||||
matcher.appendReplacement(result, matcher.group(0));
|
||||
}
|
||||
}
|
||||
matcher.appendTail(result);
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Обрабатывает @head nickname команды
|
||||
*/
|
||||
private String processPlayerHeadCommands(String message, Player sender) {
|
||||
Matcher matcher = PLAYER_HEAD_PATTERN.matcher(message);
|
||||
StringBuffer result = new StringBuffer();
|
||||
|
||||
while (matcher.find()) {
|
||||
String playerName = matcher.group(1);
|
||||
Player target = Bukkit.getPlayer(playerName);
|
||||
|
||||
if (target != null && target.isOnline()) {
|
||||
String headDisplay = createClickableHead(target, sender);
|
||||
matcher.appendReplacement(result, headDisplay);
|
||||
} else {
|
||||
// Если игрок не найден, показываем ошибку
|
||||
matcher.appendReplacement(result, "§c[Игрок " + playerName + " не найден]");
|
||||
}
|
||||
}
|
||||
matcher.appendTail(result);
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Генерирует ASCII арт головы игрока
|
||||
*/
|
||||
private String generateHeadEmoji(Player player) {
|
||||
// Получаем доминирующий цвет скина (упрощенная версия)
|
||||
String skinColor = getSkinColor(player);
|
||||
String hairColor = getHairColor(player);
|
||||
|
||||
StringBuilder head = new StringBuilder();
|
||||
head.append("§8[§r"); // Начало рамки
|
||||
|
||||
// Генерируем упрощенную голову 3x3
|
||||
head.append(hairColor).append("███§r");
|
||||
head.append(skinColor).append("█").append("§0█").append(skinColor).append("█§r"); // Глаза
|
||||
head.append(skinColor).append("███§r");
|
||||
|
||||
head.append("§8]§r"); // Конец рамки
|
||||
|
||||
return head.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Создает кликабельную голову игрока
|
||||
*/
|
||||
private String createClickableHead(Player target, Player sender) {
|
||||
String headUrl = skinsHook.getPlayerHeadUrl(target.getName());
|
||||
|
||||
// Создаем компонент с hover и click событиями
|
||||
return "§6[§e" + target.getName() + " Head§6]§r";
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает цвет скина игрока (упрощенная версия)
|
||||
*/
|
||||
private String getSkinColor(Player player) {
|
||||
// В реальной реализации здесь был бы анализ текстуры скина
|
||||
// Для демонстрации используем случайные цвета
|
||||
String[] skinColors = {"§f", "§7", "§6", "§c", "§e"};
|
||||
return skinColors[player.getName().hashCode() % skinColors.length];
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает цвет волос игрока (упрощенная версия)
|
||||
*/
|
||||
private String getHairColor(Player player) {
|
||||
// В реальной реализации здесь был бы анализ текстуры скина
|
||||
String[] hairColors = {"§0", "§8", "§6", "§c", "§e", "§a"};
|
||||
return hairColors[(player.getName().hashCode() + 1) % hairColors.length];
|
||||
}
|
||||
|
||||
/**
|
||||
* Создает Component с hover эффектом для головы игрока
|
||||
*/
|
||||
public Component createHeadComponent(Player target) {
|
||||
String headUrl = skinsHook.getPlayerHeadUrl(target.getName());
|
||||
|
||||
Component headText = Component.text("[" + target.getName() + " Head]")
|
||||
.color(NamedTextColor.GOLD)
|
||||
.hoverEvent(HoverEvent.showText(
|
||||
Component.text("Голова игрока: " + target.getName())
|
||||
.color(NamedTextColor.YELLOW)
|
||||
.append(Component.newline())
|
||||
.append(Component.text("Нажмите, чтобы получить информацию")
|
||||
.color(NamedTextColor.GRAY))
|
||||
))
|
||||
.clickEvent(ClickEvent.runCommand("/lochat playerinfo " + target.getName()));
|
||||
|
||||
return headText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, включена ли функция голов игроков
|
||||
*/
|
||||
public boolean isHeadEmojiEnabled() {
|
||||
return plugin.getConfigManager().getBoolean("head-emoji.enabled", true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, может ли игрок использовать головы
|
||||
*/
|
||||
public boolean canUseHeadEmoji(Player player) {
|
||||
return player.hasPermission("lochat.heademoji.use");
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue