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

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

Discussion in 'Помощь' started by Overload, Feb 27, 2016.

Thread Status:
Not open for further replies.
  1. Автор темы
    Overload

    Overload Новичок

    Trophy Points:
    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 Новичок Пользователь

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

    Overload Новичок

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

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

    Trophy Points:
    88
    а pex reload не поможет?
     
  6. mineguard.ru

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

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

    Overload Новичок

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

    Меня не покидает навязчивое чувство, что я не выполняю какого-то последнего шага для успеха данного мероприятия. Предположим логически, что после вызова onCommand сервером (в случае, если вводить команду в терминал) управление возвращается серверу и он обновляет какую-то информацию. А в моём случае я просто вызываю команду, но не обновляю что-то там на сервере.[DOUBLEPOST=1456592171,1456590427][/DOUBLEPOST]UPD:
    Вот это стэктрейс, если вызывать команду из терминала сервера:
    Code:
    [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)
    
    А вот выполнение команды сокет-сервером:
    Code:
    [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 Активный участник Пользователь

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

    Overload Новичок

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

    И так по приходу пакета я просто вызываю groupUsersAdd:
    Code:
    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"->"название группы")
     
Thread Status:
Not open for further replies.

Share This Page