From 7271636aa86ca0b9e4e18242ce59a06ab83076dd Mon Sep 17 00:00:00 2001 From: TheMode Date: Sun, 11 Aug 2019 00:36:20 +0200 Subject: [PATCH] Updated tick manager & players update --- src/main/java/fr/themode/minestom/Main.java | 26 +++++++----- .../fr/themode/minestom/entity/Entity.java | 4 +- .../minestom/entity/EntityManager.java | 41 ++++++++++++------- .../fr/themode/minestom/entity/Player.java | 2 +- .../minestom/entity/demo/ChickenCreature.java | 2 +- .../minestom/net/ConnectionManager.java | 12 +++--- .../themode/minestom/net/PacketProcessor.java | 5 ++- .../packet/client/login/LoginStartPacket.java | 6 +-- 8 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/main/java/fr/themode/minestom/Main.java b/src/main/java/fr/themode/minestom/Main.java index 9b2bad581..b1a7cdb2b 100644 --- a/src/main/java/fr/themode/minestom/Main.java +++ b/src/main/java/fr/themode/minestom/Main.java @@ -15,18 +15,18 @@ import java.lang.reflect.InvocationTargetException; public class Main { - // In-Game Manager - private static EntityManager entityManager; - - // Others + // Networking private static ConnectionManager connectionManager; private static PacketProcessor packetProcessor; - public static void main(String[] args) { - entityManager = new EntityManager(); + // In-Game Manager + private static EntityManager entityManager; + public static void main(String[] args) { connectionManager = new ConnectionManager(); - packetProcessor = new PacketProcessor(connectionManager); + packetProcessor = new PacketProcessor(); + + entityManager = new EntityManager(); Server server = new TCPServer(new MinecraftProtocol()).addHandler(new ServerHandler() { @Override @@ -63,10 +63,12 @@ public class Main { server.bind(25565); System.out.println("Server started"); - long lastTime = System.currentTimeMillis(); + long tickDistance = 50 * 1000000; // 50 ms + long nextTick = System.nanoTime(); + long currentTime; while (true) { - if (System.currentTimeMillis() - lastTime >= 50) { - lastTime = System.currentTimeMillis(); + currentTime = System.nanoTime(); + if (currentTime >= nextTick) { // Tick // Keep Alive Handling @@ -79,6 +81,10 @@ public class Main { // Entities update entityManager.update(); + + // Set next tick update time + currentTime = System.nanoTime(); + nextTick = currentTime + tickDistance - (currentTime - nextTick); } } } diff --git a/src/main/java/fr/themode/minestom/entity/Entity.java b/src/main/java/fr/themode/minestom/entity/Entity.java index 92881fe3f..c251075c1 100644 --- a/src/main/java/fr/themode/minestom/entity/Entity.java +++ b/src/main/java/fr/themode/minestom/entity/Entity.java @@ -37,8 +37,8 @@ public class Entity { public void addToWorld() { this.isActive = true; EntityManager entityManager = Main.getEntityManager(); - if (this instanceof LivingEntity) { - entityManager.addLivingEntity((LivingEntity) this); + if (this instanceof EntityCreature) { + entityManager.addCreature((EntityCreature) this); } } diff --git a/src/main/java/fr/themode/minestom/entity/EntityManager.java b/src/main/java/fr/themode/minestom/entity/EntityManager.java index b82f118eb..ae43851d8 100644 --- a/src/main/java/fr/themode/minestom/entity/EntityManager.java +++ b/src/main/java/fr/themode/minestom/entity/EntityManager.java @@ -1,35 +1,46 @@ package fr.themode.minestom.entity; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; +import fr.themode.minestom.Main; +import fr.themode.minestom.net.ConnectionManager; + +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class EntityManager { - private Set livingEntities = Collections.synchronizedSet(new HashSet<>()); + private Set creatures = Collections.synchronizedSet(new HashSet<>()); - private ExecutorService pool = Executors.newFixedThreadPool(50); + private ExecutorService creaturesPool = Executors.newFixedThreadPool(3); + private ExecutorService playersPool = Executors.newFixedThreadPool(2); + + private ConnectionManager connectionManager = Main.getConnectionManager(); public void update() { - livingEntities.removeIf(livingEntity -> livingEntity.shouldRemove()); + creatures.removeIf(creature -> creature.shouldRemove()); - synchronized (livingEntities) { - Iterator iterator = livingEntities.iterator(); + synchronized (creatures) { + Iterator iterator = creatures.iterator(); while (iterator.hasNext()) { - LivingEntity entity = iterator.next(); - pool.submit(entity::update); + EntityCreature creature = iterator.next(); + creaturesPool.submit(creature::update); } } + + Collection players = connectionManager.getOnlinePlayers(); + Iterator iterator = players.iterator(); + while (iterator.hasNext()) { + Player player = iterator.next(); + playersPool.submit(player::update); + } + } - public Set getEntities() { - return Collections.unmodifiableSet(livingEntities); + public Set getCreatures() { + return Collections.unmodifiableSet(creatures); } - protected void addLivingEntity(LivingEntity livingEntity) { - this.livingEntities.add(livingEntity); + protected void addCreature(EntityCreature creature) { + this.creatures.add(creature); } } diff --git a/src/main/java/fr/themode/minestom/entity/Player.java b/src/main/java/fr/themode/minestom/entity/Player.java index 6c462806e..6cc94f54b 100644 --- a/src/main/java/fr/themode/minestom/entity/Player.java +++ b/src/main/java/fr/themode/minestom/entity/Player.java @@ -18,7 +18,7 @@ public class Player extends LivingEntity { @Override public void update() { - // System.out.println("Je suis l'update"); + //System.out.println("Je suis l'update"); } public PlayerConnection getPlayerConnection() { diff --git a/src/main/java/fr/themode/minestom/entity/demo/ChickenCreature.java b/src/main/java/fr/themode/minestom/entity/demo/ChickenCreature.java index 37c512844..6346b9b7d 100644 --- a/src/main/java/fr/themode/minestom/entity/demo/ChickenCreature.java +++ b/src/main/java/fr/themode/minestom/entity/demo/ChickenCreature.java @@ -13,7 +13,7 @@ public class ChickenCreature extends EntityCreature { public void update() { onGround = true; - double speed = 0.01; + double speed = 0.05; double newPos = getZ() + speed; EntityRelativeMovePacket entityRelativeMovePacket = new EntityRelativeMovePacket(); diff --git a/src/main/java/fr/themode/minestom/net/ConnectionManager.java b/src/main/java/fr/themode/minestom/net/ConnectionManager.java index fb5526a75..4dcd08224 100644 --- a/src/main/java/fr/themode/minestom/net/ConnectionManager.java +++ b/src/main/java/fr/themode/minestom/net/ConnectionManager.java @@ -3,13 +3,11 @@ package fr.themode.minestom.net; import fr.themode.minestom.entity.Player; import fr.themode.minestom.net.player.PlayerConnection; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class ConnectionManager { + private volatile Set players = new HashSet<>(); private volatile Map connectionPlayerMap = new HashMap<>(); public Player getPlayer(PlayerConnection connection) { @@ -17,11 +15,13 @@ public class ConnectionManager { } public Collection getOnlinePlayers() { - return Collections.unmodifiableCollection(connectionPlayerMap.values()); + return Collections.unmodifiableCollection(players); } // Is only used at LoginStartPacket#process public void createPlayer(PlayerConnection connection) { - this.connectionPlayerMap.put(connection, new Player(connection)); + Player player = new Player(connection); + this.players.add(player); + this.connectionPlayerMap.put(connection, player); } } diff --git a/src/main/java/fr/themode/minestom/net/PacketProcessor.java b/src/main/java/fr/themode/minestom/net/PacketProcessor.java index 416cf9361..380bbb75a 100644 --- a/src/main/java/fr/themode/minestom/net/PacketProcessor.java +++ b/src/main/java/fr/themode/minestom/net/PacketProcessor.java @@ -3,6 +3,7 @@ package fr.themode.minestom.net; import fr.adamaq01.ozao.net.Buffer; import fr.adamaq01.ozao.net.packet.Packet; import fr.adamaq01.ozao.net.server.Connection; +import fr.themode.minestom.Main; import fr.themode.minestom.entity.Player; import fr.themode.minestom.net.packet.client.ClientPlayPacket; import fr.themode.minestom.net.packet.client.ClientPreplayPacket; @@ -29,8 +30,8 @@ public class PacketProcessor { private ClientLoginPacketsHandler loginPacketsHandler; private ClientPlayPacketsHandler playPacketsHandler; - public PacketProcessor(ConnectionManager connectionManager) { - this.connectionManager = connectionManager; + public PacketProcessor() { + this.connectionManager = Main.getConnectionManager(); this.statusPacketsHandler = new ClientStatusPacketsHandler(); this.loginPacketsHandler = new ClientLoginPacketsHandler(); diff --git a/src/main/java/fr/themode/minestom/net/packet/client/login/LoginStartPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/login/LoginStartPacket.java index 2681f0495..6e5a51dd8 100644 --- a/src/main/java/fr/themode/minestom/net/packet/client/login/LoginStartPacket.java +++ b/src/main/java/fr/themode/minestom/net/packet/client/login/LoginStartPacket.java @@ -67,9 +67,9 @@ public class LoginStartPacket implements ClientPreplayPacket { connection.sendPacket(spawnPositionPacket); PlayerPositionAndLookPacket playerPositionAndLookPacket = new PlayerPositionAndLookPacket(); - playerPositionAndLookPacket.x = 50; + playerPositionAndLookPacket.x = 0; playerPositionAndLookPacket.y = 5; - playerPositionAndLookPacket.z = 50; + playerPositionAndLookPacket.z = 0; playerPositionAndLookPacket.yaw = 0; playerPositionAndLookPacket.pitch = 0; playerPositionAndLookPacket.flags = 0; @@ -80,7 +80,7 @@ public class LoginStartPacket implements ClientPreplayPacket { for (int z = -20; z < 20; z++) { // TODO test entity ChickenCreature chickenCreature = new ChickenCreature(); - chickenCreature.setPosition(50 + (double) x * 1, 5, 50 + (double) z * 1); + chickenCreature.setPosition((double) x * 1, 5, (double) z * 1); connectionManager.getOnlinePlayers().forEach(p -> chickenCreature.addViewer(p)); chickenCreature.addToWorld(); }