ViaVersion API 文档
ViaVersion 是一个 Minecraft 服务器插件,允许较新的客户端版本连接到较旧的服务器版本。该 API 提供了跨平台支持,包括 Paper、Velocity、Fabric、Sponge
Overview
ViaVersion API 文档
概述
ViaVersion 是一个 Minecraft 服务器插件,允许较新的客户端版本连接到较旧的服务器版本。该 API 提供了跨平台支持,包括 Paper、Velocity、Fabric、Sponge 等平台。
主要包结构
核心包
com.viaversion.viaversion.api– 核心 API 接口com.viaversion.viaversion.api.command– 命令系统com.viaversion.viaversion.api.configuration– 配置管理com.viaversion.viaversion.api.connection– 连接管理com.viaversion.viaversion.api.data– 数据映射com.viaversion.viaversion.api.protocol– 协议处理com.viaversion.viaversion.api.platform– 平台抽象
Minecraft 相关包
com.viaversion.viaversion.api.minecraft– Minecraft 基础类型com.viaversion.viaversion.api.minecraft.chunks– 区块相关com.viaversion.viaversion.api.minecraft.entities– 实体类型com.viaversion.viaversion.api.minecraft.item– 物品系统com.viaversion.viaversion.api.minecraft.entitydata– 实体数据
类型系统
com.viaversion.viaversion.api.type– 类型系统com.viaversion.viaversion.api.type.types– 具体类型实现
核心 API 类
1. Via (核心入口点)
包名: com.viaversion.viaversion.api.Via
主要方法:
// 获取 API 实例
static ViaAPI getAPI()
// 获取配置
static ViaVersionConfig getConfig()
// 获取管理器(提供更多功能)
static ViaManager getManager()
// 获取平台实例
static ViaPlatform getPlatform()
// 初始化 ViaManager
static void init(ViaManager viaManager)
使用示例:
// 获取 API 实例
ViaAPI api = Via.getAPI();
// 获取玩家协议版本
ProtocolVersion version = api.getPlayerProtocolVersion(playerUUID);
// 获取服务器支持的协议版本
SortedSet<ProtocolVersion> supportedVersions = api.getSupportedProtocolVersions();
2. ViaAPI (主要 API 接口)
包名: com.viaversion.viaversion.api.ViaAPI<T>
泛型参数: T – 平台特定的玩家类型(如 Bukkit 的 Player)
主要方法:
版本信息
// 获取插件版本
String getVersion()
// 获取主版本号
default int majorVersion()
// 获取内部 API 版本
default int apiVersion()
玩家相关
// 获取玩家协议版本(返回整数)
default int getPlayerVersion(UUID uuid)
default int getPlayerVersion(T player)
// 获取玩家协议版本(返回 ProtocolVersion 对象)
ProtocolVersion getPlayerProtocolVersion(UUID uuid)
ProtocolVersion getPlayerProtocolVersion(T player)
// 检查玩家是否被注入
boolean isInjected(UUID uuid)
// 获取玩家连接
@Nullable UserConnection getConnection(UUID uuid)
服务器版本
// 获取服务器协议版本信息
ServerProtocolVersion getServerVersion()
// 获取支持的协议版本(排除被阻止的版本)
SortedSet<ProtocolVersion> getSupportedProtocolVersions()
// 获取所有支持的协议版本(包括被阻止的版本)
SortedSet<ProtocolVersion> getFullSupportedProtocolVersions()
数据包操作
// 发送原始数据包给玩家
void sendRawPacket(T player, ByteBuf packet)
void sendRawPacket(UUID uuid, ByteBuf packet)
遗留 API
// 获取遗留 API(仅适用于旧版本)
LegacyViaAPI<T> legacyAPI()
3. ProtocolVersion (协议版本)
包名: com.viaversion.viaversion.api.protocol.version.ProtocolVersion
主要功能: 表示 Minecraft 协议版本,实现了 Comparable<ProtocolVersion>
常量字段(部分):
// 未知版本
static final ProtocolVersion unknown
// 各版本常量
static final ProtocolVersion v1_8 // 协议版本 47
static final ProtocolVersion v1_9 // 协议版本 107
static final ProtocolVersion v1_12 // 协议版本 335
static final ProtocolVersion v1_16 // 协议版本 735
static final ProtocolVersion v1_17 // 协议版本 755
static final ProtocolVersion v1_18 // 协议版本 757
static final ProtocolVersion v1_19 // 协议版本 759
static final ProtocolVersion v1_20 // 协议版本 763
static final ProtocolVersion v1_21 // 协议版本 767
// ... 更多版本常量
主要方法:
版本比较
// 比较方法
boolean equalTo(ProtocolVersion other)
boolean newerThan(ProtocolVersion other)
boolean newerThanOrEqualTo(ProtocolVersion other)
boolean olderThan(ProtocolVersion other)
boolean olderThanOrEqualTo(ProtocolVersion other)
// 范围检查
boolean betweenInclusive(ProtocolVersion min, ProtocolVersion max)
boolean betweenExclusive(ProtocolVersion min, ProtocolVersion max)
版本信息
// 获取版本信息
String getName() // 版本名称,如 "1.16.4/1.16.5"
int getVersion() // 发布版本号
int getSnapshotVersion() // 快照版本号(无快照指示位)
int getFullSnapshotVersion() // 快照版本号(有快照指示位)
VersionType getVersionType() // 版本类型
// 检查版本类型
boolean isSnapshot() // 是否为快照版本
boolean isRange() // 是否为版本范围
boolean isVersionWildcard() // 是否为通配符版本(如 1.8.x)
boolean isKnown() // 是否为已知版本(非 unknown)
静态方法
// 获取协议版本实例
static ProtocolVersion getProtocol(int version)
static ProtocolVersion getProtocol(VersionType versionType, int version)
// 检查版本是否已注册
static boolean isRegistered(int version)
static boolean isRegistered(VersionType versionType, int version)
// 获取所有已注册的协议版本
static List<ProtocolVersion> getProtocols()
// 根据名称获取最接近的协议版本
static ProtocolVersion getClosest(String protocol)
4. ViaManager (管理器接口)
包名: com.viaversion.viaversion.api.ViaManager
主要功能: 提供比 ViaAPI 更高级的管理功能
相关接口:
ProtocolManager– 协议管理器ConnectionManager– 连接管理器ViaPlatform– 平台接口
5. UserConnection (用户连接)
包名: com.viaversion.viaversion.api.connection.UserConnection
主要功能: 表示玩家的连接状态和协议信息
6. ProtocolManager (协议管理器)
包名: com.viaversion.viaversion.api.protocol.ProtocolManager
主要功能: 管理协议转换和版本映射
常用使用模式
1. 获取玩家版本
// 通过 UUID 获取
UUID playerUUID = ...;
int version = Via.getAPI().getPlayerVersion(playerUUID);
ProtocolVersion protocolVersion = Via.getAPI().getPlayerProtocolVersion(playerUUID);
// 通过玩家对象获取(平台特定)
Player player = ...;
int version = Via.getAPI().getPlayerVersion(player);
ProtocolVersion protocolVersion = Via.getAPI().getPlayerProtocolVersion(player);
2. 检查版本支持
// 获取支持的版本
SortedSet<ProtocolVersion> supportedVersions = Via.getAPI().getSupportedProtocolVersions();
// 检查特定版本是否支持
ProtocolVersion targetVersion = ProtocolVersion.v1_16;
boolean isSupported = supportedVersions.contains(targetVersion);
// 检查版本范围
ProtocolVersion playerVersion = Via.getAPI().getPlayerProtocolVersion(playerUUID);
boolean isInRange = playerVersion.betweenInclusive(ProtocolVersion.v1_16, ProtocolVersion.v1_18);
3. 版本比较
ProtocolVersion v1_16 = ProtocolVersion.v1_16;
ProtocolVersion v1_18 = ProtocolVersion.v1_18;
ProtocolVersion playerVersion = ...;
// 比较版本
if (playerVersion.newerThan(v1_16)) {
// 玩家版本高于 1.16
}
if (playerVersion.olderThan(v1_18)) {
// 玩家版本低于 1.18
}
if (playerVersion.equalTo(v1_16)) {
// 玩家版本等于 1.16
}
4. 发送原始数据包
// 创建 ByteBuf 数据包
ByteBuf packet = Unpooled.buffer();
// 写入 VarInt 数据包 ID
PacketWrapper.writeVarInt(packetId, packet);
// 写入数据包内容
// ...
// 发送给玩家
Via.getAPI().sendRawPacket(player, packet);
注意事项
1. 版本检查
- 使用
majorVersion()检查主版本兼容性 - 使用
apiVersion()检查 API 兼容性 - 建议在插件启动时检查版本兼容性
2. 连接管理
- 优先使用
ConnectionManager而不是getConnection() isInjected()方法在客户端实现中可能不可靠
3. 协议版本
- 使用
ProtocolVersion对象而不是原始整数版本号 - 注意快照版本和发布版本的区别
- 使用版本比较方法而不是直接比较整数
4. 平台兼容性
- API 设计为跨平台,但某些方法可能因平台而异
- 注意泛型参数
T表示平台特定的玩家类型
版本常量参考
| 版本 | 协议版本 | 常量名 |
|---|---|---|
| 1.8-1.8.8 | 47 | v1_8 |
| 1.9 | 107 | v1_9 |
| 1.9.1 | 108 | v1_9_1 |
| 1.9.2 | 109 | v1_9_2 |
| 1.9.3 | 110 | v1_9_3 |
| 1.10-1.10.2 | 210 | v1_10 |
| 1.11-1.11.2 | 315 | v1_11 |
| 1.12-1.12.2 | 335 | v1_12 |
| 1.13 | 393 | v1_13 |
| 1.13.1 | 401 | v1_13_1 |
| 1.13.2 | 404 | v1_13_2 |
| 1.14 | 477 | v1_14 |
| 1.14.1 | 480 | v1_14_1 |
| 1.14.2 | 485 | v1_14_2 |
| 1.14.3 | 490 | v1_14_3 |
| 1.14.4 | 498 | v1_14_4 |
| 1.15 | 573 | v1_15 |
| 1.15.1 | 575 | v1_15_1 |
| 1.15.2 | 578 | v1_15_2 |
| 1.16 | 735 | v1_16 |
| 1.16.1 | 736 | v1_16_1 |
| 1.16.2 | 751 | v1_16_2 |
| 1.16.3 | 753 | v1_16_3 |
| 1.16.4 | 754 | v1_16_4 |
| 1.17 | 755 | v1_17 |
| 1.17.1 | 756 | v1_17_1 |
| 1.18 | 757 | v1_18 |
| 1.18.2 | 758 | v1_18_2 |
| 1.19 | 759 | v1_19 |
| 1.19.1 | 760 | v1_19_1 |
| 1.19.3 | 761 | v1_19_3 |
| 1.19.4 | 762 | v1_19_4 |
| 1.20 | 763 | v1_20 |
| 1.20.2 | 764 | v1_20_2 |
| 1.20.3 | 765 | v1_20_3 |
| 1.20.5 | 766 | v1_20_5 |
| 1.21 | 767 | v1_21 |
最佳实践
- 版本兼容性检查: 在插件启动时检查 ViaVersion 的主版本和 API 版本
- 优雅降级: 当 ViaVersion 不可用时提供备用方案
- 异步操作: 避免在主线程中执行耗时的版本检查
- 错误处理: 正确处理玩家未连接或版本未知的情况
- 资源清理: 及时释放 ByteBuf 等资源
扩展开发
对于需要更高级功能的开发者,建议:
- 使用
Via.getManager()获取更多管理功能 - 实现协议重写器(Rewriter)来处理特定版本的数据转换
- 使用映射系统(Mappings)处理版本间的数据映射
- 参考 ViaVersion 的源代码了解内部实现细节
文档基于 ViaVersion API 5.7.1-SNAPSHOT 版本生成,适用于开发参考。