夏日冰熊
本帖最后由 南外丶仓鼠 于 2021-2-8 18:19 编辑

代码:
  1. public class QuickNight {
  2.     private static YamlConfiguration yaml;
  3.     private static double percent;
  4.     private static int speed;
  5.     private static boolean title;

  6.     public QuickNight() {
  7.         File file = new File(UntilTheEndServer.getInstance().getDataFolder(), "timeoperate.yml");
  8.         if (!file.exists())
  9.             UntilTheEndServer.getInstance().saveResource("timeoperate.yml", false);
  10.         yaml = YamlConfiguration.loadConfiguration(file);

  11.         if (!yaml.getBoolean("quickNight.enable"))
  12.             return;

  13.         percent = yaml.getDouble("quickNight.percent");
  14.         speed = yaml.getInt("quickNight.speed");
  15.         title = yaml.getBoolean("quickNight.title");

  16.         new BukkitRunnable() {
  17.             @Override
  18.             public void run() {
  19.                 for (World world : Bukkit.getWorlds()) {
  20.                     //白天不进行计算
  21.                     if (world.getTime() < 12600) {
  22.                         continue;
  23.                     }
  24.                     //计算某世界总睡觉玩家人数
  25.                     int amount = 0;
  26.                     if (world.getPlayers().size() == 0) {
  27.                         continue;
  28.                     }
  29.                     for (Player player : world.getPlayers()) {
  30.                         if (player.isSleeping()) {
  31.                             amount++;
  32.                         }
  33.                     }
  34.                     //如果全部都在入睡,就按原版机制跳到第二天
  35.                     if (amount == world.getPlayers().size()) {
  36.                         continue;
  37.                     }
  38.                     //如果入睡人数超过占比,则加速时间流动
  39.                     if (amount >= world.getPlayers().size() * percent) {
  40.                         long newTime = world.getTime() + 2 * (speed - 1);
  41.                         System.out.println(newTime);
  42.                         if (newTime >= 24000) {
  43.                             world.setTime(newTime - 24000);
  44.                         } else {
  45.                             world.setTime(newTime);
  46.                         }
  47.                         //告诉玩家几点了
  48.                         if (title) {
  49.                             for (Player player : world.getPlayers()) {
  50.                                 player.resetTitle();
  51.                                 player.sendTitle("§a" + getFormatTime(newTime), "§e世界时间");
  52.                             }
  53.                         }
  54.                     }
  55.                 }
  56.             }
  57.         }.runTaskTimer(UntilTheEndServer.getInstance(), 0L, 2L);
  58.     }

  59.     //把世界时间刻变为刻度的hh:mm
  60.     private static String getFormatTime(long newTime) {
  61.         long hour = newTime / 1000;
  62.         long minute = (long) (newTime % 1000 * 0.06);
  63.         String tmp = "";
  64.         if (minute < 10) {
  65.             tmp += "0" + minute;
  66.         } else {
  67.             tmp += minute;
  68.         }
  69.         if (hour + 6 >= 24) {
  70.             return "0" + (hour + 6 - 24) + ":" + tmp;
  71.         } else {
  72.             return (hour + 6) + ":" + tmp;
  73.         }
  74.     }
  75. }
复制代码
其中
percent=0.3
speed=30


代码目的:
当服务器某世界夜晚时,睡觉的玩家超过一定占比,夜晚时间开始加速流动,直到白天结束睡觉


出现的问题:
从12600刻(下午六点左右)一部分玩家开始睡觉,加速流逝到16400刻左右时,突然地睡觉的一部分玩家突然停止睡觉,时间跳到第二天0刻(上午6点)于是我尝试从16400刻开始入睡,结果时间加速流逝到18200刻左右,又出现了上面的情况。
这说明我代码的加速判定是没问题的。
但是当时的确服务器内有两名玩家在线,其中有一位不在睡觉,essentials也没有判定其为afk(挂机状态),但是时间就像是所有人在睡觉一样突然的跳到第二天
我算了一下,从入睡到结束睡眠大致等于MC原版单人模式从入睡到第二天经过的现实时间(8-10s左右)

我的猜测:
bukkit判定睡眠是根据ip(因为当时服务器内两名玩家都是我的测试号,同IP)

请求各位大佬解答,感激不尽


南柯郡守
本帖最后由 南柯郡守 于 2021-2-9 00:02 编辑

1. 判定玩家睡觉跳时间并不是判断ip 因为Player下有个setSleepingIgnored(boolean isSleeping)
2. 你说的 突然跳到0刻 是一个在睡觉一个没睡觉的情况下跳到0刻的嘛




你这个不就是相当于直接跳到0刻嘛

第一页 上一页 下一页 最后一页