diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java index 27cf84d..c81e7a7 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java @@ -76,6 +76,8 @@ public class LayerWorld extends Layer { @Override protected void doRender() { + client.getComms().processPackets(); + Camera camera = client.getCamera(); if (camera.hasAnchor()) { renderWorld(); diff --git a/src/main/java/ru/windcorp/progressia/common/comms/CommsChannel.java b/src/main/java/ru/windcorp/progressia/common/comms/CommsChannel.java index 288b5dd..3eeb486 100644 --- a/src/main/java/ru/windcorp/progressia/common/comms/CommsChannel.java +++ b/src/main/java/ru/windcorp/progressia/common/comms/CommsChannel.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; import ru.windcorp.progressia.common.comms.packets.Packet; @@ -53,6 +54,8 @@ public abstract class CommsChannel { private State state = State.CONNECTING; private final Collection listeners = Collections.synchronizedCollection(new ArrayList<>()); + + private final List pendingPackets = Collections.synchronizedList(new ArrayList<>()); protected abstract void doSendPacket(Packet packet) throws IOException; @@ -101,8 +104,19 @@ public abstract class CommsChannel { public abstract void disconnect(); protected void onPacketReceived(Packet packet) { + pendingPackets.add(packet); + } + + protected void forwardPacketToListeners(Packet packet) { listeners.forEach(l -> l.onPacketReceived(packet)); } + + public void processPackets() { + synchronized (pendingPackets) { + pendingPackets.forEach(this::forwardPacketToListeners); + pendingPackets.clear(); + } + } public void addListener(CommsListener listener) { listeners.add(listener); diff --git a/src/main/java/ru/windcorp/progressia/server/Server.java b/src/main/java/ru/windcorp/progressia/server/Server.java index e975b90..ea8504f 100644 --- a/src/main/java/ru/windcorp/progressia/server/Server.java +++ b/src/main/java/ru/windcorp/progressia/server/Server.java @@ -91,6 +91,7 @@ public class Server { this.playerManager = new PlayerManager(this); this.loadManager = new LoadManager(this); + schedule(getClientManager()::processPackets); schedule(new ChunkRequestDaemon(loadManager.getChunkManager())::tick); schedule(new EntityRequestDaemon(loadManager.getEntityManager())::tick); diff --git a/src/main/java/ru/windcorp/progressia/server/comms/ClientManager.java b/src/main/java/ru/windcorp/progressia/server/comms/ClientManager.java index dfa631a..935e846 100644 --- a/src/main/java/ru/windcorp/progressia/server/comms/ClientManager.java +++ b/src/main/java/ru/windcorp/progressia/server/comms/ClientManager.java @@ -26,6 +26,7 @@ import glm.vec._3.i.Vec3i; import gnu.trove.TCollections; import gnu.trove.map.TIntObjectMap; import gnu.trove.map.hash.TIntObjectHashMap; +import ru.windcorp.progressia.common.comms.CommsChannel; import ru.windcorp.progressia.common.comms.CommsChannel.State; import ru.windcorp.progressia.common.comms.packets.Packet; import ru.windcorp.progressia.common.world.PacketSetGravityModel; @@ -92,6 +93,10 @@ public class ClientManager { client.disconnect(); clientsById.remove(client.getId()); } + + public void processPackets() { + getClients().forEach(CommsChannel::processPackets); + } /** * Sends the provided packet to all connected player clients. diff --git a/src/main/java/ru/windcorp/progressia/test/TestContent.java b/src/main/java/ru/windcorp/progressia/test/TestContent.java index 6c2b0c3..5f5a690 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestContent.java +++ b/src/main/java/ru/windcorp/progressia/test/TestContent.java @@ -55,6 +55,9 @@ import ru.windcorp.progressia.common.world.tile.*; import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.comms.controls.*; import ru.windcorp.progressia.server.world.block.*; +import ru.windcorp.progressia.server.world.context.ServerBlockContext; +import ru.windcorp.progressia.server.world.context.ServerTileContext; +import ru.windcorp.progressia.server.world.context.ServerTileStackContext; import ru.windcorp.progressia.server.world.entity.*; import ru.windcorp.progressia.server.world.generation.planet.PlanetGravityModel; import ru.windcorp.progressia.server.world.tile.*; @@ -486,11 +489,22 @@ public class TestContent { Vec3i blockInWorld = controlData.getBlockInWorld(); AbsFace face = controlData.getFace(); - if (server.getWorld().getData().getChunkByBlock(blockInWorld) == null) + if (server.getWorld().getData().getChunkByBlock(blockInWorld) == null) { return; - if (server.getWorld().getData().getTiles(blockInWorld, face).isFull()) + } + if (server.getWorld().getData().getTiles(blockInWorld, face).isFull()) { return; - server.createAbsoluteContext().addTile(blockInWorld, face.relativize(AbsFace.POS_Z), tile); + } + + ServerBlockContext context = server.createContext(blockInWorld); + ServerTileStackContext tsContext = context.push(context.toContext(face)); + ServerTileContext tileContext = tsContext.push(tsContext.getTileCount()); + + TileLogic logic = TileLogicRegistry.getInstance().get(tile.getId()); + if (!logic.canOccupyFace(tileContext)) { + return; + } + tileContext.addTile(tile); } private static void registerMisc() {