Я создаю несколько магических заклинаний, и, очевидно, мне нужна задержка между каждым использованием.

Теперь Согласно Google, в секунде 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, чем та, которую я поместил в хэш-карту, и если это так, выполните заклинание.

1
Joehot200 29 Ноя 2014 в 14:16

2 ответа

Лучший ответ

Предлагаю вам распечатать значение 1000000000 * 30 и проверить его. Вы обнаружите, что он оборачивается, потому что он слишком велик, чтобы поместиться в целое число.

Другими словами, следующая программа:

public class Test
{
    public static void main(String args[])
    {
        System.out.println(1000000000 * 30);
        System.out.println(1000000000L * 30);
    }
}

Распечатывает:

-64771072
30000000000

Так что, если вы используете вариант long, он будет работать нормально.

5
paxdiablo 29 Ноя 2014 в 11:20

Голые числовые литералы в Java обрабатываются как int, и поэтому ваши вычисления переполняются. Один из способов исправить это - выполнить вычисление с помощью литералов long, добавив L после литерала:

kam.put(p.getName(), System.nanoTime() + (1000000000L * 30L));
5
Mureinik 29 Ноя 2014 в 11:21