Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: This feature may not be available in some browsers.
В общем, затронуты только внутренние аспекты плагина.
Эта версия будет выложена только тут и не рекомнедуется пока устанавливать/заменять ее на основном сервере! (Но если все же будете, то стоит пересоздать базу/базы данных)
Касательно изменений, взамен интерфейсов Player и OfflinePlayer добавлены слегка измененные(которые все равно происходят от старых в некоторых местах) интерфейсы FunctionalPlayer и OfflineFunctionalPlayer(Котороые происходят от так же новых FunctionalCraftPlayer и OfflineFunctionalCraftPlayer), и плагин теперь базируется на них.
Убраны CoreAdapter'ы так как более не нужны.
Но стабильность работы пока оставляет желать лучшего, по этому я и говорю что не стоит пока загрузжать на основной сервер, это, скажем так, тестовая версия, и предстоит исправить еще множество багов.
Все изменения кода уже загружены на GitHub
Небольшой спойлер, в следующем обновлении(не те, которые будут связаны с исправлением багов) будет добавлена бот-защита
Сильно попрошу сообщать о багах мне ВКонтакте или на GitHub'e, заранее спасибо!
Получение данных интерфейсов для работы(если кому надо):
Java:package com.alis.example; import net.alis.functionalservercontrol.api.FunctionalApi; import net.alis.functionalservercontrol.api.interfaces.FunctionalPlayer; import net.alis.functionalservercontrol.api.interfaces.OfflineFunctionalPlayer; import net.alis.functionalservercontrol.api.naf.v1_10_0.entity.FunctionalCraftPlayer; import net.alis.functionalservercontrol.api.naf.v1_10_0.entity.OfflineFunctionalCraftPlayer; import net.alis.functionalservercontrol.api.naf.v1_10_0.util.FID; import net.alis.functionalservercontrol.api.naf.v1_10_0.util.FunctionalStatistics; import net.alis.functionalservercontrol.libraries.net.md_5.bungee.api.chat.TextComponent; import net.alis.functionalservercontrol.spigot.FunctionalServerControlSpigot; import net.alis.functionalservercontrol.spigot.additional.textcomponents.Component; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; public class Example { public void test() { FunctionalApi api = FunctionalApi.get(); if(api != null) { for(FunctionalPlayer player : FunctionalApi.getOnlinePlayers()) { //В данном случае Api на нужно, но все же если оно отключено, то и игроков мы не получим int pc = player.packetsCount(); int ping = player.ping(); String version = player.minecraftVersionName(); String clientName = player.clientBrandName(); FID fid = player.getFunctionalId(); String ip = player.address(); FunctionalPlayer[] players = new FunctionalPlayer[10]; players[0] = FunctionalPlayer.get(fid); players[1] = FunctionalPlayer.get("Name"); players[2] = FunctionalPlayer.get(UUID.randomUUID()); player.expansion().message(new Component.SimplifiedComponent("Test ").append("message")); player.expansion().message(new TextComponent("another message")); FunctionalCraftPlayer craftPlayer = (FunctionalCraftPlayer) player; //Использовать что-либо из net.alis.functionalservercontrol.api.naf не советую, будет обфусцировано } for(OfflineFunctionalPlayer player : FunctionalApi.getOfflinePlayers()) { FID fid = player.getFunctionalId(); boolean isBanned = player.isBanned(); boolean isOnline = player.isOnline(); boolean isMuted = player.isMuted(); UUID uuid = player.getUniqueId(); FunctionalStatistics.AdminStats stats = player.getStatsAsAdmin(); FunctionalStatistics.PlayerStats playerStats = player.getStatsAsPlayer(); OfflinePlayer offlinePlayer = player.getOfflineBukkitPlayer(); Player onlineBukkitPlayer = player.getBukkitPlayer(); OfflineFunctionalPlayer functionalPlayer = OfflineFunctionalPlayer.get("Nickname"); OfflineFunctionalPlayer functionalPlayer1 = OfflineFunctionalPlayer.get(uuid); OfflineFunctionalPlayer functionalPlayer2 = OfflineFunctionalPlayer.get(new FID(player.nickname())); //Все методы из OfflineFunctionalPlayer которые не указаны в данном примере для FunctionalPlayer все равно для него доступны OfflineFunctionalCraftPlayer craftPlayer = (OfflineFunctionalCraftPlayer) player; //Опять же, не стоит } } } }
Баги, баги и еще раз баги. Ну ниче, потиху исправлю =)
Коротко о обновлении:
1. Проблема с MySQL и SQLite устранена(в теории)
2. Теперь кликабельные сообщения и текст при наведении доступны на версиях сервера от 1.8 по 1.19.3
3. Убрана поддержка AdventureAPI( ну кроме мест с ивентами от Paper'а )
4. Добавлен удобный(на мой взгляд) компонентик для работы с компонентами от md_5
Примеры для тех кто использует API этого плагина(если такие есть)
Java:package your.custom.pack; import net.alis.functionalservercontrol.api.FunctionalApi; import net.alis.functionalservercontrol.libraries.net.md_5.bungee.api.chat.ClickEvent; import net.alis.functionalservercontrol.libraries.net.md_5.bungee.api.chat.HoverEvent; import net.alis.functionalservercontrol.libraries.net.md_5.bungee.api.chat.TextComponent; import net.alis.functionalservercontrol.spigot.additional.textcomponents.Component; public class Example { public void sendCoolMessage(Player player) { FunctionalApi api = FunctionalApi.get(); if(api != null) { Component.SimplifiedComponent[] components = new Component.SimplifiedComponent[]{new Component.SimplifiedComponent("")}; TextComponent[] components2 = new TextComponent[]{new TextComponent(""), new TextComponent("")}; Component.SimplifiedComponent simplifiedComponent = new Component.SimplifiedComponent(); //Создаем облегченный вариант TextComponent от md_5 simplifiedComponent .append(new TextComponent("your ")) .append("custom ") .append(" ", components) // " " - разделитель .append(" ", components2) .setHoverEvent(HoverEvent.Action.SHOW_TEXT, "Some hover text") .setClickEvent(ClickEvent.Action.OPEN_URL, "https://vk.com/alphatwo") .appendOnStart(new Component.SimplifiedComponent("re ")) .appendOnStart("He") .translateDefaultColorCodes(); //Правильно заменяет цветовые кода(обычно при переходе на новую строку цвета с использованием '§' и '&' не работают) String content = simplifiedComponent.getString(); //Получаем текстовое содержание компонента TextComponent component = simplifiedComponent.get(); //Получаем оригинальный компонент от md_5 api.getCoreAdapter().expansion().sendMessage(player, simplifiedComponent); //Отправляем игроку SimplifiedComponent api.getCoreAdapter().expansion().sendMessage(player, component); //Отправляем игроку оригинальный компонент player.spigot().sendMessage(simplifiedComponent); // <- Не работает player.spigot().sendMessage(component); // <- Не работает } } }
Еще одно небольшое обновление:
1. Исправлена проблема ошибка при загрузке PacketEventsAPI на новых версиях
2. Исправлено пару найденных багов
3. Изменена методика блокировки команд(в файле commands-limiter.yml)
Теперь метод проверки указывается для каждой команды отдельно!
Пример:
YAML:global: deny-message: "&cДанная команда заблокирована" use-as-whitelist: false group: default: - /commands[checkMode=first_arg] # Если вы установите неизвестный метод проверки, будет использован метод "first_arg" - /to # Если "[checkMode={mode}" не установено, автоматически используется "first_arg" - /ban ALis[checkMode=all_args] # Если длина команды больше одного слова, стоит использовать метод "all_args" moder: - /be[checkMode=first_arg] - /blocked[checkMode=first_arg]
Прежде всего, хотелось бы сказать что эта версия наврядли стабильная и тут для меня правда важно чтобы вы сообщали о найденых ошибках!
И так, что изменилось:
- ProtocolLib теперь нужен лишь для новой функции item-fixer, позже не будет нужен вообще(Но если он присутствует на сервере, плагин будет автоматически использовать его в любом случае)
- Добавлена возможность ограничить кол-во пакетов исходящих от игрока за определенный период
- Возможность защиты аккаунтов с использованием IP-адресов(Используйте только если у Вас статический IP-адрес)
- Контроль пинга игрока
- Защита от краша с помощью бага кафедры(не требуется на версиях выше 1.18)
- Защита от "читерских" предметов(ItemFixer от Leymooo, требуется ProtocolLib
Права:
Еще раз попрошу сообщать о найденных багах.
- functionalservercontrol.protection.packets.bypass - игрок с данным правом может отправлять неограниченное кол-во пакетов на сервер
- functionalservercontrol.notification.player-over-packets - игроки с данным правом получат уведомление при превышении игроком максимального кол-ва пакетов
- functionalservercontrol.notification.protected-account - игроки с этим правом получает уведомление, когда на защищенный аккаунт попытается зайти игрок с другим IP-адресом
- functionalservercontrol.itemfixer.enchantments.bypass - игроки с данным правом могут использовать все нестандартные зачарования
- functionalservercontrol.itemfixer.<enchant>.bypass - игроки с данным правом могут использовать указанные в праве нестандартные зачарования
- functionalservercontrol.itemfixer.nbt.bypass - у игроков с данным правом предмет не проверяется на нестандартные NBT теги
- functionalservercontrol.notification.plugin-error - игроки с данным правом получат уведомление при нахождении ошибки в плагине(но это не точно =D )
- functionalservercontrol.notification.lectern-crash - игроки с данным правом получат уведомление при попытке каким-либо игроков "крашнуть" при помощи бага кафедры
- functionalservercontrol.itemfixer.potion.bypass - у игроков с данным правом не будут проверяться зелья на нестандартные эффекты, длительность
Опять таки, если ничего не забыл, то все
Чтож, теперь файлы обновлять самостоятельно НЕ НУЖНО! Этим займется встроенное автообновление файлов. Правда, оно еще в тестировании, возможен неверный сбор конфигурации.
Что убрано:
1. Флаг '-a' так как использовался только в команде /ban и не особо нужен,если нужно, сделаю /banall
Что добавлено:
1. Право functionalservercontrol.unmute.offline - т.е. теперь игроки без этого права не смогут размутить оффлайн игроков
2. Команда /fsc inetspeed - которая подсчитает скорость интернета на вашем сервере
3. Право functionalservercontrol.inetspeed - доступ к команде "/fsc inetspeed"
4. Право functionalservercontrol.clients.bypass - игроки с этим правом могут заходить используя запрещенный клиент
5. В конфиг добавлена возможность включить асинхронный режим проверки, но при нем естественно проверка займет немного больше времени
6. Команда /deviceinfo <server/machine> - с помощью данной команды можно узнать некоторую информацию о Вашем сервере или машине на которой он стоит
7. Право functionalservercontrol.deviceinfo - доступ к команде "/deviceinfo"
8. Добавлена возможность блокировать клиенты Lunar, Badlion
9. Добавлена возможность разбанить/размутить игроков используя ID блокировки/мута, примеры:
/unmute -id 101010, /unmute -id -s 121212, /unban -id 102321, /unban -s -id 2134
Насчет подсчета TPS для команды /deviceinfo server, подсчет ведется в асинхронном режиме, т.к. я решил что нагрузка былая не плохая во время синхронного подсчета, так что я бы не сильно доверял показаниям TPS из этой команды(могут быть погрешности)
И просто чтобы было, те кто используют команду /reload или Plugman для перезагрузки данного плагина, можете даже не писать об ошибках которые возникают после перезагрузки!!!
Если я чего-то не забыл, то пока все!)
Собсна, из нового только поддержка MySQL
Пересоздайте файлы, или добавьте в конфиге general.yml рядом с storage-method: "sqlite"(а точнее под ним) вот это:
Код:mysql: host: "127.0.0.1" port: "3306" username: "root" password: "password" database_name: "name"
Для начала использования MySQL достаточно в параметре storage-method установить значение 'mysql'
Т.е.: storage-method: "mysql"
И прежде чем репортить об ошибках с MySQL убедитесь что вы все верно ввели в конфиге.
Это не то что бы обновление, ничего нового в плагин я не внедрил, лишь исправил пару недочетов
Больше это обновление связано с API
А точнее теперь оно не только в ивентах заключается.
Тем кто будет его использовать(вдруг), оно находится в паке
by.alis.functionalservercontrol.api.FunctionalAPI <- класс самого API(интерфейс точнее)
by.alis.functionalservercontrol.api.events <- здесь находятся ивенты.
Функционал у этой версии API не велик, но все же пробегимся по этой паре функций
Пример получения API:
Java:public class SomeYourClass { import net.alis.functionalservercontrol.api.FunctionalApi; private FunctionalApi api; //Создаем глобальнуя переменную API для дальнейшего ее получения public boolean setupFunctionalApi() { api = FunctionalApi.get(); //Получаем API return api != null ? true : false; //Проверяем, удались ли получить api и если да, возвращаем true //Проверять на null обязательно, так как оно может быть отключено конфигом } //Создаем getter для апи public FunctionalApi getFunctionalApi() { return this.api; } }
Пример работы с банами(с мутами также только FunctionalMuteEntry и api.getMutes(); ):
Java:public class YourSomeClass { import net.alis.functionalservercontrol.api.FunctionalApi; public void unbanPlayerIfHeALis() { FunctionalApi api = FunctionalApi.get(); //Получаем FunctionalApi if(api != null) { //Проверяем не равно ли api нулю(null) for(FunctionalBanEntry banEntry : api.getBans()) { //Перебираем список банов if(banEntry.getName().equalsIgnoreCase("ALis")) { //Проверяем, является ли имя забанненого игрока в данном спике ALis banEntry.unban(); //И если является, снимаем бан return; } } } else { getConsoleSender().sendMessage("Не удалось получить FunctionalApi!"); //Выводим сообщение, о том что не удалось получить FunctionalApi return; } } }
Пример работы со статистикой:
Java:public class YourSomeClass { import net.alis.functionalservercontrol.api.FunctionalApi; public String sendStatisctic(Player player) { FunctionalApi api = FunctionalApi.get(); if(api != null) { String wasBanned = api.getPlayerStatistics().getAsPlayer(player).get(StatsType.Player.STATS_BANS); String preformBan = api.getPlayerStatistics().getAsAdmin(player).get(StatsType.Administrator.STATS_BANS) String advertiseAttempts = api.getPlayerStatistics().getAsPlayer(player).get(StatsType.Player.ADVERTISE_ATTEMPTS) return "Был забанен " + wasBanned + " раз; Банил: " + preformBan + " раз; Пытался рекламировать: " + advertiseAttempts + " раз;" //Это не все виды статистики, просто не думаю что есть смысл все тут перечислять } else { getConsoleSender().sendMessage("Не удалось получить FunctionalApi"); return; } } }
Работа с методом FunctionalApi#getCoreAdapter:
Java:package your.custom.pack; public class YourCustomClass { import net.alis.functionalservercontrol.api.FunctionalApi; public String getPlayerVersionAndBrand(Player player) { FunctionalApi api = FunctionalApi.get(); if(api != null) { Adapter coreAdapter = api.getCoreAdapter(); String adaptName = coreAdapter.getAdapterName(); //Получаем название адаптера, просто так(Spigot либо Paper) int playerProtocolVersion = coreAdapter.getPlayerProtocolVersion(player); //Получаем версию протокола игрока String playerVersion = coreAdapter.getPlayerVersion(player).toString(); //Получем версию minecraft игрока String playerBrand = coreAdapter.getPlayerMinecraftBrand(player); //Получаем название клиента игрока return "Версия протокола игрока: " + playerProtocolVersion + "; Версия игрока: " + playerVersion + "; Название клиента игрока: " + playerBrand; } else { Bukkit.getConsoleSender().sendMessage("Не удалось получить FunctionalApi!"); return null; } } }
Сразу хочется сказать, что нововведений не будет до того момента, пока я не сделаю данную версию максимально стабильной, по этому просьба отписывать при нахождении багов и т.п., неважно куда.
Необходимо пересоздать файлы конфигурации, или по примеру с GitHub дополнить старые(что не очень легко думаю)
Новые команды:
- /fsc getstatistic <player/admin> <игрок> - показывает статистику игрока в качестве администратора или обычного игрока
- /clearchat <игрок/all> очищает чат игроку/всем
Новые возможности:
Новые права:
- Теперь, если забаненный(не по IP игрок) зайдет на сервер под другим ником, администраторы с соответствующим правом получат об этом уведомление
- Достаточно функциональная защита от рекламы(была помещена в новый конфигурационный файл chat-settings.yml, что не логично немного вышло): с помощью которой можно предотвратить рекламирование IP-адресом или доменом в сообщениях чата, командах, названиях/лорах предметов, в книгах и на табличках
- Защита чата от спама(т.е. ограничение сообщений за определенное кол-во времени), возможность ограничения повторяющихся сообщений, возможность замены определенного текста в сообщении на указанный текст в конфиге
- В истории теперь сохраняется дата и время записи в историю(в конфиге соответствующие плейсхолдеры)
- Теперь в большинстве уведомлениий(если версия сервера от 1.16) при наведении на них, доступна информация о игроке(сколько раз был забанен, кикнут и т.п.)
- Переделан функционал кнопок в уведомлениях, теперь если админ имеет право например банить + банить без причины - то при нажатии на кнопку, игрок сразу забанен, а если админ может банить, но не может банить без причины - то кнопка просто введет команду в чат, где админ сам допишет причину(так же и с мутами/киками)
- В API добавлен ивент PlayerAdvertiseEvent который вызывается при попытке игрока прорекламировать что-либо с помощью IP/домена
- Исправлены некоторые старые баги
- По классике добавлна куча новых.
- functionalservercontrol.notification.same-ip - игрок с данным правом получит уведомление, когда забаненный игрок зайдет под другим ником
- functionalservercontrol.clearchat - доступ к команде /clearchat
- functionalservercontrol.clearchat.bypass -для игрока с данным правом нельзя очистить чат
- functionalservercontrol.clearchat.all - разрешает использовать /clearchat all
- functionalservercontrol.chat.messages-replaces.bypass - у данного игрока слова в сообщении которые должны замениться, не будут заменены.
- functionalservercontrol.chat.delay.bypass - на игрока с данным правом не действует задержка чата
- functionalservercontrol.chat.repeating-message.bypass - игрок с данным правом может писать повторяющиеся сообщения в чате
- functionalservercontrol.chat.blocked-words.bypass - игрок с данным правом может использовать запрещенные слова в чате
- functionalservercontrol.books.blocked-words.bypass - игрок с данным правом может использовать запрещенные слова в книгах
- functionalservercontrol.signs.blocked-words.bypass - игрок с данным правом может использовать запрещенные слова на табличках
- functionalservercontrol.commands.blocked-words.bypass - игрок с данным правом может использовать запрещенные слова в командах
- functionalservercontrol.items.blocked-words.bypass - игрок с данным правом может использовать запрещенные слова в названии/лоре предмета
- functionalservercontrol.notification.blocked-word - игрок с данным правом получит уведомление когда кто-то попытается использовать запрещенное слово
- functionalservercontrol.notification.blocked-command - игрок с данным правом получит уведомление когда кто-то попытается использовать запрещенную команду
- functionalservercontrol.notification.advertise - игрок с данным правом получит уведомлениие когда кто-то попытается прорекламировать IP/Домен
- functionalservercontrol.getstatistic - доступ к команде /fsc getstatistic
- functionalservercontrol.advertise.chat.bypass - игрок с данным правом может использовать айпи/домен в чате
- functionalservercontrol.advertise.signs.bypass - игрок с данным правом может использовать айпи/домен на табличке
- functionalservercontrol.advertise.items.bypass - игрок с данным правом может использовать айпи/домен в названии/лорах предметов
- functionalservercontrol.advertise.commands.bypass - игрок с данным правом может использовать айпи/домен в командах
- functionalservercontrol.advertise.books.bypass - игрок с данным правом может использовать айпи/домен в книгах
Мы используем основные cookies для обеспечения работы этого сайта, а также дополнительные cookies для обеспечения максимального удобства пользователя.
Посмотрите дополнительную информацию и настройте свои предпочтения