From bcb0bcbeb6ae0506ba1d22d50eeed547951668e2 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 15 Apr 2018 12:20:19 +0300 Subject: [PATCH] continue player login --- src/main/java/mc/core/Player.java | 3 - src/main/java/mc/core/PlayerManager.java | 15 +++++ .../core/embedded/InMemoryPlayerManager.java | 56 +++++++++++++++++++ src/main/java/mc/core/network/NetStream.java | 6 ++ .../proto_125/ByteArrayOutputNetStream.java | 39 +++++++++++++ .../network/proto_125/netty/NettyPlayer.java | 18 ++++++ .../proto_125/netty/PacketHandler.java | 37 +++++++++--- .../proto_125/netty/PacketManager.java | 6 +- .../netty/wrappers/WrapperNetStream.java | 30 ++++++++++ .../packets/PositionAndLookPacket.java | 48 ++++++++++++++++ src/main/resources/spring.xml | 4 +- 11 files changed, 246 insertions(+), 16 deletions(-) create mode 100644 src/main/java/mc/core/PlayerManager.java create mode 100644 src/main/java/mc/core/embedded/InMemoryPlayerManager.java create mode 100644 src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java create mode 100644 src/main/java/mc/core/network/proto_125/packets/PositionAndLookPacket.java diff --git a/src/main/java/mc/core/Player.java b/src/main/java/mc/core/Player.java index 33ab283..1ca193b 100644 --- a/src/main/java/mc/core/Player.java +++ b/src/main/java/mc/core/Player.java @@ -6,11 +6,8 @@ package mc.core; import mc.core.network.NetChannel; -import java.net.InetAddress; - public interface Player { int getId(); String getName(); - InetAddress getAddress(); NetChannel getChannel(); } diff --git a/src/main/java/mc/core/PlayerManager.java b/src/main/java/mc/core/PlayerManager.java new file mode 100644 index 0000000..d3a2abe --- /dev/null +++ b/src/main/java/mc/core/PlayerManager.java @@ -0,0 +1,15 @@ +/* + * DmitriyMX + * 2018-04-15 + */ +package mc.core; + +import mc.core.network.CSPacket; + +public interface PlayerManager { + void addPlayer(Player player); + Player getPlayer(String name); + Player getPlayerById(int id); + void removePlayer(Player player); + void bloadcastWrite(CSPacket packet); +} diff --git a/src/main/java/mc/core/embedded/InMemoryPlayerManager.java b/src/main/java/mc/core/embedded/InMemoryPlayerManager.java new file mode 100644 index 0000000..d113c36 --- /dev/null +++ b/src/main/java/mc/core/embedded/InMemoryPlayerManager.java @@ -0,0 +1,56 @@ +/* + * DmitriyMX + * 2018-04-15 + */ +package mc.core.embedded; + +import mc.core.Config; +import mc.core.Player; +import mc.core.PlayerManager; +import mc.core.network.CSPacket; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class InMemoryPlayerManager implements PlayerManager { + private List players; + + @Autowired + public InMemoryPlayerManager(Config config) { + final int c = config.getMaxPlayers() > 50 ? 50 : config.getMaxPlayers(); + players = Collections.synchronizedList(new ArrayList<>(c)); + } + + @Override + public void addPlayer(Player player) { + players.add(player); + } + + @Override + public Player getPlayer(final String name) { + return players.stream() + .filter(player -> player.getName().equalsIgnoreCase(name)) + .findFirst() + .get(); + } + + @Override + public Player getPlayerById(final int id) { + return players.stream() + .filter(player -> player.getId() == id) + .findFirst() + .get(); + } + + @Override + public void removePlayer(Player player) { + players.remove(player); + } + + @Override + public void bloadcastWrite(final CSPacket packet) { + players.forEach(player -> player.getChannel().writeAndFlush(packet)); + } +} diff --git a/src/main/java/mc/core/network/NetStream.java b/src/main/java/mc/core/network/NetStream.java index a83c97e..e41952a 100644 --- a/src/main/java/mc/core/network/NetStream.java +++ b/src/main/java/mc/core/network/NetStream.java @@ -12,16 +12,22 @@ public abstract class NetStream { @Setter private int expectedSize; + public abstract boolean readBoolean(); public abstract byte readByte(); public abstract void readBytes(byte[] buffer); public abstract int readUnsignedByte(); public abstract int readUnsignedShort(); public abstract int readInt(); + public abstract float readFloat(); + public abstract double readDouble(); public abstract String readString(); + public abstract void writeBoolean(boolean value); public abstract void writeByte(int value); public abstract void writeBytes(byte[] buffer); public abstract void writeInt(int value); + public abstract void writeFloat(float value); + public abstract void writeDouble(double value); public abstract void writeString(String value); public abstract void skipBytes(int count); diff --git a/src/main/java/mc/core/network/proto_125/ByteArrayOutputNetStream.java b/src/main/java/mc/core/network/proto_125/ByteArrayOutputNetStream.java index 7daed07..daf577a 100644 --- a/src/main/java/mc/core/network/proto_125/ByteArrayOutputNetStream.java +++ b/src/main/java/mc/core/network/proto_125/ByteArrayOutputNetStream.java @@ -14,6 +14,11 @@ import java.nio.charset.StandardCharsets; public class ByteArrayOutputNetStream extends NetStream_p125 { private ByteArrayOutputStream baos = new ByteArrayOutputStream(); + @Override + public boolean readBoolean() { + throw new UnsupportedOperationException(); + } + @Override public byte readByte() { throw new UnsupportedOperationException(); @@ -39,6 +44,21 @@ public class ByteArrayOutputNetStream extends NetStream_p125 { throw new UnsupportedOperationException(); } + @Override + public float readFloat() { + throw new UnsupportedOperationException(); + } + + @Override + public double readDouble() { + throw new UnsupportedOperationException(); + } + + @Override + public void writeBoolean(boolean value) { + baos.write(value ? 1 : 0); + } + @Override public void writeByte(int value) { baos.write(value); @@ -57,6 +77,25 @@ public class ByteArrayOutputNetStream extends NetStream_p125 { baos.write((byte) value); } + @Override + public void writeFloat(float value) { + writeInt(Float.floatToIntBits(value)); + } + + @Override + public void writeDouble(double value) { + long v = Double.doubleToLongBits(value); + + baos.write((byte)((int)(v >>> 56))); + baos.write((byte)((int)(v >>> 48))); + baos.write((byte)((int)(v >>> 40))); + baos.write((byte)((int)(v >>> 32))); + baos.write((byte)((int)(v >>> 24))); + baos.write((byte)((int)(v >>> 16))); + baos.write((byte)((int)(v >>> 8))); + baos.write((byte)((int)(v))); + } + @Override public void skipBytes(int count) { throw new UnsupportedOperationException(); diff --git a/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java b/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java new file mode 100644 index 0000000..ce09226 --- /dev/null +++ b/src/main/java/mc/core/network/proto_125/netty/NettyPlayer.java @@ -0,0 +1,18 @@ +/* + * DmitriyMX + * 2018-04-15 + */ +package mc.core.network.proto_125.netty; + +import lombok.Getter; +import lombok.Setter; +import mc.core.Player; +import mc.core.network.NetChannel; + +@Getter +@Setter +public class NettyPlayer implements Player { + private int id; + private String name; + private NetChannel channel; +} diff --git a/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java b/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java index 15753d3..e870326 100644 --- a/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java +++ b/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java @@ -27,25 +27,25 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import mc.core.PlayerManager; import mc.core.network.CSPacket; import mc.core.Config; -import mc.core.Main; -import mc.core.network.proto_125.packets.HandshakePacket; -import mc.core.network.proto_125.packets.KickPacket; -import mc.core.network.proto_125.packets.LoginPacket; -import mc.core.network.proto_125.packets.PingPacket; +import mc.core.network.proto_125.netty.wrappers.WrapperNetChannel; +import mc.core.network.proto_125.packets.*; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.ApplicationContext; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Optional; +import java.util.Random; @Slf4j public class PacketHandler extends SimpleChannelInboundHandler { + private static final Random random = new Random(); @Autowired private Config config; + @Autowired + private PlayerManager playerManager; @Override protected void channelRead0(ChannelHandlerContext ctx, CSPacket packet) throws Exception { @@ -75,11 +75,32 @@ public class PacketHandler extends SimpleChannelInboundHandler { } public void onLoginPacket(Channel channel, LoginPacket packet) { + int pId = random.nextInt(9999); + + packet.setPlayerId(pId); packet.setLevelType("FLAT"); packet.setServerMode(1/*creative*/); packet.setDimension(0/*Overworld*/); packet.setDifficulty(0/*Peaceful*/); packet.setMaxPlayers(config.getMaxPlayers()); - channel.writeAndFlush(packet); + channel.write(packet); + + NettyPlayer player = new NettyPlayer(); + player.setId(pId); + player.setName(packet.getPlayerName()); + player.setChannel(new WrapperNetChannel(channel)); + + PositionAndLookPacket pkt = new PositionAndLookPacket(); + pkt.setX(0); + pkt.setY(0); + pkt.setZ(0); + pkt.setStance(0); + pkt.setYaw(0f); + pkt.setPitch(0f); + pkt.setOnGround(false); + channel.write(pkt); + + playerManager.addPlayer(player); + channel.flush(); } } diff --git a/src/main/java/mc/core/network/proto_125/netty/PacketManager.java b/src/main/java/mc/core/network/proto_125/netty/PacketManager.java index e2b5f70..0b089f1 100644 --- a/src/main/java/mc/core/network/proto_125/netty/PacketManager.java +++ b/src/main/java/mc/core/network/proto_125/netty/PacketManager.java @@ -8,15 +8,13 @@ import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import mc.core.network.CSPacket; import mc.core.network.SCPacket; -import mc.core.network.proto_125.packets.HandshakePacket; -import mc.core.network.proto_125.packets.KickPacket; -import mc.core.network.proto_125.packets.LoginPacket; -import mc.core.network.proto_125.packets.PingPacket; +import mc.core.network.proto_125.packets.*; public class PacketManager { private static final BiMap> packetMap = ImmutableBiMap.of( 0x01, LoginPacket.class, 0x02, HandshakePacket.class, + 0x0D, PositionAndLookPacket.class, 0xFE, PingPacket.class, 0xFF, KickPacket.class ); diff --git a/src/main/java/mc/core/network/proto_125/netty/wrappers/WrapperNetStream.java b/src/main/java/mc/core/network/proto_125/netty/wrappers/WrapperNetStream.java index ffc1e4c..d4da090 100644 --- a/src/main/java/mc/core/network/proto_125/netty/wrappers/WrapperNetStream.java +++ b/src/main/java/mc/core/network/proto_125/netty/wrappers/WrapperNetStream.java @@ -16,6 +16,11 @@ import java.nio.charset.StandardCharsets; public class WrapperNetStream extends NetStream_p125 { private final ByteBuf byteBuf; + @Override + public boolean readBoolean() { + return byteBuf.readBoolean(); + } + @Override public byte readByte() { return byteBuf.readByte(); @@ -41,6 +46,21 @@ public class WrapperNetStream extends NetStream_p125 { return byteBuf.readInt(); } + @Override + public float readFloat() { + return byteBuf.readFloat(); + } + + @Override + public double readDouble() { + return byteBuf.readDouble(); + } + + @Override + public void writeBoolean(boolean value) { + byteBuf.writeBoolean(value); + } + @Override public void writeByte(int value) { byteBuf.writeByte(value); @@ -56,6 +76,16 @@ public class WrapperNetStream extends NetStream_p125 { byteBuf.writeInt(value); } + @Override + public void writeFloat(float value) { + byteBuf.writeFloat(value); + } + + @Override + public void writeDouble(double value) { + byteBuf.writeDouble(value); + } + @Override public void skipBytes(int count) { byteBuf.skipBytes(count); diff --git a/src/main/java/mc/core/network/proto_125/packets/PositionAndLookPacket.java b/src/main/java/mc/core/network/proto_125/packets/PositionAndLookPacket.java new file mode 100644 index 0000000..8023e10 --- /dev/null +++ b/src/main/java/mc/core/network/proto_125/packets/PositionAndLookPacket.java @@ -0,0 +1,48 @@ +/* + * DmitriyMX + * 2018-04-15 + */ +package mc.core.network.proto_125.packets; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import mc.core.network.CSPacket; +import mc.core.network.NetStream; +import mc.core.network.SCPacket; +import mc.core.network.proto_125.ByteArrayOutputNetStream; + +@Getter +@Setter +@ToString +public class PositionAndLookPacket implements SCPacket, CSPacket { + private double x, y, z, stance; + private float yaw, pitch; + private boolean onGround; + + @Override + public void readSelf(NetStream netStream) { + x = netStream.readDouble(); + y = netStream.readDouble(); + stance = netStream.readDouble(); + z = netStream.readDouble(); + yaw = netStream.readFloat(); + pitch = netStream.readFloat(); + onGround = netStream.readBoolean(); + } + + @Override + public byte[] toByteArray() { + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + + netStream.writeDouble(x); + netStream.writeDouble(y); + netStream.writeDouble(stance); + netStream.writeDouble(z); + netStream.writeFloat(yaw); + netStream.writeFloat(pitch); + netStream.writeBoolean(onGround); + + return netStream.toByteArray(); + } +} diff --git a/src/main/resources/spring.xml b/src/main/resources/spring.xml index 70e4422..949de13 100644 --- a/src/main/resources/spring.xml +++ b/src/main/resources/spring.xml @@ -11,6 +11,8 @@ + + @@ -20,6 +22,6 @@ - + \ No newline at end of file