Java冷却系统

Java冷却系统,java,Java,我一直在尝试用java制作一个冷却系统,给定三个变量 冷却时间,例如100秒 单击时间戳(上次单击时) 当前时间戳 我以前做过,但看起来很复杂,我想知道是否有更好的方法 检查单击是否处于冷却状态的代码: private boolean onCooldown(String playerUUID, int npcId, int cooldown) { boolean toReturn = false; try { String timeStamp = new Si

我一直在尝试用java制作一个冷却系统,给定三个变量

  • 冷却时间,例如100秒
  • 单击时间戳(上次单击时)
  • 当前时间戳
我以前做过,但看起来很复杂,我想知道是否有更好的方法

检查单击是否处于冷却状态的代码:

private boolean onCooldown(String playerUUID, int npcId, int cooldown) {
    boolean toReturn = false;
    try {
        String timeStamp = new SimpleDateFormat("yyyy/MM/dd_HH:mm:ss").format(Calendar.getInstance().getTime());
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd_HH:mm:ss"); 
        Date savedTime;
        Date nowTime;
        String savedString = database.getTime(playerUUID, npcId);
        nowTime = df.parse(timeStamp);
        savedTime = df.parse(savedString);
        long diff = nowTime.getTime() - savedTime.getTime();
        long savedSeconds = diff / 1000 % 60;  
        long savedMinutes = diff / (60 * 1000) % 60;          
        long nowSeconds = cooldown  % 60;
        long nowMinutes = cooldown / 60 % 60;
        if (!((savedMinutes >= nowMinutes) && (savedSeconds >= nowSeconds))) {
            toReturn = true;
        } 
    } catch (Exception e) {
        toReturn = false;
    }
    return toReturn;
}
有比这更好或更简单的方法吗

干杯。

我建议使用存储玩家UUID和当前时间戳的。在该方法中,您可以检查地图是否包含玩家的钥匙,如果包含,则检查存储的值和所需的冷却时间是否小于/大于当前时间


如评论中所述,我建议使用
System.nanoTime()
作为时间戳。

System.nanoTime()
将以纳秒为单位给出当前时间。从外部保存该方法的第一个值,并在每次调用该方法时保持获取nanoTime,直到达到阈值为止。然后将旧的外部nanoTime变量替换为新的timeI投票结束这个问题,因为它属于(因为您正在寻找对已经工作的代码的改进)。尝试使用JavaFx创建GUI。另外,JavaFx有一个Timeline类,可以很好地实现这一点。您可以单击按钮启动计时器,并将该按钮设置为禁用,直到计时器完成。您还应该补充一点,除了减少计算的明显好处外,还可以显著减少内存使用量,如
System.nanoTime()
只返回一个原语
long
,而不是完整的DTOI。我以前使用HashMap来存储时间,但它有一个小缺点,那就是可以存储时间,因为每次有人重新加载服务器时,HashMap都会重置,我在minecraft的插件上使用它,冷却时间(例如172800秒(2天))将丢失。但是谢谢你,也谢谢@CraigR8806,我会改进我所拥有的!您可以使用存储Hashmap。祝你好运在性能方面,SQLite数据库还是简单的YML文件更好?我认为这取决于您拥有的数据量。除非您需要存储大量的日志文件,例如块位置或聊天历史记录,否则我建议使用Bukkit的配置。