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
备注:内容仅供参考。
