FunctionalServerControl v1.10.0 - Заменяем все одним [1.8 - 1.19.3]

Для ядра FunctionalServerControl v1.10.0 - Заменяем все одним [1.8 - 1.19.3] 1.10.0

Нет прав для скачивания
В общем, затронуты только внутренние аспекты плагина.

Эта версия будет выложена только тут и не рекомнедуется пока устанавливать/заменять ее на основном сервере! (Но если все же будете, то стоит пересоздать базу/базы данных)

Касательно изменений, взамен интерфейсов 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; //Опять же, не стоит
                }
            }
    }
   
}
  • Люблю это (+2)
Реакции: Durasell
Баги, баги и еще раз баги. Ну ниче, потиху исправлю =)

Коротко о обновлении:
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); // <- Не работает
           
        }
    }
}
  • Люблю это (+2)
Реакции: Durasell
Еще одно небольшое обновление:
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]
  • Люблю это (+2)
Реакции: Durasell
1. Исправлено пару моментов с текстом без цвета
2. Исправлено в уведомлении о ошибке плагина 'UnknownException' (вроде)
3. Исправлены проблемы с запуском на низких версиях
4. Еще немного асинхрона.
  • Люблю это (+2)
Реакции: Durasell
Небольшое обновление

Что изменилось:
  • Исправлен баг с командой /cheatcheck
  • Добавил ресурс на spigotmc.org и с его API через другое API добавил проверку новых версий плагина
  • Люблю это (+2)
Реакции: Durasell
Прежде всего, хотелось бы сказать что эта версия наврядли стабильная и тут для меня правда важно чтобы вы сообщали о найденых ошибках!

И так, что изменилось:

  • 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 - у игроков с данным правом не будут проверяться зелья на нестандартные эффекты, длительность
Еще раз попрошу сообщать о найденных багах.

Опять таки, если ничего не забыл, то все :)
  • Люблю это (+2)
Реакции: Durasell
Чтож, теперь файлы обновлять самостоятельно НЕ НУЖНО! Этим займется встроенное автообновление файлов. Правда, оно еще в тестировании, возможен неверный сбор конфигурации.

Что убрано:

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 для перезагрузки данного плагина, можете даже не писать об ошибках которые возникают после перезагрузки!!!

Если я чего-то не забыл, то пока все!)
  • Люблю это (+2)
Реакции: Durasell
Собсна, из нового только поддержка 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 убедитесь что вы все верно ввели в конфиге.
  • Люблю это (+2)
Реакции: Durasell
Это не то что бы обновление, ничего нового в плагин я не внедрил, лишь исправил пару недочетов

Больше это обновление связано с 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;
        }
    }
  
}
  • Мне нравится (+1)
  • Люблю это (+2)
Реакции: Durasell и blackgrandstyle
Сразу хочется сказать, что нововведений не будет до того момента, пока я не сделаю данную версию максимально стабильной, по этому просьба отписывать при нахождении багов и т.п., неважно куда.

Необходимо пересоздать файлы конфигурации, или по примеру с 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 - игрок с данным правом может использовать айпи/домен в книгах
  • Люблю это (+2)
Реакции: Durasell
Назад
Сверху Снизу