function Rank.UpdateRankList()
local data = SL:GetMetaValue("RANK_DATA_BY_TYPE", Rank._showDataType)
local myID = SL:GetMetaValue("USER_ID")
if Rank._selectType == 2 then -- 英雄排行榜
myID = SL:GetMetaValue("HERO_ID")
end
loc
你的代码问题在于 `for i, v in ipairs(data) do` 循环中,你只对当前玩家(`v.UserID == myID`)的情况进行了 `v.level` 的赋值,并且一旦找到自己就 `break` 退出了循环。这导致其他玩家的 `v.level` 没有被赋值。
你需要将获取等级的逻辑放在循环的开始,确保每个玩家数据都处理到。修改后的代码如下:
```lua
function Rank.UpdateRankList()
local data = SL:GetMetaValue("RANK_DATA_BY_TYPE", Rank._showDataType)
local myID = SL:GetMetaValue("USER_ID")
if Rank._selectType == 2 then -- 英雄排行榜
myID = SL:GetMetaValue("HERO_ID")
end
local myInfo = {rank = 0, guildName = ""}
for i, v in ipairs(data) do
-- 【关键修改】先为所有玩家获取等级
v.level = SL:GetMetaValue("ACTOR_LEVEL", v.UserID) or 0
if v.UserID and v.UserID == myID then
myInfo.rank = i
myInfo.guildName = v.GuildName
-- 注意:这里移除了 break,因为循环需要继续处理其他玩家
end
end
Rank.UpdateMyInfoPanel(myInfo)
SL:dump(data)
GUI:removeAllChildren(Rank._rankList)
Rank._selectItemRk = nil
for i, v in ipairs(data) do
v.rank = i
GUI:QuickCell_Create(Rank._rankList, "rank" .. i, 0, 0, 370, 33, function(parent)
local cell = Rank.CreateListCell(parent, v)
if not Rank._selectItemRk then
Rank.ResetSelectItem(v)
end
return cell
end)
end
end
```
**修改说明:**
1. 将 `v.level = SL:GetMetaValue("ACTOR_LEVEL", v.UserID) or 0` 这行代码移到了 `if` 判断之前,确保循环中的**每一个** `v`(即每一位玩家)都会执行获取等级的操作。
2. 移除了找到自己后的 `break` 语句。因为 `break` 会立即终止整个循环,导致排在你自己后面的玩家数据完全不会被处理。现在循环会完整遍历整个排行榜数据列表。
这样修改后,`data` 表中的每一个玩家数据项都会拥有 `level` 字段。下次写循环逻辑时,要注意区分“为所有元素执行操作”和“为特定元素执行操作并退出”的场景,避免这种马虎错误。如果还有不明白的,随时可以问我!