所以我正在编写一个Minecraft插件,我对此很新。 这是我的代码:
public class ItemGiver extends JavaPlugin {
public int time;
int show = time / 1200;
// Divide by mins by 1200 for ticks
@Override
public void onEnable() {
getLogger().info("ItemGiver enabled.");
timer();
}
@Override
public void onDisable() {
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(cmd.getName().equalsIgnoreCase("bonustime") && sender instanceof Player) {
Player player = (Player) sender;
if(args.length == 1) {
if(player.hasPermission("bonus.set") || player.isOp()) {
player.sendMessage(ChatColor.DARK_PURPLE + "[Bonus] The bonus delay has been set to " + show + " minute(s)!");
time = Integer.parseInt(args[0].trim()) * 1200;
return true;
}
}
if(args.length != 1) {
player.sendMessage(ChatColor.RED + "Incorrect Syntax.");
}
}
return false;
}
@SuppressWarnings("deprecation")
public void timer()
{
this.getServer().getScheduler().scheduleAsyncRepeatingTask(this,new Runnable()
{
public void run()
{
for(Player player : Bukkit.getServer().getOnlinePlayers())
{
player.getInventory().addItem(new ItemStack(Material.COBBLESTONE, 32));
player.getInventory().addItem(new ItemStack(Material.IRON_INGOT, 1));
player.giveExpLevels(2);
player.sendMessage(ChatColor.DARK_PURPLE + "[Bonus] You have received your bonus! Next bonus in " + show + " minutes!" );
}
}
}
, time, time);
}
}
问题出现在onCommand
布尔值中,我试图改变时间以延迟每个“奖励给予”,time = Interger.parseInt(arg[0].trim());
似乎实际上没有改变时间值?对不起,可能看起来像个愚蠢的问题。
答案 0 :(得分:0)
首先,使用时间的初始值计算show
的值一次。如果您希望show
的值为计时器所代表的分钟数,则应在更新时间时更新show
的值。
其次,传递给bukkit runnable的时间是final,其中bukkit runnable将其调度为您给它的原始数字,并且更新time
变量不会改变bukkit runnable的间隔。
更改时间更改时bukkit可运行间隔的解决方案是存储全局BukkitRunnable
变量。为此,您必须从已弃用的getServer().getScheduler().scheduleAsyncRepeatingTask()
移至较新的new BukkitRunnable()
方法,如本教程所示:http://wiki.bukkit.org/Scheduler_Programming#Anonymous_BukkitRunnable_Example
您想要做的是构造bukkit runnable一次,并将其存储为全局变量。每次更新时间时,都需要取消使用runnable.cancel()
运行的全局bukkit,然后使用您刚刚计算的新runnable.runTaskTimerAsynchronously()
变量安排它再次使用time
运行。
只是提示,您不应该为更新播放器库存的任务安排异步任务(在另一个线程上),您只需要ConcurrentException