Minestom/src/main/java/net/minestom/server/UpdateManager.java

67 lines
2.4 KiB
Java

package net.minestom.server;
import net.minestom.server.entity.EntityManager;
import net.minestom.server.entity.Player;
import net.minestom.server.instance.InstanceManager;
import net.minestom.server.network.ConnectionManager;
import net.minestom.server.network.packet.server.play.KeepAlivePacket;
import net.minestom.server.timer.SchedulerManager;
import net.minestom.server.utils.thread.MinestomThread;
import java.util.concurrent.ExecutorService;
public class UpdateManager {
private ExecutorService mainUpdate = new MinestomThread(MinecraftServer.THREAD_COUNT_MAIN_UPDATE, MinecraftServer.THREAD_NAME_MAIN_UPDATE);
public void start() {
mainUpdate.execute(() -> {
ConnectionManager connectionManager = MinecraftServer.getConnectionManager();
EntityManager entityManager = MinecraftServer.getEntityManager();
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
SchedulerManager schedulerManager = MinecraftServer.getSchedulerManager();
final long tickDistance = MinecraftServer.TICK_MS * 1000000;
long currentTime;
while (true) {
currentTime = System.nanoTime();
// Keep Alive Handling
for (Player player : connectionManager.getOnlinePlayers()) {
long time = currentTime / 1_000_000;
if (time - player.getLastKeepAlive() > 20000) {
player.refreshKeepAlive(time);
KeepAlivePacket keepAlivePacket = new KeepAlivePacket(time);
player.getPlayerConnection().sendPacket(keepAlivePacket);
}
}
// Entities update
entityManager.update();
// Blocks update
instanceManager.updateBlocks();
// Scheduler
schedulerManager.update();
// TODO miscellaneous update (scoreboard)
// Sleep until next tick
long sleepTime = (tickDistance - (System.nanoTime() - currentTime)) / 1000000;
sleepTime = Math.max(1, sleepTime);
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}