Minecraft/Spigot:将1.8插件的数据包代码移植到1.20版本
Spigot 1.20 发送游戏Credits数据包实现讲解
核心逻辑不变,仅类与参数结构调整
你1.8版本用的PacketPlayOutGameStateChange是负责向客户端发送游戏状态变更的数据包,其中状态ID=4就是触发显示游戏Credits(制作人员列表)的指令——这个核心逻辑在1.20里完全没变,只是Mojang对内部类的命名和参数封装做了调整。
1.20版本适配步骤拆解
1. 找对对应数据包类
1.8的PacketPlayOutGameStateChange在1.20中更名为ClientboundGameEventPacket,功能完全一致,就是用来给客户端发游戏状态事件的。
2. 构造数据包的参数变化
原来的PacketPlayOutGameStateChange(4, 1)里:
- 第一个参数
4是触发Credits的状态标识 - 第二个参数
1是状态值(对Credits来说这个值不影响,只要合法就行)
在1.20里,状态标识被封装成了枚举GameEvent,触发Credits对应的枚举值是GameEvent.SHOW_CREDITS,它的底层ID还是4,和1.8保持一致。同时第二个参数的类型从int改成了float,填1.0F就可以。
3. 发送数据包的方式
1.8里((CraftPlayer) t).getHandle().playerConnection.sendPacket(packet)的逻辑依然能用,只是playerConnection现在的类型是ServerGamePacketListenerImpl,调用send()方法发送数据包的操作没变。
完整适配代码示例
import net.minecraft.network.protocol.game.ClientboundGameEventPacket; import net.minecraft.world.level.gameevent.GameEvent; import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.entity.Player; public void showCredits(Player player) { // 构造触发Credits的数据包 ClientboundGameEventPacket packet = new ClientboundGameEventPacket(GameEvent.SHOW_CREDITS, 1.0F); // 获取NMS玩家对象并发送数据包 ((CraftPlayer) player).getHandle().connection.send(packet); }
注意事项
- 版本包路径:
CraftPlayer的包名是org.bukkit.craftbukkit.v1_20_R1.entity,如果用的是1.20.1等小版本,后缀v1_20_R1会对应变化,要匹配你的Spigot版本。 - 枚举替代硬编码:用
GameEvent.SHOW_CREDITS比直接写4更规范,避免后续版本更新时ID变动导致失效。
内容的提问来源于stack exchange,提问作者user23010873
相关产品推荐
相关产品推荐

