Files
SL1900 80af235e05 Update - 1.12.0.120
EN: 1.12.0.120
CN: 1.12.0.120
JP: 1.12.0.124
KR: 1.12.0.124
2026-06-30 14:30:00 +09:00

251 lines
6.8 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local RedDotManager = {}
local RedDotNode = require("GameCore.RedDot.RedDotNode")
local stringSplit = string.split
local RapidJson = require("rapidjson")
local mapKeyList = {}
local rootNode, trUIRoot
local DEBUG_OPEN = false
function RedDotManager.Init()
trUIRoot = GameObject.Find("---- UI ----").transform
EventManager.Add("LuaEventName_UnRegisterRedDot", RedDotManager, RedDotManager.OnEvent_UnRegisterRedDot)
end
function RedDotManager.RegisterNode(sKey, param, objGo, nType, bManualRefresh, bRebind)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
if objGo ~= nil then
local tbParam = {}
if param == nil then
tbParam.sParam = "empty"
elseif type(param) ~= "table" then
tbParam.sParam = param
else
tbParam = param
end
local bindCS = function(obj)
NovaAPI.UnRegisterRedDotNode(obj.gameObject)
local trParent = obj.transform.parent
obj.transform:SetParent(trUIRoot)
obj.gameObject:SetActive(true)
local paramJson = RapidJson.encode(tbParam)
NovaAPI.AddRedDotNode(obj.gameObject, sKey, paramJson)
obj.gameObject:SetActive(false)
obj.transform:SetParent(trParent)
end
if type(objGo) == "table" then
for _, v in ipairs(objGo) do
bindCS(v.gameObject)
end
else
bindCS(objGo.gameObject)
end
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
if bRebind then
node:UnRegisterNode()
end
node:RegisterNode(objGo, nType, bManualRefresh)
end
end
function RedDotManager.UnRegisterNode(sKey, param, objGo)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
if RedDotManager.CheckNodeExist(sNodeKey) then
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
node:UnRegisterNode(objGo)
end
end
end
function RedDotManager.OnEvent_UnRegisterRedDot(_, sKey, paramJson, objGo)
local tbParam = decodeJson(paramJson)
local param
if tbParam.sParam == nil then
param = tbParam
elseif tbParam.sParam == "empty" then
param = nil
else
param = tbParam.sParam
end
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
if RedDotManager.CheckNodeExist(sNodeKey) then
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
node:UnRegisterNode(objGo)
end
end
end
function RedDotManager.SetValid(sKey, param, bValid)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
if not node:CheckLeafNode() then
return
end
node:SetValid(bValid)
end
end
function RedDotManager.SetCount(sKey, param, nCount)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
if not node:CheckLeafNode() then
return
end
node:SetCount(nCount)
end
end
function RedDotManager.GetValid(sKey, param)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
return node:GetValid()
end
return false
end
function RedDotManager.RefreshRedDotShow(sKey, param)
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
if RedDotManager.CheckNodeExist(sNodeKey) then
local node = RedDotManager.GetNode(sNodeKey)
if nil ~= node then
node:RefreshRedDotShow()
end
end
end
function RedDotManager.GetNodeKey(sKey, param)
local sNodeKey = ""
local bCheck = true
if nil == sKey then
bCheck = false
traceback(string.format("红点注册传入参数错误,请检查!!!, key = %s, param = %s", sKey, param))
else
if nil == param then
sNodeKey = sKey
elseif type(param) ~= "table" then
sNodeKey = string.gsub(sKey, "<param>", param, 1)
else
sNodeKey = sKey
for _, v in ipairs(param) do
sNodeKey = string.gsub(sNodeKey, "<param>", v, 1)
end
end
sNodeKey = string.gsub(sNodeKey, "<param>", "")
local tbSplit = stringSplit(sNodeKey, ".") or {}
sNodeKey = ""
local index = 1
for _, v in ipairs(tbSplit) do
if nil ~= v and "" ~= v then
if index == 1 then
sNodeKey = v
else
sNodeKey = sNodeKey .. "." .. v
end
index = index + 1
end
end
end
return bCheck, sNodeKey
end
function RedDotManager.GetNode(sNodeKey)
if nil == rootNode then
rootNode = RedDotNode.new(RedDotDefine.Root)
end
local curNode = rootNode
local tbKeyList = RedDotManager.ParseKey(sNodeKey)
for _, key in ipairs(tbKeyList) do
local node = curNode:GetChildNode(key)
if nil == node then
node = curNode:AddChildNode(key)
end
curNode = node
end
return curNode
end
function RedDotManager.CheckNodeExist(sNodeKey)
return nil ~= RedDotManager.GetKeyList(sNodeKey)
end
function RedDotManager.GetKeyList(sNodeKey)
return mapKeyList[sNodeKey]
end
function RedDotManager.ParseKey(sNodeKey)
local tbKeyList = RedDotManager.GetKeyList(sNodeKey)
if nil == tbKeyList then
tbKeyList = stringSplit(sNodeKey, ".") or {}
end
mapKeyList[sNodeKey] = tbKeyList
return tbKeyList
end
function RedDotManager.OpenGMDebug(bOpen)
DEBUG_OPEN = bOpen
end
function RedDotManager.PrintRedDot(sKey, param, bLeaf)
if not DEBUG_OPEN then
return
end
local tbNode = {}
local bCheck, sNodeKey = RedDotManager.GetNodeKey(sKey, param)
if not bCheck then
return
end
local node = RedDotManager.GetNode(sNodeKey)
if nil == node then
return
end
node:PrintRedDot(bLeaf, tbNode, 0)
if tbNode == nil or #tbNode == 0 then
return
end
local COLOR_NODE = "#4FC3F7"
local COLOR_LEAF = "#B5E853"
local COLOR_ACTIVE = "#FF5252"
local escape = function(v)
local s = tostring(v)
s = s:gsub("<", "")
s = s:gsub(">", "")
return s
end
local wrap = function(sColor, sText)
return string.format("<color=%s>%s</color>", sColor, sText)
end
local tbLines = {}
table.insert(tbLines, string.format("[RedDot] ===== Tree of [%s] =====", escape(sNodeKey)))
for _, item in ipairs(tbNode) do
local curNode = item.node
local nDepth = item.depth or 0
local sIndent = string.rep("", nDepth)
local sBranch = 0 < nDepth and "├─ " or ""
local bIsLeaf = nil == curNode.tbChildNodeList or #curNode.tbChildNodeList == 0
local sTagRaw = bIsLeaf and "[Leaf]" or "[Node]"
local sTag = wrap(bIsLeaf and COLOR_LEAF or COLOR_NODE, sTagRaw)
local bindObjCount = curNode:GetBindObjCount()
local sValid = escape(curNode:GetValid())
local sInfo = string.format("%s count=%s bind=%s valid=%s", escape(curNode.sNodeKey), tostring(curNode.nRedDotCount), tostring(bindObjCount), sValid)
if curNode.nRedDotCount and 0 < curNode.nRedDotCount then
sInfo = wrap(COLOR_ACTIVE, sInfo)
end
table.insert(tbLines, string.format("%s%s%s %s", sIndent, sBranch, sTag, sInfo))
end
table.insert(tbLines, "[RedDot] ===== End =====")
printError(table.concat(tbLines, "\n"))
end
return RedDotManager