You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:58:24