2016-10-02 68 views
0

所以我有一個名爲JustExplode的Minecraft插件,我試圖讓它如此,如果有人有權限justexplode.timer,他們必須等待10分鐘才能再次使用命令/爆炸。它不工作,我嘗試了多種方式,而且我對編程新手......有人能幫助我嗎?這是我的主類JustExplode.java:如何在Bukkit中設置權限?

package me.sam1370.justexplode; 

import java.util.Date; 
import org.bukkit.Bukkit; 
import org.bukkit.ChatColor; 
import org.bukkit.Location; 
import org.bukkit.command.Command; 
import org.bukkit.command.CommandSender; 
import org.bukkit.entity.EntityType; 
import org.bukkit.entity.Player; 
import org.bukkit.plugin.java.JavaPlugin; 


public class JustExplode extends JavaPlugin{ 


@Override 
public void onEnable() { 
    getLogger().info("JustExplode has been enabled!"); 
    getConfig().options().copyDefaults(true); 
    saveConfig(); 
} 
@Override 
public void onDisable() { 
    getLogger().info("JustExplode has been disabled!"); 
} 


@Override 
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
    if (cmd.getName().equalsIgnoreCase("explode") && sender.hasPermission("justexplode.explode")){ 
      // Make sure that the player specified exactly one argument (the name of the player to exPLODE!). 
      if (args.length != 1) { 
      // When onCommand() returns false, the help message associated with that command is displayed. 
      return false; 
     } 

     // Make sure the sender is a player. 
     if (!(sender instanceof Player)) { 
      sender.sendMessage(ChatColor.RED + "Only players can explode other players."); 
      return true; 
     } 

     // Get the player who should be exploded. Remember that indices start with 0, not 1. 
     Player target = Bukkit.getServer().getPlayer(args[0]); 

     // Make sure the player is online. 
     if (target == null) { 
      sender.sendMessage(args[0] + " is not currently online."); 
      return true; 
     } 


     Location loc = target.getLocation(); 
     target.getWorld().spawnEntity(loc, EntityType.PRIMED_TNT); 
     String actuality = target.getName(); 
     if(sender instanceof Player){ 
      Player player = (Player) sender; 

      String localMessage = getConfig().getString("message"); 

      if(localMessage.contains("%player%")) { 
       localMessage = localMessage.replace("%player%", actuality); 
      } 

      if(localMessage.contains("&4")) { 
       localMessage = localMessage.replace("&4", ChatColor.DARK_RED + ""); 
      } 

      if(localMessage.contains("&c")) { 
       localMessage = localMessage.replace("&c", ChatColor.RED + ""); 
      } 

      if(localMessage.contains("&6")) { 
       localMessage = localMessage.replace("&6", ChatColor.GOLD + ""); 
      } 

      if(localMessage.contains("&e")) { 
       localMessage = localMessage.replace("&e", ChatColor.YELLOW + ""); 
      } 

      if(localMessage.contains("&2")) { 
       localMessage = localMessage.replace("&2", ChatColor.DARK_GREEN + ""); 
      } 

      if(localMessage.contains("&a")) { 
       localMessage = localMessage.replace("&a", ChatColor.GREEN + ""); 
      } 

      if(localMessage.contains("&b")) { 
       localMessage = localMessage.replace("&b", ChatColor.AQUA + ""); 
      } 

      if(localMessage.contains("&3")) { 
       localMessage = localMessage.replace("&3", ChatColor.DARK_AQUA + ""); 
      } 

      if(localMessage.contains("&1")) { 
       localMessage = localMessage.replace("&1", ChatColor.DARK_BLUE + ""); 
      } 

      if(localMessage.contains("&9")) { 
       localMessage = localMessage.replace("&9", ChatColor.BLUE + ""); 
      } 

      if(localMessage.contains("&d")) { 
       localMessage = localMessage.replace("&d", ChatColor.LIGHT_PURPLE + ""); 
      } 

      if(localMessage.contains("&5")) { 
       localMessage = localMessage.replace("&5", ChatColor.DARK_PURPLE + ""); 
      } 

      if(localMessage.contains("&f")) { 
       localMessage = localMessage.replace("&f", ChatColor.WHITE + ""); 
      } 

      if(localMessage.contains("&7")) { 
       localMessage = localMessage.replace("&7", ChatColor.GRAY + ""); 
      } 

      if(localMessage.contains("&l")) { 
       localMessage = localMessage.replace("&l", ChatColor.BOLD + ""); 
      } 

      if(localMessage.contains("&n")) { 
       localMessage = localMessage.replace("&n", ChatColor.UNDERLINE + ""); 
      } 

      if(localMessage.contains("&o")) { 
       localMessage = localMessage.replace("&o", ChatColor.ITALIC + ""); 
      } 

      if(localMessage.contains("&k")) { 
       localMessage = localMessage.replace("&k", ChatColor.MAGIC + ""); 
      } 

      if(localMessage.contains("&m")) { 
       localMessage = localMessage.replace("&m", ChatColor.STRIKETHROUGH + ""); 
      } 

      if(localMessage.contains("&r")) { 
       localMessage = localMessage.replace("&r", ChatColor.RESET + ""); 
      } 


      player.sendMessage(localMessage); 

     return true; 
    }else{ 
     if(sender instanceof Player){ 
      Player player = (Player) sender; 
     player.sendMessage(ChatColor.RED + "You don't have permission to explode anyone!"); 
     return true; 
    } 



} 
     return true; 

} 
     return true; 
    } 

    public boolean onCommand1(CommandSender sender, Command cmd, String label, String[] args) { 
     if (cmd.getName().equalsIgnoreCase("explode") && sender.hasPermission("justexplode.timer")){ 

      long timerMinutes = getConfig().getLong("timerMinutes"); 


      long startTime = System.currentTimeMillis(); 
      long elapsedTime = 0L; 

      while (elapsedTime < timerMinutes) { 

       long timeLeft = timerMinutes - elapsedTime; 

       String localMessage2 = getConfig().getString("timer"); 

       String timeLeftString = Long.toString(timeLeft); 

       if(localMessage2.contains("%timeleft%")) { 
        localMessage2 = localMessage2.replace("%timeleft%", timeLeftString); 
       } 

       if(localMessage2.contains("&4")) { 
        localMessage2 = localMessage2.replace("&4", ChatColor.DARK_RED + ""); 
       } 

       if(localMessage2.contains("&c")) { 
        localMessage2 = localMessage2.replace("&c", ChatColor.RED + ""); 
       } 

       if(localMessage2.contains("&6")) { 
        localMessage2 = localMessage2.replace("&6", ChatColor.GOLD + ""); 
       } 

       if(localMessage2.contains("&e")) { 
        localMessage2 = localMessage2.replace("&e", ChatColor.YELLOW + ""); 
       } 

       if(localMessage2.contains("&2")) { 
        localMessage2 = localMessage2.replace("&2", ChatColor.DARK_GREEN + ""); 
       } 

       if(localMessage2.contains("&a")) { 
        localMessage2 = localMessage2.replace("&a", ChatColor.GREEN + ""); 
       } 

       if(localMessage2.contains("&b")) { 
        localMessage2 = localMessage2.replace("&b", ChatColor.AQUA + ""); 
       } 

       if(localMessage2.contains("&3")) { 
        localMessage2 = localMessage2.replace("&3", ChatColor.DARK_AQUA + ""); 
       } 

       if(localMessage2.contains("&1")) { 
        localMessage2 = localMessage2.replace("&1", ChatColor.DARK_BLUE + ""); 
       } 

       if(localMessage2.contains("&9")) { 
        localMessage2 = localMessage2.replace("&9", ChatColor.BLUE + ""); 
       } 

       if(localMessage2.contains("&d")) { 
        localMessage2 = localMessage2.replace("&d", ChatColor.LIGHT_PURPLE + ""); 
       } 

       if(localMessage2.contains("&5")) { 
        localMessage2 = localMessage2.replace("&5", ChatColor.DARK_PURPLE + ""); 
       } 

       if(localMessage2.contains("&f")) { 
        localMessage2 = localMessage2.replace("&f", ChatColor.WHITE + ""); 
       } 

       if(localMessage2.contains("&7")) { 
        localMessage2 = localMessage2.replace("&7", ChatColor.GRAY + ""); 
       } 

       if(localMessage2.contains("&l")) { 
        localMessage2 = localMessage2.replace("&l", ChatColor.BOLD + ""); 
       } 

       if(localMessage2.contains("&n")) { 
        localMessage2 = localMessage2.replace("&n", ChatColor.UNDERLINE + ""); 
       } 

       if(localMessage2.contains("&o")) { 
        localMessage2 = localMessage2.replace("&o", ChatColor.ITALIC + ""); 
       } 

       if(localMessage2.contains("&k")) { 
        localMessage2 = localMessage2.replace("&k", ChatColor.MAGIC + ""); 
       } 

       if(localMessage2.contains("&m")) { 
        localMessage2 = localMessage2.replace("&m", ChatColor.STRIKETHROUGH + ""); 
       } 

       if(localMessage2.contains("&r")) { 
        localMessage2 = localMessage2.replace("&r", ChatColor.RESET + ""); 
       } 


       if(sender instanceof Player){ 
        Player player = (Player) sender; 


        player.sendMessage(localMessage2); 

       elapsedTime = (new Date()).getTime() - startTime; 
      } 



     } 
     return true; 

} 
     return true; 

} 
} 

,這裏是我的config.yml我設置:

# Default config file for JustExplode, by Sam1370 
# There isn't a reload config command for right now, just reload or restart the server 

# Change this to the message you want to see when you are exploding a player 
# Put %player% in it to get the player that you are exploding 
# Color codes are now supported, as opposed to version 1.0.8.2. YES!!! 
message: "&aExploded &c%player%!" 

# Change this to the message you want to see when a player tries to do /explode with the permission justexplode.timer 
# Put %timeleft% in it to get the time left before they can explode again 
# Color codes are supported 

timer: "You can't explode anyone for %timeleft%!" 

# Specify how many minutes, in milliseconds, how long you want someone to wait before they can do /explode again 
# The default is 600000 milliseconds, which is 10 minutes 
timerMinutes: 600000 

任何人都知道如何做到這一點?提前致謝。

回答

0

對於這些類型的延遲,你需要使用System.currentTimeMillis()和簡單HashMap

如何?

這實際上很簡單,讓我給你看幾個星期前我寫的例子。

private static HashMap<CommandSender, Long> lastExplodeUses = new HashMap<>(); 

public static HashMap<CommandSender, Long> getLastExplodeUses() { 
    return lastExplodeUses; 
} 

public static void setLastExplodeUse(CommandSender player, long till) { 
    lastHelpopSended.put(player, till); 
} 

public static boolean canExplode(CommandSender player) { 
    long timeExploded = lastExplodeUses.get(player) == null ? 0 : lastExplodeUses.get(player); 
    if (timeExploded == 0) return true; // if it's 0 - you can execute explode command. 
    long timeCurrent = System.currentTimeMillis(); // current time in millis 
    if (timeExploded < timeCurrent) { // if the timeExploded is lower than timeCurrent you can execude explode command. 
     return true; 
    } 
    return false; // if not, you cant. 
} 

下一步是什麼?你需要添加一些功能給你的命令。

if (sender.hasPermission("justexplode.timer")) { // if player has permission, if not - bypass the timer. 
    if (!canExplode(sender)) { 
     // you can't explode yet :/ 
     return; 
    } 
    setLastExplodeUse(sender, System.currentTimeMillis() + 10 * 1000); // set the till time to explode use. Current time + 10000, 10000 = 10 seconds. 
} 
// there you can do your explosion etc. 

切記!如果您正在創建例如kits,當延遲大約爲24 hours長時,您需要將該HashMap保存到MySQL或其他地方並在開始時加載!

+0

嘿,謝謝!我會試試看! – Sam1370

+0

嘿,我把「少數功能」代碼放在哪裏?我試圖在你提供的第一個示例代碼之後加上它,但它一直說「無法訪問的代碼」。我在哪裏放? – Sam1370

+0

是'return;'應該是真的還是假的? – Sam1370

0

當某人執行命令/爆炸時,會將玩家姓名和當前時間戳存儲在地圖中。當用戶再次嘗試執行該命令時,檢查播放器是否在地圖中,並且時間差等於ro大於config.yml中設置的時間。

小例子代碼:

Map<Player, Long> times = new HashMap<>(); 

@Override 
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
    if (!(sender instanceof Player)) 
    return false; 

    Player player = (Player) sender; 

    if (times.contains(player) && times.get(player) >= delay) { 
    //execute command 
    times.put(player, System.currentTimeMillis()); 
    } else if (!times.contains(player)) { 
    //execute command 
    times.put(player, System.currentTimeMillis()); 
    } 
} 
+0

嗯......怎麼樣?我是新手編程和Java,所以我不知道該怎麼做......對不起,打擾你 – Sam1370