UGCProjects/TwoOnTwo/Script/Global/System/PlayerScoreSystem.lua

304 lines
11 KiB
Lua
Raw Permalink Normal View History

2025-01-04 23:00:19 +08:00
--[[
使
1GameState的
PlayerScoreSystem.RegisterInfo(InScoreList) InScoreList PlayerScoreSystem.Config.ScoreList
2
PlayerScoreSystem.InitPlayerScoreData(PlayerKey)
3GameState内
PlayerScoreSystem.BindChangeScoreDataCallBack(Func, Obj)
(1)GameState加入同步参数PlayerScoreDatas
(2)GameState的BeginPlay函数内加入
if UGCGameSystem.IsServer() then
-- 绑定更新积分的函数
PlayerScoreSystem.BindChangeScoreDataCallBack(self.UpdateAllPlayerScoreDatas, self)
end
(3)UpdateAllPlayerScoreDatas函数
function UGCGameState:UpdateAllPlayerScoreDatas()
self.PlayerScoreDatas = PlayerScoreSystem.GetPlayerScoreDatas()
end
(4)UpdateAllPlayerScoreDatas函数
function UGCGameState:UpdateAllPlayerScoreDatas()
self.PlayerScoreDatas = PlayerScoreSystem.GetPlayerScoreDatas()
end
(5)OnRep_PlayerScoreDatas函数
function UGCGameState:OnRep_PlayerScoreDatas()
PlayerScoreSystem.SetPlayerScoreDatas(self.PlayerScoreDatas)
UGCEventSystem.SendEvent(EventEnum.UpdatePlayerScoreData)
end
-------------------------------------------------------------------------------------------
-----------
--- Server 重置所有玩家的积分信息
PlayerScoreSystem.ResetAllPlayerScoreData()
--- Server 增加玩家积分
PlayerScoreSystem.AddPlayerScoreData(PlayerKey, ScoreType, AddVal)
--- Server 设置玩家积分
PlayerScoreSystem.SetPlayerScoreDataFromType(PlayerKey, ScoreType, Val)
--- Server or Client 获取玩家积分信息
---@return number
PlayerScoreSystem.GetPlayerScoreDataFromType(PlayerKey, ScoreType)
--- Server or Client 获取玩家得分 返回: ∑得分类型×类型对应得分
---@return number
PlayerScoreSystem.GetPlayerScore(PlayerKey)
--- Server or Client 获取玩家排名 InPlayerKeys:所需排名的PlayerKeys,若为nil则全部一起排名
---@return "table {PlayerKey, ...}"
PlayerScoreSystem.GetRank(InPlayerKeys)
--- Server or Client 获取队伍的玩家排名
---@return "table {[TeamID] = {PlayerKey, ...}, ...}"
PlayerScoreSystem.GetTeamRank()
--- Server 刷新或重设PlayerScoreSystem内的玩家TeamID
PlayerScoreSystem.UpdatePlayerTeamID(PlayerKey, TeamID)
-- 特殊情况需要用的函数 -----------
--- Server 移除玩家得分信息 NeedNotify是否通知更新 这个比较少用用于有玩家退出时再进行补人的操作放在PlayerExit内调用
PlayerScoreSystem.RemovePlayerScoreInfo(PlayerKey, NeedNotify)
--- Server 清除退出的玩家得分信息
PlayerScoreSystem.ClearExitPlayer()
]]
PlayerScoreSystem = PlayerScoreSystem or {}
PlayerScoreSystem.Config = {}
-- Config ----------------------------------------------------------------
PlayerScoreSystem.Config.EScoreType = {
Kills = 1,
Assists = 2,
Deaths = 3,
Damage = 4,
}
--- Key值对应得分类型Value值对应该类型每点所获得的积分
PlayerScoreSystem.Config.ScoreList = {
[PlayerScoreSystem.Config.EScoreType.Kills] = 0;
[PlayerScoreSystem.Config.EScoreType.Assists] = 0;
[PlayerScoreSystem.Config.EScoreType.Deaths] = -1;
[PlayerScoreSystem.Config.EScoreType.Damage] = 10;
}
-- Config End ------------------------------------------------------------
-- Params ----------------------------------------------------------------
-- 得分类型对应的分数 [ScoreType] = Score
PlayerScoreSystem.ScoreList = {};
-- 得分类型
PlayerScoreSystem.ScoreType = {};
-- 玩家得分信息 [PlayerKey] = {[ScoreType] = Score, ...} 额外附加 TeamID(PlayerScoreSystem.PlayerScoreDatas[PlayerKey].TeamID)
PlayerScoreSystem.PlayerScoreDatas = {};
-- Params End ------------------------------------------------------------
--- 注册积分类型列表
---@param InScoreList 可参考PlayerScoreSystem.Config.ScoreList
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
--- Server or Client
--- 获取得分信息
function PlayerScoreSystem.GetPlayerScoreDatas()
return PlayerScoreSystem.PlayerScoreDatas
end
--- Server
--- 设置全部的得分信息 此操作不进行函数回调因为有可能是GameState的参数传进来的所以有可能导致死循环
function PlayerScoreSystem.SetPlayerScoreDatas(InPlayerScoreDatas)
PlayerScoreSystem.PlayerScoreDatas = InPlayerScoreDatas
end
--- Server
--- 绑定GameState的更新函数简化其他操作所以只能绑一个
function PlayerScoreSystem.BindChangeScoreDataCallBack(Func, Obj)
PlayerScoreSystem.ChangeScoreDataCallBackFunc = Func
PlayerScoreSystem.ChangeScoreDataCallBackObj = Obj
end
--- Server
--- 通知回调
function PlayerScoreSystem.NotifyChangeScoreDataCallBack()
if PlayerScoreSystem.ChangeScoreDataCallBackFunc then
if PlayerScoreSystem.ChangeScoreDataCallBackObj then
PlayerScoreSystem.ChangeScoreDataCallBackFunc(PlayerScoreSystem.ChangeScoreDataCallBackObj)
else
PlayerScoreSystem.ChangeScoreDataCallBackFunc()
end
end
end
--- Server
--- 初始化玩家的积分信息,也可作为重置函数使用
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
-- 设置队伍ID
PlayerScoreSystem.PlayerScoreDatas[PlayerKey].TeamID = UGCPlayerStateSystem.GetTeamID(PlayerKey)
UGCLogSystem.Log("[PlayerScoreSystem_InitPlayerScoreData] TeamID:%s", tostring(PlayerScoreSystem.PlayerScoreDatas[PlayerKey].TeamID))
-- 更新函数回调
PlayerScoreSystem.NotifyChangeScoreDataCallBack()
end
end
--- Server
--- 刷新玩家TeamID
function PlayerScoreSystem.UpdatePlayerTeamID(PlayerKey, TeamID)
if TeamID then
PlayerScoreSystem.PlayerScoreDatas[PlayerKey].TeamID = TeamID
else
PlayerScoreSystem.PlayerScoreDatas[PlayerKey].TeamID = UGCPlayerStateSystem.GetTeamID(PlayerKey)
end
UGCLogSystem.Log("[PlayerScoreSystem_UpdatePlayerTeamID] TeamID:%s", tostring(PlayerScoreSystem.PlayerScoreDatas[PlayerKey].TeamID))
PlayerScoreSystem.NotifyChangeScoreDataCallBack()
end
--- Server
--- 校验玩家积分信息是否初始化
function PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey)
if PlayerScoreSystem.PlayerScoreDatas[PlayerKey] == nil then
UGCLogSystem.LogError("[PlayerScoreSystem_CheckPlayerScoreDataIsInit] PlayerKey:%s, 玩家信息未注册", tostring(PlayerKey))
PlayerScoreSystem.InitPlayerScoreData(PlayerKey)
end
end
--- Server
--- 重置所有玩家的积分信息
function PlayerScoreSystem.ResetAllPlayerScoreData()
for PlayerKey, v in pairs(PlayerScoreSystem.PlayerScoreDatas) do
PlayerScoreSystem.InitPlayerScoreData(PlayerKey, true)
end
PlayerScoreSystem.NotifyChangeScoreDataCallBack()
end
--- Server
--- 添加玩家积分信息
function PlayerScoreSystem.AddPlayerScoreData(PlayerKey, ScoreType, AddVal)
PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey)
PlayerScoreSystem.PlayerScoreDatas[PlayerKey][ScoreType] = PlayerScoreSystem.PlayerScoreDatas[PlayerKey][ScoreType] + AddVal
PlayerScoreSystem.NotifyChangeScoreDataCallBack()
end
--- Server
--- 移除玩家得分信息
function PlayerScoreSystem.RemovePlayerScoreInfo(PlayerKey, NeedNotify)
PlayerScoreSystem.PlayerScoreDatas[PlayerKey] = nil
if NeedNotify == nil or NeedNotify then
PlayerScoreSystem.NotifyChangeScoreDataCallBack()
end
end
--- Server
--- 清除退出的玩家得分信息
function PlayerScoreSystem.ClearExitPlayer()
local AllPlayerKey = table.getKeys(PlayerScoreSystem.PlayerScoreDatas)
for i, v in pairs(AllPlayerKey) do
if UGCGameSystem.GetPlayerControllerByPlayerKey(v) == nil then
PlayerScoreSystem.RemovePlayerScoreInfo(v, false)
end
end
PlayerScoreSystem.NotifyChangeScoreDataCallBack()
end
--- Server
--- 设置玩家积分信息
function PlayerScoreSystem.SetPlayerScoreDataFromType(PlayerKey, ScoreType, Val)
PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey)
PlayerScoreSystem.PlayerScoreDatas[PlayerKey][ScoreType] = Val
PlayerScoreSystem.NotifyChangeScoreDataCallBack()
end
--- Server or Client
--- 获取玩家积分信息
function PlayerScoreSystem.GetPlayerScoreDataFromType(PlayerKey, ScoreType)
PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey)
return PlayerScoreSystem.PlayerScoreDatas[PlayerKey][ScoreType]
end
--- Server or Client
--- 获取玩家得分
---@return number
function PlayerScoreSystem.GetPlayerScore(PlayerKey)
PlayerScoreSystem.CheckPlayerScoreDataIsInit(PlayerKey)
local Res = 0
for i, v in pairs(PlayerScoreSystem.PlayerScoreDatas[PlayerKey]) do
if PlayerScoreSystem.ScoreList[i] then
Res = Res + PlayerScoreSystem.ScoreList[i] * v
end
end
return Res
end
--- Server or Client
--- 获取玩家排名
---@param InPlayerKeys "所需排名的PlayerKeys,若为nil则全部一起排名"
---@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
--- Server or Client
--- 获取队伍的玩家排名
---@return "table {[TeamID] = {PlayerKey, ...}, ...}"
function PlayerScoreSystem.GetTeamRank()
local Res = {}
-- 获取队伍玩家PlayerKey
local TeamPlayers = {}
for PlayerKey, ScoreInfo in pairs(PlayerScoreSystem.PlayerScoreDatas) do
if TeamPlayers[ScoreInfo.TeamID] == nil then TeamPlayers[ScoreInfo.TeamID] = {} end
TeamPlayers[ScoreInfo.TeamID][#TeamPlayers[ScoreInfo.TeamID] + 1] = PlayerKey
end
-- 获取队伍内排名
for TeamID, PlayerKeys in pairs(TeamPlayers) do
Res[TeamID] = PlayerScoreSystem.GetRank(PlayerKeys)
end
return Res
end