Skip to content

[26.3] NMSSignListener 处理牌子提交包时抛 ClassCastException(ArrayList cannot be cast to String[]) #735

Open

Description

@ReikoYuzuka

问题描述

在 Folia 26.3 上使用 Player.inputSign() 捕获告示牌输入,玩家编辑完牌子点「完成」时服务端抛 ClassCastException,回调永远不会执行。

NMSSignListener.onReceive 里的版本判断用的是:

val lines = when {
    MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_17) -> event.packet.read<Array<String>>("lines")!!
    MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_9) -> event.packet.read<Array<String>>("b")!!
    else -> event.packet.read<Array<Any>>("b")!!.map { NMSSign.instance.deserialize(it) }.toTypedArray()
}

26.3 满足 isHigherOrEqual(V1_17),于是按 1.17+ 的路径读取 Array<String>,但 26.3 的包字段实际是 List<String>(ArrayList),强转直接失败。

Gradle配置

version { taboolib = "6.3.0-0e3a911" }

复现代码

player.inputSign(context.parse(signContent).toTypedArray()) { lines ->
    // 26.3 上不会执行到这里
    println(lines.joinToString(""))
}

报错日志

Caused by: java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class [Ljava.lang.String; (java.util.ArrayList is in module java.base of loader 'bootstrap')
    at taboolib.module.nms.NMSSignListener.onReceive(NMSSignListener.kt:49)
    at taboolib.library.reflex.JavaClassMethod.invoke(JavaClassMethod.kt:61)
    ...
    at taboolib.module.nms.MeteorInjector.onPacketReceive(MeteorInjector.java:184)

建议修复

在 when 最前面加一个 26.3 分支,按 List<String> 读取:

val lines = when {
    MinecraftVersion.major == MinecraftVersion.V26_3 ->
        event.packet.read<List<String>>("lines")!!.toTypedArray()
    MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_17) -> event.packet.read<Array<String>>("lines")!!
    ...
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions