стабилизируем код
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
52
protocol/src/main/java/mc/protocol/utils/LocationUtils.java
Normal file
52
protocol/src/main/java/mc/protocol/utils/LocationUtils.java
Normal 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
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,5 +23,10 @@ icon {
|
||||
}
|
||||
|
||||
world {
|
||||
view-distance: 0
|
||||
view-distance: 1
|
||||
spawn {
|
||||
x: -790
|
||||
y: 256
|
||||
z: -247
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user