ro-webgl/Assets/Lua/Util/CommonUtil.lua
2026-02-12 16:57:23 +08:00

3167 lines
105 KiB
Lua
Raw 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.

module("CommonUtil", package.seeall);
function GetMetatableLua(obj)
return getmetatable(obj)
end
function StringConcat(...)
local list = {...}
local result = ""
for i = 1, #list do
result = result .. tostring(list[i])
end
return result
end
function BindGridViewItem2LuaStatic(name, go)
if go == nil or tolua.isnull(go) then
return nil
end
local lua = require("GridViewItem/"..name.."_Generate"):new()
if lua ~= nil then
lua.gameObject = go
lua:InitGenerate(go.transform)
else
lua = go
end
return lua
end
function BindGridViewItem2Lua(wndOwner, name, go)
if wndOwner.gridItemList == nil then
wndOwner.gridItemList = {}
end
if wndOwner.gridItemList[name] == nil then
wndOwner.gridItemList[name] = {}
end
if go == nil or tolua.isnull(go) then
return nil
end
local lua = wndOwner.gridItemList[name][go]
if not lua then
lua = require("GridViewItem/"..name.."_Generate"):new()
wndOwner.gridItemList[name][go] = lua
lua.gameObject = go
lua:InitGenerate(go.transform)
end
return lua
end
function GetBindGridViewItem2Lua(wndOwner, name, go)
if wndOwner.gridItemList == nil then
return nil
end
if wndOwner.gridItemList[name] == nil then
return nil
end
return wndOwner.gridItemList[name][go]
end
function ClearBindGridViewItem2Lua(wndOwner, name, go)
if wndOwner.gridItemList == nil then
return
end
if wndOwner.gridItemList[name] == nil then
return
end
local itemLua = wndOwner.gridItemList[name][go]
if not itemLua then return end
if itemLua.uIEffectCfg then
itemLua.uIEffectCfg:Clean()
end
itemLua:GenerateDestroy()
itemLua.uiParticle = nil
itemLua.gameObject = nil
itemLua.transform = nil
wndOwner.gridItemList[name][go] = nil
end
function ClearGridViewItem(wndOwner, name)
if wndOwner.gridItemList == nil then
return
end
if wndOwner.gridItemList[name] == nil then
return
end
for k,v in pairs(wndOwner.gridItemList[name]) do
if v.uIEffectCfg then
v.uIEffectCfg:Clean()
end
v:GenerateDestroy()
v.uiParticle = nil
v.gameObject = nil
v.transform = nil
end
wndOwner.gridItemList[name] = nil
end
function SetCanvasGroupStatus(go, status)
--local canvasGroup = go:GetOrAddComponent(Enum.TypeInfo.CanvasGroup)
--canvasGroup.alpha = status and 1 or 0
--canvasGroup.interactable = status and true or false
--canvasGroup.blocksRaycasts = status and true or false
go:SetActive(status)
end
function LoopGridViewEleCreate(wndOwner, loopScrollRect, gridLayoutGroup, list, interTime, updateCB, needWhole, svRectTransform)
LoopGridViewEleCreateNew(wndOwner, loopScrollRect, gridLayoutGroup, list, interTime, nil,updateCB, needWhole, svRectTransform)
end
function LoopGridViewEleCreateNew(wndOwner, loopScrollRect, gridLayoutGroup, list, interTime, luaTbl,updateCB, needWhole, svRectTransform,movePos)
if loopScrollRect == nil then return end
if needWhole then
loopScrollRect.totalCount = math.ceil(#list / loopScrollRect.contentConstraintCount)
local elm = loopScrollRect.Cell:GetComponent(Enum.TypeInfo.LayoutElement)
local height = loopScrollRect.totalCount * elm.preferredHeight
local oriSize = svRectTransform.sizeDelta
oriSize.y = height
svRectTransform.sizeDelta = oriSize
end
local function getRefreshCount()
local count = loopScrollRect.totalCount * loopScrollRect.contentConstraintCount
return count >= #list and #list or count
end
local gridViewItem = loopScrollRect.Cell:GetComponent(Enum.TypeInfo.UIGridViewMark)
local name = gridViewItem and gridViewItem.GridItemName or loopScrollRect.Cell.name
local needInter = interTime > 0
local refreshCount = getRefreshCount()
--处理gird生成
local OnUpdate = function (owner, go, idx)
go.name = idx
local itemLua = CommonUtil.BindGridViewItem2Lua(wndOwner, name, go)
itemLua.prefabName = name
if needInter then
CommonUtil.SetCanvasGroupStatus(itemLua.gameObject, false)
ManagerContainer.LuaTimerMgr:AddTimer(interTime * idx, 1, false, function(sequence, param)
CommonUtil.SetCanvasGroupStatus(itemLua.gameObject, true)
end, nil)
if idx == refreshCount - 1 then
needInter = false
end
end
if luaTbl~= nil then
updateCB(luaTbl,itemLua, idx,list[idx+1])
else
updateCB(itemLua, idx,list[idx+1])
end
end
loopScrollRect:SetUpdateCellCallback(wndOwner, OnUpdate);
if loopScrollRect.content.childCount > 0 then
--loopScrollRect:ClearCells();
end
loopScrollRect.totalCount = #list;
if movePos == nil then
loopScrollRect:MoveTo(0);
loopScrollRect:RefreshCells()
else
-- loopScrollRect:MoveTo(movePos)
loopScrollRect:SetItemStartIdx(movePos)
end
end
function LoopGridViewEleCreateWithList(wndOwner, loopScrollRect, gridLayoutGroup, list, interTime, luaTbl,updateCB, needWhole, svRectTransform,movePos)
if loopScrollRect == nil then return end
if needWhole then
loopScrollRect.totalCount = math.ceil(list.Count / loopScrollRect.contentConstraintCount)
local elm = loopScrollRect.Cell:GetComponent(Enum.TypeInfo.LayoutElement)
local height = loopScrollRect.totalCount * elm.preferredHeight
local oriSize = svRectTransform.sizeDelta
oriSize.y = height
svRectTransform.sizeDelta = oriSize
end
local function getRefreshCount()
local count = loopScrollRect.totalCount * loopScrollRect.contentConstraintCount
return count >= list.Count and list.Count or count
end
local gridViewItem = loopScrollRect.Cell:GetComponent(Enum.TypeInfo.UIGridViewMark)
local name = gridViewItem and gridViewItem.GridItemName or loopScrollRect.Cell.name
local needInter = interTime > 0
local refreshCount = getRefreshCount()
--处理gird生成
local OnUpdate = function (owner, go, idx)
go.name = idx
local itemLua = CommonUtil.BindGridViewItem2Lua(wndOwner, name, go)
itemLua.prefabName = name
if needInter then
CommonUtil.SetCanvasGroupStatus(itemLua.gameObject, false)
ManagerContainer.LuaTimerMgr:AddTimer(interTime * idx, 1, false, function(sequence, param)
CommonUtil.SetCanvasGroupStatus(itemLua.gameObject, true)
end, nil)
if idx == refreshCount - 1 then
needInter = false
end
end
if luaTbl~= nil then
updateCB(luaTbl,itemLua, idx)
else
updateCB(itemLua, idx)
end
end
loopScrollRect:SetUpdateCellCallback(wndOwner, OnUpdate);
if loopScrollRect.content.childCount > 0 then
--loopScrollRect:ClearCells();
end
loopScrollRect.totalCount = list.Count;
if movePos == nil then
loopScrollRect:MoveTo(0);
loopScrollRect:RefreshCells()
else
-- loopScrollRect:MoveTo(movePos)
loopScrollRect:SetItemStartIdx(movePos)
end
end
function LoopGridViewEleCreateNoItem(wndOwner, loopScrollRect, list, interTime, luaTbl, updateCB,movePos)
if loopScrollRect == nil then return end
local function getRefreshCount()
local count = loopScrollRect.totalCount * loopScrollRect.contentConstraintCount
return count >= #list and #list or count
end
local needInter = interTime > 0
local refreshCount = getRefreshCount()
--处理gird生成
local OnUpdate = function (owner, go, idx)
go.name = idx
if needInter then
CommonUtil.SetCanvasGroupStatus(go, false)
ManagerContainer.LuaTimerMgr:AddTimer(interTime * idx, 1, false, function(sequence, param)
CommonUtil.SetCanvasGroupStatus(go, true)
end, nil)
if idx == refreshCount - 1 then
needInter = false
end
end
if luaTbl~= nil then
updateCB(luaTbl, go, idx,list[idx+1])
else
updateCB(go, idx,list[idx+1])
end
end
loopScrollRect:SetUpdateCellCallback(wndOwner, OnUpdate);
if loopScrollRect.content.childCount > 0 then
--loopScrollRect:ClearCells();
end
loopScrollRect.totalCount = #list;
if movePos == nil then
loopScrollRect:MoveTo(0);
loopScrollRect:RefreshCells()
else
-- loopScrollRect:MoveTo(movePos)
loopScrollRect:SetItemStartIdx(movePos)
end
end
function ArrayFilterEquipWeapon(datas, jobType)
local newDatas = {}
for i = 1, #datas do
local equipData = ManagerContainer.CfgMgr:GetEquipById(datas[i].cfgId)
if CommonUtil.EleInTable(jobType, equipData.JobType) then
newDatas[#newDatas + 1] = datas[i]
end
end
return newDatas
end
function ArrayFilterSelections(array, filterType, keys, values)
local function FilterCheck(element)
if filterType == Enum.FilterType.AND then
local result = {}
for i = 1,#keys do
result[i] = false
if element[keys[i]] == nil then
result[i] = true
else
if type(values[i]) == "table" then
if not next(values[i]) then
result[i] = true
end
else
if values[i] == nil then
result[i] = true
end
end
if not result[i] then
if type(element[keys[i]]) == "table" then
if type(values[i]) == "table" then
local result1 = false
for _,v in pairs(values[i]) do
if CommonUtil.EleInTable(v, element[keys[i]]) then
result1 = true
end
end
result[i] = result1
else
if CommonUtil.EleInTable(values[i], element[keys[i]]) then
result[i] = true
end
end
else
if type(values[i]) == "table" then
local result1 = false
for _,v in pairs(values[i]) do
if element[keys[i]] == v then
result1 = true
end
end
result[i] = result1
else
if element[keys[i]] == values[i] then
result[i] = true
end
end
end
end
end
end
local endResult = true
for _,v in pairs(result) do
if not v then
endResult = false
break
end
end
return endResult
else
local result = false
for i = 1,#keys do
if element[keys[i]] == nil then
result = true
break
end
if type(values[i]) == "table" then
if not next(values[i]) then
result = true
break
end
else
if values[i] == nil then
result = true
break
end
end
if type(element[keys[i]]) == "table" then
if type(values[i]) == "table" then
local result1 = false
for _,v in pairs(values[i]) do
if CommonUtil.EleInTable(v, element[keys[i]]) then
result1 = true
break
end
end
if result1 then
result = true
break
end
else
if CommonUtil.EleInTable(values[i], element[keys[i]]) then
result = true
break
end
end
else
if type(values[i]) == "table" then
local result1 = false
for _,v in pairs(values[i]) do
if element[keys[i]] == v then
result1 = true
break
end
end
if result1 then
result = true
break
end
else
if element[keys[i]] == values[i] then
result = true
break
end
end
end
end
return result
end
end
local list = {}
if array == nil then
return list
end
for _,v in pairs(array) do
if FilterCheck(v) then
list[#list + 1] = v
end
end
return list
end
function ArraySortSelections(array, upOrDown, ...)
if array == nil then
return nil
end
local sorts = {...}
local function boolean2Number(value)
if type(value) == "boolean" then
return value and 1 or 0
end
return value
end
local function UpSort(a, b)
if #sorts == 1 then
return a[sorts[1]] < b[sorts[1]]
else
local index = 1
while index <= #sorts do
if index > 1 then
if a[sorts[index - 1]] == b[sorts[index - 1]] then
if a[sorts[index]] ~= b[sorts[index]] then
return boolean2Number(a[sorts[index]]) < boolean2Number(b[sorts[index]])
end
else
return boolean2Number(a[sorts[index - 1]]) < boolean2Number(b[sorts[index - 1]])
end
end
index = index + 1
end
end
end
local function DownSort(a, b)
if #sorts == 1 then
return a[sorts[1]] > b[sorts[1]]
else
local index = 1
while index <= #sorts do
if index > 1 then
if a[sorts[index - 1]] == b[sorts[index - 1]] then
if a[sorts[index]] ~= b[sorts[index]] then
return boolean2Number(a[sorts[index]]) > boolean2Number(b[sorts[index]])
end
else
return boolean2Number(a[sorts[index - 1]]) > boolean2Number(b[sorts[index - 1]])
end
end
index = index + 1
end
end
end
table.sort( array, upOrDown and UpSort or DownSort)
end
function ArraySortListSelections(array, keys, vals)
if array == nil then
return nil
end
if keys == nil or type(keys) ~= "table" then
return nil
end
if vals == nil or type(vals) ~= "table" then
return nil
end
local function boolean2Number(value)
if type(value) == "boolean" then
return value and 1 or 0
end
return value
end
local function Sort(a, b)
if #vals == 1 then
local sortType = keys[1] or Enum.TableSortRule.Down
return sortType == Enum.TableSortRule.Down and boolean2Number(a[vals[1]]) > boolean2Number(b[vals[1]]) or boolean2Number(a[vals[1]]) < boolean2Number(b[vals[1]])
else
local index = 1
while index <= #vals do
if index > 1 then
if a[vals[index - 1]] == b[vals[index - 1]] then
if a[vals[index]] ~= b[vals[index]] then
local sortType = keys[index] or Enum.TableSortRule.Down
local result = (sortType == Enum.TableSortRule.Down and {boolean2Number(a[vals[index]]) > boolean2Number(b[vals[index]])} or {boolean2Number(a[vals[index]]) < boolean2Number(b[vals[index]])})[1]
return result
end
else
local sortType = keys[index - 1] or Enum.TableSortRule.Down
local result = (sortType == Enum.TableSortRule.Down and {boolean2Number(a[vals[index - 1]]) > boolean2Number(b[vals[index - 1]])} or {boolean2Number(a[vals[index - 1]]) < boolean2Number(b[vals[index - 1]])})[1]
return result
end
end
index = index + 1
end
end
end
table.sort( array, Sort)
end
--传入 wndlua, 页签按钮 parent , 页签点击事件
function CreateToggleMouduleOnlyBtns(wndRoot, toggleData, togglesRoot, defaultIndex, onToggleClick, cbOwner, needGetHide, dontTrigger)
if toggleData == nil then
toggleData = {}
end
--toggleData.toggleDefaultIndex = defaultIndex
local function ToggleClick(index)
--toggleData.toggleDefaultIndex = index
onToggleClick(cbOwner or wndRoot, index)
end
local function ToggleClick1(index)
toggleData.toggleDefaultIndex = index
for j = 1,#toggleData.toggleList do
toggleData.toggleList[j].isOn = j == index
local on = toggleData.toggleList[j].transform:Find("On")
if on ~= nil then
on.gameObject:SetActive(j == index)
end
local off = toggleData.toggleList[j].transform:Find("Off")
if off ~= nil then
off.gameObject:SetActive(j ~= index)
end
end
end
local toggleGroup = togglesRoot:GetComponent('ToggleGroup')
if toggleData.toggleList == nil then
if toggleGroup ~= nil then
--存在 togglegroup 组件
toggleData.toggleList = {}
local trans = togglesRoot.transform
local toggles = togglesRoot:GetComponentsInChildren(Enum.TypeInfo.Toggle, needGetHide or false)
for i = 1, toggles.Length do
local toggle = toggles[i - 1]
if toggle ~= nil then
toggleData.toggleList[#toggleData.toggleList + 1] = toggle
wndRoot.uiBase:AddToggleUniqueEventListener(toggle, nil, function (owner, toggle, params,result)
if not result then return end
if toggleData.toggleDefaultIndex == i then return end
ToggleClick1(i)
ToggleClick(i)
end)
end
end
end
end
--if #toggleData.toggleList > 0 then
-- toggleData.toggleList[toggleData.toggleDefaultIndex].isOn = true
--
-- local on = toggleData.toggleList[toggleData.toggleDefaultIndex].transform:Find("On")
-- if on ~= nil then
-- on.gameObject:SetActive(true)
-- end
--end
if not dontTrigger then
ToggleClick1(defaultIndex)
ToggleClick(defaultIndex)
end
end
function SetGOLayer(go, layerName)
if tolua.isnull(go) then return end
local layer = LayerMask.NameToLayer(layerName)
local list = go:GetComponentsInChildren(Enum.TypeInfo.Transform)
for i = 1, list.Length do
list[i - 1].gameObject.layer = layer
end
end
function CreateModels(wnd, num, ids, callback, param)
local initIds = System.Array.CreateInstance(Enum.TypeInfo.Int32, num)
for i = 1, #ids do
initIds[i - 1] = ids[i]
end
ManagerContainer.LuaModelMgr:CreateModel(initIds, wnd, callback, param)
end
function DestroyGO(go)
if tolua.isnull(go) then return end
UnityEngine.GameObject.Destroy(go)
end
function DestroyGOImmediate(go)
if tolua.isnull(go) then return end
UnityEngine.GameObject.DestroyImmediate(go);
end
function Table2List(table, list)
if list == nil then
return nil
end
list:Clear()
for _,v in pairs(table) do
list:Add(v)
end
return list
end
function List2Table(list)
local table = {}
list:ForEach(function(v) table[#table + 1] = v end)
return table
end
function LoadIcon(wnd, name, cb, itemLua, key)
local seqId
if itemLua and key then
if itemLua.AsyncSeqIds == nil then
itemLua.AsyncSeqIds = {}
end
seqId = itemLua.AsyncSeqIds[key]
if seqId then
ManagerContainer.ResMgr:UnloadAssetBySeqId(seqId)
end
end
if name == "" or name == nil then
return -1
end
seqId = ManagerContainer.ResMgr:LuaLoadAssets(Enum.ResourceType.SingleSprite, Constants.IconDir, {name}, nil, cb)
if not ManagerContainer.ResMgr:SeqIdEquals(seqId, 0) then
if itemLua and key then
itemLua.AsyncSeqIds[key] = seqId
end
if wnd then
if wnd.AsyncSeqIds == nil then
wnd.AsyncSeqIds = {}
end
wnd.AsyncSeqIds[#wnd.AsyncSeqIds + 1] = seqId
end
end
return seqId
end
function CloseUIClearAsyncSeqIds(wnd)
if wnd.AsyncSeqIds then
for _,v in pairs(wnd.AsyncSeqIds) do
ManagerContainer.ResMgr:UnloadAssetBySeqId(v)
end
wnd.AsyncSeqIds = nil
end
end
function LoadTexture(wnd, name, cb)
if name == "" or name == nil then
return -1
end
local seqId = ManagerContainer.ResMgr:LuaLoadAssets(Enum.ResourceType.Texture2D, Constants.IconDir, {name}, nil, cb)
if not ManagerContainer.ResMgr:SeqIdEquals(seqId, 0) then
if wnd then
if wnd.AsyncSeqIds == nil then
wnd.AsyncSeqIds = {}
end
wnd.AsyncSeqIds[#wnd.AsyncSeqIds + 1] = seqId
end
end
return seqId
end
function GetIconsTotalPath(name)
return CommonUtil.StringConcat(Constants.IconDir, "/",name)
end
function TableClone(org)
local function copy(org, res)
for k,v in pairs(org) do
if type(v) ~= "table" then
res[k] = v;
else
res[k] = {};
copy(v, res[k])
end
end
end
if not org then return end
local res = {}
copy(org, res)
return res
end
function FormatNumber(number,isReturnW)
if number == nil or (type(number) ~= "number" and type(number) ~= "userdata") then
LogError("参数数值类型错误 ")
else
if type(number) == "userdata" and number.name() == "int64" then
number = #number
end
number = math.floor(number)
local num_length, num_str = string.len(number), tostring(number)
local total_length = 4
local function handler_dot(curNum, curUnit)
local tmp_decimal_str = ""
local integer_num, dot_num = math.modf(curNum/curUnit)
local offset = total_length - string.len(integer_num)
local decimal_num = curNum/curUnit
if decimal_num ~= 0 and string.find(tostring(decimal_num), "%.") then
tmp_decimal_str = tmp_decimal_str .. string.sub(tostring(decimal_num), string.find(tostring(decimal_num), "%."), string.find(tostring(decimal_num), "%.") + offset)
local first_str = string.sub(tostring(tmp_decimal_str), 2, 2)
local second_str= string.sub(tostring(tmp_decimal_str), 3, 3)
if second_str ~= "0" and second_str ~= "" then
--tmp_decimal_str = tmp_decimal_str .. string.sub(tostring(decimal_num), 2, string.find(tostring(decimal_num), ".") + 3)
else
if first_str ~= "" and first_str ~= "0" then
tmp_decimal_str = "." .. first_str
else
tmp_decimal_str = integer_num == 0 and "0" or ".0"
end
end
end
return tostring(integer_num) .. tmp_decimal_str
end
if num_length < 5 then
return num_str
elseif num_length >= 5 and num_length < 9 or isReturnW then--万
return handler_dot(number, 10^4) .. "w"
elseif num_length >= 9 and not isReturnW then--亿
return handler_dot(number, 10^8) .. "e"
end
end
end
function FormatPercentNumber(number)
if number == nil or type(number) ~= "number" then
LogError("参数数值类型错误")
else
local integer_num, dot_num = math.modf(number*100)
local decimal_num = number*100
local tmp_decimal_str = ""
if decimal_num ~= 0 and string.find(tostring(decimal_num), "%.") then
tmp_decimal_str = tmp_decimal_str .. string.sub(tostring(decimal_num), string.find(tostring(decimal_num), "%."), string.find(tostring(decimal_num), "%.") + 2)
local first_str = string.sub(tostring(tmp_decimal_str), 2, 2)
local second_str= string.sub(tostring(tmp_decimal_str), 3, 3)
if second_str ~= "0" and second_str ~= "" then
--tmp_decimal_str = tmp_decimal_str .. string.sub(tostring(decimal_num), 2, string.find(tostring(decimal_num), ".") + 3)
else
if first_str ~= "" and first_str ~= "0" then
tmp_decimal_str = "." .. first_str
else
tmp_decimal_str = ""
end
end
end
return tostring(integer_num) .. tmp_decimal_str
end
end
function IsConditionOutColor(text, out, value)
if out then
text.text = string.format(Constant.RedColorText, value)
--text.color = Color.New(Constant.RedColor[1], Constant.RedColor[2], Constant.RedColor[3], 1)
else
text.text = value
end
end
function SetTextColor(text, colorText)
if colorText == nil then return end
text.text = string.format(colorText, text.text)
end
function SetGraphicColor(graphic, colors)
graphic.color = Color.New(colors[1], colors[2], colors[3], colors[4] ~= nil and colors[4] or 1)
end
function NeedUIGray(uiObj, status)
if uiObj.material == nil then return end
if status then
uiObj.material = ManagerContainer.ResMgr:GetGrayMat()
else
uiObj.material = nil
end
end
function SetTotalChildrenGray(uiObj, status)
local children = uiObj:GetComponentsInChildren(Enum.TypeInfo.Graphic, true)
for i = 0, children.Length - 1 do
if not children[i].gameObject:GetComponent(Enum.TypeInfo.UIParticle) then
if status then
children[i].material = ManagerContainer.ResMgr:GetGrayMat()
else
children[i].material = nil
end
end
end
end
function SetUITableNilInPackage(id)
--LogError("nil ".. name)
local uiData = ManagerContainer.CfgMgr:GetUIData(id)
if uiData == nil then
return
end
local luaPath = nil
if uiData.lua_path and uiData.lua_path ~= '' then
luaPath = string.gsub(uiData.lua_path, "/", ".")
end
local path = string.gsub(uiData.res_path, "/", ".")
local viewGePath = CommonUtil.StringConcat(path, "View_Generate")
local viewPath = nil
if luaPath then
viewPath = CommonUtil.StringConcat(luaPath, "View")
--local ctrPath = CommonUtil.StringConcat(name, '.', name, "Ctr")
else
viewPath = CommonUtil.StringConcat(path, "View")
end
CommonUtil.Unrequire(viewPath)
CommonUtil.Unrequire(viewGePath)
--CommonUtil.Unrequire(ctrPath)
end
function SetUIGridItemTableNilInPackage(name)
local itemPath = CommonUtil.StringConcat("GridViewItem.", name, "_Generate")
CommonUtil.Unrequire(itemPath)
end
function Unrequire(name)
--LogError(name)
--LogError(package.loaded[name])
package.loaded[name] = nil
_G[name] = nil
--LogError(package.loaded[name])
end
---谨慎使用 该接口会把对象放入 lua对象池
function BatchCreateItems(wndOwner, itemlua, parent, data, ...)
if wndOwner.batchItemList == nil then
wndOwner.batchItemList = {}
end
local prefabName = itemlua.prefabName
if wndOwner.batchItemList[prefabName] == nil then
wndOwner.batchItemList[prefabName] = {}
end
local batchItemList = wndOwner.batchItemList[prefabName]
-- GameObject 的缓存池
local stack = batchItemList.stack
if stack == nil then
stack = {}
batchItemList.stack = stack
end
local go = itemlua.gameObject
go.transform:SetParent(parent)
go.transform.localPosition = Vector3.zero
go.transform.localRotation = Quaternion.identity
go.transform.localScale = Vector3.one
go:SetActive(true)
local luaCtr = require("Common/".. itemlua.prefabName .. "Ctr")
if luaCtr then
luaCtr:SetData(wndOwner, itemlua, data, ...)
end
stack[go] = itemlua
end
function BatchCreateItems1(wndOwner, itemlua, parent)
if wndOwner.batchItemList == nil then
wndOwner.batchItemList = {}
end
local prefabName = itemlua.prefabName
if wndOwner.batchItemList[prefabName] == nil then
wndOwner.batchItemList[prefabName] = {}
end
local batchItemList = wndOwner.batchItemList[prefabName]
-- GameObject 的缓存池
local stack = batchItemList.stack
if stack == nil then
stack = {}
batchItemList.stack = stack
end
local go = itemlua.gameObject
go.transform:SetParent(parent)
go.transform.localPosition = Vector3.zero
go.transform.localRotation = Quaternion.identity
go.transform.localScale = Vector3.one
go:SetActive(true)
stack[go] = itemlua
end
function AddBatchItemsByItemlua(wndOwner, itemlua)
if wndOwner.batchItemList == nil then
wndOwner.batchItemList = {}
end
local prefabName = itemlua.prefabName
if wndOwner.batchItemList[prefabName] == nil then
wndOwner.batchItemList[prefabName] = {}
end
local batchItemList = wndOwner.batchItemList[prefabName]
-- GameObject 的缓存池
local stack = batchItemList.stack
if stack == nil then
stack = {}
batchItemList.stack = stack
end
stack[itemlua.gameObject] = itemlua
end
function RecycleFromBatchItemsByPrefabName(wndOwner, prefabName)
if wndOwner.batchItemList ~= nil and wndOwner.batchItemList[prefabName] ~= nil then
local batchItemList = wndOwner.batchItemList[prefabName]
local stack = batchItemList.stack
if stack ~= nil then
for k, v in pairs(stack) do
DG.Tweening.DOTween.Kill(k.transform)
ManagerContainer.GoPoolMgr:RecycleGo(v)
stack[k] = nil
end
end
end
end
function GetBatchItemByGo(wndOwner, prefabName, go)
if wndOwner.batchItemList ~= nil and wndOwner.batchItemList[prefabName] ~= nil then
local batchItemList = wndOwner.batchItemList[prefabName]
local stack = batchItemList.stack
if stack ~= nil then
return stack[go]
end
end
return nil
end
function RecycleFromBatchItems(wndOwner, itemlua)
local prefabName = itemlua.oriName ~= "" and itemlua.oriName or itemlua.prefabName
if wndOwner.batchItemList ~= nil and wndOwner.batchItemList[prefabName] ~= nil then
local batchItemList = wndOwner.batchItemList[prefabName]
local stack = batchItemList.stack
if stack ~= nil then
if stack[itemlua.gameObject] then
stack[itemlua.gameObject] = nil
end
end
end
DG.Tweening.DOTween.Kill(itemlua.transform)
ManagerContainer.GoPoolMgr:RecycleGo(itemlua)
end
function HideAllChildren(parent)
if parent.childCount == 0 then return end
for i = 0, parent.childCount - 1 do
local child = parent:GetChild(i)
child.gameObject:SetActive(false)
end
end
---谨慎使用 该接口会把对象放入 lua对象池
function BatchCreateItemsLoopWithMould(wnd, mould, parent, data, idx, ...)
if parent.childCount < idx then
local params = {...}
ManagerContainer.GoPoolMgr:SpawnGoNewLua(mould, function (itemlua)
CommonUtil.BatchCreateItems(wnd, itemlua, parent, data, unpack(params))
end)
else
local child = parent:GetChild(idx - 1)
child.gameObject:SetActive(true)
if wnd.batchItemList == nil then
wnd.batchItemList = {}
end
if wnd.batchItemList[mould.prefabName] == nil then
wnd.batchItemList[mould.prefabName] = {}
end
local batchItemList = wnd.batchItemList[mould.prefabName]
-- GameObject 的缓存池
local stack = batchItemList.stack
if stack == nil then
stack = {}
batchItemList.stack = stack
end
local go = child.gameObject
local itemlua1 = stack[go]
local luaCtr = require("Common/".. itemlua1.prefabName .. "Ctr")
if luaCtr then
luaCtr:SetData(wnd, itemlua1, data, ...)
end
end
end
function BatchCreateItemsLoopSpawnItem(wnd, type, parent, data, idx, ...)
if parent.childCount < idx then
local params = {...}
ManagerContainer.GoPoolMgr:SpawnItemGo(type, function (itemlua)
CommonUtil.BatchCreateItems(wnd, itemlua, parent, data, unpack(params))
end)
else
local prefabName = GetResTypePrefabName(type)
local child = parent:GetChild(idx - 1)
child.gameObject:SetActive(true)
if wnd.batchItemList == nil then
wnd.batchItemList = {}
end
if wnd.batchItemList[prefabName] == nil then
wnd.batchItemList[prefabName] = {}
end
local batchItemList = wnd.batchItemList[prefabName]
-- GameObject 的缓存池
local stack = batchItemList.stack
if stack == nil then
stack = {}
batchItemList.stack = stack
end
local go = child.gameObject
local itemlua1 = stack[go]
local luaCtr = require("Common/".. itemlua1.prefabName .. "Ctr")
if luaCtr then
luaCtr:SetData(wnd, itemlua1, data, ...)
end
end
end
function BatchCreateItemsLoopSpawnPrefabNew(wnd, list, prefabName, parent,...)
local idx = 0
for _,v in pairs(list) do
idx = idx + 1
CommonUtil.BatchCreateItemsLoopSpawnPrefab(wnd, prefabName, parent, v, idx, ...)
end
if parent.childCount > idx then
for i = idx + 1, parent.childCount do
local child = parent:GetChild(i - 1)
child.gameObject:SetActive(false)
end
end
end
function BatchCreateItemsLoopSpawnPrefabNew1(wnd, list, prefabName, luaName, parent,...)
local idx = 0
for _,v in pairs(list) do
idx = idx + 1
if parent.childCount < idx then
local params = {...}
ManagerContainer.GoPoolMgr:SpawnPrefabGo(prefabName, function (itemlua)
CommonUtil.BatchCreateItems(wnd, itemlua, parent, v, unpack(params))
end)
else
luaName = luaName or prefabName
local child = parent:GetChild(idx - 1)
child.gameObject:SetActive(true)
if wnd.batchItemList == nil then
wnd.batchItemList = {}
end
if wnd.batchItemList[luaName] == nil then
wnd.batchItemList[luaName] = {}
end
local batchItemList = wnd.batchItemList[luaName]
-- GameObject 的缓存池
local stack = batchItemList.stack
if stack == nil then
stack = {}
batchItemList.stack = stack
end
local go = child.gameObject
local itemlua1 = stack[go]
local luaCtr = require("Common/".. luaName .. "Ctr")
if luaCtr then
luaCtr:SetData(wnd, itemlua1, v, ...)
end
end
end
if parent.childCount > idx then
for i = idx + 1, parent.childCount do
local child = parent:GetChild(i - 1)
child.gameObject:SetActive(false)
end
end
end
function BatchCreateItemsLoopSpawnPrefab(wnd, prefabName, parent, data, idx, ...)
if parent.childCount < idx then
local params = {...}
ManagerContainer.GoPoolMgr:SpawnPrefabGo(prefabName, function (itemlua)
CommonUtil.BatchCreateItems(wnd, itemlua, parent, data, unpack(params))
end)
else
local prefabName = prefabName
local child = parent:GetChild(idx - 1)
child.gameObject:SetActive(true)
if wnd.batchItemList == nil then
wnd.batchItemList = {}
end
if wnd.batchItemList[prefabName] == nil then
wnd.batchItemList[prefabName] = {}
end
local batchItemList = wnd.batchItemList[prefabName]
-- GameObject 的缓存池
local stack = batchItemList.stack
if stack == nil then
stack = {}
batchItemList.stack = stack
end
local go = child.gameObject
local itemlua1 = stack[go]
local luaCtr = require("Common/".. itemlua1.prefabName .. "Ctr")
if luaCtr then
luaCtr:SetData(wnd, itemlua1, data, ...)
end
end
end
function BatchDisposeItems(owner)
if owner.batchItemList ~= nil then
for k,v in pairs(owner.batchItemList) do
for k1,v1 in pairs(v.stack) do
ManagerContainer.GoPoolMgr:RecycleGo(v1)
v1 = nil
end
v = nil
end
end
owner.batchItemList = nil
end
function DisposeBatchGridChildsItem(owner, parent, name)
if owner.batchItemList ~= nil and parent ~= nil then
local list = owner.batchItemList[name]
if list == nil then return end
local gos = {}
for i = 1, parent.childCount do
local child = parent:GetChild(i - 1)
gos[i] = child.gameObject
end
for _,v in pairs(gos) do
local itemlua = list.stack[v]
if itemlua ~= nil then
ManagerContainer.GoPoolMgr:RecycleGo(itemlua)
itemlua = nil
end
end
end
end
function UpdateItemPrefab(wnd, itemlua, logicData, enterType, onClickOwner, onClickCB, params)
local name = itemlua:getClassName()
name = string.sub(name, 1, #name - 4)
local luaCtr = require("Common/" .. name .. "Ctr")
return luaCtr:SetData(wnd, itemlua, logicData, enterType, onClickOwner, onClickCB, params)
end
function EleInTable(ele, table)
if table == nil then return false end
for k,v in pairs(table) do
if v == ele then
return true, k
end
end
return false
end
--- 英雄属性数值转化到用于显示的字符串
function HeroAttrFormatValue(attrId, attrValue, need10000Percent)
local val = SDataUtil.InvConvert(attrValue)
if attrId > 21 then
val = CommonUtil.Floor3PointNum(attrId, val)
return (SDataUtil.IsGreater(val, 0) and '+' or (SDataUtil.IsLess(val, 0) and '-'or '')) .. Mathf.Abs((need10000Percent and val*10000 or val) / 100) .. "%"
else
val = Mathf.Floor(val)
return (SDataUtil.IsGreater(val, 0) and '+' or (SDataUtil.IsLess(val, 0) and '-'or '')) .. tostring(val)
end
end
function HeroAttrFormatValueNoSign(attrId, attrValue, need10000Percent)
local val = SDataUtil.InvConvert(attrValue)
if attrId > 21 then
val = CommonUtil.Floor3PointNum(attrId, val)
return Mathf.Abs((need10000Percent and val*10000 or val) / 100) .. "%"
else
val = Mathf.Floor(val)
return Mathf.Abs(val)
end
end
--- 英雄属性转化语言表Key
function HeroAttrFormatName(attrId, attrValue)
local name = "Attr_" .. attrId
if attrId == 54 or attrId == 55
or attrId == 59 or attrId == 60 then
name = name .. (SDataUtil.IsGreater(attrValue, 0) and '_0' or '_1')
end
return name
end
--- 英雄属性值转化为实际运算的值
function HeroAttrCalcValue(attrId, attrValue)
if attrId < Enum.HeroAttrType.STR_Percent then
return attrValue
else
-- return attrValue * 0.0001
return SDataUtil.Multiply(attrValue,0.0001)
end
end
--实例化对象
function Instantiate(_original, _parent, _localScaleRate)
local _go = UnityEngine.GameObject.Instantiate(_original);
if _parent then
local _scale = Vector3.one;
if _localScaleRate then
_scale = _scale * _localScaleRate;
end
_go.transform:SetParent(_parent);
_go.transform.localPosition = Vector3.zero;
_go.transform.localScale = _scale;
_go.transform.localRotation = Quaternion.identity;
end
return _go;
end
--Error弹窗
function PopErrorTips(Key)
if not ManagerContainer.LuaUIMgr:GetPage(Enum.UIPageName.UIErrorTips) then
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIErrorTips, {errorId=Key}, nil, nil, nil, Enum.UISibling[Enum.UIType.Top + 1] + 11)
else
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.ERROR_DESC_DISPLAY, {errorId=Key})
end
end
-- 获得装备的品质
function GetEquipItemQuality(itemCfgId)
local equipCfgData = ManagerContainer.CfgMgr:GetEquipById(itemCfgId)
local divide = Constant.Quality_Equip_Divide[equipCfgData.EquipLevel]
return divide[1], divide[2]
end
-- 获得道具的品质
function GetItemQuality(itemCfgId)
local itemCfgData = ManagerContainer.CfgMgr:GetItemById(itemCfgId)
if itemCfgData.ResType == Enum.ItemType.Equip then
return GetEquipItemQuality(itemCfgId)
else
return itemCfgData.Quality, 0
end
end
function GetDeltaAttrs(roleId, curAttrs, oneAttrList)
local dic = ManagerContainer.LuaActorDataMgr:GetIncreaseSecondAttrVal(
roleId,
oneAttrList[Enum.HeroAttrType.STR] + curAttrs[Enum.HeroAttrType.STR],
oneAttrList[Enum.HeroAttrType.AGI] + curAttrs[Enum.HeroAttrType.AGI],
oneAttrList[Enum.HeroAttrType.INT] + curAttrs[Enum.HeroAttrType.INT],
oneAttrList[Enum.HeroAttrType.VIT] + curAttrs[Enum.HeroAttrType.VIT],
oneAttrList[Enum.HeroAttrType.DEX] + curAttrs[Enum.HeroAttrType.DEX],
oneAttrList[Enum.HeroAttrType.LUK] + curAttrs[Enum.HeroAttrType.LUK]
)
local iter = dic:GetEnumerator()
local newAttrs = {}
while iter:MoveNext() do
newAttrs[iter.Current.Key] = math.floor(iter.Current.Value)
end
return newAttrs
end
--获取主角或伙伴当前的MVP卡牌祝福变化数据表
function GetCurCardLv(idx)
local lastLv = ManagerContainer.DataMgr.CardData:GetCardSuitLastLvById(idx)
local curlv = ManagerContainer.DataMgr.CardData:GetCardSuitLvById(idx)
local state = ManagerContainer.DataMgr.CardData:GetCardSuitStateById(idx)
if not state then
curlv = curlv - 1
end
if curlv > lastLv then
return {lastLv,curlv}
end
return nil
end
function AttrNoticeDisplay(slotIndex)
local oldAttr, newAttr
if slotIndex == 1 then
oldAttr = ManagerContainer.DataMgr.UserData:GetLastTotalAtttrs()
newAttr = ManagerContainer.DataMgr.UserData:GetHeroData().attrs
else
oldAttr = ManagerContainer.DataMgr.PartnerData:GetLastTotalAttrs(slotIndex)
local list = ManagerContainer.DataMgr.PartnerData:GetPartnerDataBySlotIndex(slotIndex)
newAttr = list == nil and nil or list.attrs
end
local specialAttr = nil
local temp = CommonUtil.GetCurCardLv(slotIndex)
if temp then
specialAttr = {{temp[1],temp[2]}}
end
if oldAttr == nil or newAttr == nil then return end
local increase = false
local deltaEquipAttr = {}
for _,v in pairs(Enum.HeroAttrType) do
if v >= Enum.HeroAttrType.Life then
deltaEquipAttr[v] = SDataUtil.Sub((newAttr[v] or 0),(oldAttr[v] or 0))
if SDataUtil.IsGreater(deltaEquipAttr[v], 0) then
increase = true
end
end
end
if increase then
ManagerContainer.LuaUIMgr:AttrNoticeDisplay1({oldAttr, newAttr,specialAttr})
end
end
function GetOwnResCountByItemId(id)
local count = 0
local itemCfgData = ManagerContainer.CfgMgr:GetItemById(id)
if itemCfgData == nil then
LogError(tostring(id) .. " isnt exist in ItemCfg")
return 0
end
if itemCfgData.ResType <= Enum.ItemType.ParterExp or
itemCfgData.ResType == Enum.ItemType.SkillExp or
itemCfgData.ResType == Enum.ItemType.AdvanceSkillExp or
itemCfgData.ResType == Enum.ItemType.Parter then
count = ManagerContainer.DataMgr.UserData:GetCurrency(id)
elseif itemCfgData.ResType == Enum.ItemType.PetExp or
itemCfgData.ResType == Enum.ItemType.HeroSpirit or
itemCfgData.ResType == Enum.ItemType.PetStone or
itemCfgData.ResType == Enum.ItemType.GuildStone or
itemCfgData.ResType == Enum.ItemType.HundredDojoStone or
itemCfgData.ResType == Enum.ItemType.GuildWarStone or
itemCfgData.ResType == Enum.ItemType.PetCrystal or
itemCfgData.ResType == Enum.ItemType.RecruitStone then
count = ManagerContainer.DataMgr.UserData:GetResById(id)
elseif itemCfgData.ResType == Enum.ItemType.Gift or
itemCfgData.ResType == Enum.ItemType.Income or
itemCfgData.ResType == Enum.ItemType.Item then
count = ManagerContainer.DataMgr.BagData:GetItemCountByCfgId(id)
elseif itemCfgData.ResType == Enum.ItemType.Equip then
count = ManagerContainer.DataMgr.EquipData:GetEquipCountById(id)
elseif itemCfgData.ResType == Enum.ItemType.ParterChip then
count = ManagerContainer.DataMgr.ChipData:GetChipCountById(id)
elseif itemCfgData.ResType == Enum.ItemType.Card then
count = ManagerContainer.DataMgr.CardData:GetCardCountById(id)
elseif itemCfgData.ResType == Enum.ItemType.Pet then
count = ManagerContainer.DataMgr.PetDataMgr:GetPetCountById(id)
elseif itemCfgData.ResType == Enum.ItemType.Cangpin then
count = ManagerContainer.DataMgr.KeepSakeBookData:GetMaterialById(id)
else
count = ManagerContainer.DataMgr.BagData:GetItemCountByCfgId(id)
end
return count
end
function DeserializeCfgItemList(data)
if data == nil then return nil end
local list = {}
for k,v in pairs(data) do
if type(v) == "table" then
list[#list + 1] = v
else
list = {data}
return list
end
end
return list
end
--- 职业ID转换角色ID
---@param jobId integer
---@param sex integer
---@return integer
function JobIdToRoleId(jobId, sex)
if not jobId or not sex then
return 100001
end
return jobId * 10 + sex
end
--- 角色ID转换职业ID
---@param roleId integer
---@return integer integer
function RoleIdToJobId(roleId)
if not roleId then
return 10000, 1
end
return Mathf.Round(roleId * 0.1), roleId % 10
end
--- 已弃用
function GetAsyncIdx(wnd, itemLua, name)
local asyncIdx = itemLua[name]
-- if asyncIdx then
-- ManagerContainer.ResMgr:ClearUIAsyncLoadReqsByIdx(wnd.uiData.id, asyncIdx)
-- else
-- asyncIdx = wnd.controller:GetAsyncIdx()
-- itemLua[name] = asyncIdx
-- end
return asyncIdx
end
function LocalUIPos2ScreenPos(worldPos)
return CameraMgr.Instance.UICamera:WorldToScreenPoint(worldPos);
end
function ConvertUIPos2ScreenPos(worldPos)
local tempPos = CameraMgr.Instance.UICamera:WorldToViewportPoint(worldPos);
local finalPos = Vector3.New((tempPos.x - 0.5) * ManagerContainer.LuaUIMgr.SCREEN_WIDTH, (tempPos.y - 0.5) * ManagerContainer.LuaUIMgr.SCREEN_HEIGHT, 0);
return finalPos;
end
function IsScreenUIMoveLimit(screenPos, size)
if screenPos.x > UnityEngine.Screen.width - size.x/2
or screenPos.x < size.x/2
or screenPos.y > UnityEngine.Screen.height - size.y/2
or screenPos.y < size.y/2
then
return false
end
return true
end
function ConvertScreenPos2UIPos(screenPos)
local tempPos = CameraMgr.Instance.UICamera:ScreenToViewportPoint(screenPos)
return Vector3.New((tempPos.x - 0.5) * ManagerContainer.LuaUIMgr.SCREEN_WIDTH, (tempPos.y - 0.5) * ManagerContainer.LuaUIMgr.SCREEN_HEIGHT, 0);
end
function SetRepeatButtonEvent(owner, addBtn, addCB, reduceBtn, reduceCB)
if addBtn.repeatButton == nil or reduceBtn.repeatButton == nil then
LogError("请检查 按钮上的 repeatbutton 组件是否存在或是是否导出到lua")
return
end
addBtn.repeatButton:AddRepeatClickEventListener(owner, addCB)
reduceBtn.repeatButton:AddRepeatClickEventListener(owner, reduceCB)
end
function TableToVector3(table, defaultValue)
if not table then
return defaultValue or Vector3.zero
end
local x = table[1] or 0
local y = table[2] or 0
local z = table[3] or 0
return Vector3.New(x, y, z)
end
function TableToVector2(table, defaultValue)
if not table then
return defaultValue or Vector2.zero
end
local x = table[1] or 0
local y = table[2] or 0
return Vector2.New(x, y)
end
function TableToQuaternion(table, defaultValue)
if not table then
return defaultValue or Quaternion.identity
end
local x = table[1] or 0
local y = table[2] or 0
local z = table[3] or 0
return Quaternion.Euler(x, y, z)
end
function TableToGridPos(table)
if not table then return 0,0 end
local x = table[1] or 0
local y = table[2] or 0
return x, y
end
function TableIsEmpty(table)
return (_G.next(table) == nil)
end
function GetTableCount(table)
local count = 0
for k,v in pairs(table) do
count = count + 1
end
return count
end
function GetItemTypeName(itemType)
if itemType == Enum.ItemType.Coin then
return I18N.T("Coin")
end
if itemType == Enum.ItemType.Diamond then
return I18N.T("Diamond")
end
if itemType == Enum.ItemType.RoleBaseExp then
return I18N.T("Exp")
end
if itemType == Enum.ItemType.RoleJobExp then
return I18N.T("JobExp")
end
if itemType == Enum.ItemType.ParterExp then
return I18N.T("ParterExp")
end
return ""
end
function GetVaildNickName(nickName)
if not nickName or nickName == '' or nickName == 'NickName' then
return I18N.T('NewGamePlayer')
end
return nickName
end
function GetShortVaildNickName(nickName)
nickName = CommonUtil.GetVaildNickName(nickName)
local totalLength = GetActualStringLength(nickName)
if totalLength > 4 then
nickName = Utf8StrSub(nickName, 1, 4).."..."
end
return nickName
end
--根据当前的段位积分获取当前所属段位的信息
function GetCurDunData(_danScore)
local levelDatas = ManagerContainer.CfgMgr:GetArenaLevelDatas()
local nextKey = -1
local levelCfg = nil
for key=10001, 20000 do
levelCfg = levelDatas[key]
if levelCfg~= nil then
if _danScore <= levelCfg.ArenaLevelScore then
nextKey = key+1
break;
end
end
end
return levelCfg, nextKey
end
function SetRewardItemData(pageTbl,itemId,itemLua,cnt,onClickCB)
if pageTbl == nil or itemLua == nil or itemId == nil then
return
end
local IconItemCtr = require("Common/IconItemCtr")
local data = {cfgId = itemId, num = cnt}
IconItemCtr:SetData(pageTbl, itemLua, data, Enum.ItemIEnterType.Bag, pageTbl, onClickCB)
end
function SetRewardItemDataNew(pageTbl,itemId,itemLua,cnt,fromType, onClickCB)
if pageTbl == nil or itemLua == nil or itemId == nil then
return
end
local IconItemCtr = require("Common/IconItemCtr")
local data = {cfgId = itemId, num = cnt, cornerType = fromType}
IconItemCtr:SetData(pageTbl, itemLua, data, Enum.ItemIEnterType.Bag, pageTbl, onClickCB)
end
function TaskDescParse(cond)
local desc = ""
if cond[1] == Enum.TaskType.Level_Battle_Count then
local levelId = cond[2]
local levelData = ManagerContainer.CfgMgr:GetLevelDataById(levelId)
desc = ManagerContainer.CfgMgr:GetLanguageValueByKey("Condition_"..cond[1], I18N.T(levelData.Name))
elseif cond[1] == Enum.TaskType.Hero_Id_Level then
desc = ManagerContainer.CfgMgr:GetLanguageValueByKey("Condition_"..cond[1], cond[#cond])
else
desc = ManagerContainer.CfgMgr:GetLanguageValueByKey("Condition_"..cond[1], cond[2], cond[3])
end
return desc
end
function GetResTypePrefabName(itemType)
local prefabName = ""
if itemType == Enum.ItemType.Equip then
prefabName = Enum.PrefabNames.EquipItem
elseif itemType == Enum.ItemType.Coin or
itemType == Enum.ItemType.Diamond or
itemType == Enum.ItemType.RoleBaseExp or
itemType == Enum.ItemType.RoleJobExp or
itemType == Enum.ItemType.ParterExp or
itemType == Enum.ItemType.FashionPaper or
itemType == Enum.ItemType.SkillExp or
itemType == Enum.ItemType.Gift or
itemType == Enum.ItemType.SkillBook or
itemType == Enum.ItemType.PetExp or
itemType == Enum.ItemType.PetStone or
itemType == Enum.ItemType.Income or
itemType == Enum.ItemType.SkillEquipSlotMat or
itemType == Enum.ItemType.SkillEquip or
itemType == Enum.ItemType.Item then
prefabName = Enum.PrefabNames.ItemItem
elseif itemType == Enum.ItemType.ParterChip then
prefabName = Enum.PrefabNames.ChipItem
elseif itemType == Enum.ItemType.Card then
prefabName = Enum.PrefabNames.CardIconItem
elseif itemType == Enum.ItemType.Parter then
prefabName = Enum.PrefabNames.ParterItem
elseif itemType == Enum.PrefabNames.IconSmallItem then
prefabName = Enum.PrefabNames.IconSmallItem
else
LogError("通用Item不支持该类型仔细看看 " .. itemType)
return nil
end
return prefabName
end
function GetMinRefineLevel(slots)
if slots == nil then return 0 end
local minLv = 100
for i = 1, #slots do
if slots[i].level < minLv then
minLv = slots[i].level
end
end
if minLv == 100 then
return 0
end
if minLv >= 5 then
return minLv
end
return 0
end
function GetSuitNum(slots, slotType)
if slots == nil then return 0 end
if slots[slotType].equip_id == 0 then return 0 end
local equipData = ManagerContainer.CfgMgr:GetEquipById(slots[slotType].equip_id)
local suitNum = 0
if equipData.Suit == 0 then
return suitNum
end
local suitId = ManagerContainer.CfgMgr:GetEquipSuitById(equipData.Suit)
for i = 1, #slots do
if slots[i].equip_id > 0 then
local equipData1 = ManagerContainer.CfgMgr:GetEquipById(slots[i].equip_id)
local suitId1 = ManagerContainer.CfgMgr:GetEquipSuitById(equipData1.Suit)
if suitId == suitId1 or equipData1.EquipLevel > equipData.EquipLevel then
suitNum = suitNum + 1
end
end
end
return suitNum
end
function GetAllHeroLogicDatas()
local heroList = {}
local userData = ManagerContainer.DataMgr.UserData:GetHeroData()
heroList[#heroList + 1] = userData
local partnerDatas = ManagerContainer.DataMgr.PartnerData:GetPartnerDatas()
for _,v in pairs(partnerDatas) do
heroList[#heroList + 1] = v
end
return heroList
end
function GetHeroLogicDataByUid(uid)
if uid == 1 then
return ManagerContainer.DataMgr.UserData:GetHeroData()
else
return ManagerContainer.DataMgr.PartnerData:GetPartnerDataByUniqueId(uid)
end
end
function GetHeroActorDataByUid(uid)
if uid == 1 then
local userRoleId = ManagerContainer.DataMgr.UserData:GetUserRoleId()
return ManagerContainer.LuaActorDataMgr:GetHeroActorData(userRoleId)
else
local partnerData = CommonUtil.GetHeroLogicDataByUid(uid)
return ManagerContainer.LuaActorDataMgr:GetFellowActorData(uid,partnerData.configId)
end
end
function GetHeroCfgDataByUid(uid)
if uid == 1 then
local roleId = ManagerContainer.DataMgr.UserData:GetUserRoleId()
return ManagerContainer.CfgMgr:GetRoleDataById(roleId)
else
local heroData = ManagerContainer.DataMgr.PartnerData:GetPartnerDataByUniqueId(uid)
return ManagerContainer.CfgMgr:GetPartnerDataById(heroData.configId)
end
end
function GetHeroJobCfgDataByUid(uid)
if uid == 1 then
local jobId = ManagerContainer.DataMgr.UserData:GetJobCfgId()
return ManagerContainer.CfgMgr:GetJobDataById(jobId)
else
local heroData = ManagerContainer.DataMgr.PartnerData:GetPartnerDataByUniqueId(uid)
return ManagerContainer.CfgMgr:GetPartnerDataById(heroData.configId)
end
end
function GetHeroLogicDataByPostId(PostId)
if PostId == 1 then
return ManagerContainer.DataMgr.UserData:GetHeroData()
else
local partnerDatas = ManagerContainer.DataMgr.PartnerData:GetPartnerDatas()
for _,v in pairs(partnerDatas) do
local cfgData = ManagerContainer.CfgMgr:GetPartnerDataById(v.configId)
if cfgData.PostId == PostId - 1 then
return v
end
end
return nil
end
end
function GetHeroJobAndNameByUid(uid, configId)
local name = ""
if uid == 1 then
local cfgData = ManagerContainer.CfgMgr:GetJobDataById(configId)
if cfgData == nil then
return ""
end
local nickName = ManagerContainer.DataMgr.UserData:GetUserNickname()
name = I18N.T(cfgData.JobName) .. nickName
else
local cfgData = ManagerContainer.CfgMgr:GetPartnerDataById(configId)
if cfgData == nil then
return ""
end
name = I18N.T(cfgData.JobName) .. I18N.T(cfgData.Name)
end
return name
end
function GetHeroSplitJobAndNameByUid(uid, configId)
local jobName = ""
local roleName = ""
if uid == 1 then
local cfgData = ManagerContainer.CfgMgr:GetJobDataById(configId)
if cfgData == nil then
return ""
end
roleName = ManagerContainer.DataMgr.UserData:GetUserNickname()
jobName = I18N.T(cfgData.JobName)
else
local cfgData = ManagerContainer.CfgMgr:GetPartnerDataById(configId)
if cfgData == nil then
return ""
end
jobName = I18N.T(cfgData.JobName)
roleName = I18N.T(cfgData.Name)
end
return jobName, roleName
end
--- 获得技能的CfgId
---@param skillId integer 技能Id
---@param skillSlotLv integer 技能槽位等级
---@return integer 技能的CfgId
function GetSkillCfgIdByIdAndLv(skillId, skillLv)
return skillId * 1000 + skillLv
end
--- 获得技能槽位的CfgId
---@param skillId integer 技能槽位的顺序ID
---@param skillSlotLv integer 技能槽位等级
---@return integer 技能槽位的CfgId
function GetSkillSlotCfgIdByIdxAndLv(skillSlotIdx, skillSlotLv)
return skillSlotIdx * 1000 + skillSlotLv
end
--- 获得技能升级效果的CfgId
---@param skillId integer 技能Id
---@param skillLv integer 技能等级
---@return integer 技能升级效果的CfgId
function GetSkillUpEffectCfgIdByIdAndLv(skillId, skillLv)
return skillId * 1000 + skillLv
end
--- 找到下一个解锁的技能 (最终解释权归 李慧勇)
---@param heroId integer 英雄Id
function FindNextUnlockSkill(heroId)
local heroLv = ManagerContainer.DataMgr.UserData:GetHeroLv(heroId)
local jobCfgId = ManagerContainer.DataMgr.UserData:GetHeroJobCfgId(heroId)
local skillTreeLs = nil
if ManagerContainer.DataMgr.UserData:IsLeaderHero(heroId) then
local job = ManagerContainer.CfgMgr:GetJobDataById(jobCfgId)
skillTreeLs = ManagerContainer.CfgMgr:GetSkillTreeByFeature(job.JobType, job.JobBranch, job.JobStage)
else
local job = ManagerContainer.CfgMgr:GetPartnerDataById(jobCfgId)
skillTreeLs = ManagerContainer.CfgMgr:GetParterSkillTreeByFeature(job.JobType, job.ParterId)
end
local nextLv = nil
local skillType = nil
local skillId = nil
local skillTreeCfgData = nil
if skillTreeLs then
for i = 1, #skillTreeLs do
skillTreeCfgData = skillTreeLs[i]
local needLevel = skillTreeCfgData.OpenLevel
if needLevel > heroLv then
if not nextLv or nextLv > needLevel then
nextLv = needLevel
skillType = skillTreeCfgData.SkillType
skillId = skillTreeCfgData.SkillId
end
end
end
end
return nextLv, skillType, skillId
end
function GetResetSkillLvCost()
local costCfgId = 2
local costNum = 0
local vipLv = ManagerContainer.DataMgr.UserData:GetVipLv()
local vipCfg = ManagerContainer.CfgMgr:GetVipCfgById(vipLv)
if vipCfg and vipCfg.SkillReset >= 1 then
return costCfgId, costNum
end
local cfg = GlobalConfig.Instance:GetConfigStrValue(182)
if cfg and cfg ~= '' then
local itemCfgs = string.split(cfg, ';')
if itemCfgs then
local resetCount = ManagerContainer.DataMgr.UserData:GetSkillResetCount()
if resetCount < 0 then
resetCount = 1
else
resetCount = resetCount + 1
end
local index = 0
for _,v in pairs(itemCfgs) do
if v and v ~= '' then
local itemCfg = string.split(v, ':')
if itemCfg and #itemCfg >= 2 then
if index < resetCount then
costCfgId = itemCfg[1] and tonumber(itemCfg[1]) or 1
costNum = itemCfg[2] and tonumber(itemCfg[2]) or 0
end
index = index + 1
end
end
end
end
end
return costCfgId, costNum
end
function GetHeroIdBySlotSkillLowerLv(isBattle)
local heroData = ManagerContainer.DataMgr.UserData:GetHeroData()
local lowerLv = nil
local lowerId = nil
local lv
local validSlotNum = 0
if heroData and heroData.skillData then
validSlotNum = heroData.skillData:GetUnlockSlotNum()
for i = 1, validSlotNum do
local skillId = heroData.skillData:GetSlotSkillId(i)
if CommonUtil.CheckSkillCanLvUp(heroData, skillId) == 0 then
lv = heroData.skillData:GetSkillLv(skillId)
if not lowerLv or lowerLv > lv then
lowerLv = lv
lowerId = heroData.id
end
end
end
end
local partnerDatas = ManagerContainer.DataMgr.PartnerData:GetPartnerDatas()
if partnerDatas then
for _,v in pairs(partnerDatas) do
if v and v.skillData then
if not isBattle or v.isBattle then
validSlotNum = v.skillData:GetUnlockSlotNum()
for i = 1, validSlotNum do
local skillId = v.skillData:GetSlotSkillId(i)
if CommonUtil.CheckSkillCanLvUp(v, skillId) == 0 then
lv = v.skillData:GetSkillLv(skillId)
if not lowerLv or lowerLv > lv then
lowerLv = lv
lowerId = v.id
elseif lowerLv == lv then
if lowerId and lowerId > v.id then
lowerId = v.id
end
end
end
end
end
end
end
end
if not lowerId then
return 0
end
return lowerId
end
function GetAllSlotSkillCanUpNum(isBattle)
local num = 0
local validSlotNum = 0
local heroData = ManagerContainer.DataMgr.UserData:GetHeroData()
if heroData and heroData.skillData then
validSlotNum = heroData.skillData:GetUnlockSlotNum()
for i = 1, validSlotNum do
if CommonUtil.CheckSkillCanLvUp(heroData, heroData.skillData:GetSlotSkillId(i)) == 0 then
num = num + 1
end
end
end
local partnerDatas = ManagerContainer.DataMgr.PartnerData:GetPartnerDatas()
if partnerDatas then
for _,v in pairs(partnerDatas) do
if v and v.skillData then
if not isBattle or v.isBattle then
validSlotNum = v.skillData:GetUnlockSlotNum()
for i = 1, validSlotNum do
if CommonUtil.CheckSkillCanLvUp(v, v.skillData:GetSlotSkillId(i)) == 0 then
num = num + 1
end
end
end
end
end
end
return num
end
function HasSkillCanUp(heroId, isBattle)
local heroData = ManagerContainer.DataMgr.UserData:GetHeroData(heroId)
if heroData and heroData.skillData then
if not isBattle or heroData.isBattle then
local unlockSkillMap = heroData.skillData:GetUnlockSkillMap()
if unlockSkillMap then
for skillId, _ in pairs(unlockSkillMap) do
if CommonUtil.CheckSkillCanLvUp(heroData, skillId) == 0 then
return true
end
end
end
end
end
return false
end
--- 检查技能是否能升级
---@param heroId integer 英雄Id
---@param skillId integer 技能Id
---@return integer 0:能升级;其它查看Error_Code文件
function CheckSkillCanLvUp(heroData, skillId)
if not heroData then
return 133
end
local skillTreeCfgData = nil
if ManagerContainer.DataMgr.UserData:IsLeaderHero(heroData.id) then
skillTreeCfgData = ManagerContainer.CfgMgr:GetSkillTreeCfgById(skillId)
else
skillTreeCfgData = ManagerContainer.CfgMgr:GetParterSkillTreeCfgById(skillId)
end
if not skillTreeCfgData then
return 133
end
local skillData = heroData.skillData
if not skillData then
return 133
end
if not skillData:GetIsUnlock(skillId) then
return 134
end
local curLv = skillData:GetSkillLv(skillId)
if curLv >= skillTreeCfgData.MaxLv then
return 137
end
local upgradeLevel = ManagerContainer.CfgMgr:GetSkillDemandCfgUpGradeLevelById(skillTreeCfgData.OpenLevel) --skillTreeCfgData.UpGradeLevel
if not upgradeLevel or not upgradeLevel[curLv] then
return 141
end
if (heroData.baseLevel < upgradeLevel[curLv]) then return 141 end
local upgradeCost = ManagerContainer.CfgMgr:GetSkillDemandCfgUpGradeCostById(skillTreeCfgData.OpenLevel) --skillTreeCfgData.UpGradeCost
if not upgradeCost or not upgradeCost[curLv] or #(upgradeCost[curLv]) < 2 then
return 139
end
local itemCfgId = upgradeCost[curLv][1]
local itemNum = upgradeCost[curLv][2]
if CommonUtil.GetOwnResCountByItemId(itemCfgId) < itemNum then
return 139, itemCfgId
end
return 0
end
function GetDanCfg(danScore)
if danScore == nil then
return nil
end
local levelDatas = ManagerContainer.CfgMgr:GetArenaLevelDatas()
for key=10001, 20000 do
local levelCfg = levelDatas[key]
if levelCfg~= nil then
if danScore <= levelCfg.ArenaLevelScore then
return levelCfg
end
end
end
return nil
end
function GetPreciseDecimal(nNum, n)
if type(nNum) ~= "number" then
return nNum;
end
n = n or 0;
n = math.floor(n)
local fmt = '%.' .. n .. 'f'
local nRet = tonumber(string.format(fmt, nNum))
return nRet;
end
function GetPreciseDecimalFloor(nNum, n)
if type(nNum) ~= "number" then
return nNum;
end
n = n or 0;
n = math.floor(n)
if n < 0 then
n = 0;
end
local nDecimal = 10 ^ n
local nTemp = math.floor(nNum * nDecimal);
local nRet = nTemp / nDecimal;
return nRet;
end
--- 由服务器传输的浮点的价格容易出现后缀很多的问题,
--- 比如0.1传到lua变成0.100000001490116
function GetValidPayPrice(price)
return CommonUtil.GetPreciseDecimalFloor(price + 0.0005, 3)
end
function ParseKeyValue2Map(item_list)
local data = {}
for _,v in pairs(item_list) do
data[v.key] = v.value
end
return data
end
function ParseUITargetPath(wnd, resPath)
if resPath == "" then
return
end
resPath = resPath:gsub(" ", "")
local path = resPath:split('.')
local target = wnd
local index = 1
while index <= #path do
local ok, err = pcall(function() return target[path[index]] end)
if not ok then
LogError(wnd.uiData.id.." 找不到资源对象 "..resPath)
return
else
target = target[path[index]]
if target == nil then
LogError(wnd.uiData.id.." 找不到资源对象 "..resPath)
return
end
index = index + 1
end
end
return target
end
function GetEquipForgeTypeByCfgId(cfgId)
local equipCfgData = ManagerContainer.CfgMgr:GetEquipById(cfgId)
if equipCfgData.Type == Enum.SlotEquipType.Head then
return Enum.ForgeType.Head
elseif equipCfgData.Type == Enum.SlotEquipType.Body then
return Enum.ForgeType.Body
elseif equipCfgData.Type == Enum.SlotEquipType.Wrap then
return Enum.ForgeType.Wrap
elseif equipCfgData.Type == Enum.SlotEquipType.Shoes then
return Enum.ForgeType.Shoes
elseif equipCfgData.Type == Enum.SlotEquipType.Jew then
return Enum.ForgeType.Jew
elseif equipCfgData.Type == Enum.SlotEquipType.Weapon then
if CommonUtil.EleInTable(Enum.JobWeaponMap.Sword, equipCfgData.JobType) then
return Enum.ForgeType.Sword
elseif CommonUtil.EleInTable(Enum.JobWeaponMap.Katar, equipCfgData.JobType) then
return Enum.ForgeType.Katar
elseif CommonUtil.EleInTable(Enum.JobWeaponMap.Bow, equipCfgData.JobType) then
return Enum.ForgeType.Bow
elseif CommonUtil.EleInTable(Enum.JobWeaponMap.Staff, equipCfgData.JobType) then
return Enum.ForgeType.Staff
elseif CommonUtil.EleInTable(Enum.JobWeaponMap.Priest, equipCfgData.JobType) then
return Enum.ForgeType.Priest
end
end
return nil
end
function GetFashionAttrMap(fashionMap)
-- 时装有效属性
local vaildMap = {}
local vaildAttrStr = GlobalConfig.Instance:GetConfigStrValue(125)
if vaildAttrStr then
local vaildAttrArr = string.split(vaildAttrStr, ';')
for i = 1, #vaildAttrArr do
local attrId = tonumber(vaildAttrArr[i])
if attrId then
vaildMap[attrId] = 0
end
end
end
if fashionMap then
for _,v in pairs(fashionMap) do
if v and v.cfgId then
local fashionData = ManagerContainer.CfgMgr:GetFashionById(v.cfgId)
local fashionAttr = fashionData.FashionAttr
-- 一条属性的时候
if type(fashionAttr[1]) == 'number' then
local attrId = fashionAttr[1]
if vaildMap[attrId] ~= nil then
vaildMap[attrId] = vaildMap[attrId] + fashionAttr[2]
end
else
for _,v1 in pairs(fashionAttr) do
local attrId = v1[1]
if vaildMap[attrId] ~= nil then
vaildMap[attrId] = vaildMap[attrId]+ v1[2]
end
end
end
end
end
end
return vaildMap
end
function checkNums( nums )
local n = nums
if n >= 0 then
return n
else
n = 0 - n
n = 0xffffffff - n + 1
end
return n
end
function And(num1,num2)
local tmp1 = checkNums(num1)
local tmp2 = checkNums(num2)
local ret = 0
local count = 0
repeat
local s1 = tmp1 % 2
local s2 = tmp2 % 2
if s1 == s2 and s1 == 1 then
ret = ret + 2^count
end
tmp1 = math.modf(tmp1/2)
tmp2 = math.modf(tmp2/2)
count = count + 1
until(tmp1 == 0 and tmp2 == 0)
return ret
end
function Or(num1,num2)
local tmp1 = checkNums(num1)
local tmp2 = checkNums(num2)
local ret = 0
local count = 0
repeat
local s1 = tmp1 % 2
local s2 = tmp2 % 2
if s1 == s2 and s1 == 0 then
else
ret = ret + 2^count
end
tmp1 = math.modf(tmp1/2)
tmp2 = math.modf(tmp2/2)
count = count + 1
until(tmp1 == 0 and tmp2 == 0)
return ret
end
function Xor(num1,num2)
local tmp1 = checkNums(num1)
local tmp2 = checkNums(num2)
local ret = 0
local count = 0
repeat
local s1 = tmp1 % 2
local s2 = tmp2 % 2
if s1 ~= s2 then
ret = ret + 2^count
end
tmp1 = math.modf(tmp1/2)
tmp2 = math.modf(tmp2/2)
count = count + 1
until(tmp1 == 0 and tmp2 == 0)
return ret
end
function Clamp(min, max, val)
val = math.min(max, val)
val = math.max(min, val)
return val
end
function Get2Powers(...)
local state = 0
for _,v in pairs({...}) do
state = state + 2^v
end
return state
end
function ResetAnimator(animator, name)
animator:Play(name or "Idle");
animator:Update(0);
end
function DeserializeGlobalStrToTable(val)
local table = string.split(val, ';')
local table1 = {}
for _, value in pairs(table) do
if value then
if string.find(value, ':') then
local info = string.split(value, ':')
table1[#table1 + 1] = info
else
table1[#table1 + 1] = value
end
end
end
return table1
end
function DeserializeGlobalStrToNumberTable(val)
local table = string.split(val, ';')
local table1 = {}
for _, value in pairs(table) do
if value then
if string.find(value, ':') then
local info = string.split(value, ':')
for i = 1, #info do
info[i] = tonumber(info[i])
end
table1[#table1 + 1] = info
else
table1[#table1 + 1] = tonumber(value)
end
end
end
return table1
end
--获取今天某个时间点的时间戳,比如你想获取今天五点的时间戳,可以传入数据:GetTodayTimeStamp(5)
function GetTodayTimeStamp(_h, _m, _s)
local _curTime = ManagerContainer.LuaTimerMgr:CurLuaServerTime() / 1000;
local _oneDaySeconds = ManagerContainer.LuaTimerMgr.OneDaySeconds
_zeroOClockSeconds = #_curTime - math.fmod((#_curTime + 8 * 3600), _oneDaySeconds);
_h = _h or 0;
_m = _m or 0;
_s = _s or 0;
local _second = CommonUtil.GetSomeDayTimeStamp(_curTime, _h, _m, _s);
return _second;
end
--获取某个时间戳所在天的某个时间点的时间戳,传参就是获得_stamp所在的天的_h时_m分_s秒的时间戳注意_stamp传入的是秒不是毫秒
function GetSomeDayTimeStamp(_stamp, _h, _m, _s)
_stamp = tonumber(tostring(_stamp));
local _zeroOClockSeconds = 0;
_zeroOClockSeconds = _stamp - math.fmod((_stamp + 8 * 3600), Constant.OneDaySeconds);
_h = _h or 0;
_m = _m or 0;
_s = _s or 0;
local _second = _zeroOClockSeconds + (_h or 0) * 3600 + (_m or 0) * 60 + _s or 0;
return _second;
end
function GetHeadFrameDataById(_id)
if _id and _id > 0 then
local _data = ManagerContainer.CfgMgr:GetHeadFrameById(_id);
if _data then
return _data;
else
LogError("Can not find head frame data by id : " .. tostring(_id))
end
end
return nil;
end
--返回的bool值表示是否找到了对应的数据如果时false则表明返回的是默认头像框
function GetHeadFrameName(_id)
if _id and _id > 0 then
local _data = ManagerContainer.CfgMgr:GetHeadFrameById(_id)
if _data then
return _data.HeadFrameIcon, true
else
LogError("Can not find head frame data by id : " .. tostring(_id))
end
end
return "", false
end
function SetPlayerHeadAndFrame(pageTbl,headNode,actorData,smallFrame, headFrame, onClickOwner, onClickCB, logicData, replaceParams)
if headNode == nil or actorData == nil then
return
end
headNode.levelText:SetActive(actorData.Level ~= nil)
if actorData.Level then
headNode.levelText.text.text = tostring(actorData.Level)
end
if actorData.ProfessionIcon ~= nil and actorData.ProfessionIcon ~= "" then
CommonUtil.LoadIcon(pageTbl, actorData.ProfessionIcon, function (sprite)
headNode.jobIcon.image.sprite = sprite
end,headNode, "PlayerJobIdx")
headNode.jobIcon:SetActive(true)
else
headNode.jobIcon:SetActive(false)
end
CommonUtil.LoadIcon(pageTbl, actorData.HeadIcon, function (sprite)
headNode.head.image.sprite = sprite
end,headNode, "PlayerHeadIdx")
if actorData.IsHero then
headNode.frame:SetActive(true)
headNode.headFrame:SetActive(false)
local headFramePath = CommonUtil.GetHeadFrameName(headFrame);
CommonUtil.LoadIcon(pageTbl, headFramePath, function (sprite)
headNode.frame.image.sprite = sprite
end,headNode, "PlayerHeadFrameIdx")
else
local frameIcon = Constant.Quality_White_Head_Frame_Icon
if actorData.StrengthLevel == 100 then
frameIcon = Constant.Quality_HeadFrame_Lead_Icon
elseif actorData.StrengthLevel > 0 then
frameIcon = Constant.Quality_HeadFrame_Icons[math.min(actorData.StrengthLevel, #Constant.Quality_HeadFrame_Icons)]
end
if replaceParams ~= nil and replaceParams.StrengthLevel ~= nil then
frameIcon = Constant.Quality_White_Head_Frame_Icon
if replaceParams.StrengthLevel == 100 then
frameIcon = Constant.Quality_HeadFrame_Lead_Icon
elseif replaceParams.StrengthLevel > 0 then
frameIcon = Constant.Quality_HeadFrame_Icons[math.min(replaceParams.StrengthLevel, #Constant.Quality_HeadFrame_Icons)]
end
end
--取消s资源
--if smallFrame then
-- frameIcon = frameIcon .."_s"
--end
headNode.frame:SetActive(false)
headNode.headFrame:SetActive(true)
CommonUtil.LoadIcon(pageTbl, frameIcon, function (sprite)
headNode.headFrame.image.sprite = sprite
end,headNode, "PlayerHeadFrameIdx")
end
if onClickOwner and onClickCB then
headNode.head.button.interactable = true
onClickOwner.uiBase:AddButtonUniqueEventListener(headNode.head.button, onClickOwner, onClickCB, logicData)
else
headNode.head.button.interactable = false
end
end
function SetActorItemData(pageTbl,actorLua,actorData,bEnemy,UpdateSkillCDTimer)
if actorLua == nil or actorData == nil then
return
end
if actorLua.bgFriend ~= nil then
actorLua.bgFriend:SetActive(not bEnemy)
end
if actorLua.bgEnemy ~= nil then
actorLua.bgEnemy:SetActive(bEnemy)
end
if actorLua.actorName~= nil then
actorLua.actorName.text.text = actorData.Name
end
if actorLua.hp~= nil then
actorLua.hp.image.fillAmount = 1
end
if actorLua.sp~= nil then
actorLua.sp.image.fillAmount = 1
end
if actorLua.headItem~= nil then
if actorLua.headItem.levelText~= nil then
actorLua.headItem.levelText.text.text = "Lv."..tostring(actorData.Level)
end
if actorLua.headItem.jobIcon~= nil then
if actorData.ProfessionIcon ~= nil and actorData.ProfessionIcon ~= "" then
CommonUtil.LoadIcon(pageTbl, actorData.ProfessionIcon, function (sprite)
actorLua.headItem.jobIcon.image.sprite = sprite
end)
actorLua.headItem.jobIcon:SetActive(true)
else
actorLua.headItem.jobIcon:SetActive(false)
end
end
if actorLua.headItem.head ~= nil then
CommonUtil.LoadIcon(pageTbl, actorData.HeadIcon, function (sprite)
actorLua.headItem.head.image.sprite = sprite
end)
end
if actorLua.headItem.headFrame~= nil then
-- 突破等级
local frameIcon = Constant.Quality_White_Head_Frame_Icon
if actorData.StrengthLevel == 100 then
frameIcon = Constant.Quality_HeadFrame_Lead_Icon
else
frameIcon = Constant.Quality_HeadFrame_Icons[math.min(actorData.StrengthLevel, #Constant.Quality_HeadFrame_Icons)]
end
CommonUtil.LoadIcon(pageTbl, frameIcon, function (sprite)
actorLua.headItem.headFrame.image.sprite = sprite
end)
if actorData.StrengthLevel == 100 then
actorLua.headItem.headFrame.image.rectTransform.offsetMax = Vector2(0,22)
else
actorLua.headItem.headFrame.image.rectTransform.offsetMax = Vector2(0,0)
end
end
end
SetCurSkillInfo(actorLua.skillNode,actorData.CastSkillParam,pageTbl,UpdateSkillCDTimer)
if actorLua.deadNode ~= nil then
actorLua.deadNode:SetActive(false)
end
end
function SetCurSkillInfo(skillNode,skillInfo,pageTbl,UpdateSkillCDTimer)
if skillNode == nil or skillInfo == nil then
return nil
end
CommonUtil.LoadIcon(pageTbl, skillInfo.skillIcon, function (sprite)
skillNode.skillIcon.image.sprite = sprite
end)
skillNode.forbidNode:SetActive(skillInfo.IsForbidden)
skillNode.extraNode:SetActive(skillInfo.IsEnhance)
if skillInfo.IsCasting then
skillNode.releaseNode:SetActive(true)
skillNode.keepNode:SetActive(true)
skillNode.skillProgress:SetActive(false)
skillNode.waitNode:SetActive(false)
skillNode.skillCD:SetActive(false)
if skillInfo.teamSide == 0 then
local timerHander = pageTbl.skillCDTimers[skillInfo.actorId]
if timerHander ~= nil and timerHander ~= -1 then
ManagerContainer.LuaTimerMgr:RemoveTimer(timerHander)
pageTbl.skillCDTimers[skillInfo.actorId] = -1
end
else
local timerHander = pageTbl.enemySkillCDTimers[skillInfo.actorId]
if timerHander ~= nil and timerHander ~= -1 then
ManagerContainer.LuaTimerMgr:RemoveTimer(timerHander)
pageTbl.enemySkillCDTimers[skillInfo.actorId] = -1
end
end
else
if skillInfo.cdTime > 0 then
UpdateSkillCD(skillNode,skillInfo.cdTime,skillInfo.cdTime)
local cnt = skillInfo.cdTime*1000 / 100
if skillInfo.teamSide == 0 then
local timerHander = pageTbl.skillCDTimers[skillInfo.actorId]
if timerHander ~= nil and timerHander ~= -1 then
ManagerContainer.LuaTimerMgr:RemoveTimer(timerHander)
pageTbl.skillCDTimers[skillInfo.actorId] = -1
end
if UpdateSkillCDTimer ~= nil then
timerHander = ManagerContainer.LuaTimerMgr:AddTimer(100, cnt, pageTbl, UpdateSkillCDTimer, {skillParam = skillInfo,totalTime = skillInfo.cdTime})
pageTbl.skillCDTimers[skillInfo.actorId] = timerHander
end
else
local timerHander = pageTbl.enemySkillCDTimers[skillInfo.actorId]
if timerHander ~= nil and timerHander ~= -1 then
ManagerContainer.LuaTimerMgr:RemoveTimer(timerHander)
pageTbl.enemySkillCDTimers[skillInfo.actorId] = -1
end
if UpdateSkillCDTimer ~= nil then
timerHander = ManagerContainer.LuaTimerMgr:AddTimer(100, cnt, pageTbl, UpdateSkillCDTimer, {skillParam = skillInfo,totalTime = skillInfo.cdTime})
pageTbl.enemySkillCDTimers[skillInfo.actorId] = timerHander
end
end
else
skillNode.skillProgress.image.fillAmount = 0
skillNode.skillCD.text.text = ""
skillNode.waitNode:SetActive(true)
end
skillNode.releaseNode:SetActive(false)
skillNode.keepNode:SetActive(false)
skillNode.skillProgress:SetActive(true)
skillNode.skillCD:SetActive(true)
end
end
function UpdateSkillCD(skillNode,leftTime,totalTime)
if skillNode == nil then
return
end
local time = CommonUtil.GetPreciseDecimal(leftTime,1)
if time > 0 then
skillNode.skillProgress.image.fillAmount = time / totalTime
skillNode.skillCD.text.text = tostring(time)
else
skillNode.skillProgress.image.fillAmount = 0
skillNode.skillCD.text.text = ""
end
skillNode.waitNode:SetActive(time == 0)
end
--该方法绑定HeadBoxItem该方法目前仅用在此处可以修改
function SetFighterLife(actorLua,life,maxLife)
if actorLua == nil then
return
end
if maxLife == nil or maxLife == 0 then
return
end
if actorLua ~= nil then
actorLua.hp.image.fillAmount = SDataUtil.InvConvert(life) / SDataUtil.InvConvert(maxLife)
actorLua.deadNode:SetActive(SDataUtil.InvConvert(life) == 0)
--新增新hp更新
if actorLua.newBar~=nil then
actorLua.newBar.hp.slider.value = SDataUtil.InvConvert(life) / SDataUtil.InvConvert(maxLife)
end
end
end
--该方法绑定HeadBoxItem该方法目前仅用在此处可以修改
function SetFighterSp(actorLua,sp,maxSp)
if actorLua == nil then
return
end
if maxSp == nil or maxSp == 0 then
return
end
if actorLua ~= nil then
actorLua.sp.image.fillAmount = SDataUtil.InvConvert(sp)/ SDataUtil.InvConvert(maxSp)
--新增新sp更新
if actorLua.newBar ~= nil then
actorLua.newBar.sp.slider.value = SDataUtil.InvConvert(sp) / SDataUtil.InvConvert(maxSp)
end
end
end
function SetFighterSkill(actorLua,skillParam,pageTbl,UpdateSkillCDTimer)
if actorLua ~= nil then
SetCurSkillInfo(actorLua.skillNode,skillParam,pageTbl,UpdateSkillCDTimer)
if skillParam.IsCasting then
actorLua.animator:Play("SkillRelease");
elseif skillParam.IsForbidden then
actorLua.animator:Play("SkillForbidden");
else
actorLua.animator:Play("SkillWait");
end
end
end
function SetCommonSkillItem(owner, skillItem, skillIdOrCfgData, skillLv, onClickCb, ...)
if not skillItem then
return
end
local skillCfgData
if type(skillIdOrCfgData) == "table" then
skillCfgData = skillIdOrCfgData
else
skillCfgData = skillIdOrCfgData and ManagerContainer.CfgMgr:GetSkillCfgById(skillIdOrCfgData) or nil
end
if skillCfgData then
skillItem.icon.image.sprite = nil
CommonUtil.LoadIcon(owner, skillCfgData.Icon, function (sprite)
skillItem.icon.image.sprite = sprite
end, skillItem, 'SkillIcon')
if onClickCb then
skillItem.icon.button.enabled = true
owner.uiBase:AddButtonUniqueEventListener(skillItem.icon.button, owner, onClickCb, ...)
else
skillItem.icon.button.enabled = false
end
skillItem.num.text.text = (I18N.SetLanguageValue('Lv') .. tostring(skillLv))
if skillCfgData.SpcSkillDec then
skillItem.extTagTxt.text.text = string.formatbykey('LabelSkillGai')
skillItem.extTag:SetActive(true)
else
skillItem.extTag:SetActive(false)
end
else
skillItem.extTag:SetActive(false)
end
end
function GetPlayerHeadIcon(briefInfo)
--if briefInfo == nil then
-- return nil
--end
--local jobId = briefInfo.config_id
--local sex = briefInfo.gender or 1
--local roleCfg = ManagerContainer.CfgMgr:GetRoleDataById(CommonUtil.JobIdToRoleId(jobId,sex))
--return (roleCfg and roleCfg.HeadId or '')
return briefInfo.head_id
end
--根据年月日判断今天是星期几,基姆拉尔森计算公式
function CalculateWeekDay(_y, _m, _d)
local _mModf = 3 * math.modf((_m + 1) / 5);
local _yModf = math.modf(_y / 4) + math.modf(_y / 100) + math.modf(_y / 400);
local _YMD = _yModf + _mModf + 2 * _m + _d;
local _weekDay = math.fmod(_YMD, 7);
if _weekDay == 0 then
return Enum.WeekDay.Sun;
elseif _weekDay == 1 then
return Enum.WeekDay.Mon;
elseif _weekDay == 2 then
return Enum.WeekDay.Tue;
elseif _weekDay == 3 then
return Enum.WeekDay.Wed;
elseif _weekDay == 4 then
return Enum.WeekDay.Thu;
elseif _weekDay == 5 then
return Enum.WeekDay.Fri;
elseif _weekDay == 6 then
return Enum.WeekDay.Sat;
end
return _weekDay;
end
--将时间转换成时分秒,规则是大于一天显示几天几小时,小于一天显示小时:分钟:秒
function FormatTimeDMS(_time)
local _outPut, _outTime;
if _time > 0 then
_outTime = false;
local _hours = _time / 60 / 60;
if _hours > 24 then
local _dayCount = math.floor(_hours / 24);
local _hourCount = math.floor(_hours - _dayCount * 24);
_outPut = tostring(_dayCount) .. I18N.T("D") .. tostring(_hourCount) .. I18N.T("H"); --XX天XX小時
else
local _itemStr = tostring(_time);
_outPut = ManagerContainer.LuaTimerMgr:ParseSeconds2Time(tonumber(_itemStr));
end
else
_outTime = true;
_outPut = "00:00:00";
end
return _outPut, _outTime;
end
--number 保留3位小数 四舍五入
function Floor3PointNum(attrId, num)
if attrId > 21 then
return math.floor(SDataUtil.InvConvert(num) * 1000 + 0.5)* 0.001
else
return math.floor(SDataUtil.InvConvert(num))
end
end
function ACKShowRewardList(reward_list)
if reward_list == nil then return end
local data = {}
for _,v in pairs(reward_list) do
data[v.key] = v.value
end
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_EQUIP_AND_ITEM_ADD, data)
end
function ACKSpecialShowRewardList(reward_list)
if reward_list == nil then return end
local data = {}
for _,v in pairs(reward_list) do
data[#data + 1] = {v.key, v.value, v.vip}
end
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_EQUIP_AND_ITEM_ADD_LIST, data)
end
function GetCurSeasonTitle(paramList)
if nil == paramList then
LogError("Nil ParamList");
return;
end
local title = I18N.T("None")
local titleIcon = nil;
local competitionTitleIcon
local selectionCompetitionDatas = ManagerContainer.CfgMgr:GetAllSelectionCompetitionDatas()
local recruit = paramList[1]
if recruit == 0 then
recruit = 10
end
local curRecruitCfgData = ManagerContainer.CfgMgr:GetCompetitionDataById(recruit)
if curRecruitCfgData then
title = I18N.T(curRecruitCfgData.CompetitionTitle[1])
competitionTitleIcon = curRecruitCfgData.CompetitionTitleIcon[1]
end
local rank = paramList[2]
if rank == nil then
return title, nil, competitionTitleIcon
else
if rank == 0 then
rank = 100000
end
local curSelectionCfgData, idx = ManagerContainer.CfgMgr:GetCompetitionDatasByRank(selectionCompetitionDatas, recruit, rank)
if curSelectionCfgData then
title = title ..I18N.T(curSelectionCfgData.CompetitionTitle[idx])
--competitionTitleIcon = curSelectionCfgData.CompetitionTitleIcon[idx]
end
return title, nil, competitionTitleIcon
end
end
--local bit = require "bit"
--local bit_rshift = bit.rshift
--local bit_lshift = bit.lshift
--local bit_bor = bit.bor
function GetOnlineStatus(onlineStatus, offlineTime)
if onlineStatus or (offlineTime == 0) then
return string.formatbykey("FriendsOnline")
else
return CommonUtil.GetOfflineTimeStr(offlineTime)
end
end
function GetOfflineTimeStr(offlineTime)
local time = (ManagerContainer.LuaTimerMgr:CurLuaServerTime() - offlineTime) / 1000
if time < 3600 then
return string.formatbykey("FriendsOffline")
elseif time < 86400 then
local hours = math.floor(#time/3600)
return string.formatbykey("FriendsOfflineHour",hours)
elseif time < 259200 then
return string.formatbykey("FriendsOfflineDay",1)
else
return string.formatbykey("FriendsOfflineDay",3)
end
end
function GetGuildPostStr(post)
if post == Enum.GuildPostType.President then
return string.formatbykey('GuildInfo_009')
elseif post == Enum.GuildPostType.VicePresident then
return string.formatbykey('GuildInfo_010')
else
return ''
end
end
function ResLackErrorNotice(resId, resCost, dontNotice)
local ownedCount = CommonUtil.GetOwnResCountByItemId(resId)
if ownedCount < resCost then
if not dontNotice then
CommonUtil.ItemNotEnoughHandle(resId)
end
return true
end
return false
end
function ItemNotEnoughHandle(cfgId, id)
if Constant.OpenPay then
if cfgId then
local cfgData = ManagerContainer.CfgMgr:GetItemById(cfgId)
if cfgData then
if cfgData.ResType == Enum.ItemType.Diamond then
local data = {"NoDiamondTip", nil, id, nil, CommonUtil.ItemNotEnoughSkipRuneShop}
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UINoticeTips, data)
return
end
end
end
end
ManagerContainer.LuaUIMgr:ErrorNoticeDisplayWithParam(CommonUtil.GetItemNotEnoughInfo(cfgId))
end
function ItemNotEnoughSkipRuneShop(id)
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIRuneShop, {Enum.RuneShopType.Gifts, Enum.RuneShopSubType.Gold}, id)
end
function GetItemNotEnoughInfo(cfgId)
if cfgId then
local cfgData = ManagerContainer.CfgMgr:GetItemById(cfgId)
if cfgData then
local itemName = tostring(cfgData.Name)
if cfgData.SourceFun and #cfgData.SourceFun > 0 then
local sourceFunStr = nil
for i = 1, #cfgData.SourceFun do
if sourceFunStr then
sourceFunStr = sourceFunStr .. ' , ' .. string.formatbykey('SourceFunColor', string.formatbykey('SourceFun' .. tostring(cfgData.SourceFun[i])))
else
sourceFunStr = string.formatbykey('SourceFunColor', string.formatbykey('SourceFun' .. tostring(cfgData.SourceFun[i])))
end
end
if sourceFunStr then
return 'ItemNotEnoughSource', itemName, sourceFunStr
end
end
return 'ItemNotEnough', itemName
end
end
return 'ItemNotEnoughDefault'
end
function TableToColor(table)
if not table then return Color.white end
return Color(table[1] or 0, table[2] or 0, table[3] or 0, table[4] or 1)
end
function GetSkillTreeCfgData(heroId,skillId)
local skillTreeCfgData
if ManagerContainer.DataMgr.UserData:IsLeaderHero(heroId) then
skillTreeCfgData = ManagerContainer.CfgMgr:GetSkillTreeCfgById(skillId)
else
skillTreeCfgData = ManagerContainer.CfgMgr:GetParterSkillTreeCfgById(skillId)
end
return skillTreeCfgData
end
function CheckSkillCanAvance(heroId, skillId)
local skillTreeCfgData = CommonUtil.GetSkillTreeCfgData(heroId,skillId)
if not skillTreeCfgData then
return 133
end
local herodata = ManagerContainer.DataMgr.UserData:GetHeroData(heroId)
local jobdata = ManagerContainer.CfgMgr:GetJobDataById(herodata.configId)
if jobdata and jobdata.JobStage < skillTreeCfgData.SkillBranch then
return 200 --该角色尚未满足转职需求
end
local jobBranch = jobdata and jobdata.JobBranch or 0
local nextSkilldata
if skillTreeCfgData.SuperSkill then
if #skillTreeCfgData.SuperSkill > 1 and jobBranch ~= 0 then
nextSkilldata = CommonUtil.GetSkillTreeCfgData(heroId,skillTreeCfgData.SuperSkill[jobBranch][2])
else
nextSkilldata = CommonUtil.GetSkillTreeCfgData(heroId,skillTreeCfgData.SuperSkill[1][2])
end
end
local openLevel = nextSkilldata and nextSkilldata.OpenLevel or 0
local openNeedCost = nextSkilldata.OpenNeedCost
if openLevel > 0 then
if (ManagerContainer.DataMgr.UserData:GetHeroLv(heroId) < openLevel) then return 141 end --角色等级不足
end
if openNeedCost then
local openNeedCosts = nil
if type(openNeedCost[1]) == 'number' then
if #openNeedCost > 1 then
openNeedCosts = {openNeedCost}
end
else
openNeedCosts = openNeedCost
end
if openNeedCosts then
for i = 1, #openNeedCosts do
local itemCfgId = openNeedCosts[i][1]
local itemNum = openNeedCosts[i][2]
if CommonUtil.GetOwnResCountByItemId(itemCfgId) < itemNum then
return 139, itemCfgId
end
end
end
end
return 0
end
function GetPetSkillStarIconAndColor(petSkillList,skillLv)
local count = 0
if petSkillList then
for _,v in pairs(petSkillList) do
count = count + v.level
end
elseif skillLv then
count = skillLv
else
return
end
local idx = math.floor((math.max(count - 1, 0)) / 10) + 1
local num = count % 10
local num1 = num == 0 and 10 or num
return Constant.Pet_Star_Icons[idx], string.format(Constant.Pet_Star_Text_Color[idx], num1), count
end
function ReplaceBattleSkillBySkillEquip(heroData, battleSkills)
--神器技能替换
local skillEquipSlot = heroData.skillEquipSlot
if skillEquipSlot then
local skillEquipSLotList = skillEquipSlot.slotList
if skillEquipSLotList then
for i = 1, #skillEquipSLotList do
local skillEquipData = skillEquipSLotList[i]
if skillEquipData.starLv > 0 then
local cfgData = ManagerContainer.CfgMgr:GetArtifactCfgDataByCfgId(skillEquipData.cfgId)
if cfgData then
for j = skillEquipData.starLv, 1, -1 do
local skills = cfgData.ArtifacFuncId[j]
if type(battleSkills) == "table" then
for _,v in pairs(battleSkills) do
if v.skillId == skills[2] or v.skillId == skills[3] then
v.skillId = skills[4]
end
end
else
for i = 1, battleSkills.Length do
local params = battleSkills[i - 1]
if params.skillId == skills[2] or params.skillId == skills[3] then
params.skillId = skills[4]
battleSkills[i - 1] = params
end
end
end
end
end
end
end
end
end
return battleSkills
end
function UpdateHeroExtGoShowData(heroData)
if not heroData then return end
if not heroData.extGoesShowData then
heroData.extGoesShowData = {}
end
if heroData.skillEquipSlot and heroData.skillEquipSlot.slotList then
local curSkillEquipData = heroData.skillEquipSlot.slotList[1]
if curSkillEquipData then
heroData.extGoesShowData[Enum.HeroExtGoesShowType.God_Art] = curSkillEquipData.cfgId
end
end
if heroData.strengthLevel then
heroData.extGoesShowData[Enum.HeroExtGoesShowType.Strength_Halo] = heroData.strengthLevel
end
end
function UpdatePetExtGoShowData(petData, heroData)
if not petData or not heroData then return end
if not petData.extGoesShowData then
petData.extGoesShowData = {}
end
if heroData.battlePetId > 0 and heroData.petQiyueData and heroData.petQiyueData.slotList then
local slotList = heroData.petQiyueData.slotList
if #slotList > 0 then
local data1 = petData.extGoesShowData[Enum.HeroExtGoesShowType.Pet_Qiyue]
if not data1 then
data1 = {}
end
data1.sumNum = 0
data1.battlePetId = petData.cfgId
data1.count = 0
data1.cfgIds = {}
for i = 1, #slotList do
local data = slotList[i]
if data.petId > 0 then
data1.cfgIds[#data1.cfgIds + 1] = data.petCfgId
data1.sumNum = data1.sumNum + data.petCfgId
data1.count = data1.count + 1
end
end
petData.extGoesShowData[Enum.HeroExtGoesShowType.Pet_Qiyue] = data1
end
end
end
function ToNumber(num)
return tonumber(tostring(num))
end
--获得头像偏移位置和背景颜色
function GetRoleHeadInfo(uid)
if uid == 1 then
return Vector2(8, -183), Color(231/255,186/255,101/255, 1)
elseif uid == 2 then
return Vector2(33, -194), Color(230/255,59/255,55/255, 1)
elseif uid == 3 then
return Vector2(-52, -199), Color(154/255,208/255,233/255, 1)
elseif uid == 4 then
return Vector2(-11, -148), Color(231/255,186/255,101/255, 1)
elseif uid == 5 then
return Vector2(-13, -158), Color(153/255,84/255,176/255, 1)
elseif uid == 6 then
return Vector2(-17, -177), Color(176/255,84/255,99/255, 1)
end
return Vector2(0, 0), Color(1,1,1,1)
end
function GetRole_Illustration_Info(idx)
local pos;
if idx == 1 then pos = Vector2(6, 2, 0) end
if idx == 2 then pos = Vector2(33, -7, 0) end
if idx == 3 then pos = Vector2(-50, -18, 0) end
if idx == 4 then pos = Vector2(-6, 45, 0) end
if idx == 5 then pos = Vector2(-8, 31, 0) end
if idx == 6 then pos = Vector2(-15, 11, 0) end
return pos
end
function CurrLevelHasStory()
local mapLevel = ManagerContainer.LuaBattleMgr:GetCurLevelUniqueId()
local mapLevelData = ManagerContainer.CfgMgr:GetLevelDataById(mapLevel)
local dlgId = mapLevelData["DlgId"]
local forceGuideGroup = mapLevelData["ForceGuideGroup"]
local storyId = dlgId
local storyCfg = ManagerContainer.CfgMgr:GetStoryDataById(storyId)
if storyCfg then
return true
else
return false
end
end
function CreateNormalRedPoint(parent, cb)
if parent.transform.childCount >= 1 then
cb(parent.transform:GetChild(0))
return
end
AW.async(function()
local redPoint = AW.await(ManagerContainer.ResMgr:LuaGetGoFromPoolAsync(Constants.UICommonPath, "UIRedPointRP"))
if redPoint then
redPoint.transform:SetParent(parent.transform)
redPoint.transform.localPosition = Vector3.zero
redPoint.transform.localRotation = Quaternion.identity
redPoint.transform.localScale = Vector3.one
redPoint:SetActive(true)
cb(redPoint)
end
end)
end
function CreateNewRedPoint(parent, cb)
if parent.transform.childCount >= 1 then
cb(parent.transform:GetChild(0))
return
end
AW.async(function()
local redPoint = AW.await(ManagerContainer.ResMgr:LuaGetGoFromPoolAsync(Constants.UICommonPath, "UINewRP"))
if redPoint then
redPoint.transform:SetParent(parent.transform)
redPoint.transform.localPosition = Vector3.zero
redPoint.transform.localRotation = Quaternion.identity
redPoint.transform.localScale = Vector3.one
redPoint:SetActive(true)
cb(redPoint)
end
end)
end
function RemoveRedPoint(parent)
for i = _target.transform.childCount-1, 0, -1 do
local _child = _target.transform:GetChild(i)
DestroyGO(_child.gameObject)
end
end