How to add a visible "countdown" when giving a command.

Discussion in 'Plugin Development' started by Eliteninja42, Jul 26, 2013.

Thread Status:
Not open for further replies.
  1. Offline

    Eliteninja42

    Hello,
    I was wondering if it was possible to add to my plugin a way to see how much more time you have until your cooldown was done, but only when you typed the command of the plugin.

    This is my code:
    Code:
    package com.gmail.eliteninja42;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.logging.Logger;
     
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.PluginDescriptionFile;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.command.Command;
     
    public final class SmartSmelt extends JavaPlugin {
        private List<Player> cantDoCommand = new ArrayList<Player>();
       
        Countdown d = new Countdown();
        public final Logger logger = Logger.getLogger("Minecraft");
        public static SmartSmelt plugin;
       
       
        @Override
        public void onDisable() {
            PluginDescriptionFile pdfFile = this.getDescription();
            this.logger.info(pdfFile.getName() + " Has Been Disabled!");
        }
       
        @Override
        public void onEnable() {
            PluginDescriptionFile pdfFile = this.getDescription();
            this.logger.info(pdfFile.getName() + " Version " + pdfFile.getVersion() + " Has Been Enabled!");
        }
       
        public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
            Player player = (Player) sender;
           
            if (commandLabel.equalsIgnoreCase("smelthelp")){
                player.sendMessage(ChatColor.GREEN + "Type /smelt while holding an ore or food to smelt it instantly!");
            }
            if (cantDoCommand.contains(player)){
                player.sendMessage(ChatColor.GREEN + "You must wait more seconds to smelt more ores.");
            }
            if (commandLabel.equalsIgnoreCase("smelt")){
                if (!cantDoCommand.contains(player)){
                if (player.getItemInHand().getType() == Material.IRON_ORE){
                    ItemStack iron = player.getInventory().getItemInHand();
                    int amount = iron.getAmount();
                    ItemStack smelt = new ItemStack(Material.IRON_INGOT, amount);
                    player.getInventory().setItemInHand(smelt);
                    player.sendMessage(ChatColor.GREEN + "Your Iron Ore has been smelted!");
                    cantDoCommand.add(player);
                    d.setList(cantDoCommand);
                    d.setPlayer(player);
                    new Thread(d).start();
                   
                       
                   
                   
                }else if (player.getItemInHand().getType() == Material.GOLD_ORE){
                    ItemStack gold = player.getInventory().getItemInHand();
                    int amount = gold.getAmount();
                    ItemStack smelt = new ItemStack(Material.GOLD_INGOT, amount);
                    player.getInventory().setItemInHand(smelt);
                    player.sendMessage(ChatColor.GREEN + "Your Gold Ore has been smelted!");
                    cantDoCommand.add(player);
                    d.setList(cantDoCommand);
                    d.setPlayer(player);
                    new Thread(d).start();
                   
                }else if (player.getItemInHand().getType() == Material.DIAMOND_ORE){
                    ItemStack diamond = player.getInventory().getItemInHand();
                    int amount = diamond.getAmount();
                    ItemStack smelt = new ItemStack(Material.DIAMOND, amount);
                    player.getInventory().setItemInHand(smelt);
                    player.sendMessage(ChatColor.GREEN + "Your Diamond Ore has been smelted!");
                    cantDoCommand.add(player);
                    d.setList(cantDoCommand);
                    d.setPlayer(player);
                    new Thread(d).start();
                   
                }else if (player.getItemInHand().getType() == Material.REDSTONE_ORE){
                    ItemStack redstone = player.getInventory().getItemInHand();
                    int amount = redstone.getAmount();
                    ItemStack smelt = new ItemStack(Material.REDSTONE, amount);
                    player.getInventory().setItemInHand(smelt);
                    player.sendMessage(ChatColor.GREEN + "Your Redstone Ore has been smelted!");
                    cantDoCommand.add(player);
                    d.setList(cantDoCommand);
                    d.setPlayer(player);
                    new Thread(d).start();
                   
            }else if (player.getItemInHand().getType() == Material.COAL_ORE){
                ItemStack coal = player.getInventory().getItemInHand();
                int amount = coal.getAmount();
                ItemStack smelt = new ItemStack(Material.COAL, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Coal Ore has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if(player.getItemInHand().getType() == Material.EMERALD_ORE){
                ItemStack emerald = player.getInventory().getItemInHand();
                int amount = emerald.getAmount();
                ItemStack smelt = new ItemStack(Material.EMERALD, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Emerald Ore has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if(player.getItemInHand().getType() == Material.QUARTZ_ORE){
                ItemStack quartz = player.getInventory().getItemInHand();
                int amount = quartz.getAmount();
                ItemStack smelt = new ItemStack(Material.QUARTZ, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Quartz Ore has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if (player.getItemInHand().getType() == Material.RAW_BEEF){
                ItemStack beef = player.getInventory().getItemInHand();
                int amount = beef.getAmount();
                ItemStack smelt = new ItemStack(Material.COOKED_BEEF, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Raw Beef has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if (player.getItemInHand().getType() == Material.RAW_CHICKEN){
                ItemStack chicken = player.getInventory().getItemInHand();
                int amount = chicken.getAmount();
                ItemStack smelt = new ItemStack(Material.COOKED_CHICKEN, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Raw Chicken has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if (player.getItemInHand().getType() == Material.LAPIS_ORE){
                ItemStack lapis = player.getInventory().getItemInHand();
                int amount = lapis.getAmount();
                ItemStack smelt = new ItemStack(Material.INK_SACK, amount, (byte)4);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Lapis Lazuli Ore has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if (player.getItemInHand().getType() == Material.PORK){
                ItemStack pork = player.getInventory().getItemInHand();
                int amount = pork.getAmount();
                ItemStack smelt = new ItemStack(Material.GRILLED_PORK, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Raw Pork has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if (player.getItemInHand().getType() == Material.RAW_FISH){
                ItemStack fish = player.getInventory().getItemInHand();
                int amount = fish.getAmount();
                ItemStack smelt = new ItemStack(Material.COOKED_FISH, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Raw Fish has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if (player.getItemInHand().getType() == Material.POTATO){
                ItemStack potato = player.getInventory().getItemInHand();
                int amount = potato.getAmount();
                ItemStack smelt = new ItemStack(Material.BAKED_POTATO, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Potato has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
           
            }else if (player.getItemInHand().getType() == Material.WOOD){
                ItemStack wood = player.getInventory().getItemInHand();
                int amount = wood.getAmount();
                ItemStack smelt = new ItemStack(Material.COAL, amount, (short)1);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Wood has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
           
            }else if (player.getItemInHand().getType() == Material.CACTUS){
                ItemStack cactus = player.getInventory().getItemInHand();
                int amount = cactus.getAmount();
                ItemStack smelt = new ItemStack(Material.INK_SACK, amount, (byte)2);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Cactus has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
           
            }else if (player.getItemInHand().getType() == Material.SAND){
                ItemStack sand = player.getInventory().getItemInHand();
                int amount = sand.getAmount();
                ItemStack smelt = new ItemStack(Material.GLASS, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Sand has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if (player.getItemInHand().getType() == Material.COBBLESTONE){
                ItemStack cobblestone = player.getInventory().getItemInHand();
                int amount = cobblestone.getAmount();
                ItemStack smelt = new ItemStack(Material.STONE, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Cobblestone has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
               
            }else if (player.getItemInHand().getType() == Material.CLAY_BALL){
                ItemStack clay = player.getInventory().getItemInHand();
                int amount = clay.getAmount();
                ItemStack smelt = new ItemStack(Material.CLAY_BRICK, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Clay has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
       
            }else if (player.getItemInHand().getType() == Material.NETHERRACK){
                ItemStack nether = player.getInventory().getItemInHand();
                int amount = nether.getAmount();
                ItemStack smelt = new ItemStack(Material.NETHER_BRICK, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Netherrack has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
           
            }else if (player.getItemInHand().getType() == Material.CLAY){
                ItemStack beef = player.getInventory().getItemInHand();
                int amount = beef.getAmount();
                ItemStack smelt = new ItemStack(Material.HARD_CLAY, amount);
                player.getInventory().setItemInHand(smelt);
                player.sendMessage(ChatColor.GREEN + "Your Clay Block has been smelted!");
                cantDoCommand.add(player);
                d.setList(cantDoCommand);
                d.setPlayer(player);
                new Thread(d).start();
           
        }
            }else if (player.getItemInHand().getType() == Material.AIR){
                player.sendMessage(ChatColor.GREEN + "Your hand appears to be empty!");
            }else
                player.sendMessage(ChatColor.GREEN + "You can not smelt this item!");
            }
            return true;
        }
       
        public class Countdown implements Runnable{
           
            public Player player1 = null;
            public List<Player> cantDoCommand1 = new ArrayList<Player>();
           
            public void setPlayer (Player player){
                player1 = player;
            }
     
            public void setList(List<Player> list){
                cantDoCommand1 = list;
            }
           
            public List<Player> getList() {
                return cantDoCommand1;
            }
           
            public void run() {
                try{
                    Thread.sleep(300000);
                    cantDoCommand1.remove(player1);
                }catch (Exception ignored){
                   
                }
               
               
            }
           
        }
    }
       
               
           
           
     
     
    
     
  2. Offline

    bennie3211

    Cant help you with your visible countdown, but i think you can better remove the Thread.sleep(300000) from your class that extends JavaPlugin! :) Maybe you can store the time in milliseconds + your chosen delay in milliseconds from the server into a hashmap with the player name, and then cancel the event when the stored time is under the current server time in milliseconds :)
     
  3. Offline

    hockeygoalie5

    Do not use Thread.sleep(); instead, read up on Bukkit's schedulers. If you want to report to the player how long is left in the cool down, use a timer that runs every second (20 ticks) and increment a variable (e.g., elaspedTime) on each run. You can check for if elaspedTime equals the cool down delay, and cancel the task and run the code for the end of the cool down if it does. When the command is executed during a cool down, just print elaspedTime with a message.
     
  4. Offline

    fireblast709

    bennie3211 Nothing wrong with a sleep there, as its in another thread
    Eliteninja42

    • First of all, don't use Threads as you clearly do not understand synchronization. Personally I prefer Maps for this task: (see below)
    • Also you might be able to replace that long if..else if..else with smaller code as it is quite repetitive
    Code:java
    1. Map<String, Long> cooldowns = new HashMap<String, Long>();
    2. /**
    3.  * Returns true when the player is cooling down
    4.  **/
    5.  
    6. public boolean cooldown(Player player)
    7. {
    8. String name = player.getName();
    9. Long l = this.cooldowns.get(name);
    10. if(l == null || l.longValue() < System.currentTimeMillis())
    11. {
    12. this.cooldowns.put(name, System.currentTimeMillis()+ COOLDOWN_IN_MILLISECONDS);
    13. return false;
    14. }
    15. return true;
    16. }
     
    bennie3211 likes this.
  5. Offline

    bennie3211

    fireblast709 I told him to correctly that he cant use it in the Main class where he extends the JavaPlugin? Or did i say it wrong :p

    Edit;

    what fireblast709 gives is a better explanation about the visible cooldown :)
     
  6. Offline

    blm456

    This is how I do countdowns...
    Code:java
    1. static int stop = 0;
    2. public void countdown(final int time, final Player p){
    3. stop = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable(){
    4. int timeLeft = time;
    5. public void run(){
    6. if(time > 0){
    7. time--;
    8. p.sendMessage(time + "Remaining");
    9. }else{
    10. Bukkit.getScheduler().cancelTask(stop);
    11. }
    12. }
    13. }, 0L, 20L);
    14. }


    The 20L is equal to 1 second.
     
Thread Status:
Not open for further replies.

Share This Page