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

Статус
Закрыто для дальнейших ответов.

Великий Реван

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

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));
    }
}
 
Последнее редактирование:
Ну... раз такого плагина нет, то теперь он есть ;)

CommandDelayer
https://dl.dropboxusercontent.com/u/64799811/CommandDelayer/CommandDelayer.jar

Настройка через файл конфигурации:
Код:
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));
    }
}

Спасибо большое!)

Всё отлично работает, тему закрываю.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх