успешный логин
This commit is contained in:
@@ -10,7 +10,7 @@ import lombok.Setter;
|
|||||||
public abstract class NetStream {
|
public abstract class NetStream {
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private int expectedSize;
|
private int dataSize;
|
||||||
|
|
||||||
public abstract boolean readBoolean();
|
public abstract boolean readBoolean();
|
||||||
public abstract byte readByte();
|
public abstract byte readByte();
|
||||||
@@ -27,6 +27,7 @@ public abstract class NetStream {
|
|||||||
|
|
||||||
public abstract void writeBoolean(boolean value);
|
public abstract void writeBoolean(boolean value);
|
||||||
public abstract void writeByte(int value);
|
public abstract void writeByte(int value);
|
||||||
|
public abstract void writeUnsignedByte(int value);
|
||||||
public abstract void writeBytes(byte[] buffer);
|
public abstract void writeBytes(byte[] buffer);
|
||||||
public abstract void writeShort(int value);
|
public abstract void writeShort(int value);
|
||||||
public abstract void writeInt(int value);
|
public abstract void writeInt(int value);
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable {
|
|||||||
public Player createPlayer(String name, Location defaultLocation, Look defaultLook) {
|
public Player createPlayer(String name, Location defaultLocation, Look defaultLook) {
|
||||||
SimplePlayer player = new SimplePlayer();
|
SimplePlayer player = new SimplePlayer();
|
||||||
player.setId(rand.nextInt(10000));
|
player.setId(rand.nextInt(10000));
|
||||||
|
player.setUUID(UUID.nameUUIDFromBytes(name.getBytes()));
|
||||||
player.setName(name);
|
player.setName(name);
|
||||||
player.getLocation().set(defaultLocation);
|
player.getLocation().set(defaultLocation);
|
||||||
player.getLook().set(defaultLook);
|
player.getLook().set(defaultLook);
|
||||||
|
|||||||
@@ -7,8 +7,11 @@ package mc.core.player;
|
|||||||
import mc.core.Location;
|
import mc.core.Location;
|
||||||
import mc.core.network.NetChannel;
|
import mc.core.network.NetChannel;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface Player {
|
public interface Player {
|
||||||
int getId();
|
int getId();
|
||||||
|
UUID getUUID();
|
||||||
String getName();
|
String getName();
|
||||||
boolean isOnline();
|
boolean isOnline();
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ import lombok.RequiredArgsConstructor;
|
|||||||
@Getter
|
@Getter
|
||||||
public enum PlayerMode {
|
public enum PlayerMode {
|
||||||
SURVIVAL(0),
|
SURVIVAL(0),
|
||||||
CREATIVE(1);
|
CREATIVE(1),
|
||||||
|
ADVENTURE(2),
|
||||||
|
SPECTATOR(3);
|
||||||
|
|
||||||
private final int id;
|
private final int id;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,9 +8,12 @@ import lombok.Data;
|
|||||||
import mc.core.Location;
|
import mc.core.Location;
|
||||||
import mc.core.network.NetChannel;
|
import mc.core.network.NetChannel;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class SimplePlayer implements Player {
|
public class SimplePlayer implements Player {
|
||||||
private int id;
|
private int id;
|
||||||
|
private UUID uuid;
|
||||||
private String name;
|
private String name;
|
||||||
private boolean online = false;
|
private boolean online = false;
|
||||||
private NetChannel channel;
|
private NetChannel channel;
|
||||||
@@ -25,4 +28,13 @@ public class SimplePlayer implements Player {
|
|||||||
public void setLook(Look look) {
|
public void setLook(Look look) {
|
||||||
this.look.set(look);
|
this.look.set(look);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID getUUID() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUUID(UUID uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,4 +52,9 @@ public abstract class NetStream_p125 extends NetStream {
|
|||||||
public long readLong() {
|
public long readLong() {
|
||||||
return 0; //FIXME
|
return 0; //FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeUnsignedByte(int value) {
|
||||||
|
writeByte(value); //FIXME
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,11 @@ public class ByteArrayOutputNetStream extends NetStream_p340 {
|
|||||||
baos.write(value);
|
baos.write(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeUnsignedByte(int value) {
|
||||||
|
baos.write((byte)(value & 0xFF));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeBytes(byte[] buffer) {
|
public void writeBytes(byte[] buffer) {
|
||||||
baos.write(buffer, 0, buffer.length);
|
baos.write(buffer, 0, buffer.length);
|
||||||
|
|||||||
@@ -19,26 +19,41 @@ public enum State {
|
|||||||
UNKNOWN(-1, null, null),
|
UNKNOWN(-1, null, null),
|
||||||
HANDSHAKE(0,
|
HANDSHAKE(0,
|
||||||
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
||||||
.put(0, HandshakePacket.class)
|
.put(0x00, HandshakePacket.class)
|
||||||
.build(),
|
.build(),
|
||||||
null
|
null
|
||||||
),
|
),
|
||||||
STATUS(1,
|
STATUS(1,
|
||||||
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
||||||
.put(0, StatusRequestPacket.class)
|
.put(0x00, StatusRequestPacket.class)
|
||||||
.put(1, PingPacket.class)
|
.put(0x01, PingPacket.class)
|
||||||
.build(),
|
.build(),
|
||||||
ImmutableBiMap.<Class<? extends SCPacket>, Integer>builder()
|
ImmutableBiMap.<Class<? extends SCPacket>, Integer>builder()
|
||||||
.put(StatusResponsePacket.class, 0)
|
.put(StatusResponsePacket.class, 0x00)
|
||||||
.put(PingPacket.class, 1)
|
.put(PingPacket.class, 0x01)
|
||||||
.build()
|
.build()
|
||||||
),
|
),
|
||||||
LOGIN(2,
|
LOGIN(2,
|
||||||
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
||||||
.put(0, LoginStartPacket.class)
|
.put(0x00, LoginStartPacket.class)
|
||||||
.build(),
|
.build(),
|
||||||
ImmutableBiMap.<Class<? extends SCPacket>, Integer>builder()
|
ImmutableBiMap.<Class<? extends SCPacket>, Integer>builder()
|
||||||
.put(DisconnectPacket.class, 0)
|
.put(DisconnectPacket.class, 0x00)
|
||||||
|
.put(LoginSuccessPacket.class, 0x02)
|
||||||
|
.build()
|
||||||
|
),
|
||||||
|
PLAY(3,
|
||||||
|
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
||||||
|
.put(0x00, TeleportConfirmPacket.class)
|
||||||
|
.put(0x04, ClientSettingsPacket.class)
|
||||||
|
.put(0x09, PluginMessagePacket.class)
|
||||||
|
.build(),
|
||||||
|
ImmutableBiMap.<Class<? extends SCPacket>, Integer>builder()
|
||||||
|
.put(PluginMessagePacket.class, 0x18)
|
||||||
|
.put(JoinGamePacket.class, 0x23)
|
||||||
|
.put(SpawnPositionPacket.class, 0x46)
|
||||||
|
.put(PlayerAbilitiesPacket.class, 0x2C)
|
||||||
|
.put(PlayerPositionAndLookPacket.class, 0x2F)
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -46,6 +61,7 @@ public enum State {
|
|||||||
if (id == 0) return HANDSHAKE;
|
if (id == 0) return HANDSHAKE;
|
||||||
else if (id == 1) return STATUS;
|
else if (id == 1) return STATUS;
|
||||||
else if (id == 2) return LOGIN;
|
else if (id == 2) return LOGIN;
|
||||||
|
else if (id == 3) return PLAY;
|
||||||
else {
|
else {
|
||||||
log.warn("Unknown state: {}", id);
|
log.warn("Unknown state: {}", id);
|
||||||
return UNKNOWN;
|
return UNKNOWN;
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-11
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.ToString;
|
||||||
|
import mc.core.network.CSPacket;
|
||||||
|
import mc.core.network.NetStream;
|
||||||
|
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Getter
|
||||||
|
@ToString
|
||||||
|
public class ClientSettingsPacket implements CSPacket {
|
||||||
|
private String locale;
|
||||||
|
private int viewDistance;
|
||||||
|
private int chatMode;
|
||||||
|
private boolean chatColors;
|
||||||
|
private boolean capeEnabled,
|
||||||
|
jacketEnabled,
|
||||||
|
leftSleeveEnabled,
|
||||||
|
rightSleeveEnabled,
|
||||||
|
leftPantsLegEnabled,
|
||||||
|
rightPantsLegEnabled,
|
||||||
|
hatEnabled;
|
||||||
|
private int mainHand;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readSelf(NetStream netStream) {
|
||||||
|
locale = netStream.readString();
|
||||||
|
viewDistance = netStream.readByte();
|
||||||
|
chatMode = netStream.readVarInt();
|
||||||
|
chatColors = netStream.readBoolean();
|
||||||
|
|
||||||
|
int bitmask = netStream.readUnsignedByte();
|
||||||
|
capeEnabled = (bitmask & 0x01) > 0;
|
||||||
|
jacketEnabled = (bitmask & 0x02) > 0;
|
||||||
|
leftSleeveEnabled = (bitmask & 0x04) > 0;
|
||||||
|
rightSleeveEnabled = (bitmask & 0x08) > 0;
|
||||||
|
leftPantsLegEnabled = (bitmask & 0x10) > 0;
|
||||||
|
rightPantsLegEnabled = (bitmask & 0x20) > 0;
|
||||||
|
hatEnabled = (bitmask & 0x40) > 0;
|
||||||
|
|
||||||
|
mainHand = netStream.readVarInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import mc.core.network.SCPacket;
|
import mc.core.network.SCPacket;
|
||||||
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
||||||
import mc.core.network.proto_1_12_2.TextSerializer;
|
import mc.core.network.proto_1_12_2.serializers.TextSerializer;
|
||||||
import mc.core.text.Text;
|
import mc.core.text.Text;
|
||||||
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-11
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import mc.core.network.SCPacket;
|
||||||
|
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
||||||
|
import mc.core.player.PlayerMode;
|
||||||
|
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Setter
|
||||||
|
public class JoinGamePacket implements SCPacket {
|
||||||
|
private int entityId;
|
||||||
|
private PlayerMode mode;
|
||||||
|
private int dimension;
|
||||||
|
private int difficulty;
|
||||||
|
private String levelType;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream();
|
||||||
|
|
||||||
|
netStream.writeInt(entityId);
|
||||||
|
netStream.writeUnsignedByte(mode.getId());
|
||||||
|
netStream.writeInt(dimension);
|
||||||
|
netStream.writeUnsignedByte(difficulty);
|
||||||
|
netStream.writeUnsignedByte(0); // Max Players, unused
|
||||||
|
netStream.writeString(levelType);
|
||||||
|
netStream.writeBoolean(false); // Reduced Debug Info
|
||||||
|
|
||||||
|
return netStream.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-11
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import mc.core.network.SCPacket;
|
||||||
|
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Setter
|
||||||
|
public class LoginSuccessPacket implements SCPacket {
|
||||||
|
private UUID uuid;
|
||||||
|
private String playerName;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream();
|
||||||
|
|
||||||
|
netStream.writeString(uuid.toString());
|
||||||
|
netStream.writeString(playerName);
|
||||||
|
|
||||||
|
return netStream.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-11
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import mc.core.network.SCPacket;
|
||||||
|
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
||||||
|
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Setter
|
||||||
|
public class PlayerAbilitiesPacket implements SCPacket {
|
||||||
|
private boolean godMode = false;
|
||||||
|
private boolean flying = false;
|
||||||
|
private boolean canFly = false;
|
||||||
|
private boolean instantDestroyBlocks = false;
|
||||||
|
private float flyingSpeed = 0.05f;
|
||||||
|
private float fieldOfView = flyingSpeed;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream();
|
||||||
|
|
||||||
|
byte flag = 0;
|
||||||
|
if (godMode) flag = (byte)(flag | 0x01);
|
||||||
|
if (flying) flag = (byte)(flag | 0x02);
|
||||||
|
if (canFly) flag = (byte)(flag | 0x04);
|
||||||
|
if (instantDestroyBlocks) flag = (byte)(flag | 0x08);
|
||||||
|
|
||||||
|
netStream.writeByte(flag);
|
||||||
|
netStream.writeFloat(flyingSpeed);
|
||||||
|
netStream.writeFloat(fieldOfView);
|
||||||
|
|
||||||
|
return netStream.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-11
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import mc.core.Location;
|
||||||
|
import mc.core.network.SCPacket;
|
||||||
|
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
||||||
|
import mc.core.player.Look;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Setter
|
||||||
|
public class PlayerPositionAndLookPacket implements SCPacket {
|
||||||
|
private static Random RANDOM = new Random();
|
||||||
|
private Location location;
|
||||||
|
private Look look;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream();
|
||||||
|
|
||||||
|
netStream.writeDouble(location.getX());
|
||||||
|
netStream.writeDouble(location.getY());
|
||||||
|
netStream.writeDouble(location.getZ());
|
||||||
|
netStream.writeFloat(look.getYaw());
|
||||||
|
netStream.writeFloat(look.getPitch());
|
||||||
|
netStream.writeByte(0); // It's a bitfield, X/Y/Z/Y_ROT/X_ROT. If X is set, the x value is relative and not absolute.
|
||||||
|
/* X - 0x01
|
||||||
|
* Y - 0x02
|
||||||
|
* Z - 0x04
|
||||||
|
* Y_ROT - 0x08
|
||||||
|
* X_ROT - 0x10
|
||||||
|
*/
|
||||||
|
netStream.writeVarInt(RANDOM.nextInt()); // Client should confirm this packet with Teleport Confirm containing the same Teleport ID
|
||||||
|
|
||||||
|
return netStream.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-11
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import mc.core.network.CSPacket;
|
||||||
|
import mc.core.network.NetStream;
|
||||||
|
import mc.core.network.SCPacket;
|
||||||
|
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@ToString
|
||||||
|
public class PluginMessagePacket implements SCPacket, CSPacket {
|
||||||
|
private String channelName;
|
||||||
|
private byte[] data;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readSelf(NetStream netStream) {
|
||||||
|
channelName = netStream.readString();
|
||||||
|
data = new byte[netStream.getDataSize() - channelName.getBytes().length - 1];
|
||||||
|
netStream.readBytes(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream();
|
||||||
|
|
||||||
|
netStream.writeString(channelName);
|
||||||
|
netStream.writeBytes(data);
|
||||||
|
|
||||||
|
return netStream.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-11
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import mc.core.Location;
|
||||||
|
import mc.core.network.SCPacket;
|
||||||
|
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
||||||
|
import mc.core.network.proto_1_12_2.serializers.LocationSerializer;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Setter
|
||||||
|
public class SpawnPositionPacket implements SCPacket {
|
||||||
|
private Location location;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream();
|
||||||
|
netStream.writeLong(LocationSerializer.serialize(location));
|
||||||
|
return netStream.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-12
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import mc.core.network.CSPacket;
|
||||||
|
import mc.core.network.NetStream;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@ToString
|
||||||
|
public class TeleportConfirmPacket implements CSPacket {
|
||||||
|
private int teleportId;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readSelf(NetStream netStream) {
|
||||||
|
teleportId = netStream.readVarInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-06-11
|
||||||
|
*/
|
||||||
|
package mc.core.network.proto_1_12_2.serializers;
|
||||||
|
|
||||||
|
import mc.core.Location;
|
||||||
|
|
||||||
|
public class LocationSerializer {
|
||||||
|
private static int floor_double(double value) {
|
||||||
|
int i = (int)value;
|
||||||
|
return value < (double)i ? i - 1 : i;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long serialize(Location location) {
|
||||||
|
return ((floor_double(location.getX()) & 0x3FFFFFF) << 38)
|
||||||
|
| ((floor_double(location.getY()) & 0xFFF) << 26)
|
||||||
|
| (floor_double(location.getZ()) & 0x3FFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Location deserialize(long location) {
|
||||||
|
return new Location(
|
||||||
|
location >> 38,
|
||||||
|
(location >> 26) & 0xFFF,
|
||||||
|
location << 38 >> 38);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* DmitriyMX <dimon550@gmail.com>
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
* 2018-06-11
|
* 2018-06-11
|
||||||
*/
|
*/
|
||||||
package mc.core.network.proto_1_12_2;
|
package mc.core.network.proto_1_12_2.serializers;
|
||||||
|
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
@@ -51,6 +51,7 @@ public class PacketDecoder extends ByteToMessageDecoder {
|
|||||||
log.warn("Unknown packet: {}:{}", state.name(), packetId);
|
log.warn("Unknown packet: {}:{}", state.name(), packetId);
|
||||||
in.skipBytes(packetSize - rb);
|
in.skipBytes(packetSize - rb);
|
||||||
} else {
|
} else {
|
||||||
|
netStream.setDataSize(packetSize - rb);
|
||||||
CSPacket packet = packetClass.newInstance();
|
CSPacket packet = packetClass.newInstance();
|
||||||
packet.readSelf(netStream);
|
packet.readSelf(netStream);
|
||||||
log.debug("Known packet: {}:{}", state.name(), packet.toString());
|
log.debug("Known packet: {}:{}", state.name(), packet.toString());
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
package mc.core.network.proto_1_12_2.netty;
|
package mc.core.network.proto_1_12_2.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;
|
||||||
@@ -14,11 +15,12 @@ import mc.core.chat.ChatProcessor;
|
|||||||
import mc.core.network.CSPacket;
|
import mc.core.network.CSPacket;
|
||||||
import mc.core.network.proto_1_12_2.State;
|
import mc.core.network.proto_1_12_2.State;
|
||||||
import mc.core.network.proto_1_12_2.packets.*;
|
import mc.core.network.proto_1_12_2.packets.*;
|
||||||
|
import mc.core.player.Look;
|
||||||
import mc.core.player.Player;
|
import mc.core.player.Player;
|
||||||
import mc.core.player.PlayerManager;
|
import mc.core.player.PlayerManager;
|
||||||
|
import mc.core.player.PlayerMode;
|
||||||
import mc.core.text.Text;
|
import mc.core.text.Text;
|
||||||
import mc.core.text.TextColor;
|
import mc.core.text.TextColor;
|
||||||
import mc.core.text.TextStyle;
|
|
||||||
import mc.core.world.World;
|
import mc.core.world.World;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
@@ -92,6 +94,56 @@ public class PacketHandler extends SimpleChannelInboundHandler<CSPacket> {
|
|||||||
|
|
||||||
private void onLoginStart(Channel channel, LoginStartPacket packet) {
|
private void onLoginStart(Channel channel, LoginStartPacket packet) {
|
||||||
if (!channel.attr(ATTR_STATE).get().equals(State.LOGIN)) return;
|
if (!channel.attr(ATTR_STATE).get().equals(State.LOGIN)) return;
|
||||||
channel.writeAndFlush(new DisconnectPacket(Text.of("Server is not ready :(", null, TextStyle.ITALIC)));
|
|
||||||
|
Optional<Player> optPlayer = playerManager.getPlayer(packet.getPlayerName());
|
||||||
|
if (optPlayer.isPresent() && optPlayer.get().isOnline()) {
|
||||||
|
channel.writeAndFlush(new DisconnectPacket(
|
||||||
|
Text.builder("Player \"")
|
||||||
|
.append(Text.of(packet.getPlayerName(), TextColor.YELLOW))
|
||||||
|
.append(Text.of("\" is online", TextColor.WHITE))
|
||||||
|
.build()))
|
||||||
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
|
} else {
|
||||||
|
Player player = playerManager.getPlayer(packet.getPlayerName())
|
||||||
|
.orElseGet(() -> playerManager.createPlayer(
|
||||||
|
packet.getPlayerName(),
|
||||||
|
world.getSpawn(),
|
||||||
|
new Look(0f, 0f)));
|
||||||
|
|
||||||
|
channel.writeAndFlush(new LoginSuccessPacket(
|
||||||
|
player.getUUID(),
|
||||||
|
packet.getPlayerName()));
|
||||||
|
channel.attr(ATTR_PLAYER).set(player);
|
||||||
|
channel.attr(ATTR_STATE).set(State.PLAY);
|
||||||
|
|
||||||
|
// Join Game
|
||||||
|
JoinGamePacket pkt1 = new JoinGamePacket();
|
||||||
|
pkt1.setEntityId(player.getId());
|
||||||
|
pkt1.setMode(PlayerMode.CREATIVE);
|
||||||
|
pkt1.setDimension(0/*Overworld*/);
|
||||||
|
pkt1.setDifficulty(0/*Peaceful*/);
|
||||||
|
pkt1.setLevelType("flat");
|
||||||
|
channel.write(pkt1);
|
||||||
|
|
||||||
|
// Spawn Position
|
||||||
|
SpawnPositionPacket pkt2 = new SpawnPositionPacket();
|
||||||
|
pkt2.setLocation(world.getSpawn());
|
||||||
|
channel.write(pkt2);
|
||||||
|
|
||||||
|
// Player Abilities
|
||||||
|
PlayerAbilitiesPacket pkt3 = new PlayerAbilitiesPacket();
|
||||||
|
pkt3.setCanFly(true);
|
||||||
|
pkt3.setFlying(true);
|
||||||
|
pkt3.setGodMode(true);
|
||||||
|
pkt3.setInstantDestroyBlocks(true);
|
||||||
|
channel.write(pkt2);
|
||||||
|
channel.flush();
|
||||||
|
|
||||||
|
// Player Position And Look
|
||||||
|
PlayerPositionAndLookPacket pkt4 = new PlayerPositionAndLookPacket();
|
||||||
|
pkt4.setLocation(player.getLocation());
|
||||||
|
pkt4.setLook(player.getLook());
|
||||||
|
channel.writeAndFlush(pkt4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,6 +74,11 @@ public class WrapperNetStream extends NetStream_p340 {
|
|||||||
byteBuf.writeByte(value);
|
byteBuf.writeByte(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeUnsignedByte(int value) {
|
||||||
|
byteBuf.writeByte((byte)(value & 0xFF));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeBytes(byte[] buffer) {
|
public void writeBytes(byte[] buffer) {
|
||||||
byteBuf.writeBytes(buffer);
|
byteBuf.writeBytes(buffer);
|
||||||
|
|||||||
Reference in New Issue
Block a user