PAYATHON 2026

FiveM 中无法获取 job.grade.name,提示 No grades

支付小周

结论

Player.PlayerData.job.grade.name 的写法没有问题。之所以显示 No grades,通常是因为玩家保存的等级值与 QBShared.Jobs[job].grades 使用了不同类型的键。

常见的 QBCore 配置会使用字符串作为等级键,例如 ['0'],而不是数字键 [0]。如果框架用字符串 "0" 查询数字键 0,Lua 会将它们视为两个不同的键。框架找不到对应等级时,就会使用默认值 No grades。

修改工作配置

把所有等级键统一改成字符串:

QBShared.Jobs = {
    ["unemployed"] = {
        label = "Werkloos",
        defaultDuty = true,
        grades = {
            ["0"] = {
                name = "Werkloos",
                payment = 10,
            },
        },
    },

    ["police"] = {
        label = "Politie",
        defaultDuty = true,
        grades = {
            ["0"] = {
                name = "Politie Student",
                payment = 200,
            },

            ["1"] = {
                name = "Aspirant",
                payment = 300,
            },

            ["2"] = {
                name = "Agent",
                payment = 400,
            },

            ["3"] = {
                name = "Hoofd Agent",
                payment = 400,
            },

            ["4"] = {
                name = "Brigadier",
                payment = 400,
            },

            ["5"] = {
                name = "Inspecteur",
                payment = 400,
            },

            ["6"] = {
                name = "Hoofd Inspecteur",
                payment = 400,
            },

            ["7"] = {
                name = "Commissaris",
                payment = 400,
            },

            ["8"] = {
                name = "Hoofd Commissaris",
                payment = 400,
            },

            ["9"] = {
                name = "Eerste Hoofd Commissaris",
                isboss = true,
                payment = 400,
            },
        },
    },
}

在 Lua 中,下面两个键并不相同:

grades[0]
grades["0"]

不同版本或分支的 QBCore 可能有不同实现。如果 SetJob 使用字符串形式的等级值,配置中也必须使用 ["0"]、["1"] 这类字符串键。

命令代码

等级名称仍然可以通过 Player.PlayerData.job.grade.name 获取,同时应加入必要的空值检查:

QBCore.Commands.Add("baan", "Kijk wat je baan is", {}, false, function(source, args)
    local Player = QBCore.Functions.GetPlayer(source)

    if not Player then
        return
    end

    local job = Player.PlayerData.job

    if not job or not job.grade then
        TriggerClientEvent(
            "chatMessage",
            source,
            "SYSTEM",
            "warning",
            "Baaninformatie kon niet worden geladen."
        )
        return
    end

    local jobLabel = job.label or job.name or "Onbekend"
    local gradeName = job.grade.name or "Geen rang"

    TriggerClientEvent(
        "chatMessage",
        source,
        "SYSTEM",
        "warning",
        ("Baan: %s - %s"):format(jobLabel, gradeName)
    )
end)

当玩家的工作是 police,等级是 0 时,输出如下:

Baan: Politie - Politie Student

原代码为什么会得到 No grades

QBCore 加载或设置玩家工作时,会根据工作名称和等级查询相应配置。逻辑通常相当于:

local gradeInfo = QBShared.Jobs[jobName].grades[grade]

假设玩家数据中的等级是字符串:

grade = "0"

而配置使用数字键:

grades = {
    [0] = {
        name = "Politie Student"
    }
}

实际查询的就是:

grades["0"]

配置中只有 grades[0],因此查询结果为 nil。框架无法构造完整的 job.grade,并可能保留默认名称 No grades。

修改后仍然显示旧值

工作配置通常在资源启动时载入。修改后需要重启相关资源或整个服务器,让配置重新加载。只重新执行 /baan,不会刷新已经载入内存的配置。

还需要检查玩家持久化数据中的工作等级是否有效。如果玩家保存的是等级 10,而 police.grades 只配置到 9,框架同样找不到对应等级。此时可以重新设置玩家的工作和等级:

Player.Functions.SetJob("police", 0)

应当传入数字 0 还是字符串 "0",取决于当前 QBCore 版本中 SetJob 的实现。进入等级表查询时,等级值的类型必须与 grades 的键类型一致。

配置语法注意事项

如果下面这行内容原样出现在 Lua 文件中,会导致语法错误:

name = "Politie - Student", **Want to pick this**

**...** 是 Markdown 的强调语法,不是 Lua 注释。Lua 注释应写成:

name = "Politie Student", -- Want to pick this

如果等级名称配置为:

name = "Politie - Student"

而命令又在工作名称和等级名称之间添加 " - ",最终会输出:

Baan: Politie - Politie - Student

如果希望得到:

Baan: Politie - Politie Student

应把等级名称配置为:

name = "Politie Student"

也可以只保存等级本身:

name = "Student"

这样输出会更自然:

Baan: Politie - Student

备注:内容仅供参考。