Files
SL1900 eafd8f4088 Update - 1.9.0.107
EN: 1.9.0.107
CN: 1.9.0.108
JP: 1.9.0.112
KR: 1.9.0.112
2026-05-14 16:00:00 +09:00

421 lines
14 KiB
Lua

local FriendHonorTitleCtrl = class("FriendHonorTitleCtrl", BaseCtrl)
local localdata = require("GameCore.Data.LocalData")
local RapidJson = require("rapidjson")
FriendHonorTitleCtrl._mapNodeConfig = {
btnCancel = {
sComponentName = "UIButton",
callback = "OnBtnClick_Cancel"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Cancel"
},
btnConfirm1 = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
btnCurHonorTitle = {
nCount = 3,
sComponentName = "UIButton",
callback = "OnBtnClick_ChangeHonorTitle"
},
goCurHonorTitle = {
nCount = 3,
sCtrlName = "Game.UI.FriendEx.HonorTitleCtrl"
},
imgSelect = {nCount = 3},
svHonorTitle = {
sComponentName = "LoopScrollView"
},
btnTab = {
sNodeName = "tab",
nCount = 4,
sComponentName = "UIButton",
callback = "OnBtnClick_ChangeHonorTitleType"
},
imgTab = {nCount = 4},
txtTab = {nCount = 4},
txtTabUnSelect = {nCount = 4},
imgCurHonorTitleBg = {nCount = 3},
HonorTitleContent = {},
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title"
},
txtBtnCancel = {sComponentName = "TMP_Text", sLanguageId = "BtnCancel"},
txtBtnConfirm = {sComponentName = "TMP_Text", sLanguageId = "BtnConfirm"},
txtEquipHonorTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Cur_Honor_Title_Equiped"
},
txtTab1 = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title_All"
},
txtTab2 = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title_Achievement"
},
txtTab3 = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title_Affinity"
},
txtTab4 = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title_Activity"
},
txtTabUnSelect1 = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title_All"
},
txtTabUnSelect2 = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title_Achievement"
},
txtTabUnSelect3 = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title_Affinity"
},
txtTabUnSelect4 = {
sComponentName = "TMP_Text",
sLanguageId = "Honor_Title_Activity"
}
}
FriendHonorTitleCtrl._mapEventConfig = {}
local HonorTitleType = {
All = 1,
Achievement = 2,
Affinity = 3,
Activity = 4
}
local L2_LV = 21
local L3_LV = 41
function FriendHonorTitleCtrl:Open()
self:PlayInAni()
self.tbCurHonorTitle = {}
self.tbAllHonorData = {}
self.tbGoChosenState = {}
self.ownHonorData = PlayerData.Base:GetPlayerHonorTitleList() or {}
local curHononData = PlayerData.Base:GetPlayerHonorTitle() or {}
for k, v in ipairs(curHononData) do
table.insert(self.tbCurHonorTitle, v.Id)
end
local allData = ConfigTable.Get("Honor")
local groupData = {}
local foreachHonor = function(mapData)
local bHas = false
for k, v in pairs(self.ownHonorData) do
if v.Id == mapData.Id then
bHas = true
break
end
end
if mapData.IsUnlock == true or self.ownHonorData ~= nil and bHas then
if mapData.Type == GameEnum.honorType.Group then
if groupData[mapData.Params[1]] == nil then
groupData[mapData.Params[1]] = {}
end
table.insert(groupData[mapData.Params[1]], mapData)
end
table.insert(self.tbAllHonorData, mapData)
end
end
ForEachTableLine(allData, foreachHonor)
for _, group in pairs(groupData) do
local maxPriotity = group[1]
for k, v in ipairs(group) do
if v.Priotity > maxPriotity.Priotity then
table.removebyvalue(self.tbAllHonorData, maxPriotity)
maxPriotity = v
end
end
end
self:OnBtnClick_ChangeHonorTitle(nil, 1)
self:OnBtnClick_ChangeHonorTitleType(nil, 1)
self:Refresh()
end
function FriendHonorTitleCtrl:Refresh()
self:RefreshHonorTitle()
self:RefreshHonorTitleList()
end
function FriendHonorTitleCtrl:RefreshHonorTitle()
for i = 1, 3 do
if self.tbCurHonorTitle[i] ~= nil and self.tbCurHonorTitle[i] ~= 0 then
local honorData = ConfigTable.GetData("Honor", self.tbCurHonorTitle[i])
local level
if honorData.Type == GameEnum.honorType.Character then
local affinityData = PlayerData.Char:GetCharAffinityData(honorData.Params[1])
level = affinityData.Level
elseif honorData.Type == GameEnum.honorType.Levels then
for k, v in pairs(self.ownHonorData) do
if v.Id == honorData.Id then
level = v.Lv or 1
break
end
end
end
self._mapNode.goCurHonorTitle[i]:SetHonotTitle(honorData.Id, i == 1, level)
end
self._mapNode.goCurHonorTitle[i].gameObject:SetActive(self.tbCurHonorTitle[i] ~= nil and self.tbCurHonorTitle[i] ~= 0)
self._mapNode.imgCurHonorTitleBg[i]:SetActive(self.tbCurHonorTitle[i] == nil or self.tbCurHonorTitle[i] == 0)
end
end
function FriendHonorTitleCtrl:RefreshHonorTitleList()
local nCount = 0
self.tbRefreshDataList = {}
local tbCachedGroupHonorData = {}
if self.nSelectedType == HonorTitleType.All then
nCount = #self.tbAllHonorData
self.tbRefreshDataList = self.tbAllHonorData
else
for k, v in ipairs(self.tbAllHonorData) do
local data = v
if data.TabType == GameEnum.honorTabType.Achieve then
if self.nSelectedType == HonorTitleType.Achievement then
if tbCachedGroupHonorData[data.Id] ~= nil then
if tbCachedGroupHonorData[data.Id] < data.Priotity then
tbCachedGroupHonorData[data.Id] = data.Priotity
table.insert(self.tbRefreshDataList, v)
end
else
tbCachedGroupHonorData[data.Id] = data.Priotity
table.insert(self.tbRefreshDataList, v)
end
end
elseif data.TabType == GameEnum.honorTabType.Character then
if self.nSelectedType == HonorTitleType.Affinity then
table.insert(self.tbRefreshDataList, v)
end
elseif data.TabType == GameEnum.honorTabType.Activity and self.nSelectedType == HonorTitleType.Activity then
table.insert(self.tbRefreshDataList, v)
end
end
nCount = #self.tbRefreshDataList
end
table.sort(self.tbRefreshDataList, function(a, b)
if a.Sort ~= b.Sort then
return a.Sort > b.Sort
else
return a.Id < b.Id
end
end)
self.tbHonorTitle = {}
self.tbGridRedDot = {}
self._mapNode.HonorTitleContent:SetActive(0 < nCount)
if 0 < nCount then
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self._mapNode.svHonorTitle:Init(nCount, self, self.OnGridRefresh)
end
end
function FriendHonorTitleCtrl:RefreshReddot(honorId)
local sJson = localdata.GetPlayerLocalData("HonorTitle")
local localHonorTilte = decodeJson(sJson)
if type(localHonorTilte) ~= "table" then
return
end
local bFind = false
for k, v in pairs(localHonorTilte) do
if tonumber(v) == honorId then
RedDotManager.SetValid(RedDotDefine.Friend_Honor_Title_Item, honorId, false)
table.remove(localHonorTilte, k)
bFind = true
break
end
end
if bFind then
localdata.SetPlayerLocalData("HonorTitle", RapidJson.encode(localHonorTilte))
end
end
function FriendHonorTitleCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local honorData = self.tbRefreshDataList[nIndex]
local btnGrid = goGrid.transform:Find("btnGrid"):GetComponent("UIButton")
local animRoot = btnGrid.transform:Find("AnimRoot")
local imgHonorTitleChooseBg = animRoot:Find("imgHonorTitleChooseBg"):GetComponent("Image")
local goHonorTitle = animRoot:Find("goHonorTitle")
local goChosenState = animRoot:Find("goChosenState")
local goEquipState = animRoot:Find("goEquipState")
local imgHonorTitleChooseBg1 = goChosenState:Find("imgHonorTitleChooseBg1"):GetComponent("Image")
local imgHonorTitleEquipBg = goEquipState:Find("imgHonorTitleEquipBg"):GetComponent("Image")
local txtCurChoose = goChosenState:Find("imgBg/txtCurChoose"):GetComponent("TMP_Text")
local txtCurEquip = goEquipState:Find("imgBg/txtCurEquip"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtCurChoose, ConfigTable.GetUIText("Honor_Title_State_CurChoose"))
NovaAPI.SetTMPText(txtCurEquip, ConfigTable.GetUIText("Honor_Title_State_CurEquip"))
local nInstanceId = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceId] then
self.tbGridCtrl[nInstanceId] = self:BindCtrlByNode(goHonorTitle, "Game.UI.FriendEx.HonorTitleCtrl")
end
self.tbGridRedDot[nInstanceId] = honorData.Id
local ctrl = self.tbGridCtrl[nInstanceId]
ctrl:RegisterRedDot(honorData.Id)
local level
if honorData.Type == GameEnum.honorType.Character then
local affinityData = PlayerData.Char:GetCharAffinityData(honorData.Params[1])
level = affinityData ~= nil and affinityData.Level or 1
elseif honorData.Type == GameEnum.honorType.Levels then
for k, v in pairs(self.ownHonorData) do
if v.Id == honorData.Id then
level = v.Lv or 1
break
end
end
end
local bgPath = ctrl:SetHonotTitle(honorData.Id, true, level)
self:SetPngSprite(imgHonorTitleEquipBg, bgPath ~= "" and bgPath or honorData.MainRes)
if bgPath ~= "" then
NovaAPI.SetImageNativeSize(imgHonorTitleEquipBg)
end
local spritePath = ""
if honorData.BGType == GameEnum.HonorTitleBgType.Ellipse then
if level ~= nil and level >= L2_LV and level < L3_LV then
spritePath = "db_choose_common_7"
elseif level ~= nil and level >= L3_LV then
spritePath = "db_choose_common_8"
else
spritePath = "db_choose_common_5"
end
elseif honorData.BGType == GameEnum.HonorTitleBgType.Parallelogram then
spritePath = "db_choose_common_6"
end
self:SetAtlasSprite(imgHonorTitleChooseBg, "08_db", spritePath)
self:SetAtlasSprite(imgHonorTitleChooseBg1, "08_db", spritePath)
NovaAPI.SetImageNativeSize(imgHonorTitleChooseBg)
NovaAPI.SetImageNativeSize(imgHonorTitleChooseBg1)
local bCurChosen = self.tbCurHonorTitle[self.nSelectedIndex] == honorData.Id
goChosenState.gameObject:SetActive(bCurChosen)
imgHonorTitleChooseBg.gameObject:SetActive(bCurChosen)
if self.tbCurHonorTitle[self.nSelectedIndex] == honorData.Id then
self.tbGoChosenState[self.nSelectedIndex] = {goChosenState, imgHonorTitleChooseBg}
end
local bEquiped = false
for k, v in pairs(self.tbCurHonorTitle) do
if v == honorData.Id then
bEquiped = true
break
end
end
goEquipState.gameObject:SetActive(not bCurChosen and bEquiped)
btnGrid.onClick:RemoveAllListeners()
btnGrid.onClick:AddListener(function()
if self.tbCurHonorTitle[self.nSelectedIndex] ~= honorData.Id then
for k, v in pairs(self.tbCurHonorTitle) do
if v == honorData.Id then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Honor_Title_Equiped"))
return
end
end
if self.tbGoChosenState[self.nSelectedIndex] ~= nil then
for k, v in ipairs(self.tbGoChosenState[self.nSelectedIndex]) do
v.gameObject:SetActive(false)
end
end
self.tbCurHonorTitle[self.nSelectedIndex] = honorData.Id
self.tbGoChosenState[self.nSelectedIndex] = {goChosenState, imgHonorTitleChooseBg}
for k, v in ipairs(self.tbGoChosenState[self.nSelectedIndex]) do
v.gameObject:SetActive(true)
end
else
self.tbCurHonorTitle[self.nSelectedIndex] = nil
for k, v in ipairs(self.tbGoChosenState[self.nSelectedIndex]) do
v.gameObject:SetActive(false)
end
self.tbGoChosenState[self.nSelectedIndex] = nil
end
self:RefreshHonorTitle()
self:RefreshReddot(honorData.Id)
end)
end
function FriendHonorTitleCtrl:PlayInAni()
self.gameObject:SetActive(true)
self.ani:Play("t_window_04_t_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function FriendHonorTitleCtrl:PlayOutAni()
self.ani:Play("t_window_04_t_out")
self:AddTimer(1, 0.2, "Close", true, true, true)
end
function FriendHonorTitleCtrl:Close()
self.gameObject:SetActive(false)
end
function FriendHonorTitleCtrl:SetTimer()
self.bCd = true
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
self.timer = self:AddTimer(1, 5, function()
self.bCd = false
end, true, true, false)
end
function FriendHonorTitleCtrl:Awake()
self.ani = self.gameObject.transform:GetComponent("Animator")
self.tbGridCtrl = {}
self.tbGridRedDot = {}
end
function FriendHonorTitleCtrl:OnEnable()
end
function FriendHonorTitleCtrl:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
end
function FriendHonorTitleCtrl:OnDestroy()
end
function FriendHonorTitleCtrl:OnBtnClick_Cancel(btn)
EventManager.Hit("FriendClosePop")
end
function FriendHonorTitleCtrl:OnBtnClick_ChangeHonorTitle(btn, nIndex, bInit)
if self.nSelectedIndex ~= nil and self.nSelectedIndex == nIndex then
return
end
if self.nSelectedIndex ~= nil then
self._mapNode.imgSelect[self.nSelectedIndex]:SetActive(false)
end
self._mapNode.imgSelect[nIndex]:SetActive(true)
self.nSelectedIndex = nIndex
if not bInit then
self:RefreshHonorTitleList()
end
end
function FriendHonorTitleCtrl:OnBtnClick_ChangeHonorTitleType(btn, nIndex)
if self.nSelectedType ~= nil and self.nSelectedType == nIndex then
return
end
if self.nSelectedType ~= nil then
self._mapNode.imgTab[self.nSelectedType]:SetActive(false)
self._mapNode.txtTab[self.nSelectedType]:SetActive(false)
self._mapNode.txtTabUnSelect[self.nSelectedType]:SetActive(true)
end
self._mapNode.imgTab[nIndex]:SetActive(true)
self._mapNode.txtTab[nIndex]:SetActive(true)
self._mapNode.txtTabUnSelect[nIndex]:SetActive(false)
self.nSelectedType = nIndex
self:RefreshHonorTitleList()
end
function FriendHonorTitleCtrl:OnBtnClick_Confirm()
local callback = function()
local mapMsg = {
nType = AllEnum.MessageBox.Tips,
bPositive = true,
sContent = ConfigTable.GetUIText("Change_Success")
}
EventManager.Hit(EventId.OpenMessageBox, mapMsg)
self:OnBtnClick_Cancel()
end
if self.tbCurHonorTitle == nil then
self.tbhonorTitle = {}
end
for i = 1, 3 do
if self.tbCurHonorTitle[i] == nil then
self.tbCurHonorTitle[i] = 0
end
end
PlayerData.Base:SendPlayerHonorTitleEditReq(self.tbCurHonorTitle, callback)
end
return FriendHonorTitleCtrl