我的 Bukkit 计时器运行一次,当我再次执行命令时,它更快
My Bukkit Timer runs once and when i do the command again it, its faster
我的 Bukkit 插件有一个计时器,可以穿上盔甲,倒计时,然后移除盔甲,然后当我 运行 它再次出现时,计时器会更快吗?为什么是这样?我希望用户能够多次执行该命令而无需再次登录。有人可以帮助我吗?
if(args[0].equalsIgnoreCase("BlackWing") )
{
final ItemStack[] oldarmor1;
oldarmor1 = p.getInventory().getArmorContents();
ItemStack ib = new ItemStack(Material.CHAINMAIL_BOOTS, 1);
ib.addEnchantment(Enchantment.PROTECTION_FALL, 4);
ib.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
ItemStack il=new ItemStack(Material.CHAINMAIL_LEGGINGS, 1);
il.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
ItemStack ic = new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1);
ic.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
ItemStack ih = new ItemStack(Material.CHAINMAIL_HELMET, 1);
ih.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
ItemStack[] armors1 = { ib ,
il,
ic,
ih};
p.getInventory().setArmorContents(armors1);
PotionEffect pe = new PotionEffect(PotionEffectType.JUMP, 600, 5);
p.addPotionEffect(pe);
ItemStack ironsword = new ItemStack(Material.IRON_SWORD,1);
ironsword.addEnchantment(Enchantment.DAMAGE_ALL, 3);
p.getInventory().setItem( 0, ironsword);
getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
public void run(){
if (number != 0){
p.sendMessage(ChatColor.RED + "[FairyTail] " + ChatColor.GRAY + number + " seconds left");
number=number -1;
}else{
p.getInventory().setArmorContents(oldarmor1);
}
}
}, 0L, 20L);
}
number=30;
查看您提供的代码片段,倒计时的计划任务从未取消。同一个玩家第二次执行该命令时,后台实际上会有两个任务 运行,它们都递减 number
(秒数),因此导致倒计时快两倍。要解决此问题,您可以确保在任务完成后倒计时它被取消的秒数。在这种情况下,编写一个扩展 BukkitRunnable
的新 class 可能真的很有帮助,因为它们可以自行取消(例如,在 30 秒结束的情况下)。
我的 Bukkit 插件有一个计时器,可以穿上盔甲,倒计时,然后移除盔甲,然后当我 运行 它再次出现时,计时器会更快吗?为什么是这样?我希望用户能够多次执行该命令而无需再次登录。有人可以帮助我吗?
if(args[0].equalsIgnoreCase("BlackWing") )
{
final ItemStack[] oldarmor1;
oldarmor1 = p.getInventory().getArmorContents();
ItemStack ib = new ItemStack(Material.CHAINMAIL_BOOTS, 1);
ib.addEnchantment(Enchantment.PROTECTION_FALL, 4);
ib.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
ItemStack il=new ItemStack(Material.CHAINMAIL_LEGGINGS, 1);
il.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
ItemStack ic = new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1);
ic.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
ItemStack ih = new ItemStack(Material.CHAINMAIL_HELMET, 1);
ih.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1);
ItemStack[] armors1 = { ib ,
il,
ic,
ih};
p.getInventory().setArmorContents(armors1);
PotionEffect pe = new PotionEffect(PotionEffectType.JUMP, 600, 5);
p.addPotionEffect(pe);
ItemStack ironsword = new ItemStack(Material.IRON_SWORD,1);
ironsword.addEnchantment(Enchantment.DAMAGE_ALL, 3);
p.getInventory().setItem( 0, ironsword);
getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
public void run(){
if (number != 0){
p.sendMessage(ChatColor.RED + "[FairyTail] " + ChatColor.GRAY + number + " seconds left");
number=number -1;
}else{
p.getInventory().setArmorContents(oldarmor1);
}
}
}, 0L, 20L);
}
number=30;
查看您提供的代码片段,倒计时的计划任务从未取消。同一个玩家第二次执行该命令时,后台实际上会有两个任务 运行,它们都递减 number
(秒数),因此导致倒计时快两倍。要解决此问题,您可以确保在任务完成后倒计时它被取消的秒数。在这种情况下,编写一个扩展 BukkitRunnable
的新 class 可能真的很有帮助,因为它们可以自行取消(例如,在 30 秒结束的情况下)。