continue player login
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
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
|
||||
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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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.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<CSPacket> {
|
||||
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<CSPacket> {
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Integer, Class<?>> packetMap = ImmutableBiMap.of(
|
||||
0x01, LoginPacket.class,
|
||||
0x02, HandshakePacket.class,
|
||||
0x0D, PositionAndLookPacket.class,
|
||||
0xFE, PingPacket.class,
|
||||
0xFF, KickPacket.class
|
||||
);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"/>
|
||||
</bean>
|
||||
|
||||
<bean id="playerManager" class="mc.core.embedded.InMemoryPlayerManager"/>
|
||||
|
||||
<!-- Netty Server -->
|
||||
<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"/>
|
||||
@@ -20,6 +22,6 @@
|
||||
<bean id="server" class="mc.core.network.proto_125.netty.NettyServer">
|
||||
<property name="host" value="127.0.0.1"/>
|
||||
<property name="port" value="25565"/>
|
||||
<!--<property name="workerGroupCount" value="8"/>-->
|
||||
<property name="workerGroupCount" value="2"/>
|
||||
</bean>
|
||||
</beans>
|
||||
Reference in New Issue
Block a user