Archived
0

обновление PlayerManager

This commit is contained in:
2018-09-16 00:06:28 +03:00
parent 3e6d0687ab
commit 5a0b29c2ba
6 changed files with 53 additions and 67 deletions

View File

@@ -1,7 +1,3 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-06-29
*/
package mc.core.embedded; package mc.core.embedded;
import mc.core.EntityLocation; import mc.core.EntityLocation;
@@ -65,13 +61,8 @@ public class FakePlayerManager implements PlayerManager {
} }
@Override @Override
public Optional<Player> getPlayer(String name) { public Player getPlayer(String name) {
return Optional.empty(); return null;
}
@Override
public Optional<Player> getPlayerById(int id) {
return Optional.empty();
} }
@Override @Override
@@ -80,7 +71,7 @@ public class FakePlayerManager implements PlayerManager {
} }
@Override @Override
public int getCountOnlinePlayers() { public int getCountPlayers() {
return 0; return 0;
} }
@@ -88,4 +79,9 @@ public class FakePlayerManager implements PlayerManager {
public NetChannel getBroadcastChannel() { public NetChannel getBroadcastChannel() {
return FAKE_NET_CHANNEL; return FAKE_NET_CHANNEL;
} }
@Override
public Player getOfflinePlayer(String name) {
return null;
}
} }

View File

@@ -59,17 +59,10 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
} }
@Override @Override
public Optional<Player> getPlayer(final String name) { public Player getPlayer(final String name) {
return players.stream() return players.stream()
.filter(player -> player.getName().equalsIgnoreCase(name)) .filter(player -> player.getName().equalsIgnoreCase(name))
.findFirst(); .findFirst().get();
}
@Override
public Optional<Player> getPlayerById(final int id) {
return players.stream()
.filter(player -> player.getId() == id)
.findFirst();
} }
@Override @Override
@@ -78,7 +71,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
} }
@Override @Override
public int getCountOnlinePlayers() { public int getCountPlayers() {
return (int) players.stream().filter(Player::isOnline).count(); return (int) players.stream().filter(Player::isOnline).count();
} }
@@ -87,6 +80,14 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
return new BroadcastNetChannel(players.stream().filter(Player::isOnline)); return new BroadcastNetChannel(players.stream().filter(Player::isOnline));
} }
@Override
public Player getOfflinePlayer(String name) {
return players.stream()
.filter(player -> player.getName().equals(name))
.filter(player -> !player.isOnline())
.findFirst().orElse(null);
}
@Override @Override
public void run() { public void run() {
while (!Thread.currentThread().isInterrupted()) { while (!Thread.currentThread().isInterrupted()) {

View File

@@ -1,7 +1,3 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-04-15
*/
package mc.core.player; package mc.core.player;
import mc.core.EntityLocation; import mc.core.EntityLocation;
@@ -9,15 +5,16 @@ import mc.core.network.NetChannel;
import mc.core.world.World; import mc.core.world.World;
import java.util.List; import java.util.List;
import java.util.Optional;
public interface PlayerManager { public interface PlayerManager {
Player createPlayer(String name, EntityLocation location, World world); Player createPlayer(String name, EntityLocation location, World world);
void joinServer(Player player); void joinServer(Player player);
void leftServer(Player player); void leftServer(Player player);
Optional<Player> getPlayer(String name);
Optional<Player> getPlayerById(int id); Player getPlayer(String name);
List<Player> getPlayers(); List<Player> getPlayers();
int getCountOnlinePlayers(); int getCountPlayers();
NetChannel getBroadcastChannel(); NetChannel getBroadcastChannel();
Player getOfflinePlayer(String name);
} }

View File

@@ -24,9 +24,6 @@ import mc.core.world.chunk.Chunk;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Optional;
import java.util.UUID;
import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_PLAYER; import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_PLAYER;
import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE;
@@ -39,8 +36,8 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand
@Handler @Handler
public void onLoginStart(Channel channel, LoginStartPacket packet) { public void onLoginStart(Channel channel, LoginStartPacket packet) {
Optional<Player> optPlayer = playerManager.getPlayer(packet.getPlayerName()); Player player = playerManager.getPlayer(packet.getPlayerName());
if (optPlayer.isPresent() && optPlayer.get().isOnline()) { if (player != null) {
channel.writeAndFlush(new DisconnectPacket( channel.writeAndFlush(new DisconnectPacket(
Text.builder("Player \"") Text.builder("Player \"")
.append(Text.of(packet.getPlayerName(), TextColor.YELLOW)) .append(Text.of(packet.getPlayerName(), TextColor.YELLOW))
@@ -48,11 +45,22 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand
.build())) .build()))
.addListener(ChannelFutureListener.CLOSE); .addListener(ChannelFutureListener.CLOSE);
} else { } else {
Player player = playerManager.getPlayer(packet.getPlayerName()) player = playerManager.getOfflinePlayer(packet.getPlayerName());
.orElseGet(() -> playerManager.createPlayer(
packet.getPlayerName(), if (player == null) {
world.getSpawn(), player = playerManager.createPlayer(
world)); packet.getPlayerName(),
world.getSpawn(),
world
);
if (player == null) {
channel.writeAndFlush(new DisconnectPacket(
Text.of("Internal server error: can't create new player"))
).addListener(ChannelFutureListener.CLOSE);
return;
}
}
channel.writeAndFlush(new LoginSuccessPacket( channel.writeAndFlush(new LoginSuccessPacket(
player.getUuid(), player.getUuid(),
@@ -62,10 +70,10 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand
// Join Game // Join Game
JoinGamePacket pkt1 = new JoinGamePacket(); JoinGamePacket pkt1 = new JoinGamePacket();
pkt1.setEntityId(player.getId()); pkt1.setEntityId(player.getId()); //TODO отделить системный ID от EntityID
pkt1.setMode(PlayerMode.CREATIVE); pkt1.setMode(PlayerMode.CREATIVE); //TODO перенести в Config
pkt1.setDimension(0/*Overworld*/); pkt1.setDimension(0/*Overworld*/); //TODO перенести в World
pkt1.setDifficulty(0/*Peaceful*/); pkt1.setDifficulty(0/*Peaceful*/); //TODO перенести в Config
pkt1.setLevelType(world.getWorldType().getName()); pkt1.setLevelType(world.getWorldType().getName());
channel.write(pkt1); channel.write(pkt1);
@@ -75,15 +83,17 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand
channel.write(pkt2); channel.write(pkt2);
// Player Abilities // Player Abilities
PlayerAbilitiesPacket pkt3 = new PlayerAbilitiesPacket(); PlayerAbilitiesPacket pkt3 = new PlayerAbilitiesPacket(); //TODO перенести в Player
pkt3.setCanFly(true); pkt3.setCanFly(true);
pkt3.setFlying(true); pkt3.setFlying(true);
pkt3.setGodMode(true); pkt3.setGodMode(true);
pkt3.setInstantDestroyBlocks(true); pkt3.setInstantDestroyBlocks(true);
channel.write(pkt3); channel.write(pkt3);
channel.flush(); channel.flush();
// First Chunk // First Chunk
//TODO необходимо отправлять больше начальных чанков
ChunkDataPacket pkt8 = new ChunkDataPacket(); ChunkDataPacket pkt8 = new ChunkDataPacket();
Chunk chunk = player.getWorld().getChunk(player.getLocation()); Chunk chunk = player.getWorld().getChunk(player.getLocation());
pkt8.setX(chunk.getX()); pkt8.setX(chunk.getX());
@@ -91,6 +101,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand
pkt8.setChunk(chunk); pkt8.setChunk(chunk);
pkt8.setInitChunk(true); pkt8.setInitChunk(true);
channel.writeAndFlush(pkt8); channel.writeAndFlush(pkt8);
player.getLoadedChunks().add(CompactedCoords.compressXZ(0, 0)); player.getLoadedChunks().add(CompactedCoords.compressXZ(0, 0));
// Player Position And Look // Player Position And Look
@@ -102,6 +113,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand
player.setChannel(new WrapperNetChannel(channel)); player.setChannel(new WrapperNetChannel(channel));
// Send <Tab> items // Send <Tab> items
//TODO обновление должно приходить всем игрокам на сервере
PlayerListItemPacket pkt5 = new PlayerListItemPacket(); PlayerListItemPacket pkt5 = new PlayerListItemPacket();
pkt5.setAction(PlayerListItemPacket.Action.ADD_PLAYER); pkt5.setAction(PlayerListItemPacket.Action.ADD_PLAYER);
PlayerListItemPacket.PlayerData playerData = new PlayerListItemPacket.PlayerData(); PlayerListItemPacket.PlayerData playerData = new PlayerListItemPacket.PlayerData();
@@ -118,26 +130,6 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand
pkt5.getListPlayers().add(playerData); pkt5.getListPlayers().add(playerData);
channel.writeAndFlush(pkt5); channel.writeAndFlush(pkt5);
// Send header/footer <Tab> list
PlayerListHeaderAndFooterPacket pkt6 = new PlayerListHeaderAndFooterPacket();
Text text = Text.of(TextColor.GOLD, "=============================");
pkt6.setHeader(text);
pkt6.setFooter(text);
channel.writeAndFlush(pkt6);
// Send Boss bar
BossBarPacket pkt7 = new BossBarPacket();
BossBarPacket.BarData barData = new BossBarPacket.BarData();
barData.setTitle(Text.of(TextColor.GREEN, TextStyle.BOLD, "FORWOLK"));
barData.setColor(BossBarPacket.Color.WHITE);
barData.setDivision(BossBarPacket.Division._12);
barData.setHealth(1.0f);
barData.setFlags(BossBarPacket.Flag.NO);
pkt7.setUuid(UUID.randomUUID());
pkt7.setAction(BossBarPacket.Action.ADD);
pkt7.setBarData(barData);
channel.writeAndFlush(pkt7);
playerManager.joinServer(player); playerManager.joinServer(player);
CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation()); CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation());

View File

@@ -26,7 +26,7 @@ public class StatusHandler extends AbstractStateHandler implements StatusStateHa
responsePacket.setMaxOnline(config.getMaxPlayers()); responsePacket.setMaxOnline(config.getMaxPlayers());
responsePacket.setDescription(config.getDescriptionServer()); responsePacket.setDescription(config.getDescriptionServer());
responsePacket.setFaviconBase64(config.getFaviconBase64()); responsePacket.setFaviconBase64(config.getFaviconBase64());
responsePacket.setOnline(playerManager.getCountOnlinePlayers()); responsePacket.setOnline(playerManager.getCountPlayers());
channel.writeAndFlush(responsePacket); channel.writeAndFlush(responsePacket);
} }

View File

@@ -53,7 +53,7 @@ public class ListCommand implements CommandExecutor {
playerManager.getPlayers().forEach(pl -> sj.add(pl.getName())); playerManager.getPlayers().forEach(pl -> sj.add(pl.getName()));
Text message = messageFormat.apply( Text message = messageFormat.apply(
"count", playerManager.getCountOnlinePlayers(), "count", playerManager.getCountPlayers(),
"players", sj.toString()); "players", sj.toString());
sender.getChannel().sendChatMessage(message, MessageType.SYSTEM_MESSAGE); sender.getChannel().sendChatMessage(message, MessageType.SYSTEM_MESSAGE);
} }