стабилизируем код
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
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;
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()));
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk = world.getChunk(x, z);
|
||||||
|
if (chunk != null) {
|
||||||
chunkDataPacket = new ChunkDataPacket();
|
chunkDataPacket = new ChunkDataPacket();
|
||||||
chunk = world.getChunk(x, z);
|
chunkDataPacket.setChunk(chunk);
|
||||||
if (chunk != null) {
|
player.getCtx().write(chunkDataPacket);
|
||||||
chunkDataPacket.setChunk(chunk);
|
|
||||||
player.getCtx().write(chunkDataPacket);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getCtx().flush();
|
player.getCtx().flush();
|
||||||
|
ProtocolObjectPool.chunkSectionLocation().returnObject(chunkLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendPlayerPositionAndLook(Player player) {
|
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;
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,5 +23,10 @@ icon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
world {
|
world {
|
||||||
view-distance: 0
|
view-distance: 1
|
||||||
|
spawn {
|
||||||
|
x: -790
|
||||||
|
y: 256
|
||||||
|
z: -247
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user