miduo_client/Assets/ManagedResources/~Lua/Modules/Player/RedPointData.lua

223 lines
6.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

local isLog = false
local function __DebugLog(str)
if isLog then
Log("<color=#aa55aa>" .. str .. "</color>")
end
end
-- 红点状态
local _data = {}
-- 红点树关系结构数据
local _parentIndex = {}
local _childNum = {}
local _childIndex = {}
-- 红点检测方法
local _checkFunc = {}
-- 服务器保存的红点信息
local _serverRedData = {}
-- 向父级检测设置红点值
local function _doSetRedValue(node, value)
if _data[node] ~= value then
_data[node] = value
__DebugLog(Language[11409].. node .. ", value == ".. value)
--如果有父级,更新父级
local _parent = _parentIndex[node]
if _parent then
local index = _childIndex[node]
local _parentValue = 0
--- BitMath.lShiftOp(1, (index - 1)) 后为:: 1248 .。。 既0001 0010 0100 1000。。。
local _IndexBitValue = BitMath.lShiftOp(1, (index - 1))
if value > 0 then
--- 父结点值为:或运算,将相应二进制位置上的 0 置为 1
_parentValue = BitMath.orOp(_data[_parent], _IndexBitValue)
else
--- BitMath.notOp(_IndexBitValue) 取反运算,值为: 1110 1101 1011 0111 .。。
--- 父节点值为:与运算,将相应二进制位置上的 1 置为 0
_parentValue = BitMath.andOp(_data[_parent], BitMath.notOp(_IndexBitValue))
end
-- 向上一层级递归
_doSetRedValue(_parent, _parentValue)
end
end
end
local RedPointData = {}
function RedPointData:SetParent(child, parent)
-- 不能相反
if _parentIndex[parent] == child then
LogError("试图将一个红点的父红点注册为其子红点, parent == ".. parent.. ", child == ".. child)
return
end
-- 一个子节点只能有一个父节点
if _parentIndex[child] then
-- LogError("红点id == " .. child.. ",重复设置了父级,请检查")
return
end
-- 设置子节点对应的父节点
_parentIndex[child] = parent
-- 记录父节点对应的子节点数量
if not _childNum[parent] then _childNum[parent] = 0 end
_childNum[parent] = _childNum[parent] + 1
-- 记录子节点在父节点中的位置
_childIndex[child] = _childNum[parent]
-- 设置数据
if not _data[child] then _data[child] = 0 end
if not _data[parent] then _data[parent] = 0 end
end
-- 获取红点的父节点
function RedPointData:GetRedParent(node)
return _parentIndex[node]
end
function RedPointData:GetRedChildren(node)
local list = {}
for c, p in pairs(_parentIndex) do
if p == node then
table.insert(list, c)
end
end
-- 排序
table.sort(list, function(a, b)
return _childIndex[a] < _childIndex[b]
end)
return list
end
-- 对叶子节点设置红点状态
function RedPointData:SetRedValue(node, value)
if _childNum[node] and _childNum[node] > 0 then
Log("子结点数量大于1说明是高级结点不能操作")
return false
end
-- 设置红点数值
_doSetRedValue(node, value)
return true
end
-- 获取红点状态
function RedPointData:GetRedValue(node)
return _data[node]
end
-- 获取所有红点数据
function RedPointData:GetAllRedData()
return _data
end
-- 注册红点检测方法
function RedPointData:AddCheckFunc(node, func, openType)
if _childNum[node] and _childNum[node] > 0 then
Log("红点id == ".. node .. ", 此节点是父节点,不可以注册检测方法")
return
end
if _checkFunc[node] then
Log("红点id == ".. node .. ", 重复注册了事件,请检查")
return
end
if not RedPointData:GetServerRed(node) and not func then
Log("红点id == ".. node .. ", 不是服务器红点,并注册事件为空,请检查")
return
end
__DebugLog(Language[11410].. node .. Language[11411])
_checkFunc[node] = {
func = func,
openType = openType
}
end
-- 删除检测方法
function RedPointData:RemoveCheckFunc(node)
_checkFunc[node] = nil
end
-- 检测红点成功返回true失败返回 false
function RedPointData:CheckRedPoint(node)
local value = nil
-- 判断是否解锁
if _checkFunc[node] and _checkFunc[node].openType then
local isOpen = ActTimeCtrlManager.SingleFuncState(_checkFunc[node].openType)
if not isOpen then value = 0 end
end
if not value then
-- 判断是否是服务器红点
if RedPointData:GetServerRed(node) then
value = RedPointData:GetServerRed(node)
-- 判断是否注册了检测方法
elseif _checkFunc[node] and _checkFunc[node].func then
value = _checkFunc[node].func(node) and 1 or 0
-- 都没有提示,出错
else
Log("红点id == ".. node .. ", 没有注册检测事件,也不是服务器保存的红点,请检查")
return false
end
end
-- 数据正确性检测
if not value then
Log("红点id == ".. node .. ", 数据错误,请检查")
return false
end
-- 判断红点状态是否改变
if value == RedPointData:GetRedValue(node) then
__DebugLog(Language[11410].. node .. ", value = ".. value ..Language[11412])
return false
end
-- 设置红点值
RedPointData:SetRedValue(node, value)
return true
end
-- 获取红点检测方法list
function RedPointData:GetCheckList()
return _checkFunc
end
---------服务器红点相关-----------------
-- 设置服务器红点数据
function RedPointData:SetServerRedData(list)
_serverRedData = list
-- debug用
__DebugLog("++++++++++++++++")
__DebugLog("++++++++++++++++")
__DebugLog("++++++++++++++++")
for rpType, value in ipairs(list) do
__DebugLog(Language[11413]..rpType..", value == "..value)
end
__DebugLog("++++++++++++++++")
__DebugLog("++++++++++++++++")
__DebugLog("++++++++++++++++")
end
function RedPointData:GetServerRedData()
return _serverRedData
end
-- 更新服务器红点状态
function RedPointData:SetServerRed(node, value)
if not _serverRedData[node] then
Log("红点id == "..node..",不是服务器保存红点,请检查!")
return false
end
_serverRedData[node] = value
return true
end
-- 获取服务器红点值
function RedPointData:GetServerRed(node)
if not _serverRedData[node] then
return
end
return _serverRedData[node]
end
return RedPointData