Archived
0

стабилизируем код

This commit is contained in:
2021-07-18 00:01:44 +03:00
parent b0bb86f215
commit f280e9beaa
9 changed files with 118 additions and 51 deletions

View File

@@ -2,6 +2,7 @@ package mc.protocol.pool;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import mc.protocol.model.ChunkSectionLocation;
import mc.protocol.model.Location; import mc.protocol.model.Location;
import mc.protocol.model.Look; import mc.protocol.model.Look;
import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ClientSidePacket;
@@ -13,24 +14,29 @@ import mc.utils.pool.SimpleObjectPool;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ProtocolObjectPool { public final class ProtocolObjectPool {
private static final ObjectPool<Location> locationPool = new SimpleObjectPool<>(Location.class); private static final ObjectPool<Location> LOCATION_POOL = new SimpleObjectPool<>(Location.class);
private static final ObjectPool<Look> lookPool = new SimpleObjectPool<>(Look.class); private static final ObjectPool<ChunkSectionLocation> CHUNK_SECTION_LOCATION_POOL = new SimpleObjectPool<>(ChunkSectionLocation.class);
private static final NetByteBufObjectPool netByteBufPool = new NetByteBufObjectPool(); private static final ObjectPool<Look> LOOK_POOL = new SimpleObjectPool<>(Look.class);
private static final MultiObjectPool<ClientSidePacket> packetPool = new PassivableMultiObjectPool<>(); private static final NetByteBufObjectPool NETBYTEBUF_POOL = new NetByteBufObjectPool();
private static final MultiObjectPool<ClientSidePacket> PACKET_POOL = new PassivableMultiObjectPool<>();
public static ObjectPool<Location> location() { public static ObjectPool<Location> location() {
return locationPool; return LOCATION_POOL;
}
public static ObjectPool<ChunkSectionLocation> chunkSectionLocation() {
return CHUNK_SECTION_LOCATION_POOL;
} }
public static ObjectPool<Look> look() { public static ObjectPool<Look> look() {
return lookPool; return LOOK_POOL;
} }
public static NetByteBufObjectPool netByteBuf() { public static NetByteBufObjectPool netByteBuf() {
return netByteBufPool; return NETBYTEBUF_POOL;
} }
public static MultiObjectPool<ClientSidePacket> packet() { public static MultiObjectPool<ClientSidePacket> packet() {
return packetPool; return PACKET_POOL;
} }
} }

View File

@@ -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
}

View File

@@ -1,5 +1,6 @@
package mc.protocol.world; package mc.protocol.world;
import mc.protocol.model.ChunkSectionLocation;
import mc.protocol.model.Location; import mc.protocol.model.Location;
import mc.protocol.utils.LevelType; import mc.protocol.utils.LevelType;
@@ -10,4 +11,5 @@ public interface World {
Location getSpawn(); Location getSpawn();
Chunk getChunk(int x, int z); Chunk getChunk(int x, int z);
Chunk getChunk(ChunkSectionLocation chunkSectionLocation);
} }

View File

@@ -68,6 +68,7 @@ public class Main {
ServerComponent serverComponent = DaggerServerComponent.builder() ServerComponent serverComponent = DaggerServerComponent.builder()
.scenarioModule(new ScenarioModule(configComponent.getConfig())) .scenarioModule(new ScenarioModule(configComponent.getConfig()))
.worldModule(new WorldModule(configComponent.getConfig()))
.build(); .build();
serverComponent.getPacketScenarios().forEach(scenario -> scenario.setup(serverComponent.getProtocolHandlersBus())); serverComponent.getPacketScenarios().forEach(scenario -> scenario.setup(serverComponent.getProtocolHandlersBus()));

View File

@@ -1,18 +1,31 @@
package mc.server.di; package mc.server.di;
import com.typesafe.config.Config;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import lombok.RequiredArgsConstructor;
import mc.protocol.model.Location;
import mc.protocol.world.World; import mc.protocol.world.World;
import mc.server.world.SomeWorld; import mc.server.world.SomeWorld;
import javax.inject.Singleton; import javax.inject.Singleton;
@Module @Module
@RequiredArgsConstructor
public class WorldModule { public class WorldModule {
private final Config config;
@Provides @Provides
@Singleton @Singleton
World provideWorld() { 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);
} }
} }

View File

@@ -6,20 +6,21 @@ import lombok.RequiredArgsConstructor;
import mc.protocol.ProtocolAttributes; import mc.protocol.ProtocolAttributes;
import mc.protocol.State; import mc.protocol.State;
import mc.protocol.handler.ProtocolHandlersBus; import mc.protocol.handler.ProtocolHandlersBus;
import mc.protocol.model.Location; import mc.protocol.model.ChunkSectionLocation;
import mc.protocol.model.Look; import mc.protocol.model.Look;
import mc.protocol.packets.KeepAlivePacket; import mc.protocol.packets.KeepAlivePacket;
import mc.protocol.packets.login.client.LoginStartPacket; import mc.protocol.packets.login.client.LoginStartPacket;
import mc.protocol.packets.login.server.LoginSuccessPacket; import mc.protocol.packets.login.server.LoginSuccessPacket;
import mc.protocol.packets.play.server.*; import mc.protocol.packets.play.server.*;
import mc.protocol.pool.ProtocolObjectPool;
import mc.protocol.utils.Difficulty; import mc.protocol.utils.Difficulty;
import mc.protocol.utils.GameMode; import mc.protocol.utils.GameMode;
import mc.protocol.utils.LocationUtils;
import mc.protocol.world.Chunk; import mc.protocol.world.Chunk;
import mc.protocol.world.World; import mc.protocol.world.World;
import mc.server.Player; import mc.server.Player;
import mc.server.PlayerManager; import mc.server.PlayerManager;
import mc.server.ServetAttributes; import mc.server.ServetAttributes;
import mc.server.util.LocationUtils;
import java.util.Random; import java.util.Random;
@@ -95,35 +96,39 @@ public class ScenarioLogin implements PacketScenario {
@SuppressWarnings("java:S2589") @SuppressWarnings("java:S2589")
private void sendWorldData(Player player) { private void sendWorldData(Player player) {
Location chunkLocation = LocationUtils.toChunkXZ(player.getLocation()); ChunkSectionLocation chunkLocation = LocationUtils.location2chunkPooled(player.getLocation());
// Chunk chunk = world.getChunk((int) chunkLocation.getX(), (int) chunkLocation.getZ()); Chunk chunk = world.getChunk(chunkLocation);
Chunk chunk = world.getChunk(-50, -16);
var chunkDataPacket = new ChunkDataPacket(); var chunkDataPacket = new ChunkDataPacket();
chunkDataPacket.setChunk(chunk); chunkDataPacket.setChunk(chunk);
player.getCtx().write(chunkDataPacket); player.getCtx().write(chunkDataPacket);
for (int i = 1; i <= config.getInt("world.view-distance"); i++) { int distance = config.getInt("world.view-distance");
int minX = (int) chunkLocation.getX() - i; if (distance > 0) {
int minZ = (int) chunkLocation.getZ() - i; int minX = chunkLocation.getX() - distance;
int maxX = (int) chunkLocation.getX() + i; int minZ = chunkLocation.getZ() - distance;
int maxZ = (int) chunkLocation.getZ() + i; int maxX = chunkLocation.getX() + distance;
int maxZ = chunkLocation.getZ() + distance;
for (int z = minZ; z <= maxZ; z++) { for (int z = minZ; z <= maxZ; z++) {
for (int x = minX; x <= maxX; x++) { for (int x = minX; x <= maxX; x++) {
if ((z == minZ || z == maxZ) || (x == minX || x == maxX)) { if (x == chunkLocation.getX() && z == chunkLocation.getZ()) {
chunkDataPacket = new ChunkDataPacket(); continue;
}
chunk = world.getChunk(x, z); chunk = world.getChunk(x, z);
if (chunk != null) { if (chunk != null) {
chunkDataPacket = new ChunkDataPacket();
chunkDataPacket.setChunk(chunk); chunkDataPacket.setChunk(chunk);
player.getCtx().write(chunkDataPacket); player.getCtx().write(chunkDataPacket);
} }
} }
} }
} }
}
player.getCtx().flush(); player.getCtx().flush();
ProtocolObjectPool.chunkSectionLocation().returnObject(chunkLocation);
} }
private void sendPlayerPositionAndLook(Player player) { private void sendPlayerPositionAndLook(Player player) {

View File

@@ -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;
}
}

View File

@@ -1,16 +1,18 @@
package mc.server.world; package mc.server.world;
import lombok.RequiredArgsConstructor;
import mc.protocol.model.ChunkSectionLocation;
import mc.protocol.model.Location; import mc.protocol.model.Location;
import mc.protocol.pool.ProtocolObjectPool;
import mc.protocol.utils.LevelType; import mc.protocol.utils.LevelType;
import mc.protocol.world.Chunk; import mc.protocol.world.Chunk;
import mc.protocol.world.World; import mc.protocol.world.World;
import mc.utils.Table; import mc.utils.Table;
@RequiredArgsConstructor
public class SomeWorld implements World { public class SomeWorld implements World {
private static final Location spawn;
private final Table<Integer, Integer, Chunk> chunkTable = new Table<>(); private final Table<Integer, Integer, Chunk> chunkTable = new Table<>();
private final Location spawn;
@Override @Override
public LevelType getLevelType() { public LevelType getLevelType() {
@@ -19,15 +21,11 @@ public class SomeWorld implements World {
@Override @Override
public Location getSpawn() { public Location getSpawn() {
return SomeWorld.spawn; return this.spawn;
} }
@Override @Override
public Chunk getChunk(int x, int z) { public Chunk getChunk(int x, int z) {
if (x != -50 && z != -16) {
return null;
}
Chunk chunk = chunkTable.getColumnAndRow(x, z); Chunk chunk = chunkTable.getColumnAndRow(x, z);
if (chunk == null) { if (chunk == null) {
chunk = new SomeChunk(x, z); chunk = new SomeChunk(x, z);
@@ -37,8 +35,8 @@ public class SomeWorld implements World {
return chunk; return chunk;
} }
static { @Override
spawn = new Location(); public Chunk getChunk(ChunkSectionLocation chunkSectionLocation) {
spawn.set(-790d, 256d, -263d + 16d); return getChunk(chunkSectionLocation.getX(), chunkSectionLocation.getZ());
} }
} }

View File

@@ -23,5 +23,10 @@ icon {
} }
world { world {
view-distance: 0 view-distance: 1
spawn {
x: -790
y: 256
z: -247
}
} }