1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Команда от игрока с правами оператора.

Тема в разделе "Разработка плагинов для новичков", создана пользователем General, 19 май 2013.

  1. Автор темы
    General

    General Старожил Пользователь

    Баллы:
    123
    Ниже мы видим довольно простой код:
    Код:
    import java.lang.reflect.Method;
    import java.util.Map;
     
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event;
     
    import net.morematerials.MoreMaterials;
    import net.morematerials.handlers.GenericHandler;
     
     
    public class CommandHandler extends GenericHandler {
     
        @Override
        public void init(MoreMaterials instance) {
        }
     
        @Override
        public void shutdown() {
        }
     
        @Override
        public void onActivation(Event event, Map<String, Object> config) {
            // Get the player for this event.
            Player player;
            try {
                Method method = event.getClass().getMethod("getPlayer");
                player = (Player) method.invoke(event);
            } catch (Exception exception) {
                return;
            }
           
            // Call the chat command :D
            if (config.containsKey("Command")) {
                player.chat((String) config.get("Command"));
            }
        }
     
    }
    Команды здесь выполняют от игрока, но какой смысл выполнения команд от игрока, если им всё равно нужно выдавать на них пермишены?
    То есть: Игрок юзает предмет на котором висит команда, но эта команда выполняется от игрока, мне нужно, чтоб эта команда выполнялась от игрока, но при этом с правами оператора.
    Что дало бы игроку абсолютную власть, если бы он смог изменить команду у предмета.

    Надеюсь на помощь девелоперов.
     
  2. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Плагины обычно проверяют пермишены в onCommand() , влезть нереально.
    Но можно творить непотребство
    Код:
    // Call the chat command :D
    if (config.containsKey("Command")) {
    player.setOP(true);
    getCommand(Имя нужной команды).execute(player, чёто-тут нужно бы документацию прочитать, аргументы команды);
    player.setOP(false);
    }
    
    Так как я предполагаю что в коде "Command" - это полный набор с аргументами, то придётся побить на массив и 0й элемент отправить как имя команды, а остальное - в аргументы.
    По идее произойдёт это всё последовательно, так что игрок не успеет заюзать опку.

    проверяй
     
  3. Автор темы
    General

    General Старожил Пользователь

    Баллы:
    123
    То, что в скобках нужно заменить или убрать? Если заменить, то тогда плагин не будет работать нормально.
     
  4. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Хотя некоторые плагины опку не уважают и потому придётся с помощью ваулта допихивать игрока в группу со всем правами а потом запихивать обратно.
    Что-то не пойму про что ты конекретно.
     
  5. Автор темы
    General

    General Старожил Пользователь

    Баллы:
    123
    (Имя нужной команды) про это и чёто-тут нужно бы документацию прочитать, аргументы
     
  6. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Да, заменить на необходимые вещи которые можно выдрать из плагина
    Имя команды - это
    (String config.get("Command"))).split(" ")[0] , аргументы - остальная часть массива
    player - это (CommandSender)player
    А вот место где нужно прочитать документацию - туда просто запихни тоже имя команды, я думаю хватит. Этим полем ни один нормальный плагин не пользуется.
     
  7. Автор темы
    General

    General Старожил Пользователь

    Баллы:
    123
    Не работает, выдаёт ошибку
    Код:
    plugins/MoreMaterials/handlers/src/CommandHandler.java:33: error: cannot find symbol
    player.setOP(true);
     
    ^
     
    symbol:  method setOP(boolean)
     
    location: variable player of type Player
     
    plugins/MoreMaterials/handlers/src/CommandHandler.java:35: error: cannot find symbol
     
    getCommand.execute(player);
    ^
     
    symbol:  variable getCommand
     
    location: class CommandHandler
     
    plugins/MoreMaterials/handlers/src/CommandHandler.java:36: error: cannot find symbol
     
    player.setOP(false);
          ^
    symbol:  method setOP(boolean)
    location: variable player of type Player
     
    3 errors
    Пофиксил всё равно так же ошибка

    Код:
    player.setOP(true);
    getCommand.execute(player);
    player.setOP(false);
     
  8. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Да я ж неточные названия методов привёл, проверять надо же, у меня сейчас под рукой нет IDE.
    setOP() - настоящее название setOp()
    Bukkit.getCommand("autosaveworld").execute(player, "autosaveworld", String[]{"help"}); - вот пример вызовет команду /autosaveworld help
    как то так, позже прду - скажу как надо.
     
  9. Автор темы
    General

    General Старожил Пользователь

    Баллы:
    123
    Что-то мне кажется она будет не от игрока
    Сорри не увидел. Но он всё равно мне ошибки выдаёт пойду править(с нубо знаниями джавы)
    Нифига строка с getCommand не работает или пишет, что-то про string или ещё что-то.
    Уже вечер вторника, где ты?
     
  10. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Код:
    getCommand("autosaveworld").execute((CommandSender)Bukkit.getPlayerExact("Shevchik"), "autosaveworld", new String[]{"help"}); - от имени игрока Shevchik вызовет команду /autosaveworld help
    
    Учти что getCommand() можно вызвать только из главного класса плагина, так что нужно будет хранить где-то ссылку на главный класс плагина.
     

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