完整的 Minecraft 1.8.9 协议实现,支持连接到专用服务器和局域网服务器。
- 完整的 Minecraft 1.8.9 协议实现 (Protocol Version 47)
- 支持连接到专用服务器 (Dedicated Server)
- 支持连接到局域网服务器 (LAN Server)
- 支持数据包压缩
- 模块化的数据包系统
- 自动处理 KeepAlive 数据包
- 支持离线模式服务器
src/
├── Main.java # 主入口
├── client/
│ └── MinecraftClient.java # 客户端核心逻辑
├── network/
│ └── MinecraftConnection.java # 网络连接处理
├── protocol/
│ ├── Packet.java # 数据包接口
│ ├── PacketBuffer.java # 数据包缓冲区
│ ├── PacketRegistry.java # 数据包注册表
│ ├── ProtocolState.java # 协议状态枚举
│ └── packets/
│ ├── handshake/ # 握手协议包
│ │ └── PacketHandshake.java
│ ├── status/ # 状态协议包
│ │ ├── PacketStatusRequest.java
│ │ ├── PacketStatusResponse.java
│ │ ├── PacketStatusPing.java
│ │ └── PacketStatusPong.java
│ ├── login/ # 登录协议包
│ │ ├── PacketLoginStart.java
│ │ ├── PacketLoginSuccess.java
│ │ ├── PacketLoginDisconnect.java
│ │ ├── PacketEncryptionRequest.java
│ │ ├── PacketEncryptionResponse.java
│ │ └── PacketSetCompression.java
│ └── play/ # 游戏协议包
│ ├── PacketJoinGame.java
│ ├── PacketKeepAlive.java
│ ├── PacketPlayerPosition.java
│ ├── PacketPlayerPositionAndLook.java
│ ├── PacketChatMessage.java
│ ├── PacketClientSettings.java
│ ├── PacketClientStatus.java
│ └── PacketDisconnect.java
├── crypto/
│ └── MinecraftEncryption.java # 加密工具类
└── examples/
├── ConnectToDedicatedServer.java # 专用服务器连接示例
└── ConnectToLANServer.java # 局域网服务器连接示例
javac -d out src/**/*.java# 使用默认参数 (localhost:25565, 用户名: TestBot)
java -cp out Main dedicated
# 指定服务器地址和端口
java -cp out Main dedicated 192.168.1.100 25565 MyBot
# 连接到本地服务器
java -cp out Main dedicated localhost 25565 TestBot# 使用默认用户名 (TestBot)
java -cp out Main lan
# 指定用户名
java -cp out Main lan MyBot局域网模式会自动扫描网络中的 Minecraft 局域网服务器并连接。
- Minecraft 版本: 1.8.9
- 协议版本号: 47
- HANDSHAKING (握手): 初始连接状态
- STATUS (状态): 服务器列表 ping
- LOGIN (登录): 身份验证和登录
- PLAY (游戏): 游戏内数据包
- 握手协议
- 登录流程 (离线模式)
- 数据包压缩支持
- KeepAlive 心跳
- 玩家位置同步
- 聊天消息接收
- 客户端设置发送
- 局域网服务器发现 (多播)
- 离线模式: 支持离线模式服务器 (online-mode=false)
- 加密: 支持加密连接,可以连接到局域网服务器(不需要 Mojang 账户验证)
- 局域网连接: 需要确保防火墙允许多播流量 (224.0.2.60:4445)
- 协议版本: 仅支持 Minecraft 1.8.9 (协议版本 47)
- 在线模式: 不支持 Mojang 账户验证,但支持加密通信
- 在
protocol/packets/对应的目录下创建新的数据包类 - 实现
Packet接口 - 在
PacketRegistry.java中注册数据包
示例:
public class MyCustomPacket implements Packet {
@Override
public void write(PacketBuffer buffer) throws IOException {
// 写入数据
}
@Override
public void read(PacketBuffer buffer) throws IOException {
// 读取数据
}
@Override
public int getPacketId() {
return 0x??; // 数据包 ID
}
}在 MinecraftClient.java 的 handlePlay() 方法中添加处理逻辑:
else if (packet instanceof MyCustomPacket) {
MyCustomPacket custom = (MyCustomPacket) packet;
// 处理数据包
}推荐使用以下方式测试:
- 本地服务器: 运行 Minecraft 1.8.9 服务器,设置
online-mode=false - 局域网世界: 在 Minecraft 客户端中打开单人世界到局域网
- 测试服务器: 使用公共的离线模式测试服务器
[Length (VarInt)] [Packet ID (VarInt)] [Data]
[Packet Length (VarInt)] [Data Length (VarInt)] [Compressed Data]
使用 Minecraft 协议标准的 VarInt 编码,每个字节的最高位表示是否还有后续字节。
本项目仅供学习和研究使用。