Archived
0

реорганизация работы Player manager

(cherry picked from commit f92b80d0ae10c329477ce39e41147a320301c2d5)
This commit is contained in:
2018-04-26 21:26:56 +03:00
parent 95a0f98e8e
commit fc59185922
7 changed files with 58 additions and 67 deletions

View File

@@ -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);

View File

@@ -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();
} }

View File

@@ -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

View 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);
}

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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();
} }