успешный логин
This commit is contained in:
@@ -69,6 +69,11 @@ public class ByteArrayOutputNetStream extends NetStream_p340 {
|
||||
baos.write(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeUnsignedByte(int value) {
|
||||
baos.write((byte)(value & 0xFF));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeBytes(byte[] buffer) {
|
||||
baos.write(buffer, 0, buffer.length);
|
||||
|
||||
@@ -19,26 +19,41 @@ public enum State {
|
||||
UNKNOWN(-1, null, null),
|
||||
HANDSHAKE(0,
|
||||
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
||||
.put(0, HandshakePacket.class)
|
||||
.put(0x00, HandshakePacket.class)
|
||||
.build(),
|
||||
null
|
||||
),
|
||||
STATUS(1,
|
||||
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
||||
.put(0, StatusRequestPacket.class)
|
||||
.put(1, PingPacket.class)
|
||||
.put(0x00, StatusRequestPacket.class)
|
||||
.put(0x01, PingPacket.class)
|
||||
.build(),
|
||||
ImmutableBiMap.<Class<? extends SCPacket>, Integer>builder()
|
||||
.put(StatusResponsePacket.class, 0)
|
||||
.put(PingPacket.class, 1)
|
||||
.put(StatusResponsePacket.class, 0x00)
|
||||
.put(PingPacket.class, 0x01)
|
||||
.build()
|
||||
),
|
||||
LOGIN(2,
|
||||
ImmutableBiMap.<Integer, Class<? extends CSPacket>>builder()
|
||||
.put(0, LoginStartPacket.class)
|
||||
.put(0x00, LoginStartPacket.class)
|
||||
.build(),
|
||||
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()
|
||||
);
|
||||
|
||||
@@ -46,6 +61,7 @@ public enum State {
|
||||
if (id == 0) return HANDSHAKE;
|
||||
else if (id == 1) return STATUS;
|
||||
else if (id == 2) return LOGIN;
|
||||
else if (id == 3) return PLAY;
|
||||
else {
|
||||
log.warn("Unknown state: {}", id);
|
||||
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 mc.core.network.SCPacket;
|
||||
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;
|
||||
|
||||
@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>
|
||||
* 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.JsonObject;
|
||||
Reference in New Issue
Block a user