PlayerManager
This commit is contained in:
@@ -20,6 +20,7 @@ import mc.server.config.Config;
|
||||
import mc.server.di.ConfigModule;
|
||||
import mc.server.di.DaggerServerComponent;
|
||||
import mc.server.di.ServerComponent;
|
||||
import mc.server.service.PlayerManager;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -48,6 +49,7 @@ public class Main {
|
||||
.build();
|
||||
|
||||
Config config = serverComponent.getConfig();
|
||||
PlayerManager playerManager = serverComponent.getPlayerManager();
|
||||
|
||||
ProtocolComponent protocolComponent = DaggerProtocolComponent.builder()
|
||||
.protocolModule(new ProtocolModule(true))
|
||||
@@ -57,7 +59,10 @@ public class Main {
|
||||
PacketHandler packetHandler = serverComponent.getPacketHandler();
|
||||
|
||||
server.onNewConnect(connectionContext -> connectionContext.setState(State.HANDSHAKING));
|
||||
server.onDisonnect(connectionContext -> connectionContext.setState(null));
|
||||
server.onDisonnect(connectionContext -> {
|
||||
connectionContext.setState(null);
|
||||
connectionContext.getCustomProperty("player", Player.class).ifPresent(playerManager::remove);
|
||||
});
|
||||
|
||||
server.listenPacket(State.HANDSHAKING, HandshakePacket.class, packetHandler::onHandshake);
|
||||
server.listenPacket(State.STATUS, KeepAlivePacket.class, packetHandler::onKeepAlive);
|
||||
|
||||
@@ -18,6 +18,7 @@ import mc.protocol.utils.GameMode;
|
||||
import mc.protocol.world.Chunk;
|
||||
import mc.protocol.world.World;
|
||||
import mc.server.config.Config;
|
||||
import mc.server.service.PlayerManager;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -26,7 +27,6 @@ import java.nio.file.Path;
|
||||
import java.util.Base64;
|
||||
import java.util.Collections;
|
||||
import java.util.Random;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Slf4j
|
||||
@@ -36,6 +36,7 @@ public class PacketHandler {
|
||||
private final Random random = new Random(System.currentTimeMillis());
|
||||
private final Config config;
|
||||
private final World world;
|
||||
private final PlayerManager playerManager;
|
||||
|
||||
public void onHandshake(ConnectionContext context, HandshakePacket packet) {
|
||||
context.setState(packet.getNextState());
|
||||
@@ -65,6 +66,8 @@ public class PacketHandler {
|
||||
serverInfo.players().max(config.players().maxOnlile());
|
||||
if (config.players().fakeOnline().enable()) {
|
||||
serverInfo.players().online(config.players().fakeOnline().value());
|
||||
} else {
|
||||
serverInfo.players().online(playerManager.online());
|
||||
}
|
||||
serverInfo.players().sample(Collections.emptyList());
|
||||
serverInfo.description(TextSerializer.fromPlain(config.motd()));
|
||||
@@ -81,16 +84,19 @@ public class PacketHandler {
|
||||
|
||||
@SuppressWarnings("java:S2589")
|
||||
public void onLoginStart(ConnectionContext context, LoginStartPacket loginStartPacket) {
|
||||
Player player = playerManager.addAndCreate(context, loginStartPacket.getName(), GameMode.SURVIVAL, world.getSpawn());
|
||||
context.setCustomProperty("player", player);
|
||||
|
||||
var loginSuccessPacket = new LoginSuccessPacket();
|
||||
loginSuccessPacket.setUuid(UUID.randomUUID());
|
||||
loginSuccessPacket.setName(loginStartPacket.getName());
|
||||
loginSuccessPacket.setUuid(player.getUuid());
|
||||
loginSuccessPacket.setName(player.getName());
|
||||
|
||||
context.sendNow(loginSuccessPacket);
|
||||
context.setState(State.PLAY);
|
||||
|
||||
var joinGamePacket = new JoinGamePacket();
|
||||
joinGamePacket.setEntityId(random.nextInt());
|
||||
joinGamePacket.setGameMode(GameMode.SURVIVAL);
|
||||
joinGamePacket.setGameMode(player.getGameMode());
|
||||
joinGamePacket.setDimension(0/*Overworld*/);
|
||||
joinGamePacket.setDifficulty(Difficulty.PEACEFUL);
|
||||
joinGamePacket.setLevelType(world.getLevelType());
|
||||
@@ -98,7 +104,7 @@ public class PacketHandler {
|
||||
context.send(joinGamePacket);
|
||||
|
||||
var spawnPositionPacket = new SpawnPositionPacket();
|
||||
spawnPositionPacket.setSpawn(world.getSpawn());
|
||||
spawnPositionPacket.setSpawn(player.getLocation());
|
||||
|
||||
context.send(spawnPositionPacket);
|
||||
|
||||
@@ -114,7 +120,7 @@ public class PacketHandler {
|
||||
|
||||
context.flushSending();
|
||||
|
||||
Location chunkLocation = world.getSpawn().toChunkXZ();
|
||||
Location chunkLocation = player.getLocation().toChunkXZ();
|
||||
Chunk chunk = world.getChunk(chunkLocation.getIntX(), chunkLocation.getIntZ());
|
||||
|
||||
var chunkDataPacket = new ChunkDataPacket();
|
||||
@@ -145,7 +151,7 @@ public class PacketHandler {
|
||||
context.flushSending();
|
||||
|
||||
var playerPositionAndLookPacket = new SPlayerPositionAndLookPacket();
|
||||
playerPositionAndLookPacket.setPosition(world.getSpawn());
|
||||
playerPositionAndLookPacket.setPosition(player.getLocation());
|
||||
playerPositionAndLookPacket.setLook(new Look(0f, 0f));
|
||||
playerPositionAndLookPacket.setTeleportId(random.nextInt());
|
||||
|
||||
|
||||
20
server/src/main/java/mc/server/Player.java
Normal file
20
server/src/main/java/mc/server/Player.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package mc.server;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import mc.protocol.api.ConnectionContext;
|
||||
import mc.protocol.model.Location;
|
||||
import mc.protocol.utils.GameMode;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Getter
|
||||
public class Player {
|
||||
|
||||
private final ConnectionContext connectionContext;
|
||||
private final UUID uuid;
|
||||
private final String name;
|
||||
private final GameMode gameMode;
|
||||
private final Location location;
|
||||
}
|
||||
@@ -5,12 +5,13 @@ import dagger.Provides;
|
||||
import mc.protocol.world.World;
|
||||
import mc.server.PacketHandler;
|
||||
import mc.server.config.Config;
|
||||
import mc.server.service.PlayerManager;
|
||||
|
||||
@Module
|
||||
public class PacketHandlerModule {
|
||||
|
||||
@Provides
|
||||
public PacketHandler providePacketHandler(Config config, World world) {
|
||||
return new PacketHandler(config, world);
|
||||
public PacketHandler providePacketHandler(Config config, World world, PlayerManager playerManager) {
|
||||
return new PacketHandler(config, world, playerManager);
|
||||
}
|
||||
}
|
||||
|
||||
16
server/src/main/java/mc/server/di/PlayersModule.java
Normal file
16
server/src/main/java/mc/server/di/PlayersModule.java
Normal file
@@ -0,0 +1,16 @@
|
||||
package mc.server.di;
|
||||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
import mc.protocol.di.ServerScope;
|
||||
import mc.server.service.PlayerManager;
|
||||
|
||||
@Module
|
||||
public class PlayersModule {
|
||||
|
||||
@Provides
|
||||
@ServerScope
|
||||
PlayerManager providePlayerManager() {
|
||||
return new PlayerManager();
|
||||
}
|
||||
}
|
||||
@@ -4,13 +4,15 @@ import dagger.Component;
|
||||
import mc.protocol.di.ServerScope;
|
||||
import mc.server.PacketHandler;
|
||||
import mc.server.config.Config;
|
||||
import mc.server.service.PlayerManager;
|
||||
|
||||
@Component(modules = {
|
||||
ConfigModule.class, PacketHandlerModule.class, WorldModule.class
|
||||
ConfigModule.class, PacketHandlerModule.class, WorldModule.class, PlayersModule.class
|
||||
})
|
||||
@ServerScope
|
||||
public interface ServerComponent {
|
||||
|
||||
Config getConfig();
|
||||
PacketHandler getPacketHandler();
|
||||
PlayerManager getPlayerManager();
|
||||
}
|
||||
|
||||
29
server/src/main/java/mc/server/service/PlayerManager.java
Normal file
29
server/src/main/java/mc/server/service/PlayerManager.java
Normal file
@@ -0,0 +1,29 @@
|
||||
package mc.server.service;
|
||||
|
||||
import mc.protocol.api.ConnectionContext;
|
||||
import mc.protocol.model.Location;
|
||||
import mc.protocol.utils.GameMode;
|
||||
import mc.server.Player;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.UUID;
|
||||
|
||||
public class PlayerManager {
|
||||
|
||||
private final LinkedList<Player> players = new LinkedList<>();
|
||||
|
||||
public Player addAndCreate(ConnectionContext context, String name, GameMode gameMode, Location location) {
|
||||
context.setUsedContext(true);
|
||||
Player player = new Player(context, UUID.randomUUID(), name, gameMode, location);
|
||||
players.add(player);
|
||||
return player;
|
||||
}
|
||||
|
||||
public void remove(Player player) {
|
||||
players.remove(player);
|
||||
}
|
||||
|
||||
public int online() {
|
||||
return players.size();
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ disconnect-reason: '&4Server is not available.'
|
||||
players:
|
||||
max-online: 0
|
||||
fake-online:
|
||||
enable: true
|
||||
enable: false
|
||||
value: 0
|
||||
|
||||
# Размер значка: 64x64 px
|
||||
|
||||
Reference in New Issue
Block a user