package com.loki.lochat.utils; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.entity.Player; import java.util.UUID; /** * Утилиты для работы с игроками */ public final class PlayerUtil { private PlayerUtil() { } /** * Safely parses a sound name from config. * Uses Registry API for modern sound parsing with fallback to reflection. * * @param soundName the sound name to parse * @param defaultSound the default sound to return if parsing fails * @return the parsed Sound or the default if invalid */ public static Sound parseSound(String soundName, Sound defaultSound) { if (soundName == null || soundName.isEmpty()) { return defaultSound; } try { // Try to get sound by key using Registry (modern way) Sound sound = org.bukkit.Registry.SOUNDS.match(soundName); if (sound != null) { return sound; } } catch (Exception e) { // Registry failed, try fallback } // Fallback: try direct field access via reflection try { java.lang.reflect.Field field = Sound.class.getField(soundName.toUpperCase().trim()); return (Sound) field.get(null); } catch (Exception ex) { return defaultSound; } } /** * Находит игрока по имени (онлайн или оффлайн) * * @param name имя игрока * @return UUID игрока или null если не найден */ public static UUID findPlayerUUID(String name) { // Сначала ищем онлайн игрока Player onlinePlayer = Bukkit.getPlayer(name); if (onlinePlayer != null) { return onlinePlayer.getUniqueId(); } // Затем ищем оффлайн игрока OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name); if (offlinePlayer.hasPlayedBefore() || offlinePlayer.isOnline()) { return offlinePlayer.getUniqueId(); } return null; } /** * Проверяет, существует ли игрок (играл на сервере) * * @param name имя игрока * @return true если игрок существует */ public static boolean playerExists(String name) { return findPlayerUUID(name) != null; } /** * Получает имя игрока по UUID * * @param uuid UUID игрока * @return имя игрока или null */ public static String getPlayerName(UUID uuid) { Player onlinePlayer = Bukkit.getPlayer(uuid); if (onlinePlayer != null) { return onlinePlayer.getName(); } OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); return offlinePlayer.getName(); } /** * Проверяет, онлайн ли игрок * * @param uuid UUID игрока * @return true если игрок онлайн */ public static boolean isPlayerOnline(UUID uuid) { Player player = Bukkit.getPlayer(uuid); return player != null && player.isOnline(); } }