From f280e9beaaed76e53ff873a0a3d166849c192dab Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 18 Jul 2021 00:01:44 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B8=D1=80=D1=83=D0=B5=D0=BC=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/protocol/pool/ProtocolObjectPool.java | 22 +++++--- .../java/mc/protocol/utils/LocationUtils.java | 52 +++++++++++++++++++ .../main/java/mc/protocol/world/World.java | 2 + server/src/main/java/mc/server/Main.java | 1 + .../main/java/mc/server/di/WorldModule.java | 15 +++++- .../mc/server/scenario/ScenarioLogin.java | 37 +++++++------ .../java/mc/server/util/LocationUtils.java | 15 ------ .../main/java/mc/server/world/SomeWorld.java | 18 +++---- server/src/main/resources/config-default.conf | 7 ++- 9 files changed, 118 insertions(+), 51 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/utils/LocationUtils.java delete mode 100644 server/src/main/java/mc/server/util/LocationUtils.java diff --git a/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java b/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java index f239447..1ba3155 100644 --- a/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java +++ b/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java @@ -2,6 +2,7 @@ package mc.protocol.pool; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import mc.protocol.model.ChunkSectionLocation; import mc.protocol.model.Location; import mc.protocol.model.Look; import mc.protocol.packets.ClientSidePacket; @@ -13,24 +14,29 @@ import mc.utils.pool.SimpleObjectPool; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ProtocolObjectPool { - private static final ObjectPool locationPool = new SimpleObjectPool<>(Location.class); - private static final ObjectPool lookPool = new SimpleObjectPool<>(Look.class); - private static final NetByteBufObjectPool netByteBufPool = new NetByteBufObjectPool(); - private static final MultiObjectPool packetPool = new PassivableMultiObjectPool<>(); + private static final ObjectPool LOCATION_POOL = new SimpleObjectPool<>(Location.class); + private static final ObjectPool CHUNK_SECTION_LOCATION_POOL = new SimpleObjectPool<>(ChunkSectionLocation.class); + private static final ObjectPool LOOK_POOL = new SimpleObjectPool<>(Look.class); + private static final NetByteBufObjectPool NETBYTEBUF_POOL = new NetByteBufObjectPool(); + private static final MultiObjectPool PACKET_POOL = new PassivableMultiObjectPool<>(); public static ObjectPool location() { - return locationPool; + return LOCATION_POOL; + } + + public static ObjectPool chunkSectionLocation() { + return CHUNK_SECTION_LOCATION_POOL; } public static ObjectPool look() { - return lookPool; + return LOOK_POOL; } public static NetByteBufObjectPool netByteBuf() { - return netByteBufPool; + return NETBYTEBUF_POOL; } public static MultiObjectPool packet() { - return packetPool; + return PACKET_POOL; } } diff --git a/protocol/src/main/java/mc/protocol/utils/LocationUtils.java b/protocol/src/main/java/mc/protocol/utils/LocationUtils.java new file mode 100644 index 0000000..a609567 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/utils/LocationUtils.java @@ -0,0 +1,52 @@ +package mc.protocol.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import mc.protocol.model.BlockLocation; +import mc.protocol.model.ChunkSectionLocation; +import mc.protocol.model.Location; +import mc.protocol.pool.ProtocolObjectPool; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class LocationUtils { + + //region Unpooled + public static ChunkSectionLocation location2chunk(Location location) { + var chunkSectionLocation = new ChunkSectionLocation(); + chunkSectionLocation.set( + (int) location.getX() >> 4, + (int) location.getY() >> 4, + (int) location.getZ() >> 4); + return chunkSectionLocation; + } + + public static ChunkSectionLocation location2chunk(BlockLocation blockLocation) { + var chunkSectionLocation = new ChunkSectionLocation(); + chunkSectionLocation.set( + blockLocation.getX() >> 4, + blockLocation.getY() >> 4, + blockLocation.getZ() >> 4); + return chunkSectionLocation; + } + //endregion + + //region Pooled + public static ChunkSectionLocation location2chunkPooled(Location location) { + ChunkSectionLocation chunkSectionLocation = ProtocolObjectPool.chunkSectionLocation().borrowObject(); + chunkSectionLocation.set( + (int) location.getX() >> 4, + (int) location.getY() >> 4, + (int) location.getZ() >> 4); + return chunkSectionLocation; + } + + public static ChunkSectionLocation location2chunkPooled(BlockLocation blockLocation) { + ChunkSectionLocation chunkSectionLocation = ProtocolObjectPool.chunkSectionLocation().borrowObject(); + chunkSectionLocation.set( + blockLocation.getX() >> 4, + blockLocation.getY() >> 4, + blockLocation.getZ() >> 4); + return chunkSectionLocation; + } + //endregion +} diff --git a/protocol/src/main/java/mc/protocol/world/World.java b/protocol/src/main/java/mc/protocol/world/World.java index 1d57700..387ade0 100644 --- a/protocol/src/main/java/mc/protocol/world/World.java +++ b/protocol/src/main/java/mc/protocol/world/World.java @@ -1,5 +1,6 @@ package mc.protocol.world; +import mc.protocol.model.ChunkSectionLocation; import mc.protocol.model.Location; import mc.protocol.utils.LevelType; @@ -10,4 +11,5 @@ public interface World { Location getSpawn(); Chunk getChunk(int x, int z); + Chunk getChunk(ChunkSectionLocation chunkSectionLocation); } diff --git a/server/src/main/java/mc/server/Main.java b/server/src/main/java/mc/server/Main.java index 37651eb..0cf877a 100644 --- a/server/src/main/java/mc/server/Main.java +++ b/server/src/main/java/mc/server/Main.java @@ -68,6 +68,7 @@ public class Main { ServerComponent serverComponent = DaggerServerComponent.builder() .scenarioModule(new ScenarioModule(configComponent.getConfig())) + .worldModule(new WorldModule(configComponent.getConfig())) .build(); serverComponent.getPacketScenarios().forEach(scenario -> scenario.setup(serverComponent.getProtocolHandlersBus())); diff --git a/server/src/main/java/mc/server/di/WorldModule.java b/server/src/main/java/mc/server/di/WorldModule.java index 4d6a03f..fca7fa9 100644 --- a/server/src/main/java/mc/server/di/WorldModule.java +++ b/server/src/main/java/mc/server/di/WorldModule.java @@ -1,18 +1,31 @@ package mc.server.di; +import com.typesafe.config.Config; import dagger.Module; import dagger.Provides; +import lombok.RequiredArgsConstructor; +import mc.protocol.model.Location; import mc.protocol.world.World; import mc.server.world.SomeWorld; import javax.inject.Singleton; @Module +@RequiredArgsConstructor public class WorldModule { + private final Config config; + @Provides @Singleton World provideWorld() { - return new SomeWorld(); + Location spawn = new Location(); + spawn.set( + config.getDouble("world.spawn.x"), + config.getDouble("world.spawn.y"), + config.getDouble("world.spawn.z") + ); + + return new SomeWorld(spawn); } } diff --git a/server/src/main/java/mc/server/scenario/ScenarioLogin.java b/server/src/main/java/mc/server/scenario/ScenarioLogin.java index c359ad2..bdd9438 100644 --- a/server/src/main/java/mc/server/scenario/ScenarioLogin.java +++ b/server/src/main/java/mc/server/scenario/ScenarioLogin.java @@ -6,20 +6,21 @@ import lombok.RequiredArgsConstructor; import mc.protocol.ProtocolAttributes; import mc.protocol.State; import mc.protocol.handler.ProtocolHandlersBus; -import mc.protocol.model.Location; +import mc.protocol.model.ChunkSectionLocation; import mc.protocol.model.Look; import mc.protocol.packets.KeepAlivePacket; import mc.protocol.packets.login.client.LoginStartPacket; import mc.protocol.packets.login.server.LoginSuccessPacket; import mc.protocol.packets.play.server.*; +import mc.protocol.pool.ProtocolObjectPool; import mc.protocol.utils.Difficulty; import mc.protocol.utils.GameMode; +import mc.protocol.utils.LocationUtils; import mc.protocol.world.Chunk; import mc.protocol.world.World; import mc.server.Player; import mc.server.PlayerManager; import mc.server.ServetAttributes; -import mc.server.util.LocationUtils; import java.util.Random; @@ -95,35 +96,39 @@ public class ScenarioLogin implements PacketScenario { @SuppressWarnings("java:S2589") private void sendWorldData(Player player) { - Location chunkLocation = LocationUtils.toChunkXZ(player.getLocation()); -// Chunk chunk = world.getChunk((int) chunkLocation.getX(), (int) chunkLocation.getZ()); - Chunk chunk = world.getChunk(-50, -16); + ChunkSectionLocation chunkLocation = LocationUtils.location2chunkPooled(player.getLocation()); + Chunk chunk = world.getChunk(chunkLocation); var chunkDataPacket = new ChunkDataPacket(); chunkDataPacket.setChunk(chunk); player.getCtx().write(chunkDataPacket); - for (int i = 1; i <= config.getInt("world.view-distance"); i++) { - int minX = (int) chunkLocation.getX() - i; - int minZ = (int) chunkLocation.getZ() - i; - int maxX = (int) chunkLocation.getX() + i; - int maxZ = (int) chunkLocation.getZ() + i; + int distance = config.getInt("world.view-distance"); + if (distance > 0) { + int minX = chunkLocation.getX() - distance; + int minZ = chunkLocation.getZ() - distance; + int maxX = chunkLocation.getX() + distance; + int maxZ = chunkLocation.getZ() + distance; + for (int z = minZ; z <= maxZ; z++) { for (int x = minX; x <= maxX; x++) { - if ((z == minZ || z == maxZ) || (x == minX || x == maxX)) { + if (x == chunkLocation.getX() && z == chunkLocation.getZ()) { + continue; + } + + chunk = world.getChunk(x, z); + if (chunk != null) { chunkDataPacket = new ChunkDataPacket(); - chunk = world.getChunk(x, z); - if (chunk != null) { - chunkDataPacket.setChunk(chunk); - player.getCtx().write(chunkDataPacket); - } + chunkDataPacket.setChunk(chunk); + player.getCtx().write(chunkDataPacket); } } } } player.getCtx().flush(); + ProtocolObjectPool.chunkSectionLocation().returnObject(chunkLocation); } private void sendPlayerPositionAndLook(Player player) { diff --git a/server/src/main/java/mc/server/util/LocationUtils.java b/server/src/main/java/mc/server/util/LocationUtils.java deleted file mode 100644 index 981bc5c..0000000 --- a/server/src/main/java/mc/server/util/LocationUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package mc.server.util; - -import lombok.experimental.UtilityClass; -import mc.protocol.model.Location; - -@UtilityClass -public class LocationUtils { - - //TODO заменить другими инструментами - public Location toChunkXZ(Location location) { - Location location0 = new Location(); - location0.set((int) location.getX() >> 4, 0d, (int) location.getZ() >> 4); - return location0; - } -} diff --git a/server/src/main/java/mc/server/world/SomeWorld.java b/server/src/main/java/mc/server/world/SomeWorld.java index 4c729fe..b21b183 100644 --- a/server/src/main/java/mc/server/world/SomeWorld.java +++ b/server/src/main/java/mc/server/world/SomeWorld.java @@ -1,16 +1,18 @@ package mc.server.world; +import lombok.RequiredArgsConstructor; +import mc.protocol.model.ChunkSectionLocation; import mc.protocol.model.Location; -import mc.protocol.pool.ProtocolObjectPool; import mc.protocol.utils.LevelType; import mc.protocol.world.Chunk; import mc.protocol.world.World; import mc.utils.Table; +@RequiredArgsConstructor public class SomeWorld implements World { - private static final Location spawn; private final Table chunkTable = new Table<>(); + private final Location spawn; @Override public LevelType getLevelType() { @@ -19,15 +21,11 @@ public class SomeWorld implements World { @Override public Location getSpawn() { - return SomeWorld.spawn; + return this.spawn; } @Override public Chunk getChunk(int x, int z) { - if (x != -50 && z != -16) { - return null; - } - Chunk chunk = chunkTable.getColumnAndRow(x, z); if (chunk == null) { chunk = new SomeChunk(x, z); @@ -37,8 +35,8 @@ public class SomeWorld implements World { return chunk; } - static { - spawn = new Location(); - spawn.set(-790d, 256d, -263d + 16d); + @Override + public Chunk getChunk(ChunkSectionLocation chunkSectionLocation) { + return getChunk(chunkSectionLocation.getX(), chunkSectionLocation.getZ()); } } diff --git a/server/src/main/resources/config-default.conf b/server/src/main/resources/config-default.conf index 0dd6f63..deaca56 100644 --- a/server/src/main/resources/config-default.conf +++ b/server/src/main/resources/config-default.conf @@ -23,5 +23,10 @@ icon { } world { - view-distance: 0 + view-distance: 1 + spawn { + x: -790 + y: 256 + z: -247 + } }