我正在创造一些魔法咒语,显然我希望每次使用之间都有延迟。
现在根据谷歌的说法,一秒钟有1000000000纳秒。
然而,魔法咒语在不到两秒钟后就会充电。
@EventHandler
public void onInteract(PlayerInteractEvent e){
Player p = e.getPlayer();
if (p.getItemInHand().getType().equals(Material.BLAZE_ROD)){
{
{
if (!kam.containsKey(p.getName())) kam.put(p.getName(), (long) 0);
if (kam.get(p.getName()) < System.nanoTime()){
kam.remove(p.getName());
kam.put(p.getName(), System.nanoTime() + (1000000000 * 30));
//Do magic spell attack here.
}
}
}else{
p.sendMessage(ChatColor.AQUA + "Skill recharging!");
}
}
显然,我的代码正在尝试添加System.nanoTime()
加 30 秒,然后检查当前系统nanoTime
是否大于我放入哈希图的系统,如果是,请执行拼写。
我建议你打印出1000000000 * 30
的值并检查它。你会发现它正在环绕,因为它太大而无法放入整数中。
换句话说,以下程序:
public class Test
{
public static void main(String args[])
{
System.out.println(1000000000 * 30);
System.out.println(1000000000L * 30);
}
}
打印输出:
-64771072
30000000000
因此,如果您使用 long
变体,它将正常工作。
Java
中的裸数字文字被视为 int
s,因此您的计算溢出。解决此问题的一种方法是使用long
文本执行计算,方法是在文本后添加L
:
kam.put(p.getName(), System.nanoTime() + (1000000000L * 30L));