390 lines
13 KiB
Lua
390 lines
13 KiB
Lua
PrivilegeManager = {}
|
||
local this = PrivilegeManager
|
||
|
||
function this.Initialize()
|
||
this._PrivilegeInfoList = {} --接收到的后端的特权列表
|
||
this._PrivilegeTypeList = {} --从前端特权表中读取的数据,以表中列PrivilegeType为键
|
||
end
|
||
|
||
-- 初始化数据
|
||
function PrivilegeManager.InitPrivilegeData(data)
|
||
this._PrivilegeInfoList = {}
|
||
for i = 1, #data do
|
||
|
||
--[[data:从后端接受到的数据 data是个列表 列表元素的结构id与priviledge的id对应 usedTimes使用次数 endTime 有效时间]]
|
||
this._PrivilegeInfoList[data[i].id] = { id = data[i].id, usedTimes = data[i].usedTimes, endTime = data[i].effectTime }
|
||
end
|
||
|
||
this._PrivilegeTypeList = {}
|
||
local configList = ConfigManager.GetConfig(ConfigName.PrivilegeTypeConfig)
|
||
for _, config in ConfigPairs(configList) do
|
||
if not this._PrivilegeTypeList[config.PrivilegeType] then
|
||
this._PrivilegeTypeList[config.PrivilegeType] = {}
|
||
end
|
||
table.insert(this._PrivilegeTypeList[config.PrivilegeType], config)
|
||
end
|
||
end
|
||
|
||
--刷新从后端接收的到的特权表
|
||
function PrivilegeManager.FiveAMRefreshLocalData(privilegeList)
|
||
this.InitPrivilegeData(privilegeList)
|
||
end
|
||
|
||
--刷新从后端接收的到的特权表
|
||
function PrivilegeManager.OnPrivilegeUpdate(data)
|
||
for i = 1, #data do
|
||
this._PrivilegeInfoList[data[i].id] = { id = data[i].id, usedTimes = data[i].usedTimes, endTime = data[i].effectTime }
|
||
-- 发送特权解锁事件
|
||
Game.GlobalEvent:DispatchEvent(GameEvent.Privilege.OnPrivilegeUpdate, data[i].id)
|
||
end
|
||
end
|
||
|
||
-- 获取服务器数据
|
||
function PrivilegeManager.GetSerData(privilegeId)
|
||
local data = this._PrivilegeInfoList[privilegeId]
|
||
return data
|
||
end
|
||
|
||
|
||
-- 用于比较副本id的大小
|
||
local function _CarbonIdCompare(cId1, cId2)
|
||
local len1 = string.len(cId1)
|
||
local diff1 = tonumber(string.sub(cId1, len1, len1))
|
||
local id1 = tonumber(string.sub(cId1, 1, len1-1))
|
||
|
||
local len2 = string.len(cId2)
|
||
local diff2 = tonumber(string.sub(cId1, len2, len2))
|
||
local id2 = tonumber(string.sub(cId1, 1, len2-1))
|
||
|
||
if diff1 == diff2 then
|
||
return id1 - id2
|
||
end
|
||
return diff1 - diff2
|
||
end
|
||
|
||
-- 判断 cdv2 是否 在cdv1条件下可以解锁
|
||
--- type 解锁类型
|
||
--- condition 解锁条件
|
||
--- value 当前值
|
||
local function _CompareCondition(type, condition, value)
|
||
assert(type, Language[11511])
|
||
assert(condition, Language[11512])
|
||
if type == 1 then -- 玩家等级解锁
|
||
value = value or PlayerManager.level
|
||
return value >= condition
|
||
elseif type == 2 then -- 关卡解锁
|
||
if value then
|
||
return _CarbonIdCompare(value, condition) >= 0
|
||
else
|
||
return FightPointPassManager.GetFightStateById(condition) == FIGHT_POINT_STATE.PASS
|
||
end
|
||
elseif type == 3 then -- vip等级解锁
|
||
value = value or VipManager.GetVipLevel()
|
||
return value >= condition
|
||
elseif type == 4 then -- 特殊类型
|
||
return true
|
||
elseif type == 5 then -- 特殊类型
|
||
return true
|
||
end
|
||
end
|
||
|
||
|
||
--获取特权次数或者收益相关值(纯前端读表)
|
||
--- value 自定义比较值,为空时使用玩家自己的默认值进行比较,
|
||
function PrivilegeManager.GetPrivilegeNumberById(privilegeId, value)
|
||
local privilegeData = ConfigManager.GetConfigData(ConfigName.PrivilegeTypeConfig, privilegeId)
|
||
local unlockType = privilegeData.UnlockType
|
||
-- 特殊类型特殊处理
|
||
if unlockType == 4 or unlockType == 5 then
|
||
-- 4类型没有服务器数据不解锁
|
||
local serData = this.GetSerData(privilegeId)
|
||
if not serData then return 0 end
|
||
-- 判断是否有持续时间
|
||
-- 有结束时间,但不在时间范围内
|
||
if serData.endTime ~= 0 and serData.endTime < GetTimeStamp() then return 0 end
|
||
end
|
||
|
||
-- 没有条件直接 直接永远存在
|
||
if not privilegeData.Condition then return -1 end
|
||
-- 判断解锁条件
|
||
local tValue = 0
|
||
for i = 1, #privilegeData.Condition do
|
||
local condition = privilegeData.Condition[i]
|
||
-- 没有条件了
|
||
if not condition then break end
|
||
-- 按照类型比较解锁条件
|
||
if not _CompareCondition(unlockType, condition[1], value) then break end
|
||
-- 保存当前值
|
||
tValue = condition[2]
|
||
end
|
||
-- 根据类型返回相应得数值
|
||
if privilegeData.IfFloat == 1 then
|
||
return tValue
|
||
elseif privilegeData.IfFloat == 2 then
|
||
return tValue / 10000
|
||
else
|
||
return tValue / 100
|
||
end
|
||
end
|
||
|
||
--获取特权次数或者收益相关值(纯前端读表)
|
||
--- value 自定义比较值,为空时使用玩家自己的默认值进行比较,
|
||
function PrivilegeManager.GetPrivilegeNumber(privilegeType, conValue)
|
||
local privilegeList = this._PrivilegeTypeList[privilegeType]
|
||
if not privilegeList then return 0 end
|
||
local value = 0
|
||
for _, config in ipairs(privilegeList) do
|
||
local privilegeId = config.Id
|
||
local v = this.GetPrivilegeNumberById(privilegeId, conValue)
|
||
-- -1表示一直存在,无限次数
|
||
if v < 0 then return v end
|
||
-- 所有值相同类型值相加
|
||
value = value + v
|
||
end
|
||
return value
|
||
end
|
||
|
||
--获取某权益已用次数
|
||
function PrivilegeManager.GetPrivilegeUsedTimes(privilegeType)
|
||
local privilegeList = this._PrivilegeTypeList[privilegeType]
|
||
if not privilegeList then return 0 end
|
||
local usedTimes = 0
|
||
for _, config in ipairs(privilegeList) do
|
||
local privilegeId = config.Id
|
||
local serData = this._PrivilegeInfoList[privilegeId]
|
||
if serData then
|
||
usedTimes = usedTimes + serData.usedTimes
|
||
end
|
||
end
|
||
return usedTimes
|
||
end
|
||
|
||
--获取特权次数相关剩余值(前后端数值计算)
|
||
function PrivilegeManager.GetPrivilegeRemainValue(privilegeType)
|
||
local originalValue = this.GetPrivilegeNumber(privilegeType)
|
||
local usedTimes = this.GetPrivilegeUsedTimes(privilegeType)
|
||
--LogBlue(string.format("originalValue:%s, usedTimes:%s",tostring(originalValue),tostring(usedTimes)))
|
||
local remainNum = originalValue - usedTimes
|
||
return remainNum
|
||
end
|
||
|
||
--刷新已用次数
|
||
function PrivilegeManager.RefreshPrivilegeUsedTimes(privilegeType, times)
|
||
local privilegeList = this._PrivilegeTypeList[privilegeType]
|
||
if not privilegeList then return end
|
||
for _, config in ipairs(privilegeList) do
|
||
local privilegeId = config.Id
|
||
local serData = this._PrivilegeInfoList[privilegeId]
|
||
if serData then
|
||
local maxTimes = this.GetPrivilegeNumberById(privilegeId)
|
||
local curTimes = serData.usedTimes
|
||
local finalTimes = curTimes + times
|
||
times = finalTimes - maxTimes
|
||
if times <= 0 then
|
||
this._PrivilegeInfoList[privilegeId].usedTimes = finalTimes
|
||
break
|
||
else
|
||
this._PrivilegeInfoList[privilegeId].usedTimes = maxTimes
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
--获取某权益是否解锁的状态
|
||
function PrivilegeManager.GetPrivilegeOpenStatus(privilegeType, value)
|
||
-- 判断条件是否符合
|
||
local num = this.GetPrivilegeNumber(privilegeType, value)
|
||
return num ~= 0
|
||
end
|
||
|
||
--获取某权益是否解锁的状态
|
||
function PrivilegeManager.GetPrivilegeOpenStatusById(privilegeId, value)
|
||
-- 判断条件是否符合
|
||
local num = this.GetPrivilegeNumberById(privilegeId, value)
|
||
return num ~= 0
|
||
end
|
||
|
||
--获取谋权益几级解锁
|
||
function PrivilegeManager.GetPrivilegeOpenTip(privilegeType)
|
||
local privilegeList = this._PrivilegeTypeList[privilegeType]
|
||
if not privilegeList or #privilegeList == 0 then
|
||
return Language[11513]..tostring(privilegeType)
|
||
end
|
||
|
||
--当存在多解锁类型时
|
||
if #privilegeList>1 then
|
||
local infoList={}
|
||
--解锁2倍速的处理
|
||
for i,v in ipairs(privilegeList) do
|
||
if (v.UnlockType==2 or v.UnlockType==3) and privilegeType==PRIVILEGE_TYPE.DoubleTimesFight then
|
||
for _, con in ipairs(v.Condition) do
|
||
if con[2] > 0 then
|
||
table.insert(infoList, con[1])
|
||
end
|
||
end
|
||
end
|
||
end
|
||
if privilegeType==PRIVILEGE_TYPE.DoubleTimesFight then
|
||
local fightConfig = ConfigManager.GetConfigData(ConfigName.MainLevelConfig, infoList[1])
|
||
return string.format(Language[11514],fightConfig.Name,infoList[2])
|
||
end
|
||
end
|
||
|
||
local privilegeData = privilegeList[1]
|
||
-- 没有条件直接返回0
|
||
if not privilegeData.Condition then
|
||
return Language[11515]
|
||
end
|
||
|
||
if privilegeData.Type ~= 1 then
|
||
return Language[11516]
|
||
end
|
||
|
||
local condition = privilegeData.Condition
|
||
local v = nil
|
||
for _, con in ipairs(condition) do
|
||
if con[2] > 0 then
|
||
v = con[1]
|
||
end
|
||
end
|
||
if not v then
|
||
return Language[11517]
|
||
end
|
||
if privilegeData.UnlockType == 1 then
|
||
return string.format(Language[11518], v)
|
||
elseif privilegeData.UnlockType == 2 then
|
||
local fightConfig = ConfigManager.GetConfigData(ConfigName.MainLevelConfig, v)
|
||
return string.format(Language[11519], fightConfig.Name)
|
||
elseif privilegeData.UnlockType == 3 then
|
||
return string.format(Language[11520], v)
|
||
end
|
||
end
|
||
|
||
|
||
|
||
--功能解锁是否在当前等级
|
||
--function PrivilegeManager.IsPrivilegeOpenedCurrentLevel(privilegeId, level)
|
||
function PrivilegeManager.IsPrivilegeOpenedCurrentValue(privilegeId, value)
|
||
local privilegeData = ConfigManager.GetConfigData(ConfigName.PrivilegeTypeConfig, privilegeId)
|
||
assert(privilegeData, string.format("ConfigName.PrivilegeTypeConfig not find Id:%s", privilegeId))
|
||
if not privilegeData.Condition then
|
||
return false
|
||
end
|
||
if privilegeData.Condition[1][1] == value then
|
||
return
|
||
end
|
||
end
|
||
|
||
-- 通过vip等级获取相应等级会解锁的特权信息
|
||
-- return {
|
||
-- [1] = {
|
||
-- content = "",
|
||
-- value = 0 }
|
||
-- [2] = ...
|
||
--}
|
||
function PrivilegeManager.GetTipsByVipLv(vipLv)
|
||
local list = {}
|
||
local configList = ConfigManager.GetAllConfigsDataByKey(ConfigName.PrivilegeTypeConfig, "UnlockType", 3)
|
||
for _, config in ipairs(configList) do
|
||
if config.isShowName == 1 then
|
||
for _, condition in ipairs(config.Condition) do
|
||
if condition[1] == vipLv then
|
||
local tValue = condition[2]
|
||
-- 根据类型返回相应得数值
|
||
if config.IfFloat == 1 then
|
||
tValue = tValue
|
||
elseif config.IfFloat == 2 then
|
||
tValue = tValue / 10000
|
||
else
|
||
tValue = tValue / 100
|
||
end
|
||
-- 如果是功能解锁,且解锁
|
||
if config.Type == 1 and tValue ~= 0 then
|
||
tValue = ""
|
||
end
|
||
table.insert(list, {content = config.Name, value = tValue,id = config.Id, IfFloat = config.IfFloat})
|
||
break
|
||
end
|
||
end
|
||
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
-- 获取特权剩余时间(非计时特权返回0)
|
||
function PrivilegeManager.GetPrivilegeLeftTime(privilegeType)
|
||
local isActive = this.GetPrivilegeOpenStatus(privilegeType)
|
||
if isActive then
|
||
local privilegeList = this._PrivilegeTypeList[privilegeType]
|
||
if not privilegeList or #privilegeList == 0 then
|
||
return 0
|
||
end
|
||
for _, pId in ipairs(privilegeList) do
|
||
local serData = this.GetSerData(pId)
|
||
if serData and serData > 0 then
|
||
local leftTime = serData.endTime - GetTimeStamp()
|
||
if leftTime > 0 then
|
||
return leftTime
|
||
end
|
||
end
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
-- 获取特权剩余时间(非计时特权返回0)
|
||
function PrivilegeManager.GetPrivilegeLeftTimeById(privilegeId)
|
||
local serData = this.GetSerData(privilegeId)
|
||
if serData and serData.endTime > 0 then
|
||
local leftTime = serData.endTime - GetTimeStamp()
|
||
if leftTime > 0 then
|
||
return leftTime
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
|
||
------- 部分特殊特权处理 -----------------------
|
||
-- 检测是否是特殊特权
|
||
--function PrivilegeManager.CheckIsSpecialPrivilege(privilegeId)
|
||
-- for _, spId in pairs(SPECIAL_PRIVILEGE) do
|
||
-- if spId == privilegeId then
|
||
-- return true
|
||
-- end
|
||
-- end
|
||
-- Log("特权id == " .. privilegeId .. ", 不是特殊特权,请检查!")
|
||
-- return false
|
||
--end
|
||
-- 开放某些特权
|
||
--function PrivilegeManager.OpenSpecialPrivilege(privilegeId)
|
||
-- -- 检测是否是特殊特权
|
||
-- if not this.CheckIsSpecialPrivilege(privilegeId) then
|
||
-- return
|
||
-- end
|
||
-- -- 检测特权是否存在
|
||
-- local serData = this._PrivilegeInfoList[privilegeId]
|
||
-- if serData then return end
|
||
-- this._PrivilegeInfoList[privilegeId] = {
|
||
-- id = privilegeId,
|
||
-- usedTimes = 0,
|
||
-- endTime = 0
|
||
-- }
|
||
--end
|
||
|
||
-- 获取特权状态(true 开启,false 未开启)
|
||
--function PrivilegeManager.GetSpecialPrivilegeStatus(privilegeId)
|
||
-- -- 检测是否是特殊特权
|
||
-- if not this.CheckIsSpecialPrivilege(privilegeId) then
|
||
-- return false
|
||
-- end
|
||
-- --
|
||
-- local serData = this._PrivilegeInfoList[privilegeId]
|
||
-- if serData then
|
||
-- return true
|
||
-- end
|
||
-- return false
|
||
--end
|
||
|
||
return this |