本帖最后由 南外丶仓鼠 于 2021-2-8 18:19 编辑
代码:复制代码其中
percent=0.3
speed=30
代码目的:
当服务器某世界夜晚时,睡觉的玩家超过一定占比,夜晚时间开始加速流动,直到白天结束睡觉
出现的问题:
从12600刻(下午六点左右)一部分玩家开始睡觉,加速流逝到16400刻左右时,突然地睡觉的一部分玩家突然停止睡觉,时间跳到第二天0刻(上午6点)于是我尝试从16400刻开始入睡,结果时间加速流逝到18200刻左右,又出现了上面的情况。
这说明我代码的加速判定是没问题的。
但是当时的确服务器内有两名玩家在线,其中有一位不在睡觉,essentials也没有判定其为afk(挂机状态),但是时间就像是所有人在睡觉一样突然的跳到第二天
我算了一下,从入睡到结束睡眠大致等于MC原版单人模式从入睡到第二天经过的现实时间(8-10s左右)
我的猜测:
bukkit判定睡眠是根据ip(因为当时服务器内两名玩家都是我的测试号,同IP)
请求各位大佬解答,感激不尽
代码:
- public class QuickNight {
- private static YamlConfiguration yaml;
- private static double percent;
- private static int speed;
- private static boolean title;
- public QuickNight() {
- File file = new File(UntilTheEndServer.getInstance().getDataFolder(), "timeoperate.yml");
- if (!file.exists())
- UntilTheEndServer.getInstance().saveResource("timeoperate.yml", false);
- yaml = YamlConfiguration.loadConfiguration(file);
- if (!yaml.getBoolean("quickNight.enable"))
- return;
- percent = yaml.getDouble("quickNight.percent");
- speed = yaml.getInt("quickNight.speed");
- title = yaml.getBoolean("quickNight.title");
- new BukkitRunnable() {
- @Override
- public void run() {
- for (World world : Bukkit.getWorlds()) {
- //白天不进行计算
- if (world.getTime() < 12600) {
- continue;
- }
- //计算某世界总睡觉玩家人数
- int amount = 0;
- if (world.getPlayers().size() == 0) {
- continue;
- }
- for (Player player : world.getPlayers()) {
- if (player.isSleeping()) {
- amount++;
- }
- }
- //如果全部都在入睡,就按原版机制跳到第二天
- if (amount == world.getPlayers().size()) {
- continue;
- }
- //如果入睡人数超过占比,则加速时间流动
- if (amount >= world.getPlayers().size() * percent) {
- long newTime = world.getTime() + 2 * (speed - 1);
- System.out.println(newTime);
- if (newTime >= 24000) {
- world.setTime(newTime - 24000);
- } else {
- world.setTime(newTime);
- }
- //告诉玩家几点了
- if (title) {
- for (Player player : world.getPlayers()) {
- player.resetTitle();
- player.sendTitle("§a" + getFormatTime(newTime), "§e世界时间");
- }
- }
- }
- }
- }
- }.runTaskTimer(UntilTheEndServer.getInstance(), 0L, 2L);
- }
- //把世界时间刻变为刻度的hh:mm
- private static String getFormatTime(long newTime) {
- long hour = newTime / 1000;
- long minute = (long) (newTime % 1000 * 0.06);
- String tmp = "";
- if (minute < 10) {
- tmp += "0" + minute;
- } else {
- tmp += minute;
- }
- if (hour + 6 >= 24) {
- return "0" + (hour + 6 - 24) + ":" + tmp;
- } else {
- return (hour + 6) + ":" + tmp;
- }
- }
- }
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刻嘛
1. 判定玩家睡觉跳时间并不是判断ip 因为Player下有个setSleepingIgnored(boolean isSleeping)
- if (newTime >= 24000) {
- world.setTime(newTime - 24000);
- }
你这个不就是相当于直接跳到0刻嘛