обновление PlayerManager
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
|
||||||
|
if (player == null) {
|
||||||
|
player = playerManager.createPlayer(
|
||||||
packet.getPlayerName(),
|
packet.getPlayerName(),
|
||||||
world.getSpawn(),
|
world.getSpawn(),
|
||||||
world));
|
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());
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user