continue player login
This commit is contained in:
@@ -6,11 +6,8 @@ package mc.core;
|
|||||||
|
|
||||||
import mc.core.network.NetChannel;
|
import mc.core.network.NetChannel;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
|
||||||
|
|
||||||
public interface Player {
|
public interface Player {
|
||||||
int getId();
|
int getId();
|
||||||
String getName();
|
String getName();
|
||||||
InetAddress getAddress();
|
|
||||||
NetChannel getChannel();
|
NetChannel getChannel();
|
||||||
}
|
}
|
||||||
|
|||||||
15
src/main/java/mc/core/PlayerManager.java
Normal file
15
src/main/java/mc/core/PlayerManager.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
56
src/main/java/mc/core/embedded/InMemoryPlayerManager.java
Normal file
56
src/main/java/mc/core/embedded/InMemoryPlayerManager.java
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 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<Player> 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,16 +12,22 @@ public abstract class NetStream {
|
|||||||
@Setter
|
@Setter
|
||||||
private int expectedSize;
|
private int expectedSize;
|
||||||
|
|
||||||
|
public abstract boolean readBoolean();
|
||||||
public abstract byte readByte();
|
public abstract byte readByte();
|
||||||
public abstract void readBytes(byte[] buffer);
|
public abstract void readBytes(byte[] buffer);
|
||||||
public abstract int readUnsignedByte();
|
public abstract int readUnsignedByte();
|
||||||
public abstract int readUnsignedShort();
|
public abstract int readUnsignedShort();
|
||||||
public abstract int readInt();
|
public abstract int readInt();
|
||||||
|
public abstract float readFloat();
|
||||||
|
public abstract double readDouble();
|
||||||
public abstract String readString();
|
public abstract String readString();
|
||||||
|
|
||||||
|
public abstract void writeBoolean(boolean value);
|
||||||
public abstract void writeByte(int value);
|
public abstract void writeByte(int value);
|
||||||
public abstract void writeBytes(byte[] buffer);
|
public abstract void writeBytes(byte[] buffer);
|
||||||
public abstract void writeInt(int value);
|
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 writeString(String value);
|
||||||
|
|
||||||
public abstract void skipBytes(int count);
|
public abstract void skipBytes(int count);
|
||||||
|
|||||||
@@ -14,6 +14,11 @@ import java.nio.charset.StandardCharsets;
|
|||||||
public class ByteArrayOutputNetStream extends NetStream_p125 {
|
public class ByteArrayOutputNetStream extends NetStream_p125 {
|
||||||
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean readBoolean() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte readByte() {
|
public byte readByte() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
@@ -39,6 +44,21 @@ public class ByteArrayOutputNetStream extends NetStream_p125 {
|
|||||||
throw new UnsupportedOperationException();
|
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
|
@Override
|
||||||
public void writeByte(int value) {
|
public void writeByte(int value) {
|
||||||
baos.write(value);
|
baos.write(value);
|
||||||
@@ -57,6 +77,25 @@ public class ByteArrayOutputNetStream extends NetStream_p125 {
|
|||||||
baos.write((byte) value);
|
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
|
@Override
|
||||||
public void skipBytes(int count) {
|
public void skipBytes(int count) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
@@ -27,25 +27,25 @@ import io.netty.channel.Channel;
|
|||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.SimpleChannelInboundHandler;
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import mc.core.PlayerManager;
|
||||||
import mc.core.network.CSPacket;
|
import mc.core.network.CSPacket;
|
||||||
import mc.core.Config;
|
import mc.core.Config;
|
||||||
import mc.core.Main;
|
import mc.core.network.proto_125.netty.wrappers.WrapperNetChannel;
|
||||||
import mc.core.network.proto_125.packets.HandshakePacket;
|
import mc.core.network.proto_125.packets.*;
|
||||||
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 org.springframework.beans.factory.annotation.Autowired;
|
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.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();
|
||||||
@Autowired
|
@Autowired
|
||||||
private Config config;
|
private Config config;
|
||||||
|
@Autowired
|
||||||
|
private PlayerManager playerManager;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void channelRead0(ChannelHandlerContext ctx, CSPacket packet) throws Exception {
|
protected void channelRead0(ChannelHandlerContext ctx, CSPacket packet) throws Exception {
|
||||||
@@ -75,11 +75,32 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onLoginPacket(Channel channel, LoginPacket packet) {
|
public void onLoginPacket(Channel channel, LoginPacket packet) {
|
||||||
|
int pId = random.nextInt(9999);
|
||||||
|
|
||||||
|
packet.setPlayerId(pId);
|
||||||
packet.setLevelType("FLAT");
|
packet.setLevelType("FLAT");
|
||||||
packet.setServerMode(1/*creative*/);
|
packet.setServerMode(1/*creative*/);
|
||||||
packet.setDimension(0/*Overworld*/);
|
packet.setDimension(0/*Overworld*/);
|
||||||
packet.setDifficulty(0/*Peaceful*/);
|
packet.setDifficulty(0/*Peaceful*/);
|
||||||
packet.setMaxPlayers(config.getMaxPlayers());
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,15 +8,13 @@ import com.google.common.collect.BiMap;
|
|||||||
import com.google.common.collect.ImmutableBiMap;
|
import com.google.common.collect.ImmutableBiMap;
|
||||||
import mc.core.network.CSPacket;
|
import mc.core.network.CSPacket;
|
||||||
import mc.core.network.SCPacket;
|
import mc.core.network.SCPacket;
|
||||||
import mc.core.network.proto_125.packets.HandshakePacket;
|
import mc.core.network.proto_125.packets.*;
|
||||||
import mc.core.network.proto_125.packets.KickPacket;
|
|
||||||
import mc.core.network.proto_125.packets.LoginPacket;
|
|
||||||
import mc.core.network.proto_125.packets.PingPacket;
|
|
||||||
|
|
||||||
public class PacketManager {
|
public class PacketManager {
|
||||||
private static final BiMap<Integer, Class<?>> packetMap = ImmutableBiMap.of(
|
private static final BiMap<Integer, Class<?>> packetMap = ImmutableBiMap.of(
|
||||||
0x01, LoginPacket.class,
|
0x01, LoginPacket.class,
|
||||||
0x02, HandshakePacket.class,
|
0x02, HandshakePacket.class,
|
||||||
|
0x0D, PositionAndLookPacket.class,
|
||||||
0xFE, PingPacket.class,
|
0xFE, PingPacket.class,
|
||||||
0xFF, KickPacket.class
|
0xFF, KickPacket.class
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ import java.nio.charset.StandardCharsets;
|
|||||||
public class WrapperNetStream extends NetStream_p125 {
|
public class WrapperNetStream extends NetStream_p125 {
|
||||||
private final ByteBuf byteBuf;
|
private final ByteBuf byteBuf;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean readBoolean() {
|
||||||
|
return byteBuf.readBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte readByte() {
|
public byte readByte() {
|
||||||
return byteBuf.readByte();
|
return byteBuf.readByte();
|
||||||
@@ -41,6 +46,21 @@ public class WrapperNetStream extends NetStream_p125 {
|
|||||||
return byteBuf.readInt();
|
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
|
@Override
|
||||||
public void writeByte(int value) {
|
public void writeByte(int value) {
|
||||||
byteBuf.writeByte(value);
|
byteBuf.writeByte(value);
|
||||||
@@ -56,6 +76,16 @@ public class WrapperNetStream extends NetStream_p125 {
|
|||||||
byteBuf.writeInt(value);
|
byteBuf.writeInt(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeFloat(float value) {
|
||||||
|
byteBuf.writeFloat(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeDouble(double value) {
|
||||||
|
byteBuf.writeDouble(value);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void skipBytes(int count) {
|
public void skipBytes(int count) {
|
||||||
byteBuf.skipBytes(count);
|
byteBuf.skipBytes(count);
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,8 @@
|
|||||||
<property name="faviconBase64" value="icon.png"/>
|
<property name="faviconBase64" value="icon.png"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<bean id="playerManager" class="mc.core.embedded.InMemoryPlayerManager"/>
|
||||||
|
|
||||||
<!-- Netty Server -->
|
<!-- Netty Server -->
|
||||||
<bean id="pipeline.log" class="io.netty.handler.logging.LoggingHandler" scope="prototype"/>
|
<bean id="pipeline.log" class="io.netty.handler.logging.LoggingHandler" scope="prototype"/>
|
||||||
<bean id="pipeline.decoder" class="mc.core.network.proto_125.netty.PacketDecoder" scope="prototype"/>
|
<bean id="pipeline.decoder" class="mc.core.network.proto_125.netty.PacketDecoder" scope="prototype"/>
|
||||||
@@ -20,6 +22,6 @@
|
|||||||
<bean id="server" class="mc.core.network.proto_125.netty.NettyServer">
|
<bean id="server" class="mc.core.network.proto_125.netty.NettyServer">
|
||||||
<property name="host" value="127.0.0.1"/>
|
<property name="host" value="127.0.0.1"/>
|
||||||
<property name="port" value="25565"/>
|
<property name="port" value="25565"/>
|
||||||
<!--<property name="workerGroupCount" value="8"/>-->
|
<property name="workerGroupCount" value="2"/>
|
||||||
</bean>
|
</bean>
|
||||||
</beans>
|
</beans>
|
||||||
Reference in New Issue
Block a user