System.currentTimeMillis()不断重置

时间:2015-06-04 16:13:09

标签: java minecraft

我正在尝试在我的插件插件中制作一个冷却工具:

package net.gettrillium.trillium.api.cooldown;

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import net.gettrillium.trillium.Utils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import java.util.UUID;

public class Cooldown {

private static Table<UUID, CooldownType, Long> cooldown = HashBasedTable.create();

public static void setCooldown(Player p, CooldownType type) {
    cooldown.put(p.getUniqueId(), type, System.currentTimeMillis());
}

public static boolean hasCooldown(Player p, CooldownType type) {
    if (cooldown.contains(p.getUniqueId(), type)) {
        Bukkit.broadcastMessage("GET: " + cooldown.get(p.getUniqueId(), type));
        Bukkit.broadcastMessage("CURRENT MILLIS: " + System.currentTimeMillis());
        Bukkit.broadcastMessage("SUBTRACTED: " + (System.currentTimeMillis() - cooldown.get(p.getUniqueId(), type)));
        Bukkit.broadcastMessage("IN SECONDS: " + (System.currentTimeMillis() - cooldown.get(p.getUniqueId(), type)) / 1000.0);
        Bukkit.broadcastMessage("> WITH: " + (type.getTimeInTicks() / 20));
        Bukkit.broadcastMessage("HAS COOLDOWN: " + (((System.currentTimeMillis() - cooldown.get(p.getUniqueId(), type)) / 1000.0) > (type.getTimeInTicks() / 20)));
        if (((System.currentTimeMillis() - cooldown.get(p.getUniqueId(), type)) / 1000.0) > (type.getTimeInTicks() / 20)) {
            return true;
        } else {
            cooldown.remove(p.getUniqueId(), type);
            return false;
        }
    } else {
        return false;
    }
}

public static String getTime(Player p, CooldownType type) {
    if (hasCooldown(p, type)) {
        return Utils.timeToString((int) ((System.currentTimeMillis() - cooldown.get(p.getUniqueId(), type)) / 1000.0));
    } else {
        return null;
    }
}
}

bukkit.broadcastMessage()方法只是将消息发送到控制台,并在游戏中作为调试。

我的问题是,每次检查cooldown表时,cooldown.contains(p.getUniqueId(), type)始终是新的System.currentTimeMillis()。它没有保存在setCooldown中注册的那个。

此传送模块中使用此Cooldown类,您需要注意的是与cooldown相关的if语句,其他所有内容都只是teleport相关代码。

调试输出:

GET: 1433433920944
CURRENT MILLIS: 1433433928830
SUBTRACTED: 7888
IN SECONDS: 7.889
WITH: 20
HAS COOLDOWN: false

任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分:1)

hasCooldown()中这是一个简单的逻辑错误。您可以从调试输出中看到,即使以秒为单位的时间小于冷却时间长度,它也会返回false以获得冷却时间。

通过在计算中使用临时变量,您可以更轻松地了解原因。当你在地图中找到一个条目时,你就是在做相同的事情:

long startMillis = cooldown.get(p.getUniqueId(), type);
double elapsedSecs = (System.currentTimeMillis() - startMillis) / 1000.0;
long cooldownSecs = type.getTimeInTicks() / 20;
boolean hasCooldown = elapsedSecs > cooldownSecs  // wrong!

那是倒退:如果elapsedSecs > cooldownSecs,那么冷却时间已经超时。如果cooldownSecs < elapsedSecs,则冷却时间仍然有效。

因此,当elapsedSecs < cooldownSecshasCooldown()错误地认为冷却时间超时时,它会将其删除并返回false。我确定你的代码的其他部分,找不到冷却时间,插入一个新的,这就是为什么你会看到一个新的。