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

Идея Задержка перед вводом команды

Тема в разделе "Запросы на разработку плагинов", создана пользователем Великий Реван, 5 фев 2014.

Статус темы:
Закрыта.
  1. Автор темы
    Великий Реван

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

    Баллы:
    78
    Skype:
    RevanOleg
    Необходим плагин, который будет делать задержку перед вводом команды, как, например, в Essentials можно поставить задержку перед командой "/home", так мне нужно, чтобы можно было любую команду сделать в конфиге. То есть: ввёл команду, тебе поступает сообщение, что она выполнится через столько-то секунд и через это время она именно выполняется.
     
  2. Автор темы
    Великий Реван

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

    Баллы:
    78
    Skype:
    RevanOleg
  3. 0bsid1

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

    Баллы:
    123
    Имя в Minecraft:
    Artarious
    CoolDown
     
  4. Автор темы
    Великий Реван

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

    Баллы:
    78
    Skype:
    RevanOleg
    Он делает после ввода команды, а мне нужно до.
     
  5. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Ну... раз такого плагина нет, то теперь он есть ;)

    CommandExpectation (название пришлось сменить - на девбуките оказался похожий плагин)
    http://dev.bukkit.org/bukkit-plugins/command-delayer/

    Настройка через файл конфигурации:
    Код:
    warning-message: '&6Your command will be executed after &e%time%'
    commands:
      help: 10s
      react: 10s
    
    Здесь: warning-message - сообщение. Если нужно, можно указать на русском.
    commands - перечень команд и времени.
    Если у команды есть алиас, то задержка будет распространяться как на команду так и на все алиасы.
    Время указывается в том же формате, что в ReActions или PlayEffect: http://dev.bukkit.org/bukkit-plugins/reactions/pages/main/time-format/

    Пермишены:
    commanddelayer.ignore — задержка игнорируется для всех команд
    commanddelayer.ignore.<команда> — задержка игнорируется для команды <команда>

    Исходный код:
    Код:
    package me.fromagate.commanddelayer;
    
    import java.util.HashMap;
    import java.util.Map;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerCommandPreprocessEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class CommandDelayer extends JavaPlugin implements Listener{
        String warningMessage = "&6Your command will be executed after &e%time%";
        Map<String,String> commands = new HashMap<String,String>();
    
    
        @Override
        public void onEnable(){
            loadCfg();
            saveCfg();
            getServer().getPluginManager().registerEvents(this, this);
        }
    
        public void loadCfg(){
            this.warningMessage = getConfig().getString("warning-message",warningMessage);
            for (String key : getConfig().getKeys(true)){
                if (key.startsWith("commands.")){
                    commands.put(key.replaceFirst("commands.", ""), getConfig().getString(key, "0"));
                }
            }
            if (commands.isEmpty()) commands.put("help", "10s");
        }
     
        public void saveCfg(){
            getConfig().set("warning-message",warningMessage);
            for (String command : commands.keySet()){
                getConfig().set("commands."+command, commands.get(command));
            }
            this.saveConfig();
        }
     
     
        public String getCommandFromLine (String commandLine){
            if (commandLine.isEmpty()) return "";
            String [] ln = commandLine.split(" ");
            if (ln.length==0) return "";
            return (ln[0].substring(1));
        }
     
        public String getPlayerCommand(String message){
            if (message.isEmpty()) return "";
            String messageCommand = getRegisteredCommand(getCommandFromLine(message));
            for (String command : commands.keySet()){
                String listedCommand = getRegisteredCommand(command);
                if (messageCommand.equalsIgnoreCase(listedCommand)) return command;
            }
            return "";
        }
     
        public String getRegisteredCommand (String cmd){
            if (cmd.isEmpty()) return "";
            Command cmm  = Bukkit.getServer().getPluginCommand(cmd);
            if (cmm == null) return "";
            return cmm.getLabel();
        }
    
     
        @EventHandler(priority=EventPriority.LOWEST, ignoreCancelled = true)
        public void onCommand (PlayerCommandPreprocessEvent event){
            String command = getPlayerCommand(event.getMessage());
            if (command.isEmpty()) return;
            if (event.getPlayer().hasPermission("commanddelayer.ignore."+command)||
                    event.getPlayer().hasPermission("commanddelayer.ignore")) return;
         
            String timeStr = commands.get(command);
            if (timeStr.isEmpty()) return;
            Long time = parseTime(timeStr);
            if (time<=0) return;
            event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', warningMessage.replace("%time%", timeStr)));
            final Player player = event.getPlayer();
            final String newCommandMessage = event.getMessage();
            event.setCancelled(true);     
            Bukkit.getScheduler().runTaskLater(this, new Runnable(){
                @Override
                public void run() {
                    if (!player.isOnline()) return;
                    Bukkit.dispatchCommand(player, newCommandMessage.substring(1));
                }
            }, timeToTicks(time));
         
         
        }
    
        public Long parseTime(String time){
            int hh = 0; // часы
            int mm = 0; // минуты
            int ss = 0; // секунды
            int tt = 0; // тики
            int ms = 0; // миллисекунды
            if (isInteger(time)){
                ss = Integer.parseInt(time);
            } else if (time.matches("^[0-5][0-9]:[0-5][0-9]$")){
                String [] ln = time.split(":");
                if (isInteger(ln[0])) mm = Integer.parseInt(ln[0]);
                if (isInteger(ln[1])) ss = Integer.parseInt(ln[1]);
            } else if (time.matches("^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$")){
                String [] ln = time.split(":");
                if (isInteger(ln[0])) hh = Integer.parseInt(ln[0]);
                if (isInteger(ln[1])) mm = Integer.parseInt(ln[1]);
                if (isInteger(ln[2])) ss = Integer.parseInt(ln[2]);
            } else if (time.endsWith("ms")) {
                String s = time.replace("ms", "");
                if (isInteger(s)) ms = Integer.parseInt(s);
            } else if (time.endsWith("h")) {
                String s = time.replace("h", "");
                if (isInteger(s)) hh = Integer.parseInt(s);
            } else if (time.endsWith("m")) {
                String s = time.replace("m", "");
                if (isInteger(s)) mm = Integer.parseInt(s);
            } else if (time.endsWith("s")) {
                String s = time.replace("s", "");
                if (isInteger(s)) ss = Integer.parseInt(s);
            } else if (time.endsWith("t")) {
                String s = time.replace("t", "");
                if (isInteger(s)) tt = Integer.parseInt(s);
            }
            return (long) ((hh*3600000)+(mm*60000)+(ss*1000)+(tt*50)+ms);
        }
    
        public boolean isInteger (String str){
            return (str.matches("[0-9]+[0-9]*"));
        }
    
        public Long timeToTicks(Long time){
            return Math.max(1, (time/50));
        }
    }
    
     
    Последнее редактирование: 24 июн 2014
    SHALK97, Hilgert и Великий Реван нравится это.
  6. Автор темы
    Великий Реван

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

    Баллы:
    78
    Skype:
    RevanOleg
    Спасибо большое!)

    Всё отлично работает, тему закрываю.
     
Статус темы:
Закрыта.

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