Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Решено Удалённое управление PermissionsEx (bukkit 1.8.8, PEX 1.23.4)

Тема в разделе "Помощь", создана пользователем Overload, 27 фев 2016.

Статус темы:
Закрыта.
  1. Автор темы
    Overload

    Overload Новичок

    Баллы:
    6
    Добрый вечер всем.

    Прошу помощи в непонятном для меня вопросе. Назревала потребность организовать автоматический сбор мат. средств на сервере. По этому было решено пересобрать плагин PermissionsEx с надстройкой, которая позволяла бы ему удалённо принимать команды (например от php-скрипта).

    Методом научного тыка было выяснено, что плагин обрабатывает команду терминала в методе onCommand, вызывая CommandManager.execute.

    Не долго думая был дописан локальный сокет сервер, принимающий пакеты и вызывающий доп. метод RemoteCmd, который так же был дописан в основной класс PermissionsEx.

    Схема очевидная:
    • старт сервера
    • вызов PermissionsEx.onEnable
    • внутри onEnable аккуратно вешаем сокет сервер слушать какой-нибудь порт, передав ему инстанс плагина
    • как сокет сервер примет нужный пакет, то вызвать переданный ранее инстанс.RemoteCmd, который выполнит CommandManager.execute

    Т.к. метод CommandManager.execute вторым параметром принимает объект Command, но в теле метода использует его исключительно как Command.getName(), то был сделан клон CommandManager.executeEx с отличием от оригинального тем, что принимает вторым аргументом сразу строку.

    И всё вроде бы хорошо, сокет сервер принимает пакеты, обрабатывает и вызывает наш executeEx, о чём информирует командная строка сервера. Но с игроком ничего не происходит.
     
  2. Хостинг MineCraft
    <
  3. mineguard.ru

    mineguard.ru Новичок Пользователь

    Баллы:
    6
    Зачем такие сложности? Просто прикрутите pex к mysql
    А там уже можно php скриптом делать запросики
     
  4. Автор темы
    Overload

    Overload Новичок

    Баллы:
    6
    Проблема такого подхода в том, что игроку требуется перезаход, чтобы изменения вступили в силу.
     
  5. snr93

    snr93 Активный участник Пользователь

    Баллы:
    88
    а pex reload не поможет?
     
  6. mineguard.ru

    mineguard.ru Новичок Пользователь

    Баллы:
    6
    ну обычно на всех топ проектах написано мол "после покупки статуса перезайдите на сервер"
     
  7. Автор темы
    Overload

    Overload Новичок

    Баллы:
    6
    После вставки в таблицу поможет. Но это ведь полуавтоматический метод, а не полностью автоматический.

    Меня не покидает навязчивое чувство, что я не выполняю какого-то последнего шага для успеха данного мероприятия. Предположим логически, что после вызова onCommand сервером (в случае, если вводить команду в терминал) управление возвращается серверу и он обновляет какую-то информацию. А в моём случае я просто вызываю команду, но не обновляю что-то там на сервере.[DOUBLEPOST=1456592171,1456590427][/DOUBLEPOST]UPD:
    Вот это стэктрейс, если вызывать команду из терминала сервера:
    Код:
    [19:53:20 INFO]: java.lang.Thread.getStackTrace(Thread.java:1552)
    [19:53:20 INFO]: ru.tehkode.permissions.bukkit.PermissionsEx.onCommand(PermissionsEx.java:349)
    [19:53:20 INFO]: org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    [19:53:20 INFO]: org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
    [19:53:20 INFO]: org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641)
    [19:53:20 INFO]: org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchServerCommand(CraftServer.java:627)
    [19:53:20 INFO]: net.minecraft.server.v1_8_R3.DedicatedServer.aO(DedicatedServer.java:412)
    [19:53:20 INFO]: net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:375)
    [19:53:20 INFO]: net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654)
    [19:53:20 INFO]: net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557)
    [19:53:20 INFO]: java.lang.Thread.run(Thread.java:745)
    
    А вот выполнение команды сокет-сервером:
    Код:
    [19:52:59 INFO]: java.lang.Thread.getStackTrace(Thread.java:1552)
    [19:52:59 INFO]: ru.tehkode.permissions.bukkit.PermissionsEx.onCommand(PermissionsEx.java:349)
    [19:52:59 INFO]: ru.tehkode.permissions.bukkit.PermissionsEx.RemoteCmd(PermissionsEx.java:146)
    [19:52:59 INFO]: ru.tehkode.permissions.bukkit.PExServer$PacketParser.run(PExServer.java:95)
    
     
  8. deadanykey

    deadanykey Активный участник Пользователь

    Баллы:
    96
    .reset делайте после вызова команды. Это эквивалент /pex reload
     
  9. Автор темы
    Overload

    Overload Новичок

    Баллы:
    6
    Спасибо всем, кто пытался помочь. Проблема решена. Решением оказался метод, от которого я отказался изначально в виду того, что не понимал, как он работает.

    И так по приходу пакета я просто вызываю groupUsersAdd:
    Код:
    public void RemoteCmd(byte reason, Map<String, String> args)
    {
        GroupCommands gc = new GroupCommands();
        switch (reason)
        {
            case 0:
                gc.groupUsersAdd(this, getServer().getConsoleSender(), args);
                break;
             
            case 1:
                gc.groupUsersRemove(this, getServer().getConsoleSender(), args);
                break;
        }
    }
    Где RemoteCmd это дописанный метод класса PermissionsEx и он вызывается сокет-сервером по приходу пакета.

    Аргументы:
    byte reason, думаю, понятно из кода.
    args - это HashMap, который на момент вызова содержит в себе следующие данные
    ("user"->"ник", "group"->"название группы")
     
Статус темы:
Закрыта.

Поделиться этой страницей