PlayerScoreSystem = PlayerScoreSystem or {} -- 得分类型对应的分数 [ScoreType] = Score PlayerScoreSystem.ScoreList = {}; -- 得分类型 PlayerScoreSystem.ScoreType = {}; -- 玩家得分信息 [PlayerKey] = {[ScoreType] = Score, ...} PlayerScoreSystem.PlayerScoreDatas = {}; --- 注册积分类型列表 function PlayerScoreSystem.RegisterInfo(InScoreList) if type(InScoreList) ~= "table" then UGCLogSystem.LogError("[PlayerScoreSystem_RegisterInfo] InScoreType 类型错误") end PlayerScoreSystem.ScoreType = table.getKeys(InScoreList) PlayerScoreSystem.ScoreList = InScoreList UGCLogSystem.LogTree("[PlayerScoreSystem_RegisterInfo] ScoreType", PlayerScoreSystem.ScoreType) UGCLogSystem.LogTree("[PlayerScoreSystem_RegisterInfo] ScoreList", PlayerScoreSystem.ScoreList) end --- 获取得分信息 function PlayerScoreSystem.GetPlayerScoreDatas() return PlayerScoreSystem.PlayerScoreDatas end --- 设置全部的得分信息 此操作不进行函数回调,因为有可能是GameState的参数传进来的所以有可能导致死循环 function PlayerScoreSystem.SetPlayerScoreDatas(InPlayerScoreDatas) PlayerScoreSystem.PlayerScoreDatas = InPlayerScoreDatas end --- 绑定GameState的更新函数,简化其他操作,所以只能绑一个 function PlayerScoreSystem.BindChangeScoreDataCallBack(Func, Obj) PlayerScoreSystem.ChangeScoreDataCallBackFunc = Func PlayerScoreSystem.ChangeScoreDataCallBackObj = Obj end --- 通知回调 function PlayerScoreSystem.NotifyChangeScoreDataCallBack() if PlayerScoreSystem.ChangeScoreDataCallBackFunc then if PlayerScoreSystem.ChangeScoreDataCallBackObj then PlayerScoreSystem.ChangeScoreDataCallBackFunc(PlayerScoreSystem.ChangeScoreDataCallBackObj) else PlayerScoreSystem.ChangeScoreDataCallBackFunc() end end end --- 初始化玩家的积分信息,也可作为重置函数使用 function PlayerScoreSystem.InitPlayerScoreData(PlayerKey, IsReset) if PlayerScoreSystem.PlayerScoreDatas[PlayerKey] == nil or IsReset then PlayerScoreSystem.PlayerScoreDatas[PlayerKey] = {} -- 初始化信息 for i, v in pairs(PlayerScoreSystem.ScoreType) do PlayerScoreSystem.PlayerScoreDatas[PlayerKey][v] = 0 end PlayerScoreSystem.NotifyChangeScoreDataCallBack() end end --- 校验玩家积分信息是否初始化 function PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey) if PlayerScoreSystem.PlayerScoreDatas[PlayerKey] == nil then UGCLogSystem.LogError("[PlayerScoreSystem_CheckPlayerScoreDataIsInit] 玩家信息未注册") PlayerScoreSystem.InitPlayerScoreData(PlayerKey) end end --- 重置所有玩家的积分信息 function PlayerScoreSystem.ResetAllPlayerScoreData() for PlayerKey, v in pairs(PlayerScoreSystem.PlayerScoreDatas) do PlayerScoreSystem.InitPlayerScoreData(PlayerKey, true) end PlayerScoreSystem.NotifyChangeScoreDataCallBack() end --- 添加玩家积分信息 function PlayerScoreSystem.AddPlayerScoreData(PlayerKey, ScoreType, AddVal) PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey) PlayerScoreSystem.PlayerScoreDatas[PlayerKey][ScoreType] = PlayerScoreSystem.PlayerScoreDatas[PlayerKey][ScoreType] + AddVal PlayerScoreSystem.NotifyChangeScoreDataCallBack() end --- 获取玩家积分信息 function PlayerScoreSystem.GetPlayerScoreDataFromType(PlayerKey, ScoreType) PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey) return PlayerScoreSystem.PlayerScoreDatas[PlayerKey][ScoreType] end --- 设置玩家积分信息 function PlayerScoreSystem.SetPlayerScoreDataFromType(PlayerKey, ScoreType, Val) PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey) PlayerScoreSystem.PlayerScoreDatas[PlayerKey][ScoreType] = Val PlayerScoreSystem.NotifyChangeScoreDataCallBack() end --- 获取玩家得分 ---@return number function PlayerScoreSystem.GetPlayerScore(PlayerKey) PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey) local Res = 0 for i, v in pairs(PlayerScoreSystem.PlayerScoreDatas[PlayerKey]) do Res = Res + PlayerScoreSystem.ScoreList[i] * v end return Res end --- 获取玩家排名 ---@return "table {PlayerKey, ...}" function PlayerScoreSystem.GetRank(InPlayerKeys) local AllPlayerKey = {} if InPlayerKeys == nil or type(InPlayerKeys) ~= "table" then AllPlayerKey = table.getKeys(PlayerScoreSystem.PlayerScoreDatas) else AllPlayerKey = InPlayerKeys end table.sort(AllPlayerKey, function(a, b) return PlayerScoreSystem.GetPlayerScore(a) > PlayerScoreSystem.GetPlayerScore(b) end) return AllPlayerKey end --- 获取队伍的玩家排名 ---@return "table {[TeamID] = {PlayerKey, ...}, ...}" function PlayerScoreSystem.GetTeamRank() local Res = {} local AllTeamIDs = UGCTeamSystem.GetTeamIDs() for i, TeamID in pairs(AllTeamIDs) do Res[TeamID] = PlayerScoreSystem.GetRank(UGCTeamSystem.GetPlayerKeysByTeamID(TeamID)) end return Res end --- 移除玩家得分信息 function PlayerScoreSystem.RemovePlayerScoreInfo(PlayerKey, NeedNotify) PlayerScoreSystem.PlayerScoreDatas[PlayerKey] = nil if NeedNotify == nil or NeedNotify then PlayerScoreSystem.NotifyChangeScoreDataCallBack() end end --- 清除退出的玩家得分信息 function PlayerScoreSystem.ClearExitPlayer() local AllPlayerKey = table.getKeys(PlayerScoreSystem.PlayerScoreData) for i, v in pairs(AllPlayerKey) do if UGCGameSystem.GetPlayerControllerByPlayerKey(v) == nil then PlayerScoreSystem.RemovePlayerScoreInfo(v, false) end end PlayerScoreSystem.NotifyChangeScoreDataCallBack() end