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.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<Location> locationPool = new SimpleObjectPool<>(Location.class);
private static final ObjectPool<Look> lookPool = new SimpleObjectPool<>(Look.class);
private static final NetByteBufObjectPool netByteBufPool = new NetByteBufObjectPool();
private static final MultiObjectPool<ClientSidePacket> packetPool = new PassivableMultiObjectPool<>();
private static final ObjectPool<Location> LOCATION_POOL = new SimpleObjectPool<>(Location.class);
private static final ObjectPool<ChunkSectionLocation> CHUNK_SECTION_LOCATION_POOL = new SimpleObjectPool<>(ChunkSectionLocation.class);
private static final ObjectPool<Look> LOOK_POOL = new SimpleObjectPool<>(Look.class);
private static final NetByteBufObjectPool NETBYTEBUF_POOL = new NetByteBufObjectPool();
private static final MultiObjectPool<ClientSidePacket> PACKET_POOL = new PassivableMultiObjectPool<>();
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() {
return lookPool;
return LOOK_POOL;
}
public static NetByteBufObjectPool netByteBuf() {
return netByteBufPool;
return NETBYTEBUF_POOL;
}
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;
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);
}

View File

@@ -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()));

View File

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

View File

@@ -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)) {
chunkDataPacket = new ChunkDataPacket();
if (x == chunkLocation.getX() && z == chunkLocation.getZ()) {
continue;
}
chunk = world.getChunk(x, z);
if (chunk != null) {
chunkDataPacket = new ChunkDataPacket();
chunkDataPacket.setChunk(chunk);
player.getCtx().write(chunkDataPacket);
}
}
}
}
}
player.getCtx().flush();
ProtocolObjectPool.chunkSectionLocation().returnObject(chunkLocation);
}
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;
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<Integer, Integer, Chunk> 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());
}
}

View File

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