Проведённое на сервере время

BlackBaroness

Модератор
Разработчик
Сообщения
1 841
Решения
81
Веб-сайт
t.me
[OFFTOPIC]Цифры в коде поставлены в целях отладки[/OFFTOPIC]
Сап спигот. Имею почти рабочий плагин, который подсчитывает проведенное игроком время на сервере.

Java:
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

public final class SapphireTimer extends JavaPlugin implements Listener {

    private final Map<UUID, PlayTime> playerTime = new HashMap<>();

    @Override
    public void onEnable() {
        getLogger().info(ChatColor.AQUA + "Successfully enabled.");
        Bukkit.getPluginManager().registerEvents(this, this);
        Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> {
            getLogger().info("3");
            playerTime.forEach((player, playTime) -> {
                long now = System.currentTimeMillis();
                long differenceInHours = TimeUnit.MILLISECONDS.toMinutes(now - playTime.getStart());
                Player p = Bukkit.getPlayer(player);
                getLogger().info("4");
                switch ((int) differenceInHours) {
                    case 1:
                        p.sendMessage("1");
                        break;
                    case 2:
                        p.sendMessage("2");
                        break;
                    default:
                        break;
                }
            });
        }, 0L, 1200L);
    }

    @Override
    public void onDisable() {
        getLogger().info(ChatColor.AQUA + "Successfully disabled.");
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        getLogger().info("1");
        Player p = e.getPlayer();
        UUID uuid = p.getUniqueId();
        if (!playerTime.containsKey(uuid)) {
            playerTime.put(uuid, new PlayTime());
        }
        getLogger().info("2");
    }

    @EventHandler
    void onQuit(PlayerQuitEvent e) {
        getLogger().info("5");
        Player p = e.getPlayer();
        UUID uuid = p.getUniqueId();
        playerTime.remove(uuid);
        getLogger().info("6");
    }
}

Дополнительный класс-считалочка:

Java:
public class PlayTime {
    private final long start = System.currentTimeMillis();

    public long getStart() {
        return start;
    }
}

Проверили код со знакомым джавером, всё должно работать... Но оно не работает. Именно тогда я и добавил циферки. Итак, лог:

Java:
[22:19:21] [Server thread/INFO]: [SapphireTimer] 1
[22:19:21] [Server thread/INFO]: [SapphireTimer] 2
[22:19:22] [Server thread/INFO]: Black_Baroness[/127.0.0.1:50365] logged in with entity id 200 at ([world]-187.68818107282408, 68.24124201567889, -171.5977566799813)
[22:20:11] [Craft Scheduler Thread - 4/INFO]: [SapphireTimer] 3
[22:20:11] [Craft Scheduler Thread - 4/INFO]: [SapphireTimer] 4

То есть код тормозит на switch ((int) differenceInHours). Почему - понятия не имею.
PS. В целях теста скрипт считает минуты, а не часы
 
Назад
Сверху Снизу