реорганизация работы Player manager
(cherry picked from commit f92b80d0ae10c329477ce39e41147a320301c2d5)
This commit is contained in:
@@ -8,13 +8,8 @@ import mc.core.network.NetChannel;
|
|||||||
|
|
||||||
public interface Player {
|
public interface Player {
|
||||||
int getId();
|
int getId();
|
||||||
void setId(int value);
|
|
||||||
|
|
||||||
String getName();
|
String getName();
|
||||||
void setName(String value);
|
|
||||||
|
|
||||||
boolean isOnline();
|
boolean isOnline();
|
||||||
void setOnline(boolean status);
|
|
||||||
|
|
||||||
NetChannel getChannel();
|
NetChannel getChannel();
|
||||||
void setChannel(NetChannel channel);
|
void setChannel(NetChannel channel);
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import mc.core.network.NetChannel;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface PlayerManager {
|
public interface PlayerManager {
|
||||||
void addPlayer(Player player);
|
Player createPlayer(String name);
|
||||||
|
void joinServer(Player player);
|
||||||
|
void leftServer(Player player);
|
||||||
Optional<Player> getPlayer(String name);
|
Optional<Player> getPlayer(String name);
|
||||||
Optional<Player> getPlayerById(int id);
|
|
||||||
void removePlayer(Player player);
|
|
||||||
NetChannel getBroadcastChannel();
|
NetChannel getBroadcastChannel();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,13 +13,11 @@ import mc.core.network.BroadcastNetChannel;
|
|||||||
import mc.core.network.NetChannel;
|
import mc.core.network.NetChannel;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
||||||
|
private static final Random rand = new Random();
|
||||||
private List<Player> players;
|
private List<Player> players;
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
@Setter
|
@Setter
|
||||||
@@ -33,12 +31,26 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addPlayer(Player player) {
|
public Player createPlayer(String name) {
|
||||||
|
SimplePlayer player = new SimplePlayer();
|
||||||
|
player.setId(rand.nextInt(10000));
|
||||||
|
player.setName(name);
|
||||||
|
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
players.add(player);
|
players.add(player);
|
||||||
lock.notify();
|
lock.notify();
|
||||||
log.info("Player \"{}\" join server", player.getName());
|
|
||||||
}
|
}
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void joinServer(Player player) {
|
||||||
|
((SimplePlayer) player).setOnline(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void leftServer(Player player) {
|
||||||
|
((SimplePlayer) player).setOnline(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -48,27 +60,9 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
|||||||
.findFirst();
|
.findFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<Player> getPlayerById(final int id) {
|
|
||||||
return players.stream()
|
|
||||||
.filter(player -> player.getId() == id)
|
|
||||||
.findFirst();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removePlayer(Player player) {
|
|
||||||
player.setOnline(false);
|
|
||||||
player.setChannel(null);
|
|
||||||
log.info("Player \"{}\" left server", player.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NetChannel getBroadcastChannel() {
|
public NetChannel getBroadcastChannel() {
|
||||||
return new BroadcastNetChannel(
|
return new BroadcastNetChannel(players.stream().filter(Player::isOnline));
|
||||||
players.stream()
|
|
||||||
.filter(Player::isOnline)
|
|
||||||
.filter(player -> player.getChannel() != null)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
21
core/src/main/java/mc/core/embedded/SimplePlayer.java
Normal file
21
core/src/main/java/mc/core/embedded/SimplePlayer.java
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-04-23
|
||||||
|
*/
|
||||||
|
package mc.core.embedded;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import mc.core.Location;
|
||||||
|
import mc.core.Look;
|
||||||
|
import mc.core.Player;
|
||||||
|
import mc.core.network.NetChannel;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class SimplePlayer implements Player {
|
||||||
|
private int id;
|
||||||
|
private String name;
|
||||||
|
private boolean online = false;
|
||||||
|
private NetChannel channel;
|
||||||
|
private Location location = new Location(0, 0, 0);
|
||||||
|
private Look look = new Look(0, 0);
|
||||||
|
}
|
||||||
@@ -4,6 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
package mc.core.network.proto_125.packets;
|
package mc.core.network.proto_125.packets;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -13,6 +15,8 @@ import mc.core.network.SCPacket;
|
|||||||
import mc.core.network.proto_125.ByteArrayOutputNetStream;
|
import mc.core.network.proto_125.ByteArrayOutputNetStream;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
@Setter
|
@Setter
|
||||||
@ToString
|
@ToString
|
||||||
public class KickPacket implements SCPacket, CSPacket {
|
public class KickPacket implements SCPacket, CSPacket {
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-04-15
|
|
||||||
*/
|
|
||||||
package mc.core.network.proto_125.netty;
|
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import mc.core.Location;
|
|
||||||
import mc.core.Look;
|
|
||||||
import mc.core.Player;
|
|
||||||
import mc.core.network.NetChannel;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
public class NettyPlayer implements Player {
|
|
||||||
private int id;
|
|
||||||
private String name;
|
|
||||||
private boolean online;
|
|
||||||
private NetChannel channel;
|
|
||||||
private Location location;
|
|
||||||
private Look look;
|
|
||||||
}
|
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
package mc.core.network.proto_125.netty;
|
package mc.core.network.proto_125.netty;
|
||||||
|
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.channel.ChannelFutureListener;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.SimpleChannelInboundHandler;
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
import io.netty.util.AttributeKey;
|
import io.netty.util.AttributeKey;
|
||||||
@@ -19,11 +20,9 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
||||||
private static final Random random = new Random();
|
|
||||||
private static final AttributeKey<Player> ATTR_PLAYER = AttributeKey.newInstance("ATTR_PLAYER");
|
private static final AttributeKey<Player> ATTR_PLAYER = AttributeKey.newInstance("ATTR_PLAYER");
|
||||||
@Autowired
|
@Autowired
|
||||||
private Config config;
|
private Config config;
|
||||||
@@ -35,7 +34,8 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
|||||||
super.channelInactive(context);
|
super.channelInactive(context);
|
||||||
Player player = context.channel().attr(ATTR_PLAYER).get();
|
Player player = context.channel().attr(ATTR_PLAYER).get();
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
playerManager.removePlayer(player);
|
playerManager.leftServer(player);
|
||||||
|
player.setChannel(null);
|
||||||
}
|
}
|
||||||
context.channel().attr(ATTR_PLAYER).set(null);
|
context.channel().attr(ATTR_PLAYER).set(null);
|
||||||
}
|
}
|
||||||
@@ -72,16 +72,16 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
|||||||
Optional<Player> optPlayer = playerManager.getPlayer(packet.getPlayerName());
|
Optional<Player> optPlayer = playerManager.getPlayer(packet.getPlayerName());
|
||||||
if (optPlayer.isPresent()) {
|
if (optPlayer.isPresent()) {
|
||||||
player = optPlayer.get();
|
player = optPlayer.get();
|
||||||
} else {
|
|
||||||
int pId = random.nextInt(9999);
|
|
||||||
|
|
||||||
player = new NettyPlayer();
|
if (player.isOnline()) {
|
||||||
player.setId(pId);
|
channel.writeAndFlush(new KickPacket("Player is exists in server"))
|
||||||
player.setName(packet.getPlayerName());
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
player = playerManager.createPlayer(packet.getPlayerName());
|
||||||
player.setLocation(spawnLoc);
|
player.setLocation(spawnLoc);
|
||||||
player.setLook(new Look(0f, 0f));
|
player.setLook(new Look(0f, 0f));
|
||||||
player.setOnline(true);
|
|
||||||
playerManager.addPlayer(player);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Response login
|
// Response login
|
||||||
@@ -165,7 +165,7 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
|||||||
|
|
||||||
channel.attr(ATTR_PLAYER).set(player);
|
channel.attr(ATTR_PLAYER).set(player);
|
||||||
player.setChannel(new WrapperNetChannel(channel));
|
player.setChannel(new WrapperNetChannel(channel));
|
||||||
player.setOnline(true);
|
playerManager.joinServer(player);
|
||||||
channel.flush();
|
channel.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user