Update CustomDiscs.java

Ru:удаление проверки paper
En:deleting the paper check
This commit is contained in:
kavarobot3
2025-08-15 20:47:46 +03:00
committed by GitHub
parent a86dea30f0
commit 30fdc0f221

View File

@@ -31,260 +31,393 @@ import java.util.logging.Level;
import java.util.logging.Logger;
public final class CustomDiscs extends JavaPlugin {
static CustomDiscs instance;
// RU: Статическая переменная для хранения экземпляра плагина
// EN: Static variable to store the plugin instance
static CustomDiscs instance;
@Nullable
private VoicePlugin voicechatPlugin;
private Logger pluginLogger;
// RU: Плагин голосового чата (может быть null)
// EN: Voice chat plugin (can be null)
@Nullable
private VoicePlugin voicechatPlugin;
// RU: Логгер плагина
// EN: Plugin logger
private Logger pluginLogger;
// RU: Режим отладки
// EN: Debug mode
private static boolean debugMode = false;
public static YamlConfiguration LANG;
public static File LANG_FILE;
public static boolean musicDiscEnable = true;
public static boolean musicDiscPlayingEnable = true;
public float musicDiscDistance;
public float musicDiscMaxDistance;
public float musicDiscVolume;
public static boolean customHornEnable = true;
public static boolean customHornPlayingEnable = true;
public float customHornDistance;
public float customHornMaxDistance;
public int hornCooldown;
public int hornMaxCooldown;
public static boolean customHeadEnable = true;
public static boolean customHeadPlayingEnable = true;
public float customHeadDistance;
public float customHeadMaxDistance;
@Override
public void onLoad() {
CustomDiscs.instance = this;
CommandAPI.onLoad(new CommandAPIBukkitConfig(this).verboseOutput(true));
//To get CommandAPI working on newer MC Release - for development
//CommandAPI.onLoad(new CommandAPIBukkitConfig(this).verboseOutput(true).beLenientForMinorVersions(true));
new CustomDiscCommand(this).register("customdiscs");
}
// RU: Конфигурация файла lang.yml
// EN: Configuration for lang.yml file
public static YamlConfiguration LANG;
@Override
public void onEnable() {
pluginLogger = getLogger();
// RU: Файл lang.yml
// EN: lang.yml file
public static File LANG_FILE;
CommandAPI.onEnable();
// RU: Включение музыкальных дисков
// EN: Enable music discs
public static boolean musicDiscEnable = true;
BukkitVoicechatService service = getServer().getServicesManager().load(BukkitVoicechatService.class);
// RU: Включение проигрывания музыкальных дисков
// EN: Enable music disc playing
public static boolean musicDiscPlayingEnable = true;
this.saveDefaultConfig();
loadLang();
// RU: Дистанция слышимости музыкальных дисков
// EN: Music disc hearing distance
public float musicDiscDistance;
// Config initializer section
debugMode = getConfig().getBoolean("debugMode", false);
musicDiscEnable = getConfig().getBoolean("music-disc-enable");
musicDiscPlayingEnable = getConfig().getBoolean("music-disc-playing-enable");
musicDiscDistance = getConfig().getInt("music-disc-distance");
musicDiscMaxDistance = getConfig().getInt("music-disc-max-distance");
musicDiscVolume = Float.parseFloat(Objects.requireNonNull(getConfig().getString("music-disc-volume")));
customHornEnable = getConfig().getBoolean("custom-horn-enable");
customHornPlayingEnable = getConfig().getBoolean("custom-horn-playing-enable");
customHornDistance = getConfig().getInt("custom-horn-distance");
customHornMaxDistance = getConfig().getInt("custom-horn-max-distance");
hornCooldown = getConfig().getInt("horn-cooldown");
hornMaxCooldown = getConfig().getInt("horn-max-cooldown");
customHeadEnable = getConfig().getBoolean("custom-head-enable");
customHeadPlayingEnable = getConfig().getBoolean("custom-head-playing-enable");
customHeadDistance = getConfig().getInt("custom-head-distance");
customHeadMaxDistance = getConfig().getInt("custom-head-max-distance");
// RU: Максимальная дистанция слышимости музыкальных дисков
// EN: Maximum music disc hearing distance
public float musicDiscMaxDistance;
// Checking server version and display console message in case the server is not supported
ServerVersionChecker serverVersionChecker = new ServerVersionChecker(this);
serverVersionChecker.checkVersion();
// RU: Громкость музыкальных дисков
// EN: Music disc volume
public float musicDiscVolume;
File musicData = new File(this.getDataFolder(), "musicdata");
if (!(musicData.exists())) {
musicData.mkdirs();
}
// RU: Включение кастомных горнов
// EN: Enable custom horns
public static boolean customHornEnable = true;
if (service != null) {
voicechatPlugin = new VoicePlugin();
service.registerPlugin(voicechatPlugin);
pluginLogger.info("Successfully registered CustomDiscs plugin");
} else {
pluginLogger.info("Failed to register CustomDiscs plugin");
}
// RU: Включение проигрывания кастомных горнов
// EN: Enable custom horn playing
public static boolean customHornPlayingEnable = true;
if (isMusicDiscEnable()) {
getServer().getPluginManager().registerEvents(new JukeBox(), this);
getServer().getPluginManager().registerEvents(new HopperManager(), this);
}
if (isCustomHeadEnable()) { getServer().getPluginManager().registerEvents(new HeadPlay(), this); }
if (isCustomHornEnable()) { getServer().getPluginManager().registerEvents(new HornPlay(), this); }
// RU: Дистанция слышимости кастомных горнов
// EN: Custom horn hearing distance
public float customHornDistance;
// To avoid any "0" values, set it to 1.
if (hornCooldown <= 0) {
hornCooldown = 1;
}
if (hornMaxCooldown <= 0) {
hornMaxCooldown = 1;
}
// RU: Максимальная дистанция слышимости кастомных горнов
// EN: Maximum custom horn hearing distance
public float customHornMaxDistance;
ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
protocolManager.addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL, PacketType.Play.Server.WORLD_EVENT) {
@Override
public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket();
// RU: Кулдаун горна
// EN: Horn cooldown
public int hornCooldown;
if (packet.getIntegers().read(0).toString().equals("1010")) {
if (!isMusicDiscEnable()) { return; }
Jukebox jukebox = (Jukebox) packet.getBlockPositionModifier().read(0).toLocation(event.getPlayer().getWorld()).getBlock().getState();
// RU: Максимальный кулдаун горна
// EN: Maximum horn cooldown
public int hornMaxCooldown;
if (!jukebox.getRecord().hasItemMeta()) return;
// RU: Включение кастомных голов
// EN: Enable custom heads
public static boolean customHeadEnable = true;
if (jukebox.getRecord().getItemMeta().getPersistentDataContainer().has(new NamespacedKey(this.plugin, "customdisc"), PersistentDataType.STRING)) {
event.setCancelled(true);
}
// RU: Включение проигрывания кастомных голов
// EN: Enable custom head playing
public static boolean customHeadPlayingEnable = true;
//Start the jukebox state manager.
//This keeps the jukebox powered while custom song is playing,
//which perfectly emulates the vanilla behavior of discs.
JukeboxStateManager.start(jukebox);
}
}
});
// RU: Дистанция слышимости кастомных голов
// EN: Custom head hearing distance
public float customHeadDistance;
}
// RU: Максимальная дистанция слышимости кастомных голов
// EN: Maximum custom head hearing distance
public float customHeadMaxDistance;
@Override
public void onDisable() {
CommandAPI.onDisable();
if (voicechatPlugin != null) {
getServer().getServicesManager().unregister(voicechatPlugin);
pluginLogger.info("Successfully unregistered CustomDiscs plugin");
}
}
@Override
public void onLoad() {
// RU: Сохранение экземпляра плагина
// EN: Store the plugin instance
CustomDiscs.instance = this;
public static CustomDiscs getInstance() {
return instance;
}
// RU: Инициализация CommandAPI с подробным выводом
// EN: Initialize CommandAPI with verbose output
CommandAPI.onLoad(new CommandAPIBukkitConfig(this).verboseOutput(true));
/**
* Load the lang.yml file.
*/
public void loadLang() {
File lang = new File(getDataFolder(), "lang.yml");
if (!lang.exists()) {
try {
getDataFolder().mkdir();
lang.createNewFile();
InputStream defConfigStream = this.getResource("lang.yml");
if (defConfigStream != null) {
copyInputStreamToFile(defConfigStream, lang);
YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(lang);
defConfig.save(lang);
Lang.setFile(defConfig);
}
} catch (IOException e) {
pluginLogger.severe("Failed to create lang.yml for CustomDiscs.");
pluginLogger.severe("Now disabling...");
this.setEnabled(false); // Without it loaded, we can't send them messages
if (isDebugMode()) {
pluginLogger.log(Level.SEVERE, "Exception output: ", e);
}
}
}
YamlConfiguration conf = YamlConfiguration.loadConfiguration(lang);
for (Lang item : Lang.values()) {
if (conf.getString(item.getPath()) == null) {
conf.set(item.getPath(), item.getDefault());
}
}
Lang.setFile(conf);
LANG = conf;
LANG_FILE = lang;
try {
conf.save(getLangFile());
} catch (IOException e) {
pluginLogger.warning("Failed to save lang.yml for CustomDiscs");
pluginLogger.warning("Now disabling...");
if (isDebugMode()) {
pluginLogger.log(Level.SEVERE, "Exception output: ", e);
}
}
}
// RU: Регистрация команды /customdiscs
// EN: Register the /customdiscs command
new CustomDiscCommand(this).register("customdiscs");
}
/**
* Gets the lang.yml config.
*
* @return The lang.yml config.
*/
public YamlConfiguration getLang() {
return LANG;
}
@Override
public void onEnable() {
// RU: Инициализация логгера
// EN: Initialize the logger
pluginLogger = getLogger();
/**
* Get the lang.yml file.
*
* @return The lang.yml file.
*/
public File getLangFile() {
return LANG_FILE;
}
// RU: Включение CommandAPI
// EN: Enable CommandAPI
CommandAPI.onEnable();
public static void copyInputStreamToFile(InputStream input, File file) {
// RU: Загрузка сервиса голосового чата
// EN: Load the voice chat service
BukkitVoicechatService service = getServer().getServicesManager().load(BukkitVoicechatService.class);
try (OutputStream output = new FileOutputStream(file)) {
input.transferTo(output);
} catch (IOException ioException) {
if (isDebugMode()) {
CustomDiscs.getInstance().getLogger().log(Level.SEVERE, "Exception output: ", ioException);
}
}
// RU: Сохранение конфигурации по умолчанию
// EN: Save default configuration
this.saveDefaultConfig();
}
// RU: Загрузка файла lang.yml
// EN: Load the lang.yml file
loadLang();
/**
* Get the debugMode configuration.
*
* @return The boolean value of debugMode.
*/
public static boolean isDebugMode() { return debugMode; }
// RU: Инициализация настроек из конфига
// EN: Initialize settings from config
debugMode = getConfig().getBoolean("debugMode", false);
musicDiscEnable = getConfig().getBoolean("music-disc-enable");
musicDiscPlayingEnable = getConfig().getBoolean("music-disc-playing-enable");
musicDiscDistance = getConfig().getInt("music-disc-distance");
musicDiscMaxDistance = getConfig().getInt("music-disc-max-distance");
musicDiscVolume = Float.parseFloat(Objects.requireNonNull(getConfig().getString("music-disc-volume")));
customHornEnable = getConfig().getBoolean("custom-horn-enable");
customHornPlayingEnable = getConfig().getBoolean("custom-horn-playing-enable");
customHornDistance = getConfig().getInt("custom-horn-distance");
customHornMaxDistance = getConfig().getInt("custom-horn-max-distance");
hornCooldown = getConfig().getInt("horn-cooldown");
hornMaxCooldown = getConfig().getInt("horn-max-cooldown");
customHeadEnable = getConfig().getBoolean("custom-head-enable");
customHeadPlayingEnable = getConfig().getBoolean("custom-head-playing-enable");
customHeadDistance = getConfig().getInt("custom-head-distance");
customHeadMaxDistance = getConfig().getInt("custom-head-max-distance");
/**
* Get the musicDiscPlayingEnable configuration.
*
* @return The boolean value of musicDiscPlayingEnable.
*/
public static boolean isMusicDiscEnable() { return musicDiscEnable; }
// RU: Создание папки musicdata, если она не существует
// EN: Create the musicdata folder if it doesn't exist
File musicData = new File(this.getDataFolder(), "musicdata");
if (!(musicData.exists())) {
musicData.mkdirs();
}
/**
* Get the customHornPlayingEnable configuration.
*
* @return The boolean value of customHornPlayingEnable.
*/
public static boolean isCustomHornEnable() { return customHornEnable; }
// RU: Регистрация плагина для голосового чата
// EN: Register the plugin for voice chat
if (service != null) {
voicechatPlugin = new VoicePlugin();
service.registerPlugin(voicechatPlugin);
pluginLogger.info("Плагин CustomDiscs успешно зарегистрирован / CustomDiscs plugin successfully registered");
} else {
pluginLogger.info("Не удалось зарегистрировать плагин CustomDiscs / Failed to register CustomDiscs plugin");
}
/**
* Get the customHeadPlayingEnable configuration.
*
* @return The boolean value of customHeadPlayingEnable.
*/
public static boolean isCustomHeadEnable() { return customHeadEnable; }
// RU: Регистрация событий для музыкальных дисков
// EN: Register events for music discs
if (isMusicDiscEnable()) {
getServer().getPluginManager().registerEvents(new JukeBox(), this);
getServer().getPluginManager().registerEvents(new HopperManager(), this);
}
/**
* Get the musicDiscPlayingEnable configuration.
*
* @return The boolean value of musicDiscPlayingEnable.
*/
public static boolean isMusicDiscPlayingEnable() { return musicDiscPlayingEnable; }
// RU: Регистрация событий для кастомных голов
// EN: Register events for custom heads
if (isCustomHeadEnable()) {
getServer().getPluginManager().registerEvents(new HeadPlay(), this);
}
/**
* Get the customHornPlayingEnable configuration.
*
* @return The boolean value of customHornPlayingEnable.
*/
public static boolean isCustomHornPlayingEnable() { return customHornPlayingEnable; }
// RU: Регистрация событий для кастомных горнов
// EN: Register events for custom horns
if (isCustomHornEnable()) {
getServer().getPluginManager().registerEvents(new HornPlay(), this);
}
/**
* Get the customHeadPlayingEnable configuration.
*
* @return The boolean value of customHeadPlayingEnable.
*/
public static boolean isCustomHeadPlayingEnable() { return customHeadPlayingEnable; }
// RU: Установка минимального кулдауна для горнов
// EN: Set minimum cooldown for horns
if (hornCooldown <= 0) {
hornCooldown = 1;
}
if (hornMaxCooldown <= 0) {
hornMaxCooldown = 1;
}
// RU: Настройка ProtocolLib для обработки пакетов
// EN: Set up ProtocolLib for packet handling
ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
protocolManager.addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL, PacketType.Play.Server.WORLD_EVENT) {
@Override
public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket();
// RU: Проверка пакета для события проигрывания диска
// EN: Check packet for disc playback event
if (packet.getIntegers().read(0).toString().equals("1010")) {
if (!isMusicDiscEnable()) { return; }
Jukebox jukebox = (Jukebox) packet.getBlockPositionModifier().read(0).toLocation(event.getPlayer().getWorld()).getBlock().getState();
if (!jukebox.getRecord().hasItemMeta()) return;
// RU: Проверка, является ли диск кастомным
// EN: Check if the disc is custom
if (jukebox.getRecord().getItemMeta().getPersistentDataContainer().has(new NamespacedKey(this.plugin, "customdisc"), PersistentDataType.STRING)) {
event.setCancelled(true);
}
// RU: Запуск менеджера состояния проигрывателя
// EN: Start the jukebox state manager
JukeboxStateManager.start(jukebox);
}
}
});
}
@Override
public void onDisable() {
// RU: Отключение CommandAPI
// EN: Disable CommandAPI
CommandAPI.onDisable();
// RU: Отмена регистрации плагина голосового чата
// EN: Unregister the voice chat plugin
if (voicechatPlugin != null) {
getServer().getServicesManager().unregister(voicechatPlugin);
pluginLogger.info("Плагин CustomDiscs успешно отключен / CustomDiscs plugin successfully unregistered");
}
}
// RU: Получение экземпляра плагина
// EN: Get the plugin instance
public static CustomDiscs getInstance() {
return instance;
}
/**
* RU: Загрузка файла lang.yml
* EN: Load the lang.yml file
*/
public void loadLang() {
File lang = new File(getDataFolder(), "lang.yml");
if (!lang.exists()) {
try {
// RU: Создание папки и файла lang.yml
// EN: Create folder and lang.yml file
getDataFolder().mkdir();
lang.createNewFile();
InputStream defConfigStream = this.getResource("lang.yml");
if (defConfigStream != null) {
copyInputStreamToFile(defConfigStream, lang);
YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(lang);
defConfig.save(lang);
Lang.setFile(defConfig);
}
} catch (IOException e) {
pluginLogger.severe("Не удалось создать lang.yml для CustomDiscs / Failed to create lang.yml for CustomDiscs");
pluginLogger.severe("Отключение плагина... / Disabling plugin...");
this.setEnabled(false); // RU: Без lang.yml плагин отключается / EN: Disable plugin without lang.yml
if (isDebugMode()) {
pluginLogger.log(Level.SEVERE, "Вывод ошибки / Exception output: ", e);
}
}
}
// RU: Загрузка и настройка конфигурации lang.yml
// EN: Load and configure lang.yml
YamlConfiguration conf = YamlConfiguration.loadConfiguration(lang);
for (Lang item : Lang.values()) {
if (conf.getString(item.getPath()) == null) {
conf.set(item.getPath(), item.getDefault());
}
}
Lang.setFile(conf);
LANG = conf;
LANG_FILE = lang;
try {
conf.save(getLangFile());
} catch (IOException e) {
pluginLogger.warning("Не удалось сохранить lang.yml для CustomDiscs / Failed to save lang.yml for CustomDiscs");
pluginLogger.warning("Отключение плагина... / Disabling plugin...");
if (isDebugMode()) {
pluginLogger.log(Level.SEVERE, "Вывод ошибки / Exception output: ", e);
}
}
}
/**
* RU: Получение конфигурации lang.yml
* EN: Get the lang.yml configuration
*
* @return Конфигурация lang.yml / The lang.yml configuration
*/
public YamlConfiguration getLang() {
return LANG;
}
/**
* RU: Получение файла lang.yml
* EN: Get the lang.yml file
*
* @return Файл lang.yml / The lang.yml file
*/
public File getLangFile() {
return LANG_FILE;
}
/**
* RU: Копирование InputStream в файл
* EN: Copy InputStream to file
*/
public static void copyInputStreamToFile(InputStream input, File file) {
try (OutputStream output = new FileOutputStream(file)) {
input.transferTo(output);
} catch (IOException ioException) {
if (isDebugMode()) {
CustomDiscs.getInstance().getLogger().log(Level.SEVERE, "Вывод ошибки / Exception output: ", ioException);
}
}
}
/**
* RU: Получение значения debugMode из конфигурации
* EN: Get the debugMode configuration value
*
* @return Значение debugMode / The debugMode value
*/
public static boolean isDebugMode() {
return debugMode;
}
/**
* RU: Получение значения musicDiscEnable из конфигурации
* EN: Get the musicDiscEnable configuration value
*
* @return Значение musicDiscEnable / The musicDiscEnable value
*/
public static boolean isMusicDiscEnable() {
return musicDiscEnable;
}
/**
* RU: Получение значения customHornEnable из конфигурации
* EN: Get the customHornEnable configuration value
*
* @return Значение customHornEnable / The customHornEnable value
*/
public static boolean isCustomHornEnable() {
return customHornEnable;
}
/**
* RU: Получение значения customHeadEnable из конфигурации
* EN: Get the customHeadEnable configuration value
*
* @return Значение customHeadEnable / The customHeadEnable value
*/
public static boolean isCustomHeadEnable() {
return customHeadEnable;
}
/**
* RU: Получение значения musicDiscPlayingEnable из конфигурации
* EN: Get the musicDiscPlayingEnable configuration value
*
* @return Значение musicDiscPlayingEnable / The musicDiscPlayingEnable value
*/
public static boolean isMusicDiscPlayingEnable() {
return musicDiscPlayingEnable;
}
/**
* RU: Получение значения customHornPlayingEnable из конфигурации
* EN: Get the customHornPlayingEnable configuration value
*
* @return Значение customHornPlayingEnable / The customHornPlayingEnable value
*/
public static boolean isCustomHornPlayingEnable() {
return customHornPlayingEnable;
}
/**
* RU: Получение значения customHeadPlayingEnable из конфигурации
* EN: Get the customHeadPlayingEnable configuration value
*
* @return Значение customHeadPlayingEnable / The customHeadPlayingEnable value
*/
public static boolean isCustomHeadPlayingEnable() {
return customHeadPlayingEnable;
}
}