Initial version - 1.2.0.60

EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
This commit is contained in:
SL1900
2025-12-03 01:00:00 +09:00
commit 5e0d58cfad
3595 changed files with 9373562 additions and 0 deletions
+145
View File
@@ -0,0 +1,145 @@
local BaseCtrl = require("GameCore.UI.BaseCtrl")
local CharShardsConvertCtrl = class("CharShardsConvertCtrl", BaseCtrl)
CharShardsConvertCtrl._mapNodeConfig = {
got_fullscreen_blur_blue = {
sNodeName = "t_fullscreen_blur_blue",
sComponentName = "GameObject"
},
btnsnapshot = {
sNodeName = "snapshot",
sComponentName = "Button",
callback = "OnBtnClick_Close"
},
anit_window = {sNodeName = "t_window", sComponentName = "Animator"},
btnConfirm = {
sNodeName = "btnConfirm2",
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
loopsv = {
sNodeName = "sv",
sComponentName = "LoopScrollView"
},
imgItem_ = {nCount = 2, sComponentName = "Image"},
txtItemNum_ = {nCount = 2, sComponentName = "TMP_Text"},
btnClose = {
sNodeName = "btnClose",
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
Item_ = {nCount = 2, sComponentName = "GameObject"},
goEmpty = {}
}
CharShardsConvertCtrl._mapEventConfig = {}
function CharShardsConvertCtrl:Awake()
self.tbAllCharFragmentsList = {}
end
function CharShardsConvertCtrl:OnEnable()
self._mapNode.got_fullscreen_blur_blue:SetActive(true)
self._mapNode.anit_window:Play("t_window_04_t_in")
self.tbGridCtrl = {}
self:OnRefreshPanel()
end
function CharShardsConvertCtrl:OnRefreshPanel()
local allChar = PlayerData.Char:GetDataForCharList()
for k, v in pairs(allChar) do
local fragmentsCount = PlayerData.Talent:GetOverFragments(v.nId)
if 0 < fragmentsCount then
table.insert(self.tbAllCharFragmentsList, {
v.nId,
fragmentsCount
})
end
end
local allFragments = PlayerData.Item:GetCharFragmentsData()
for k, v in pairs(allFragments) do
local fragmentsCount = PlayerData.Talent:GetOverFragments(v.nId)
if 0 < fragmentsCount then
table.insert(self.tbAllCharFragmentsList, {
v.nId,
fragmentsCount
})
end
end
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self._mapNode.loopsv:Init(#self.tbAllCharFragmentsList, self, self.OnRefreshGrid)
self:OnRefreshConvertItem()
self._mapNode.goEmpty:SetActive(0 >= #self.tbAllCharFragmentsList)
end
function CharShardsConvertCtrl:OnRefreshConvertItem()
self.tbConvertItem = {}
local data = ConfigTable.GetData("CharGrade", GameEnum.characterGrade.SSR)
if data ~= nil then
if data.SubstituteItemId1 ~= 0 and self.tbConvertItem[data.SubstituteItemId1] == nil then
self.tbConvertItem[data.SubstituteItemId1] = 0
end
if data.SubstituteItemId2 ~= 0 and self.tbConvertItem[data.SubstituteItemId2] == nil then
self.tbConvertItem[data.SubstituteItemId2] = 0
end
end
for k, v in ipairs(self.tbAllCharFragmentsList) do
local mapData = ConfigTable.GetData_Character(v[1])
if mapData ~= nil then
local gradeData = ConfigTable.GetData("CharGrade", mapData.Grade)
if gradeData ~= nil then
if gradeData.SubstituteItemId1 ~= 0 then
if self.tbConvertItem[gradeData.SubstituteItemId1] == nil then
self.tbConvertItem[gradeData.SubstituteItemId1] = 0
end
self.tbConvertItem[gradeData.SubstituteItemId1] = self.tbConvertItem[gradeData.SubstituteItemId1] + gradeData.SubstituteItemQty1 * v[2]
end
if gradeData.SubstituteItemId2 ~= 0 then
if self.tbConvertItem[gradeData.SubstituteItemId2] == nil then
self.tbConvertItem[gradeData.SubstituteItemId2] = 0
end
self.tbConvertItem[gradeData.SubstituteItemId2] = self.tbConvertItem[gradeData.SubstituteItemId2] + gradeData.SubstituteItemQty2 * v[2]
end
end
end
end
local index = 1
for k, v in pairs(self.tbConvertItem) do
self._mapNode.Item_[index]:SetActive(true)
self:SetPngSprite(self._mapNode.imgItem_[index], ConfigTable.GetData_Item(k).Icon)
NovaAPI.SetTMPText(self._mapNode.txtItemNum_[index], v)
index = index + 1
end
end
function CharShardsConvertCtrl:OnRefreshGrid(go)
local index = tonumber(go.name) + 1
local nInstanceId = go:GetInstanceID()
if not self.tbGridCtrl[nInstanceId] then
self.tbGridCtrl[nInstanceId] = self:BindCtrlByNode(go, "Game.UI.TemplateEx.TemplateItemCtrl")
end
local mapData = ConfigTable.GetData_Character(self.tbAllCharFragmentsList[index][1])
if mapData ~= nil then
self.tbGridCtrl[nInstanceId]:SetItem(mapData.FragmentsId, nil, self.tbAllCharFragmentsList[index][2])
end
end
function CharShardsConvertCtrl:OnPanelClose()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
EventManager.Hit(EventId.ClosePanel, PanelId.CharShardsConvert)
end
function CharShardsConvertCtrl:OnBtnClick_Close()
self._mapNode.anit_window:Play("t_window_04_t_out")
self:AddTimer(1, 0.2, "OnPanelClose", true, true, true)
end
function CharShardsConvertCtrl:OnBtnClick_Confirm()
if #self.tbAllCharFragmentsList <= 0 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("CharShard_Not_Enough"))
return
end
local callBack = function(_, mapChangeInfo)
UTILS.OpenReceiveByChangeInfo(mapChangeInfo)
self:OnPanelClose()
end
PlayerData.Mall:SendCharFragmentConvertReq(callBack)
end
return CharShardsConvertCtrl
@@ -0,0 +1,21 @@
local BasePanel = require("GameCore.UI.BasePanel")
local CharShardsConvertPanel = class("CharShardsConvertPanel", BasePanel)
CharShardsConvertPanel._bIsMainPanel = false
CharShardsConvertPanel._sSortingLayerName = AllEnum.SortingLayerName.UI_Top
CharShardsConvertPanel._tbDefine = {
{
sPrefabPath = "Mall/CharShardsConvertPanel.prefab",
sCtrlName = "Game.UI.Mall.CharShardsConvertCtrl"
}
}
function CharShardsConvertPanel:Awake()
end
function CharShardsConvertPanel:OnEnable()
end
function CharShardsConvertPanel:OnDisable()
end
function CharShardsConvertPanel:OnDestroy()
end
function CharShardsConvertPanel:OnRelease()
end
return CharShardsConvertPanel
+143
View File
@@ -0,0 +1,143 @@
local MallCtrl = class("MallCtrl", BaseCtrl)
MallCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
tog = {
nCount = 5,
sComponentName = "UIButton",
callback = "OnBtnClick_ChangeSheet"
},
ctrlTog = {
nCount = 5,
sNodeName = "tog",
sCtrlName = "Game.UI.TemplateEx.TemplateToggleCtrl"
},
Gem = {
sNodeName = "---Gem---",
sCtrlName = "Game.UI.Mall.MallGemCtrl"
},
Package = {
sNodeName = "---Package---",
sCtrlName = "Game.UI.Mall.MallPackageCtrl"
},
MonthlyCard = {
sNodeName = "---MonthlyCard---",
sCtrlName = "Game.UI.Mall.MallMonthlyCardCtrl"
},
Shop = {
sNodeName = "---Shop---",
sCtrlName = "Game.UI.Mall.MallShopCtrl"
},
Skin = {
sNodeName = "---Skin---",
sCtrlName = "Game.UI.Mall.MallSkinCtrl"
},
btnCharShard = {
sNodeName = "btnCharShard",
sComponentName = "UIButton",
callback = "OnBtnClick_OpenCharShardPanel"
},
aniMonthlyCard = {
sNodeName = "---MonthlyCard---",
sComponentName = "Animator"
},
redDotTog = {nCount = 4}
}
MallCtrl._mapEventConfig = {
OpenMallTog = "OnEvent_OpenMallTog",
MallChangeTopCoin = "OnEvent_ChangeTopCoin"
}
function MallCtrl:RegisterRedDot()
RedDotManager.RegisterNode(RedDotDefine.Mall_Free, nil, self._mapNode.redDotTog[2])
end
function MallCtrl:SwitchTog()
self._mapNode.Gem.gameObject:SetActive(self._panel.nCurTog == AllEnum.MallToggle.Gem)
self._mapNode.Package.gameObject:SetActive(self._panel.nCurTog == AllEnum.MallToggle.Package)
self._mapNode.MonthlyCard.gameObject:SetActive(self._panel.nCurTog == AllEnum.MallToggle.MonthlyCard)
self._mapNode.Shop.gameObject:SetActive(self._panel.nCurTog == AllEnum.MallToggle.Shop)
self._mapNode.Skin.gameObject:SetActive(self._panel.nCurTog == AllEnum.MallToggle.Skin)
if self._panel.nCurTog == AllEnum.MallToggle.Gem then
self._mapNode.Gem:Refresh()
self._mapNode.TopBar:CreateCoin({
AllEnum.CoinItemId.Jade,
AllEnum.CoinItemId.FREESTONE
})
elseif self._panel.nCurTog == AllEnum.MallToggle.Package then
self._mapNode.Package:ResetTab(self.nTabParam)
self._mapNode.Package:Refresh(true)
self._mapNode.TopBar:CreateCoin({
AllEnum.CoinItemId.FREESTONE
})
elseif self._panel.nCurTog == AllEnum.MallToggle.MonthlyCard then
self._mapNode.MonthlyCard:Refresh()
self._mapNode.TopBar:CreateCoin({
AllEnum.CoinItemId.Jade,
AllEnum.CoinItemId.FREESTONE
})
elseif self._panel.nCurTog == AllEnum.MallToggle.Shop then
self._mapNode.Shop:ResetTab()
self._mapNode.Shop:Refresh(true)
elseif self._panel.nCurTog == AllEnum.MallToggle.Skin then
self._mapNode.Skin:ResetTab()
self._mapNode.Skin:Refresh(true)
end
self:RegisterRedDot()
end
function MallCtrl:PlayTogAni()
if self._panel.nCurTog == AllEnum.MallToggle.MonthlyCard then
self._mapNode.aniMonthlyCard:Play("MonthlyCard_in")
end
end
function MallCtrl:SetDefaultTog()
if self._panel.nCurTog == nil then
self._panel.nCurTog = AllEnum.MallToggle.MonthlyCard
end
for i = 1, 5 do
self._mapNode.ctrlTog[i]:SetDefault(i == self._panel.nCurTog)
end
self:SwitchTog()
end
function MallCtrl:RefreshTogText()
self._mapNode.ctrlTog[1]:SetText(ConfigTable.GetUIText("Mall_Tog_MonthlyCard"))
self._mapNode.ctrlTog[2]:SetText(ConfigTable.GetUIText("Mall_Tog_Package"))
self._mapNode.ctrlTog[3]:SetText(ConfigTable.GetUIText("Mall_Tog_Gem"))
self._mapNode.ctrlTog[4]:SetText(ConfigTable.GetUIText("Mall_Tog_Exchange"))
self._mapNode.ctrlTog[5]:SetText(ConfigTable.GetUIText("Mall_Tog_Skin"))
end
function MallCtrl:FadeIn(bPlayFadeIn)
EventManager.Hit(EventId.SetTransition)
self:PlayTogAni()
end
function MallCtrl:Awake()
self:RefreshTogText()
end
function MallCtrl:OnEnable()
EventManager.Hit("MallCloseDetail")
self:SetDefaultTog()
end
function MallCtrl:OnDisable()
end
function MallCtrl:OnDestroy()
end
function MallCtrl:OnBtnClick_ChangeSheet(btn, nIndex)
if nIndex == self._panel.nCurTog then
return
end
self._mapNode.ctrlTog[nIndex]:SetTrigger(true)
self._mapNode.ctrlTog[self._panel.nCurTog]:SetTrigger(false)
self._panel.nCurTog = nIndex
self:SwitchTog()
self:PlayTogAni()
end
function MallCtrl:OnBtnClick_OpenCharShardPanel(btn)
EventManager.Hit(EventId.OpenPanel, PanelId.CharShardsConvert)
end
function MallCtrl:OnEvent_ChangeTopCoin(tbCoin)
self._mapNode.TopBar:CreateCoin(tbCoin)
end
function MallCtrl:OnEvent_OpenMallTog(nTog)
self:OnBtnClick_ChangeSheet(nil, nTog)
end
return MallCtrl
+53
View File
@@ -0,0 +1,53 @@
local MallGemCtrl = class("MallGemCtrl", BaseCtrl)
MallGemCtrl._mapNodeConfig = {
sv = {
sComponentName = "LoopScrollView"
}
}
MallGemCtrl._mapEventConfig = {MallOrderClear = "Refresh"}
function MallGemCtrl:Refresh()
if self._panel.nCurTog ~= AllEnum.MallToggle.Gem then
return
end
local callback = function(tbList)
table.sort(tbList, function(a, b)
return ConfigTable.GetData("MallGem", a.Id).Order < ConfigTable.GetData("MallGem", b.Id).Order
end)
self.tbList = tbList
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self._mapNode.sv:SetAnim(0.04)
self._mapNode.sv:Init(#self.tbList, self, self.OnGridRefresh, self.OnGridBtnClick)
end
PlayerData.Mall:SendMallGemListReq(callback)
end
function MallGemCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapData = self.tbList[nIndex]
local nInstanceID = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceID] then
self.tbGridCtrl[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Mall.MallGemItemCtrl")
end
self.tbGridCtrl[nInstanceID]:Refresh(mapData)
end
function MallGemCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
PlayerData.Mall:BuyGem(self.tbList[nIndex].Id, ConfigTable.GetData("MallGem", self.tbList[nIndex].Id).StatisticalGroup)
end
function MallGemCtrl:Awake()
self.tbGridCtrl = {}
end
function MallGemCtrl:OnEnable()
end
function MallGemCtrl:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
end
function MallGemCtrl:OnDestroy()
end
return MallGemCtrl
+43
View File
@@ -0,0 +1,43 @@
local MallGemItemCtrl = class("MallGemItemCtrl", BaseCtrl)
MallGemItemCtrl._mapNodeConfig = {
imgState = {nCount = 2},
txtState1 = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Gem_Normal"
},
txtState2 = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Gem_Maiden"
},
txtName = {sComponentName = "TMP_Text"},
imgIcon = {sComponentName = "Image"},
imgRareBg = {sComponentName = "Image"},
txtAdd = {sComponentName = "TMP_Text"},
txtPrice = {sComponentName = "TMP_Text"}
}
MallGemItemCtrl._mapEventConfig = {}
function MallGemItemCtrl:Refresh(mapData)
local mapCfg = ConfigTable.GetData("MallGem", mapData.Id)
if not mapCfg then
return
end
self._mapNode.imgState[1]:SetActive(not mapData.Maiden)
self._mapNode.imgState[2]:SetActive(mapData.Maiden)
local nAll = mapData.Maiden and mapCfg.MaidenBonusItemQty + mapCfg.BaseItemQty or mapCfg.ExperiencedBonusItemQty + mapCfg.BaseItemQty
local sName = orderedFormat(mapCfg.Name, nAll)
NovaAPI.SetTMPText(self._mapNode.txtName, sName)
self:SetPngSprite(self._mapNode.imgIcon, mapCfg.Icon)
self:SetPngSprite(self._mapNode.imgRareBg, mapCfg.IconBg)
local sDesc = orderedFormat(mapCfg.Desc, mapCfg.BaseItemQty, mapData.Maiden and mapCfg.MaidenBonusItemQty or mapCfg.ExperiencedBonusItemQty)
NovaAPI.SetTMPText(self._mapNode.txtAdd, sDesc)
NovaAPI.SetTMPText(self._mapNode.txtPrice, tostring(mapCfg.ShowPrice))
end
function MallGemItemCtrl:Awake()
end
function MallGemItemCtrl:OnEnable()
end
function MallGemItemCtrl:OnDisable()
end
function MallGemItemCtrl:OnDestroy()
end
return MallGemItemCtrl
+112
View File
@@ -0,0 +1,112 @@
local MallMonthlyCardCtrl = class("MallMonthlyCardCtrl", BaseCtrl)
MallMonthlyCardCtrl._mapNodeConfig = {
btnBuy = {
sComponentName = "UIButton",
callback = "OnBtnClick_Buy"
},
txtBtnBuy = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Btn_Buy"
},
btnRule = {
sComponentName = "UIButton",
callback = "OnBtnClick_Rule"
},
cgBg = {
sNodeName = "imgMonthlyBg",
sComponentName = "CanvasGroup"
},
txtRemainDay = {sComponentName = "TMP_Text"},
imgItem = {nCount = 3},
imgItemIcon = {nCount = 3, sComponentName = "Image"},
txtItemCount = {nCount = 3, sComponentName = "TMP_Text"},
txtPrice = {sComponentName = "TMP_Text"},
txtName = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_MonthlyCard_Name"
},
txtTip1 = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_MonthlyCard_BuyImmediately"
},
txtTip2 = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_MonthlyCard_Daily"
},
txtTip3 = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_MonthlyCard_UseTip"
},
txtTip4 = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_MonthlyCard_LimitTime"
},
txtTip6 = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_MonthlyCard_RuleDetail"
}
}
MallMonthlyCardCtrl._mapEventConfig = {
MallOrderClear = "OnEvent_OrderClear"
}
function MallMonthlyCardCtrl:Refresh()
if self._panel.nCurTog ~= AllEnum.MallToggle.MonthlyCard then
return
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgBg, 0)
local callback = function(mapData)
self.sId = mapData.Id
self.bReceived = mapData.Received
self.nRemaining = mapData.Remaining
self:RefreshList()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgBg, 1)
end
PlayerData.Mall:SendMallMonthlyCardListReq(callback)
end
function MallMonthlyCardCtrl:RefreshList()
local mapCfg = ConfigTable.GetData("MallMonthlyCard", self.sId)
local sState = self.bReceived and ConfigTable.GetUIText("Mall_MonthlyCard_Received") or ConfigTable.GetUIText("Mall_MonthlyCard_Unreceived")
NovaAPI.SetTMPText(self._mapNode.txtRemainDay, orderedFormat(ConfigTable.GetUIText("Mall_MonthlyCard_RemainDay"), self.nRemaining, sState))
self:SetPngSprite(self._mapNode.imgItemIcon[1], ConfigTable.GetData_Item(mapCfg.BaseItemId).Icon2)
NovaAPI.SetTMPText(self._mapNode.txtItemCount[1], mapCfg.BaseItemQty)
NovaAPI.SetTMPText(self._mapNode.txtPrice, tostring(mapCfg.ShowPrice))
local mapMonthlyCard = ConfigTable.GetData("MonthlyCard", mapCfg.MonthlyCardId * 100 + 1)
self._mapNode.imgItem[2].gameObject:SetActive(mapMonthlyCard.RewardId1 ~= 0)
if mapMonthlyCard.RewardId1 ~= 0 then
self:SetPngSprite(self._mapNode.imgItemIcon[2], ConfigTable.GetData_Item(mapMonthlyCard.RewardId1).Icon2)
NovaAPI.SetTMPText(self._mapNode.txtItemCount[2], mapMonthlyCard.RewardNum1)
end
self._mapNode.imgItem[3].gameObject:SetActive(mapMonthlyCard.RewardId2 ~= 0)
if mapMonthlyCard.RewardId2 ~= 0 then
self:SetPngSprite(self._mapNode.imgItemIcon[3], ConfigTable.GetData_Item(mapMonthlyCard.RewardId2).Icon2)
NovaAPI.SetTMPText(self._mapNode.txtItemCount[3], mapMonthlyCard.RewardNum2)
end
end
function MallMonthlyCardCtrl:Awake()
end
function MallMonthlyCardCtrl:OnEnable()
end
function MallMonthlyCardCtrl:OnDisable()
end
function MallMonthlyCardCtrl:OnDestroy()
end
function MallMonthlyCardCtrl:OnBtnClick_Buy()
local mapCfg = ConfigTable.GetData("MallMonthlyCard", self.sId)
if self.nRemaining > mapCfg.MaxDays then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Mall_MaxDay"))
return
end
PlayerData.Mall:BuyMonthlyCard(self.sId, mapCfg.StatisticalGroup)
end
function MallMonthlyCardCtrl:OnBtnClick_Rule()
local msg = {
nType = AllEnum.MessageBox.Desc,
sContent = ConfigTable.GetUIText("Mall_MonthlyCard_RuleDesc")
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function MallMonthlyCardCtrl:OnEvent_OrderClear()
PopUpManager.OpenPopUpPanelByType(GameEnum.PopUpSeqType.MonthlyCard)
self:Refresh()
end
return MallMonthlyCardCtrl
+191
View File
@@ -0,0 +1,191 @@
local MallPackageCtrl = class("MallPackageCtrl", BaseCtrl)
MallPackageCtrl._mapNodeConfig = {
sv = {
sComponentName = "LoopScrollView"
},
cgSv = {
sNodeName = "sv",
sComponentName = "CanvasGroup"
},
tab = {},
trTab = {sComponentName = "Transform"},
svTab = {sComponentName = "ScrollRect"}
}
MallPackageCtrl._mapEventConfig = {MallOrderClear = "Refresh"}
function MallPackageCtrl:Refresh(bResetPos)
if self._panel.nCurTog ~= AllEnum.MallToggle.Package then
return
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgSv, 0)
local callback = function(tbList, nTime)
self:RefreshData(tbList)
self:RefreshTab()
self:RefreshList(bResetPos)
self:SetTimer(nTime)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgSv, 1)
end
PlayerData.Mall:SendMallPackageListReq(callback)
end
function MallPackageCtrl:RefreshData(tbList)
local tbPage = PlayerData.Mall:GetPackagePage(GameEnum.MallItemType.Package)
local tbAllList = {}
local tbPackageToPage = {}
for _, v in pairs(tbList) do
local mapCfg = ConfigTable.GetData("MallPackage", v.sId)
if mapCfg.Tag == GameEnum.MallItemType.Package then
local nGroupId = mapCfg.GroupId
if not tbPackageToPage[nGroupId] then
tbPackageToPage[nGroupId] = {}
end
table.insert(tbPackageToPage[nGroupId], v)
table.insert(tbAllList, v)
end
end
self.tbPackagePage, self.tbPages = {}, {}
for _, v in pairs(tbPage) do
if tbPackageToPage[v.Id] then
table.insert(self.tbPackagePage, tbPackageToPage[v.Id])
table.insert(self.tbPages, v)
end
end
self.nPageCount = #self.tbPages
if self._panel.nDefaultId then
for k, v in ipairs(self.tbPages) do
if v.Id == self._panel.nDefaultId then
self.nCurTab = k
self._panel.nDefaultId = nil
break
end
end
end
if not self.tbPages[self.nCurTab] or self.nSelectPage and self.tbPages[self.nCurTab].Id ~= self.nSelectPage then
self.nCurTab = 1
end
self.nSelectPage = self.tbPages[self.nCurTab].Id
end
function MallPackageCtrl:RefreshList(bResetPos)
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
local tbCur = self.tbPackagePage[self.nCurTab]
self._mapNode.sv:SetAnim(0.04)
self._mapNode.sv:Init(#tbCur, self, self.OnGridRefresh, self.OnGridBtnClick, not bResetPos)
end
function MallPackageCtrl:RefreshTab()
self._mapNode.svTab.gameObject:SetActive(true)
NovaAPI.SetScrollHorizontal(self._mapNode.svTab, self.nPageCount > 4)
self.ctrlTab = {}
delChildren(self._mapNode.trTab)
for i = 1, self.nPageCount do
local goTab = instantiate(self._mapNode.tab, self._mapNode.trTab)
goTab:SetActive(true)
local btn = goTab.transform:Find("btnTab"):GetComponent("UIButton")
local func_Handler = ui_handler(self, self.OnBtnClick_ChangeSheet, goTab, i)
btn.onClick:AddListener(func_Handler)
self.ctrlTab[i] = self:BindCtrlByNode(goTab, "Game.UI.TemplateEx.TemplateTabCtrl")
self.ctrlTab[i]:SetText(self.tbPages[i].Name)
end
for i = 1, self.nPageCount do
local nState = self:GetTabState(i)
self.ctrlTab[i]:SetSelect(i == self.nCurTab, nState)
if i == self.nCurTab and 1 < i then
self.ctrlTab[i - 1]:SetLine(false)
end
end
end
function MallPackageCtrl:SetTimer(nTime)
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
if 0 < nTime then
self.timer = self:AddTimer(1, nTime, function()
self:Refresh(true)
EventManager.Hit(EventId.CloseMessageBox)
EventManager.Hit("MallCloseDetail")
end, true, true, false)
end
end
function MallPackageCtrl:GetTabState(nCurTab)
local nState = 2
if nCurTab == 1 then
nState = 1
elseif nCurTab == self.nPageCount then
nState = 3
end
return nState
end
function MallPackageCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapData = self.tbPackagePage[self.nCurTab][nIndex]
local nInstanceID = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceID] then
self.tbGridCtrl[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Mall.MallPackageItemCtrl")
end
self.tbGridCtrl[nInstanceID]:Refresh(mapData)
end
function MallPackageCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
EventManager.Hit(EventId.OpenPanel, PanelId.MallPopup, AllEnum.MallToggle.Package, self.tbPackagePage[self.nCurTab][nIndex], {
AllEnum.CoinItemId.FREESTONE
})
end
function MallPackageCtrl:ResetTab(nTab)
if not self.ctrlTab then
return
end
if nTab ~= nil then
self.nCurTab = nTab
end
if self.nCurTab and self.nCurTab > 1 then
local nState = self:GetTabState(self.nCurTab)
self.ctrlTab[self.nCurTab]:SetSelect(false, nState)
self.ctrlTab[self.nCurTab - 1]:SetLine(true)
end
if nTab == nil then
self.nCurTab = 1
end
self.ctrlTab[self.nCurTab]:SetSelect(true, 1)
end
function MallPackageCtrl:Awake()
self.tbGridCtrl = {}
self._mapNode.svTab.gameObject:SetActive(false)
end
function MallPackageCtrl:OnEnable()
end
function MallPackageCtrl:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
if self.ctrlTab then
for nTab, objCtrl in pairs(self.ctrlTab) do
self:UnbindCtrlByNode(objCtrl)
self.ctrlTab[nTab] = nil
end
self.ctrlTab = nil
end
end
function MallPackageCtrl:OnDestroy()
end
function MallPackageCtrl:OnBtnClick_ChangeSheet(btn, nIndex)
if nIndex == self.nCurTab then
return
end
local nState = self:GetTabState(self.nCurTab)
self.ctrlTab[self.nCurTab]:SetSelect(false, nState)
if self.nCurTab > 1 then
self.ctrlTab[self.nCurTab - 1]:SetLine(true)
end
nState = self:GetTabState(nIndex)
self.ctrlTab[nIndex]:SetSelect(true, nState)
if 1 < nIndex then
self.ctrlTab[nIndex - 1]:SetLine(false)
end
self.nCurTab = nIndex
self.nSelectPage = self.tbPages[self.nCurTab].Id
self:RefreshList(true)
end
return MallPackageCtrl
+243
View File
@@ -0,0 +1,243 @@
local MallPackageDetailCtrl = class("MallPackageDetailCtrl", BaseCtrl)
MallPackageDetailCtrl._mapNodeConfig = {
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Shop_TitleBuy"
},
txtName = {sComponentName = "TMP_Text"},
imgDetailIcon = {sComponentName = "Image"},
goCurrency = {},
imgCurrency = {sComponentName = "Image"},
txtPrice = {sComponentName = "TMP_Text"},
txtPriceCn = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Package_PriceTitle"
},
goTime = {},
txtLimit = {sComponentName = "TMP_Text"},
txtLimitCn = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Package_LimitTitle"
},
txtTime = {sComponentName = "TMP_Text"},
txtTimeCn = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Package_TimeTitle"
},
txtTitleDetail = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Package_Detail"
},
btnBuy1 = {
sComponentName = "UIButton",
callback = "OnBtnClick_Buy"
},
btnBuy2 = {
sComponentName = "UIButton",
callback = "OnBtnClick_Disable"
},
btnAll = {
sComponentName = "UIButton",
callback = "OnBtnClick_All"
},
txtBtnBuy = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Mall_Btn_Buy"
},
txtBtnAll = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Btn_All"
},
goShow = {
nCount = 5,
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btnShow = {
nCount = 5,
sComponentName = "UIButton",
callback = "OnBtnClick_Tips"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
txtDisable = {sComponentName = "TMP_Text"}
}
MallPackageDetailCtrl._mapEventConfig = {}
function MallPackageDetailCtrl:Refresh(mapData)
self.sId = mapData.sId
local mapCfg = ConfigTable.GetData("MallPackage", mapData.sId)
self:PlayInAni()
self:RefreshInfo(mapCfg)
self:RefreshPrice(mapCfg)
self:RefreshLimit(mapCfg, mapData)
self:RefreshTime(mapData)
self:RefreshItem(mapCfg)
self:RefreshBuy(mapCfg, mapData)
end
function MallPackageDetailCtrl:RefreshInfo(mapCfg)
NovaAPI.SetTMPText(self._mapNode.txtName, mapCfg.DetailName)
self:SetPngSprite(self._mapNode.imgDetailIcon, mapCfg.Icon)
end
function MallPackageDetailCtrl:RefreshPrice(mapCfg)
if mapCfg.CurrencyType == GameEnum.currencyType.Cash then
self._mapNode.goCurrency:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, tostring(mapCfg.CurrencyShowPrice))
elseif mapCfg.CurrencyType == GameEnum.currencyType.Item then
self._mapNode.goCurrency:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtPrice, mapCfg.CurrencyItemQty)
self:SetPngSprite(self._mapNode.imgCurrency, ConfigTable.GetData_Item(mapCfg.CurrencyItemId).Icon2)
elseif mapCfg.CurrencyType == GameEnum.currencyType.Free then
self._mapNode.goCurrency:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, ConfigTable.GetUIText("Mall_Package_Free"))
end
end
function MallPackageDetailCtrl:RefreshLimit(mapCfg, mapData)
NovaAPI.SetTMPText(self._mapNode.txtLimit, mapData.nCurStock .. "/" .. mapCfg.Stock)
if mapCfg.RefreshType == GameEnum.mallPackageRefreshType.None then
NovaAPI.SetTMPText(self._mapNode.txtLimitCn, ConfigTable.GetUIText("Mall_Package_LimitTitle"))
elseif mapCfg.RefreshType == GameEnum.mallPackageRefreshType.Day then
NovaAPI.SetTMPText(self._mapNode.txtLimitCn, ConfigTable.GetUIText("Mall_Package_DayLimitTitle"))
elseif mapCfg.RefreshType == GameEnum.mallPackageRefreshType.Week then
NovaAPI.SetTMPText(self._mapNode.txtLimitCn, ConfigTable.GetUIText("Mall_Package_WeekLimitTitle"))
elseif mapCfg.RefreshType == GameEnum.mallPackageRefreshType.Month then
NovaAPI.SetTMPText(self._mapNode.txtLimitCn, ConfigTable.GetUIText("Mall_Package_MonthLimitTitle"))
end
end
function MallPackageDetailCtrl:RefreshTime(mapData)
self._mapNode.goTime:SetActive(mapData.nNextRefreshTime > 0)
if mapData.nNextRefreshTime > 0 then
local sSuffix = mapData.bPrioritizeDeList and ConfigTable.GetUIText("Mall_Package_Delist") or ConfigTable.GetUIText("Mall_Package_Refresh")
local sPrefix
local nRemaining = mapData.nNextRefreshTime - CS.ClientManager.Instance.serverTimeStamp
if nRemaining <= 3600 then
sPrefix = ConfigTable.GetUIText("Mall_Package_WithinHour")
elseif 3600 < nRemaining and nRemaining <= 86400 then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_Hour") or "", math.floor(nRemaining / 3600))
elseif 86400 < nRemaining then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_Day") or "", math.floor(nRemaining / 86400))
end
NovaAPI.SetTMPText(self._mapNode.txtTime, sPrefix .. sSuffix)
end
end
function MallPackageDetailCtrl:RefreshItem(mapCfg)
local tbItem = decodeJson(mapCfg.Items)
self.tbShow = {}
for k, v in pairs(tbItem) do
local nId = tonumber(k)
table.insert(self.tbShow, {
nId = nId,
nCount = v,
nRarity = ConfigTable.GetData_Item(nId).Rarity
})
end
table.sort(self.tbShow, function(a, b)
if a.nRarity ~= b.nRarity then
return a.nRarity < b.nRarity
else
return a.nId < b.nId
end
end)
local nItemCount = #self.tbShow
self._mapNode.btnAll.gameObject:SetActive(5 < nItemCount)
for i = 1, 5 do
if i <= nItemCount then
self._mapNode.goShow[i]:SetItem(self.tbShow[i].nId, nil, self.tbShow[i].nCount, nil, nil, nil, nil, true)
else
self._mapNode.goShow[i]:SetItem()
end
self._mapNode.btnShow[i].interactable = i <= nItemCount
end
end
function MallPackageDetailCtrl:RefreshBuy(mapCfg, mapData)
local tbCond = decodeJson(mapCfg.OrderCondParams)
local bPurchaseAble = PlayerData.Shop:CheckShopCond(mapCfg.OrderCondType, tbCond)
local bAble = bPurchaseAble and mapData.nCurStock > 0
self._mapNode.btnBuy1.gameObject:SetActive(bAble)
self._mapNode.btnBuy2.gameObject:SetActive(not bAble)
self._mapNode.txtDisable.gameObject:SetActive(not bAble)
local sDisable
if not bPurchaseAble then
if mapCfg.OrderCondType == GameEnum.shopCond.WorldClassSpecific then
sDisable = orderedFormat(ConfigTable.GetUIText("Shop_Cond_WorldClassShort") or "", tbCond[1])
end
self.sDisableTip = ConfigTable.GetUIText("Shop_Condition")
elseif mapData.nCurStock == 0 then
sDisable = ConfigTable.GetUIText("Shop_Cond_SoldOutShort")
self.sDisableTip = ConfigTable.GetUIText("Shop_GoodsEmpty")
end
NovaAPI.SetTMPText(self._mapNode.txtDisable, sDisable)
end
function MallPackageDetailCtrl:PlayInAni()
self.gameObject:SetActive(true)
self.ani:Play("t_window_04_t_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function MallPackageDetailCtrl:PlayOutAni()
self.ani:Play("t_window_04_t_out")
self:AddTimer(1, 0.2, "Close", true, true, true)
end
function MallPackageDetailCtrl:Close()
self.gameObject:SetActive(false)
end
function MallPackageDetailCtrl:Awake()
self.ani = self.gameObject.transform:GetComponent("Animator")
end
function MallPackageDetailCtrl:OnEnable()
end
function MallPackageDetailCtrl:OnDisable()
end
function MallPackageDetailCtrl:OnDestroy()
end
function MallPackageDetailCtrl:OnBtnClick_Buy()
local mapCfg = ConfigTable.GetData("MallPackage", self.sId)
if not mapCfg then
return
end
local nCurrencyType = mapCfg.CurrencyType
if nCurrencyType == GameEnum.currencyType.Cash then
PlayerData.Mall:BuyPackage(self.sId, mapCfg.StatisticalGroup)
else
if nCurrencyType == GameEnum.currencyType.Item then
local nHas = 0
if mapCfg.CurrencyItemId == AllEnum.CoinItemId.FREESTONE or mapCfg.CurrencyItemId == AllEnum.CoinItemId.STONE then
nHas = PlayerData.Coin:GetCoinCount(AllEnum.CoinItemId.FREESTONE) + PlayerData.Coin:GetCoinCount(AllEnum.CoinItemId.STONE)
else
nHas = PlayerData.Coin:GetCoinCount(mapCfg.CurrencyItemId)
end
if nHas < mapCfg.CurrencyItemQty then
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = orderedFormat(ConfigTable.GetUIText("Recruit_Charge") or "", ConfigTable.GetData_Item(AllEnum.CoinItemId.STONE).Id),
callbackConfirm = function()
EventManager.Hit("MallCloseDetail")
EventManager.Hit("OpenMallTog", AllEnum.MallToggle.Gem)
end,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
return
end
end
PlayerData.Mall:SendMallPackageOrderReq(self.sId)
end
end
function MallPackageDetailCtrl:OnBtnClick_Disable()
EventManager.Hit(EventId.OpenMessageBox, self.sDisableTip)
end
function MallPackageDetailCtrl:OnBtnClick_All()
local msg = {
nType = AllEnum.MessageBox.ItemList,
tbItem = self.tbShow,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function MallPackageDetailCtrl:OnBtnClick_Close()
EventManager.Hit("MallCloseDetail")
end
function MallPackageDetailCtrl:OnBtnClick_Tips(btn, nIndex)
UTILS.ClickItemGridWithTips(self.tbShow[nIndex].nId, btn.transform, true, true, false)
end
return MallPackageDetailCtrl
+142
View File
@@ -0,0 +1,142 @@
local MallPackageItemCtrl = class("MallPackageItemCtrl", BaseCtrl)
local LayoutRebuilder = CS.UnityEngine.UI.LayoutRebuilder
MallPackageItemCtrl._mapNodeConfig = {
txtName = {sComponentName = "TMP_Text"},
imgIcon = {sComponentName = "Image"},
imgBg = {sComponentName = "Image"},
txtPrice = {sComponentName = "TMP_Text"},
txtLimit = {sComponentName = "TMP_Text"},
imgCurrency = {sComponentName = "Image"},
goCurrency = {},
goTime = {},
goCondition = {},
goSoldOut = {},
imgSoldOut = {nCount = 2},
imgLimit = {nCount = 2},
txtRefreshTime = {sComponentName = "TMP_Text"},
txtTime = {sComponentName = "TMP_Text"},
txtSoldOut = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Mall_Package_SoldOut"
},
txtCondition = {sComponentName = "TMP_Text"},
goSaleRate = {
sComponentName = "RectTransform"
},
txtSaleRate = {sComponentName = "TMP_Text"},
imgMask = {},
reddotPkg = {}
}
MallPackageItemCtrl._mapEventConfig = {}
function MallPackageItemCtrl:Refresh(mapData)
local mapCfg = ConfigTable.GetData("MallPackage", mapData.sId)
self.sId = mapData.sId
self:RefreshInfo(mapCfg)
self:RefreshPrice(mapCfg)
self:RefreshLimit(mapCfg, mapData)
self:RefreshCond(mapCfg, mapData)
self:RefreshTime(mapCfg, mapData)
self:RegisterRedDot()
end
function MallPackageItemCtrl:RefreshPrice(mapCfg)
if mapCfg.CurrencyType == GameEnum.currencyType.Cash then
self._mapNode.goCurrency:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, tostring(mapCfg.CurrencyShowPrice))
elseif mapCfg.CurrencyType == GameEnum.currencyType.Item then
self._mapNode.goCurrency:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtPrice, mapCfg.CurrencyItemQty)
self:SetPngSprite(self._mapNode.imgCurrency, ConfigTable.GetData_Item(mapCfg.CurrencyItemId).Icon2)
elseif mapCfg.CurrencyType == GameEnum.currencyType.Free then
self._mapNode.goCurrency:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, ConfigTable.GetUIText("Mall_Package_Free"))
end
end
function MallPackageItemCtrl:RefreshLimit(mapCfg, mapData)
self._mapNode.imgLimit[1]:SetActive(mapData.nNextRefreshTime > 0 and mapCfg.RefreshType == GameEnum.mallPackageRefreshType.None)
self._mapNode.imgLimit[2]:SetActive(mapData.nNextRefreshTime > 0 and mapCfg.RefreshType ~= GameEnum.mallPackageRefreshType.None)
if mapCfg.RefreshType == GameEnum.mallPackageRefreshType.None then
NovaAPI.SetTMPText(self._mapNode.txtLimit, orderedFormat(ConfigTable.GetUIText("Mall_Package_Limit") or "", mapData.nCurStock, mapCfg.Stock))
elseif mapCfg.RefreshType == GameEnum.mallPackageRefreshType.Day then
NovaAPI.SetTMPText(self._mapNode.txtLimit, orderedFormat(ConfigTable.GetUIText("Mall_Package_DayLimit") or "", mapData.nCurStock, mapCfg.Stock))
elseif mapCfg.RefreshType == GameEnum.mallPackageRefreshType.Week then
NovaAPI.SetTMPText(self._mapNode.txtLimit, orderedFormat(ConfigTable.GetUIText("Mall_Package_WeekLimit") or "", mapData.nCurStock, mapCfg.Stock))
elseif mapCfg.RefreshType == GameEnum.mallPackageRefreshType.Month then
NovaAPI.SetTMPText(self._mapNode.txtLimit, orderedFormat(ConfigTable.GetUIText("Mall_Package_MonthLimit") or "", mapData.nCurStock, mapCfg.Stock))
end
end
function MallPackageItemCtrl:RefreshInfo(mapCfg)
NovaAPI.SetTMPText(self._mapNode.txtName, mapCfg.Name)
self:SetPngSprite(self._mapNode.imgIcon, mapCfg.Icon)
self:SetPngSprite(self._mapNode.imgBg, mapCfg.IconBg)
self._mapNode.goSaleRate.gameObject:SetActive(mapCfg.SaleRate ~= 0)
if mapCfg.SaleRate ~= 0 then
if mapCfg.SaleRate == -1 then
NovaAPI.SetTMPText(self._mapNode.txtSaleRate, ConfigTable.GetUIText("Mall_Package_Recommend"))
else
NovaAPI.SetTMPText(self._mapNode.txtSaleRate, string.format("%s%%", mapCfg.SaleRate))
end
LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.goSaleRate)
end
end
function MallPackageItemCtrl:RefreshTime(mapCfg, mapData)
local bDisposable = mapCfg.RefreshType == GameEnum.mallPackageRefreshType.None
self._mapNode.goTime.gameObject:SetActive(mapData.nNextRefreshTime > 0 and bDisposable)
if mapData.nNextRefreshTime > 0 and bDisposable then
local sSuffix = mapData.bPrioritizeDeList and ConfigTable.GetUIText("Mall_Package_Delist") or ConfigTable.GetUIText("Mall_Package_Refresh")
local sPrefix
local nRemaining = mapData.nNextRefreshTime - CS.ClientManager.Instance.serverTimeStamp
if nRemaining <= 3600 then
sPrefix = ConfigTable.GetUIText("Mall_Package_WithinHour")
elseif 3600 < nRemaining and nRemaining <= 86400 then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_Hour") or "", math.floor(nRemaining / 3600))
elseif 86400 < nRemaining then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_Day") or "", math.floor(nRemaining / 86400))
end
NovaAPI.SetTMPText(self._mapNode.txtTime, sPrefix .. sSuffix)
end
end
function MallPackageItemCtrl:RefreshCond(mapCfg, mapData)
local tbCond = decodeJson(mapCfg.OrderCondParams)
local bPurchaseAble = PlayerData.Shop:CheckShopCond(mapCfg.OrderCondType, tbCond)
self._mapNode.imgMask:SetActive(mapData.nCurStock == 0 or not bPurchaseAble)
self._mapNode.goCondition:SetActive(not bPurchaseAble)
self._mapNode.goSoldOut:SetActive(mapData.nCurStock == 0)
if not bPurchaseAble then
local sCond = ""
if mapCfg.OrderCondType == GameEnum.shopCond.WorldClassSpecific then
sCond = orderedFormat(ConfigTable.GetUIText("Mall_Cond_WorldClass") or "", tbCond[1])
end
NovaAPI.SetTMPText(self._mapNode.txtCondition, sCond)
end
if mapData.nCurStock == 0 then
local bDisposable = mapCfg.RefreshType == GameEnum.mallPackageRefreshType.None
local bTime = 0 < mapData.nNextRefreshTime and not bDisposable
self._mapNode.imgSoldOut[1]:SetActive(not bTime)
self._mapNode.imgSoldOut[2]:SetActive(bTime)
if 0 < mapData.nNextRefreshTime then
local sPrefix
local nRemaining = mapData.nNextRefreshTime - CS.ClientManager.Instance.serverTimeStamp
if nRemaining <= 3600 then
sPrefix = ConfigTable.GetUIText("Mall_Package_WithinHourRefresh")
elseif 3600 < nRemaining and nRemaining <= 86400 then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_HourRefresh") or "", math.floor(nRemaining / 3600))
elseif 86400 < nRemaining then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_DayRefresh") or "", math.floor(nRemaining / 86400))
end
NovaAPI.SetTMPText(self._mapNode.txtRefreshTime, sPrefix)
end
end
end
function MallPackageItemCtrl:RegisterRedDot()
RedDotManager.RegisterNode(RedDotDefine.FreePackage, self.sId, self._mapNode.reddotPkg)
end
function MallPackageItemCtrl:Awake()
end
function MallPackageItemCtrl:OnEnable()
end
function MallPackageItemCtrl:OnDisable()
end
function MallPackageItemCtrl:OnDestroy()
end
return MallPackageItemCtrl
+24
View File
@@ -0,0 +1,24 @@
local MallPanel = class("MallPanel", BasePanel)
MallPanel._tbDefine = {
{
sPrefabPath = "Mall/MallPanel.prefab",
sCtrlName = "Game.UI.Mall.MallCtrl"
}
}
function MallPanel:Awake()
self.nCurTog = nil
self.nDefaultId = nil
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self.nCurTog = tbParam[1]
self.nDefaultId = tbParam[2]
self.nTabParam = tbParam[3]
end
end
function MallPanel:OnEnable()
end
function MallPanel:OnDisable()
end
function MallPanel:OnDestroy()
end
return MallPanel
+88
View File
@@ -0,0 +1,88 @@
local MallPopupCtrl = class("MallPopupCtrl", BaseCtrl)
MallPopupCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
blur = {
sNodeName = "t_fullscreen_blur_blue"
},
aniBlur = {
sNodeName = "t_fullscreen_blur_blue",
sComponentName = "Animator"
},
btnCloseDatail = {
sNodeName = "snapshot",
sComponentName = "Button",
callback = "OnBtnClick_CloseDetail"
},
PackageDetail = {
sNodeName = "---PackageDetail---",
sCtrlName = "Game.UI.Mall.MallPackageDetailCtrl"
},
ShopDetail = {
sNodeName = "---ShopDetail---",
sCtrlName = "Game.UI.Mall.MallShopDetailCtrl"
}
}
MallPopupCtrl._mapEventConfig = {
MallCloseDetail = "OnBtnClick_CloseDetail",
MallOrderClear = "OnBtnClick_CloseDetail"
}
function MallPopupCtrl:Open()
self._mapNode.blur:SetActive(true)
if self.nType == AllEnum.MallToggle.Package then
self._mapNode.PackageDetail:Refresh(self.mapData)
self._mapNode.TopBar:CreateCoin(self.tbCoin, true)
elseif self.nType == AllEnum.MallToggle.Shop then
self._mapNode.ShopDetail:Refresh(self.mapData, self._mapNode.TopBar)
self._mapNode.TopBar:CreateCoin(self.tbCoin, true)
end
end
function MallPopupCtrl:ClosePackageDetail()
if self._mapNode.PackageDetail.gameObject.activeSelf == false then
return
end
self._mapNode.PackageDetail:PlayOutAni()
self:CloseOther()
end
function MallPopupCtrl:CloseShopDetail()
if self._mapNode.ShopDetail.gameObject.activeSelf == false then
return
end
self._mapNode.ShopDetail:PlayOutAni()
self:CloseOther()
end
function MallPopupCtrl:CloseOther()
self._mapNode.TopBar.gameObject:SetActive(false)
self._mapNode.aniBlur:SetTrigger("tOut")
self:AddTimer(1, 0.2, function()
EventManager.Hit(EventId.ClosePanel, PanelId.MallPopup)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
function MallPopupCtrl:Awake()
self._mapNode.PackageDetail.gameObject:SetActive(false)
self._mapNode.ShopDetail.gameObject:SetActive(false)
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self.nType = tbParam[1]
self.mapData = tbParam[2]
self.tbCoin = tbParam[3]
end
end
function MallPopupCtrl:OnEnable()
self:Open()
end
function MallPopupCtrl:OnDisable()
end
function MallPopupCtrl:OnDestroy()
end
function MallPopupCtrl:OnBtnClick_CloseDetail()
if self.nType == AllEnum.MallToggle.Package then
self:ClosePackageDetail()
elseif self.nType == AllEnum.MallToggle.Shop then
self:CloseShopDetail()
end
end
return MallPopupCtrl
+17
View File
@@ -0,0 +1,17 @@
local MallPopupPanel = class("MallPopupPanel", BasePanel)
MallPopupPanel._bIsMainPanel = false
MallPopupPanel._tbDefine = {
{
sPrefabPath = "Mall/MallPopupPanel.prefab",
sCtrlName = "Game.UI.Mall.MallPopupCtrl"
}
}
function MallPopupPanel:Awake()
end
function MallPopupPanel:OnEnable()
end
function MallPopupPanel:OnDisable()
end
function MallPopupPanel:OnDestroy()
end
return MallPopupPanel
+249
View File
@@ -0,0 +1,249 @@
local MallShopCtrl = class("MallShopCtrl", BaseCtrl)
MallShopCtrl._mapNodeConfig = {
sv = {
sComponentName = "LoopScrollView"
},
cgSv = {
sNodeName = "sv",
sComponentName = "CanvasGroup"
},
tab = {},
trTab = {sComponentName = "Transform"},
svTab = {sComponentName = "ScrollRect"},
goRefresh = {},
txtRefreshCn = {sComponentName = "TMP_Text"},
txtRefreshTime = {sComponentName = "TMP_Text"}
}
MallShopCtrl._mapEventConfig = {MallOrderClear = "Refresh"}
function MallShopCtrl:Refresh(bResetPos)
if self._panel.nCurTog ~= AllEnum.MallToggle.Shop then
return
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgSv, 0)
local callback = function(tbList, nTime)
self:RefreshData(tbList)
self:RefreshTab()
self:RefreshList(bResetPos)
self:SetTimer(nTime)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgSv, 1)
end
PlayerData.Mall:SendMallShopListReq(callback)
end
function MallShopCtrl:RefreshData(tbList)
local tbPage = PlayerData.Mall:GetExchangeShop()
local tbGoodsToPage = {}
for _, v in pairs(tbList) do
local mapCfg = ConfigTable.GetData("MallShop", v.sId)
local nGroupId = mapCfg.GroupId
if not tbGoodsToPage[nGroupId] then
tbGoodsToPage[nGroupId] = {}
end
table.insert(tbGoodsToPage[nGroupId], v)
end
self.tbGoodsPage, self.tbPages = {}, {}
for _, v in pairs(tbPage) do
if tbGoodsToPage[v.Id] then
table.insert(self.tbGoodsPage, tbGoodsToPage[v.Id])
local mapSample = tbGoodsToPage[v.Id][1]
table.insert(self.tbPages, {
Id = v.Id,
Name = v.Name,
ShopCoin = v.ShopCoin,
RefreshTime = mapSample.nNextRefreshTime
})
end
end
self.nPageCount = #self.tbPages
if self._panel.nDefaultId then
for k, v in ipairs(self.tbPages) do
if v.Id == self._panel.nDefaultId then
self.nCurTab = k
self._panel.nDefaultId = nil
break
end
end
end
if not self.tbPages[self.nCurTab] or self.nSelectPage and self.tbPages[self.nCurTab].Id ~= self.nSelectPage then
self.nCurTab = 1
end
self.nSelectPage = self.tbPages[self.nCurTab].Id
end
function MallShopCtrl:RefreshTab()
self._mapNode.svTab.gameObject:SetActive(true)
NovaAPI.SetScrollHorizontal(self._mapNode.svTab, self.nPageCount > 4)
self.ctrlTab = {}
delChildren(self._mapNode.trTab)
for i = 1, self.nPageCount do
local goTab = instantiate(self._mapNode.tab, self._mapNode.trTab)
goTab:SetActive(true)
local btn = goTab.transform:Find("btnTab"):GetComponent("UIButton")
local func_Handler = ui_handler(self, self.OnBtnClick_ChangeSheet, goTab, i)
btn.onClick:AddListener(func_Handler)
self.ctrlTab[i] = self:BindCtrlByNode(goTab, "Game.UI.TemplateEx.TemplateTabCtrl")
self.ctrlTab[i]:SetText(self.tbPages[i].Name)
end
for i = 1, self.nPageCount do
local nState = self:GetTabState(i)
self.ctrlTab[i]:SetSelect(i == self.nCurTab, nState)
EventManager.Hit("MallChangeTopCoin", self.tbPages[self.nCurTab].ShopCoin)
if i == self.nCurTab and 1 < i then
self.ctrlTab[i - 1]:SetLine(false)
end
end
end
function MallShopCtrl:SetTimer(nTime)
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
if 0 < nTime then
self.timer = self:AddTimer(1, nTime, function()
self:Refresh(true)
EventManager.Hit(EventId.CloseMessageBox)
EventManager.Hit("MallCloseDetail")
end, true, true, false)
end
end
function MallShopCtrl:GetTabState(nCurTab)
local nState = 2
if nCurTab == 1 then
nState = 1
elseif nCurTab == self.nPageCount then
nState = 3
end
return nState
end
function MallShopCtrl:RefreshList(bResetPos)
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
local tbCur = self.tbGoodsPage[self.nCurTab]
self._mapNode.sv:SetAnim(0.04)
self._mapNode.sv:Init(#tbCur, self, self.OnGridRefresh, self.OnGridBtnClick, not bResetPos)
local mapShop = self.tbPages[self.nCurTab]
self.nRemainTime = mapShop.RefreshTime == 0 and 0 or mapShop.RefreshTime - CS.ClientManager.Instance.serverTimeStamp
if self.timerCountDown == nil then
self.timerCountDown = self:AddTimer(0, 1, "RefreshTime", false, true, false)
end
if self.nRemainTime > 0 then
self._mapNode.goRefresh:SetActive(true)
self:RefreshTime()
self.timerCountDown:Pause(false)
else
self._mapNode.goRefresh:SetActive(false)
self.timerCountDown:Pause(true)
end
end
function MallShopCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapData = self.tbGoodsPage[self.nCurTab][nIndex]
local nInstanceID = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceID] then
self.tbGridCtrl[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Mall.MallShopItemCtrl")
end
self.tbGridCtrl[nInstanceID]:Refresh(mapData)
end
function MallShopCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapData = self.tbGoodsPage[self.nCurTab][nIndex]
local mapCfg = ConfigTable.GetData("MallShop", mapData.sId)
local tbCoin = mapCfg and {
mapCfg.ExchangeItemId
} or {}
EventManager.Hit(EventId.OpenPanel, PanelId.MallPopup, AllEnum.MallToggle.Shop, mapData, tbCoin)
end
function MallShopCtrl:RefreshTime()
self._mapNode.goRefresh:SetActive(true)
self.nRemainTime = self.nRemainTime - 1
if self.nRemainTime > 0 then
NovaAPI.SetTMPText(self._mapNode.txtRefreshCn, ConfigTable.GetUIText("Shop_NextRefresh"))
local sTime = ""
if self.nRemainTime <= 60 then
local sec = math.floor(self.nRemainTime)
sTime = orderedFormat(ConfigTable.GetUIText("Shop_NextRefresh_Sec") or "", sec)
elseif self.nRemainTime > 60 and self.nRemainTime <= 3600 then
local min = math.floor(self.nRemainTime / 60)
local sec = math.floor(self.nRemainTime - min * 60)
if sec == 0 then
min = min - 1
sec = 60
end
sTime = orderedFormat(ConfigTable.GetUIText("Shop_NextRefresh_Min") or "", min, sec)
elseif self.nRemainTime > 3600 and self.nRemainTime <= 86400 then
local hour = math.floor(self.nRemainTime / 3600)
local min = math.floor((self.nRemainTime - hour * 3600) / 60)
if min == 0 then
hour = hour - 1
min = 60
end
sTime = orderedFormat(ConfigTable.GetUIText("Shop_NextRefresh_Hour") or "", hour, min)
elseif self.nRemainTime > 86400 then
local day = math.floor(self.nRemainTime / 86400)
local hour = math.floor((self.nRemainTime - day * 86400) / 3600)
if hour == 0 then
day = day - 1
hour = 24
end
sTime = orderedFormat(ConfigTable.GetUIText("Shop_NextRefresh_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtRefreshTime, sTime)
else
self.timerCountDown:Pause(true)
end
end
function MallShopCtrl:ResetTab()
if not self.ctrlTab then
return
end
if self.nCurTab and self.nCurTab > 1 then
local nState = self:GetTabState(self.nCurTab)
self.ctrlTab[self.nCurTab]:SetSelect(false, nState)
self.ctrlTab[self.nCurTab - 1]:SetLine(true)
end
self.nCurTab = 1
self.ctrlTab[self.nCurTab]:SetSelect(true, 1)
end
function MallShopCtrl:Awake()
self.tbGridCtrl = {}
self._mapNode.svTab.gameObject:SetActive(false)
self._mapNode.goRefresh:SetActive(false)
end
function MallShopCtrl:OnEnable()
end
function MallShopCtrl:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
if self.ctrlTab then
for nTab, objCtrl in pairs(self.ctrlTab) do
self:UnbindCtrlByNode(objCtrl)
self.ctrlTab[nTab] = nil
end
self.ctrlTab = nil
end
end
function MallShopCtrl:OnDestroy()
end
function MallShopCtrl:OnBtnClick_ChangeSheet(btn, nIndex)
if nIndex == self.nCurTab then
return
end
local nState = self:GetTabState(self.nCurTab)
self.ctrlTab[self.nCurTab]:SetSelect(false, nState)
if self.nCurTab > 1 then
self.ctrlTab[self.nCurTab - 1]:SetLine(true)
end
nState = self:GetTabState(nIndex)
self.ctrlTab[nIndex]:SetSelect(true, nState)
if 1 < nIndex then
self.ctrlTab[nIndex - 1]:SetLine(false)
end
self.nCurTab = nIndex
self.nSelectPage = self.tbPages[self.nCurTab].Id
EventManager.Hit("MallChangeTopCoin", self.tbPages[self.nCurTab].ShopCoin)
self:RefreshList(true)
end
return MallShopCtrl
+303
View File
@@ -0,0 +1,303 @@
local MallShopDetailCtrl = class("MallShopDetailCtrl", BaseCtrl)
MallShopDetailCtrl._mapNodeConfig = {
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Shop_TitleBuy"
},
goItem = {
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btnDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_Detail"
},
txtName = {sComponentName = "TMP_Text"},
txtDesc = {sComponentName = "TMP_Text"},
txtHas = {sComponentName = "TMP_Text"},
txtPriceCn = {
sComponentName = "TMP_Text",
sLanguageId = "Shop_UnitPrice"
},
imgCoin = {nCount = 2, sComponentName = "Image"},
goOrigin = {},
txtOrigin = {sComponentName = "TMP_Text"},
txtPrice = {sComponentName = "TMP_Text"},
imgDiscount = {},
txtDiscount = {
sComponentName = "TMP_Text",
sLanguageId = "Shop_Discount"
},
txtStock = {sComponentName = "TMP_Text"},
goStock = {},
txtBtnBuy = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Shop_Btn_Buy"
},
txtCoinCount = {sComponentName = "TMP_Text"},
btnBuy = {
sComponentName = "UIButton",
callback = "OnBtnClick_Buy"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
btnBuy2 = {
sComponentName = "UIButton",
callback = "OnBtnClick_Disable"
},
txtDisable = {sComponentName = "TMP_Text"},
goQuantitySelector = {
sNodeName = "tc_quantity_selector",
sCtrlName = "Game.UI.TemplateEx.TemplateQuantitySelectorCtrl"
}
}
MallShopDetailCtrl._mapEventConfig = {}
function MallShopDetailCtrl:Refresh(mapData, topbar)
self.mapData = mapData
self.mapCfg = ConfigTable.GetData("MallShop", mapData.sId)
self:PlayInAni()
self:RefreshInfo()
self:RefreshPrice()
self:RefreshBuyState()
self:RefreshBuyCount()
self.TopBar = topbar
end
function MallShopDetailCtrl:RefreshInfo()
local mapItemCfg = ConfigTable.GetData_Item(self.mapCfg.ItemId)
if not mapItemCfg then
return
end
NovaAPI.SetTMPText(self._mapNode.txtName, self.mapCfg.Name)
self._mapNode.goItem:SetItem(self.mapCfg.ItemId, nil, self.mapCfg.ItemQty, nil, nil, nil, nil, true)
if mapItemCfg.Type == GameEnum.itemType.Disc or mapItemCfg.Type == GameEnum.itemType.Char or mapItemCfg.Type == GameEnum.itemType.CharacterSkin then
self._mapNode.txtHas.gameObject:SetActive(false)
else
self._mapNode.txtHas.gameObject:SetActive(true)
local nCount = PlayerData.Item:GetItemCountByID(self.mapCfg.ItemId)
if 999999 < nCount then
local nFloor = math.floor(nCount / 100)
local nK = string.format("%.0f", nFloor / 10)
local sCount = nK .. "k"
NovaAPI.SetTMPText(self._mapNode.txtHas, ConfigTable.GetUIText("Shop_Has") .. sCount)
else
NovaAPI.SetTMPText(self._mapNode.txtHas, ConfigTable.GetUIText("Shop_Has") .. nCount)
end
end
NovaAPI.SetTMPText(self._mapNode.txtDesc, self.mapCfg.Desc)
local bLimit = self.mapCfg.Stock > 0
if bLimit then
local nLeft = self.mapData.nCurStock
NovaAPI.SetTMPText(self._mapNode.txtStock, orderedFormat(ConfigTable.GetUIText("Shop_Stock"), nLeft))
NovaAPI.SetTMPColor(self._mapNode.txtStock, nLeft == 0 and Red_Unable or Blue_Dark)
else
NovaAPI.SetTMPText(self._mapNode.txtStock, ConfigTable.GetUIText("Shop_Unlimited"))
NovaAPI.SetTMPColor(self._mapNode.txtStock, Blue_Dark)
end
self._mapNode.btnDetail.interactable = mapItemCfg and (mapItemCfg.Stype == GameEnum.itemStype.Disc or mapItemCfg.Stype == GameEnum.itemStype.Char or mapItemCfg.Stype == GameEnum.itemStype.RandomPackage or mapItemCfg.Stype == GameEnum.itemStype.ComCYO or mapItemCfg.Stype == GameEnum.itemStype.OutfitCYO)
end
function MallShopDetailCtrl:RefreshPrice()
for i = 1, 2 do
self:SetSprite_Coin(self._mapNode.imgCoin[i], self.mapCfg.ExchangeItemId)
end
NovaAPI.SetTMPText(self._mapNode.txtPrice, self.mapCfg.ExchangeItemQty)
end
function MallShopDetailCtrl:RefreshBuyCount()
local nCost = self.nBuyCount * self.mapCfg.ExchangeItemQty
NovaAPI.SetTMPText(self._mapNode.txtCoinCount, nCost)
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapCfg.ExchangeItemId)
NovaAPI.SetTMPColor(self._mapNode.txtCoinCount, nCost > nHasCoin and Red_Unable or Blue_Normal)
end
function MallShopDetailCtrl:RefreshBuyState()
local tbCond = decodeJson(self.mapCfg.OrderCondParams)
local bPurchaseAble = PlayerData.Shop:CheckShopCond(self.mapCfg.OrderCondType, tbCond)
local bAble = bPurchaseAble and (self.mapData.nCurStock > 0 or self.mapCfg.Stock == 0)
self._mapNode.btnBuy.gameObject:SetActive(bAble)
self._mapNode.btnBuy2.gameObject:SetActive(not bAble)
self._mapNode.txtDisable.gameObject:SetActive(not bAble)
self.nBuyCount = bAble and 1 or 0
local nMax = self:CountMaxBuy()
local callback = function(nCount)
self.nBuyCount = nCount
self:RefreshBuyCount()
end
self._mapNode.goQuantitySelector:Init(callback, self.nBuyCount, nMax)
local sDisable = ""
if not bPurchaseAble then
if self.mapCfg.OrderCondType == GameEnum.shopCond.WorldClassSpecific then
sDisable = orderedFormat(ConfigTable.GetUIText("Shop_Cond_WorldClassShort") or "", tbCond[1])
end
self.sDisableTip = ConfigTable.GetUIText("Shop_Condition")
elseif self.mapData.nCurStock == 0 then
sDisable = ConfigTable.GetUIText("Shop_Cond_SoldOutShort") or ""
self.sDisableTip = ConfigTable.GetUIText("Shop_GoodsEmpty")
end
NovaAPI.SetTMPText(self._mapNode.txtDisable, sDisable)
end
function MallShopDetailCtrl:CountMaxBuy()
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapCfg.ExchangeItemId)
local nMax = math.floor(nHasCoin / self.mapCfg.ExchangeItemQty)
if nMax == 0 then
return 1
end
if 0 < self.mapCfg.Stock then
local nRemain = self.mapData.nCurStock
return nMax > nRemain and nRemain or nMax
else
return nMax
end
end
function MallShopDetailCtrl:PlayInAni()
self.gameObject:SetActive(true)
self.ani:Play("t_window_04_t_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function MallShopDetailCtrl:PlayOutAni()
self.ani:Play("t_window_04_t_out")
self:AddTimer(1, 0.2, "Close", true, true, true)
end
function MallShopDetailCtrl:Close()
self.gameObject:SetActive(false)
end
function MallShopDetailCtrl:Awake()
self.ani = self.gameObject.transform:GetComponent("Animator")
end
function MallShopDetailCtrl:OnEnable()
end
function MallShopDetailCtrl:OnDisable()
end
function MallShopDetailCtrl:OnDestroy()
end
function MallShopDetailCtrl:OnBtnClick_Buy()
local nCost = self.nBuyCount * self.mapCfg.ExchangeItemQty
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapCfg.ExchangeItemId)
local sName = ConfigTable.GetData_Item(self.mapCfg.ExchangeItemId).Title
if nCost > nHasCoin then
if self.mapCfg.ExchangeItemId == AllEnum.CoinItemId.Jade then
local needCount = nCost - nHasCoin
local sTips1 = orderedFormat(ConfigTable.GetUIText("Recruit_ExchangeGemZero") or "", ConfigTable.GetData_Item(AllEnum.CoinItemId.Jade).Id, needCount, ConfigTable.GetData_Item(AllEnum.CoinItemId.STONE).Id)
local cancelCallback = function()
EventManager.Hit("TopRes", false, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade
}, true)
end
local confirmCallback = function()
local nCurStoneCount = PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.STONE)
nCurStoneCount = nCurStoneCount + PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.FREESTONE)
if nCurStoneCount >= needCount then
local successCallback = function()
EventManager.Hit("TopRes", false, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade
}, true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self:Refresh(self.mapData)
end
cs_coroutine.start(wait)
end
PlayerData.Coin:SendGemConvertReqReq(needCount, successCallback)
else
local sTips2 = orderedFormat(ConfigTable.GetUIText("Recruit_Charge") or "", ConfigTable.GetData_Item(AllEnum.CoinItemId.STONE).Id)
local confirmCallbackExchange = function()
EventManager.Hit("TopRes", false, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade
})
EventManager.Hit("MallCloseDetail")
EventManager.Hit("OpenMallTog", AllEnum.MallToggle.Gem)
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTips2,
callbackConfirm = confirmCallbackExchange,
callbackCancel = cancelCallback
}
EventManager.Hit(EventId.OpenMessageBox, msg)
EventManager.Hit("TopRes", true, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade,
AllEnum.CoinItemId.STONE
})
end
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTips1,
callbackConfirm = confirmCallback,
callbackCancel = cancelCallback,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
EventManager.Hit("TopRes", true, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade,
AllEnum.CoinItemId.STONE
})
return
end
EventManager.Hit(EventId.OpenMessageBox, orderedFormat(ConfigTable.GetUIText("Shop_NotEnough") or "", sName))
return
end
local buy = function()
PlayerData.Mall:SendMallShopOrderReq(self.mapData.sId, self.nBuyCount)
end
local buy_confirm = function()
local nAll = self.mapCfg.ItemQty * self.nBuyCount
local sTip = 1 < nAll and orderedFormat(ConfigTable.GetUIText("Shop_MultiBuyComfirm"), nCost, sName, nAll, self.mapCfg.Name) or orderedFormat(ConfigTable.GetUIText("Shop_BuyComfirm"), nCost, sName, self.mapCfg.Name)
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTip,
callbackConfirm = buy,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
local mapCfg = ConfigTable.GetData_Item(self.mapCfg.ItemId)
local sTip
if mapCfg.Type == GameEnum.itemType.Disc then
sTip = PlayerData.Item:GetDiscHoldingState(self.mapCfg.ItemId, self.nBuyCount)
elseif mapCfg.Type == GameEnum.itemType.Char then
sTip = PlayerData.Item:GetCharHoldingState(self.mapCfg.ItemId, self.nBuyCount)
elseif mapCfg.Stype == GameEnum.itemStype.CharShard then
local nCharId = PlayerData.Talent:GetFragmentsToChar(self.mapCfg.ItemId)
sTip = PlayerData.Item:GetCharHoldingState(nCharId, 0, self.nBuyCount)
end
if sTip then
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTip,
callbackConfirm = buy_confirm,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
else
buy_confirm()
end
end
function MallShopDetailCtrl:OnBtnClick_Close()
EventManager.Hit("MallCloseDetail")
end
function MallShopDetailCtrl:OnBtnClick_Detail()
local mapCfg = ConfigTable.GetData_Item(self.mapCfg.ItemId)
if not mapCfg then
return
end
if mapCfg.Stype == GameEnum.itemStype.Disc then
EventManager.Hit(EventId.OpenPanel, PanelId.DiscSample, self.mapCfg.ItemId)
elseif mapCfg.Stype == GameEnum.itemStype.Char then
EventManager.Hit(EventId.OpenPanel, PanelId.CharBgTrialPanel, PanelId.CharInfoTrial, self.mapCfg.ItemId)
elseif mapCfg.Stype == GameEnum.itemStype.RandomPackage or mapCfg.Stype == GameEnum.itemStype.ComCYO then
local tbDetailItem, sDetailTitle = PlayerData.Item:GetCYODisplayItem(self.mapCfg.ItemId)
local msg = {
nType = AllEnum.MessageBox.ItemList,
tbItem = tbDetailItem,
sTitle = sDetailTitle,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
elseif mapCfg.Stype == GameEnum.itemStype.OutfitCYO then
EventManager.Hit(EventId.OpenPanel, PanelId.DiscPreview, self.mapCfg.ItemId)
end
end
function MallShopDetailCtrl:OnBtnClick_Disable()
EventManager.Hit(EventId.OpenMessageBox, self.sDisableTip)
end
return MallShopDetailCtrl
+101
View File
@@ -0,0 +1,101 @@
local MallShopItemCtrl = class("MallShopItemCtrl", BaseCtrl)
MallShopItemCtrl._mapNodeConfig = {
imgRare = {sComponentName = "Image"},
imgDiscount = {},
txtDiscount = {
sComponentName = "TMP_Text",
sLanguageId = "Shop_Discount"
},
imgLeft = {},
txtLeft = {sComponentName = "TMP_Text"},
imgTime = {},
txtLeftTime = {sComponentName = "TMP_Text"},
txtName = {sComponentName = "TMP_Text"},
imgIcon = {sComponentName = "Image"},
txtCount = {sComponentName = "TMP_Text"},
imgCoin = {sComponentName = "Image"},
goOrigin = {},
txtOrigin = {sComponentName = "TMP_Text"},
txtPrice = {sComponentName = "TMP_Text"},
imgMask = {},
goRestock = {},
txtRestock = {
sComponentName = "TMP_Text",
sLanguageId = "Shop_Restock"
},
goCondition = {},
txtCondition = {sComponentName = "TMP_Text"}
}
MallShopItemCtrl._mapEventConfig = {}
function MallShopItemCtrl:Refresh(mapData)
local mapCfg = ConfigTable.GetData("MallShop", mapData.sId)
self:RefreshInfo(mapCfg, mapData)
self:RefreshPrice(mapCfg)
self:RefreshLimit(mapCfg, mapData)
end
function MallShopItemCtrl:RefreshInfo(mapCfg, mapData)
local mapItemCfg = ConfigTable.GetData_Item(mapCfg.ItemId)
NovaAPI.SetTMPText(self._mapNode.txtName, mapCfg.Name)
if mapItemCfg.Type == GameEnum.itemType.Disc then
self:SetPngSprite(self._mapNode.imgIcon, mapItemCfg.Icon .. AllEnum.OutfitIconSurfix.Item)
else
self:SetPngSprite(self._mapNode.imgIcon, mapItemCfg.Icon)
end
local sPath = AllEnum.FrameType_New.MallGoods .. AllEnum.FrameColor_New[mapItemCfg.Rarity]
self:SetAtlasSprite(self._mapNode.imgRare, "12_rare", sPath)
local bLimit = mapCfg.Stock > 0
if bLimit then
NovaAPI.SetTMPText(self._mapNode.txtLeft, orderedFormat(ConfigTable.GetUIText("Shop_Left"), mapData.nCurStock))
else
NovaAPI.SetTMPText(self._mapNode.txtLeft, orderedFormat(ConfigTable.GetUIText("Shop_Left"), ConfigTable.GetUIText("Shop_Unlimited")))
end
NovaAPI.SetTMPText(self._mapNode.txtCount, orderedFormat(ConfigTable.GetUIText("Shop_GoodsItem_Count"), mapCfg.ItemQty))
end
function MallShopItemCtrl:RefreshPrice(mapCfg)
self:SetSprite_Coin(self._mapNode.imgCoin, mapCfg.ExchangeItemId)
NovaAPI.SetTMPText(self._mapNode.txtPrice, mapCfg.ExchangeItemQty)
end
function MallShopItemCtrl:RefreshTime(mapData)
self._mapNode.imgTime:SetActive(mapData.bPrioritizeDeList)
if not mapData.bPrioritizeDeList then
return
end
local sTime
local nRemaining = mapData.nNextRefreshTime - CS.ClientManager.Instance.serverTimeStamp
if nRemaining <= 3600 and 0 < nRemaining then
sTime = ConfigTable.GetUIText("Shop_WithinHour")
elseif 3600 < nRemaining and nRemaining <= 86400 then
sTime = orderedFormat(ConfigTable.GetUIText("Shop_Hour") or "", math.floor(nRemaining / 3600))
elseif 86400 < nRemaining then
sTime = orderedFormat(ConfigTable.GetUIText("Shop_Day") or "", math.floor(nRemaining / 86400))
end
NovaAPI.SetTMPText(self._mapNode.txtLeftTime, sTime)
end
function MallShopItemCtrl:RefreshLimit(mapCfg, mapData)
local tbCond = decodeJson(mapCfg.OrderCondParams)
local bPurchaseAble = PlayerData.Shop:CheckShopCond(mapCfg.OrderCondType, tbCond)
self._mapNode.imgMask:SetActive(mapData.nCurStock == 0 or not bPurchaseAble)
if mapData.nCurStock == 0 then
self._mapNode.goRestock:SetActive(true)
self._mapNode.goCondition:SetActive(false)
return
end
self._mapNode.goRestock:SetActive(false)
self._mapNode.goCondition:SetActive(true)
if not bPurchaseAble then
local sCond = ""
if mapCfg.OrderCondType == GameEnum.shopCond.WorldClassSpecific then
sCond = orderedFormat(ConfigTable.GetUIText("Mall_Cond_WorldClass") or "", tbCond[1])
end
NovaAPI.SetTMPText(self._mapNode.txtCondition, sCond)
end
end
function MallShopItemCtrl:Awake()
end
function MallShopItemCtrl:OnEnable()
end
function MallShopItemCtrl:OnDisable()
end
function MallShopItemCtrl:OnDestroy()
end
return MallShopItemCtrl
+217
View File
@@ -0,0 +1,217 @@
local MallSkinCtrl = class("MallSkinCtrl", BaseCtrl)
MallSkinCtrl._mapNodeConfig = {
sv = {
sComponentName = "LoopScrollView"
},
cgSv = {
sNodeName = "sv",
sComponentName = "CanvasGroup"
},
tab = {},
trTab = {sComponentName = "Transform"},
svTab = {sComponentName = "ScrollRect"},
goEmpty = {},
txtSkinEmpty = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Skin_Empty"
}
}
MallSkinCtrl._mapEventConfig = {MallOrderClear = "Refresh"}
function MallSkinCtrl:Refresh(bResetPos)
if self._panel.nCurTog ~= AllEnum.MallToggle.Skin then
return
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgSv, 0)
local callback = function(tbList, nTime)
self:RefreshData(tbList)
self:RefreshTab()
self:RefreshList(bResetPos)
self:SetTimer(nTime)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgSv, 1)
end
PlayerData.Mall:SendMallPackageListReq(callback)
end
function MallSkinCtrl:RefreshData(tbList)
local tbPage = PlayerData.Mall:GetPackagePage(GameEnum.MallItemType.Skin)
local tbAllList = {}
local tbPackageToPage = {}
for _, v in pairs(tbList) do
local mapCfg = ConfigTable.GetData("MallPackage", v.sId)
if mapCfg.Tag == GameEnum.MallItemType.Skin then
local nGroupId = mapCfg.GroupId
if not tbPackageToPage[nGroupId] then
tbPackageToPage[nGroupId] = {}
end
table.insert(tbPackageToPage[nGroupId], v)
table.insert(tbAllList, v)
end
end
self.tbPackagePage, self.tbPages = {}, {}
table.insert(self.tbPackagePage, tbAllList)
self.tbPages[1] = {
Id = 0,
Name = ConfigTable.GetUIText("Mall_Package_TabAll")
}
for _, v in pairs(tbPage) do
if tbPackageToPage[v.Id] then
table.insert(self.tbPackagePage, tbPackageToPage[v.Id])
table.insert(self.tbPages, v)
end
end
self.nPageCount = #self.tbPages
if self._panel.nDefaultId then
for k, v in ipairs(self.tbPages) do
if v.Id == self._panel.nDefaultId then
self.nCurTab = k
self._panel.nDefaultId = nil
break
end
end
end
if not self.tbPages[self.nCurTab] or self.nSelectPage and self.tbPages[self.nCurTab].Id ~= self.nSelectPage then
self.nCurTab = 1
end
self.nSelectPage = self.tbPages[self.nCurTab].Id
end
function MallSkinCtrl:RefreshList(bResetPos)
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbCurList = self.tbPackagePage[self.nCurTab] or {}
if #self.tbCurList == 0 then
self._mapNode.goEmpty.gameObject:SetActive(true)
self._mapNode.sv.gameObject:SetActive(false)
self._mapNode.svTab.gameObject:SetActive(false)
else
self._mapNode.goEmpty.gameObject:SetActive(false)
self._mapNode.sv.gameObject:SetActive(true)
self._mapNode.svTab.gameObject:SetActive(true)
self._mapNode.sv:SetAnim(0.04)
self._mapNode.sv:Init(#self.tbCurList, self, self.OnGridRefresh, self.OnGridBtnClick, not bResetPos)
end
end
function MallSkinCtrl:RefreshTab()
NovaAPI.SetScrollHorizontal(self._mapNode.svTab, self.nPageCount > 4)
self.ctrlTab = {}
delChildren(self._mapNode.trTab)
for i = 1, self.nPageCount do
local goTab = instantiate(self._mapNode.tab, self._mapNode.trTab)
goTab:SetActive(true)
local btn = goTab.transform:Find("btnTab"):GetComponent("UIButton")
local func_Handler = ui_handler(self, self.OnBtnClick_ChangeSheet, goTab, i)
btn.onClick:AddListener(func_Handler)
self.ctrlTab[i] = self:BindCtrlByNode(goTab, "Game.UI.TemplateEx.TemplateTabCtrl")
self.ctrlTab[i]:SetText(self.tbPages[i].Name)
end
for i = 1, self.nPageCount do
local nState = self:GetTabState(i)
self.ctrlTab[i]:SetSelect(i == self.nCurTab, nState)
if i == self.nCurTab and 1 < i then
self.ctrlTab[i - 1]:SetLine(false)
end
end
end
function MallSkinCtrl:SetTimer(nTime)
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
if 0 < nTime then
self.timer = self:AddTimer(1, nTime, function()
self:Refresh(true)
EventManager.Hit("MallCloseDetail")
end, true, true, false)
end
end
function MallSkinCtrl:GetTabState(nCurTab)
local nState = 2
if nCurTab == 1 then
nState = 1
elseif nCurTab == self.nPageCount then
nState = 3
end
return nState
end
function MallSkinCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapData = self.tbPackagePage[self.nCurTab][nIndex]
local nInstanceID = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceID] then
self.tbGridCtrl[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Mall.MallSkinItemCtrl")
end
self.tbGridCtrl[nInstanceID]:Refresh(mapData)
end
function MallSkinCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapData = self.tbPackagePage[self.nCurTab][nIndex]
local mapCfg = ConfigTable.GetData("MallPackage", mapData.sId)
if not mapCfg then
return
end
local tbParam = decodeJson(mapCfg.Items)
local nSkinId = 0
for nId, v in pairs(tbParam) do
nSkinId = tonumber(nId)
break
end
local func = function()
EventManager.Hit(EventId.OpenPanel, PanelId.MallSkinPreview, self.tbCurList, nSkinId, nIndex)
end
EventManager.Hit(EventId.SetTransition, 5, func)
end
function MallSkinCtrl:ResetTab()
if not self.ctrlTab then
return
end
if self.nCurTab and self.nCurTab > 1 then
local nState = self:GetTabState(self.nCurTab)
self.ctrlTab[self.nCurTab]:SetSelect(false, nState)
self.ctrlTab[self.nCurTab - 1]:SetLine(true)
end
self.nCurTab = 1
self.ctrlTab[self.nCurTab]:SetSelect(true, 1)
end
function MallSkinCtrl:Awake()
self.tbGridCtrl = {}
self._mapNode.goEmpty.gameObject:SetActive(false)
self._mapNode.sv.gameObject:SetActive(false)
self._mapNode.svTab.gameObject:SetActive(false)
end
function MallSkinCtrl:OnEnable()
end
function MallSkinCtrl:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
if self.ctrlTab then
for nTab, objCtrl in pairs(self.ctrlTab) do
self:UnbindCtrlByNode(objCtrl)
self.ctrlTab[nTab] = nil
end
self.ctrlTab = nil
end
end
function MallSkinCtrl:OnDestroy()
end
function MallSkinCtrl:OnBtnClick_ChangeSheet(btn, nIndex)
if nIndex == self.nCurTab then
return
end
local nState = self:GetTabState(self.nCurTab)
self.ctrlTab[self.nCurTab]:SetSelect(false, nState)
if self.nCurTab > 1 then
self.ctrlTab[self.nCurTab - 1]:SetLine(true)
end
nState = self:GetTabState(nIndex)
self.ctrlTab[nIndex]:SetSelect(true, nState)
if 1 < nIndex then
self.ctrlTab[nIndex - 1]:SetLine(false)
end
self.nCurTab = nIndex
self.nSelectPage = self.tbPages[self.nCurTab].Id
self:RefreshList(true)
end
return MallSkinCtrl
+155
View File
@@ -0,0 +1,155 @@
local MallSkinItemCtrl = class("MallSkinItemCtrl", BaseCtrl)
local LayoutRebuilder = CS.UnityEngine.UI.LayoutRebuilder
local ClientManager = CS.ClientManager.Instance
MallSkinItemCtrl._mapNodeConfig = {
txtName = {sComponentName = "TMP_Text"},
imgSkin = {sComponentName = "Image"},
goTime = {},
txtTime = {sComponentName = "TMP_Text"},
goNormalPrice = {},
goCurrency = {},
imgCurrency = {sComponentName = "Image"},
txtPrice = {sComponentName = "TMP_Text"},
txtSalePrice = {sComponentName = "TMP_Text"},
txtHas = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Skin_Unlock"
},
goSale = {},
txtSale = {sComponentName = "TMP_Text"},
img2D = {},
img3D = {},
imgCG = {},
imgBGM = {},
goSaleRate = {
sComponentName = "RectTransform"
},
txtSaleRate = {sComponentName = "TMP_Text"},
imgMask = {},
reddotPkg = {},
imgRoleBg = {},
txtRoleName = {sComponentName = "TMP_Text"}
}
MallSkinItemCtrl._mapEventConfig = {}
function MallSkinItemCtrl:Refresh(mapData)
local mapCfg = ConfigTable.GetData("MallPackage", mapData.sId)
self.sId = mapData.sId
self:RefreshInfo(mapCfg)
self:RefreshPrice(mapCfg)
self:RefreshTime(mapCfg, mapData)
end
function MallSkinItemCtrl:RefreshPrice(mapCfg)
local tbParam = decodeJson(mapCfg.Items)
local nSkinId = 0
for nId, v in pairs(tbParam) do
nSkinId = tonumber(nId)
break
end
self._mapNode.imgRoleBg.gameObject:SetActive(false)
local mapSkinCfg = ConfigTable.GetData_CharacterSkin(nSkinId)
if mapSkinCfg ~= nil then
local nCharId = mapSkinCfg.CharId
local mapCharCfg = ConfigTable.GetData_Character(nCharId)
if mapCharCfg ~= nil then
self._mapNode.imgRoleBg.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtRoleName, mapCharCfg.Name)
end
end
self.bUnlock = PlayerData.CharSkin:CheckSkinUnlock(nSkinId)
self._mapNode.goNormalPrice.gameObject:SetActive(not self.bUnlock)
self._mapNode.txtHas.gameObject:SetActive(self.bUnlock)
self._mapNode.goSale.gameObject:SetActive(false)
if not self.bUnlock then
local bSale = mapCfg.IsSaleSkin
if bSale then
local nDeListTime = PlayerData.Shop:ChangeToTimeStamp(mapCfg.DeListTime)
local nCurTime = ClientManager.serverTimeStamp
local nTime = nDeListTime - nCurTime
if 0 < nTime then
self._mapNode.goSale.gameObject:SetActive(true)
local sTimeStr = self:GetTimeStr(nTime)
NovaAPI.SetTMPText(self._mapNode.txtSale, orderedFormat(ConfigTable.GetUIText("Mall_Skin_Sale_End"), sTimeStr))
end
end
self._mapNode.txtSalePrice.gameObject:SetActive(0 < mapCfg.BasePrice)
if mapCfg.CurrencyType == GameEnum.currencyType.Cash then
self._mapNode.goCurrency:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, tostring(mapCfg.CurrencyShowPrice))
NovaAPI.SetTMPText(self._mapNode.txtSalePrice, tostring(mapCfg.CurrencyShowBasePrice))
elseif mapCfg.CurrencyType == GameEnum.currencyType.Item then
self._mapNode.goCurrency:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtPrice, mapCfg.CurrencyItemQty)
NovaAPI.SetTMPText(self._mapNode.txtSalePrice, mapCfg.BasePrice)
self:SetPngSprite(self._mapNode.imgCurrency, ConfigTable.GetData_Item(mapCfg.CurrencyItemId).Icon2)
elseif mapCfg.CurrencyType == GameEnum.currencyType.Free then
self._mapNode.goCurrency:SetActive(false)
self._mapNode.txtSalePrice:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, ConfigTable.GetUIText("Mall_Package_Free"))
end
end
end
function MallSkinItemCtrl:RefreshInfo(mapCfg)
NovaAPI.SetTMPText(self._mapNode.txtName, mapCfg.Name)
self:SetPngSprite(self._mapNode.imgSkin, mapCfg.Icon)
self._mapNode.goSaleRate.gameObject:SetActive(mapCfg.SaleRate ~= 0)
if mapCfg.SaleRate ~= 0 then
if mapCfg.SaleRate == -1 then
NovaAPI.SetTMPText(self._mapNode.txtSaleRate, ConfigTable.GetUIText("Mall_Package_Recommend"))
else
NovaAPI.SetTMPText(self._mapNode.txtSaleRate, string.format("%s%%", mapCfg.SaleRate))
end
LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.goSaleRate)
end
self._mapNode.img2D.gameObject:SetActive(false)
self._mapNode.img3D.gameObject:SetActive(false)
self._mapNode.imgBGM.gameObject:SetActive(false)
self._mapNode.imgCG.gameObject:SetActive(false)
for k, v in ipairs(mapCfg.ContentIcon) do
if v == GameEnum.skinExtraTag.TWOD then
self._mapNode.img2D.gameObject:SetActive(true)
elseif v == GameEnum.skinExtraTag.MODEL then
self._mapNode.img3D.gameObject:SetActive(true)
elseif v == GameEnum.skinExtraTag.MUSIC then
self._mapNode.imgBGM.gameObject:SetActive(true)
elseif v == GameEnum.skinExtraTag.IMAGE then
self._mapNode.imgCG.gameObject:SetActive(true)
end
end
end
function MallSkinItemCtrl:GetTimeStr(nRemainTime)
local str = ""
if nRemainTime <= 3600 then
str = ConfigTable.GetUIText("Mall_Package_WithinHour")
elseif 3600 < nRemainTime and nRemainTime <= 86400 then
str = orderedFormat(ConfigTable.GetUIText("Mall_Package_Hour") or "", math.floor(nRemainTime / 3600))
elseif 86400 < nRemainTime then
str = orderedFormat(ConfigTable.GetUIText("Mall_Package_Day") or "", math.floor(nRemainTime / 86400))
end
return str
end
function MallSkinItemCtrl:RefreshTime(mapCfg, mapData)
local nDeListTime = 0
if mapCfg.ProDeListTime ~= nil and mapCfg.ProDeListTime ~= "" then
self._mapNode.goTime:SetActive(true)
nDeListTime = PlayerData.Shop:ChangeToTimeStamp(mapCfg.ProDeListTime)
local bDisposable = mapCfg.RefreshType == GameEnum.mallPackageRefreshType.None
self._mapNode.goTime.gameObject:SetActive(0 < mapData.nNextRefreshTime and bDisposable and not self.bUnlock)
if 0 < mapData.nNextRefreshTime and bDisposable then
local sSuffix = ConfigTable.GetUIText("Mall_Package_Delist")
local nRemaining = nDeListTime - CS.ClientManager.Instance.serverTimeStamp
local sPrefix = self:GetTimeStr(nRemaining)
NovaAPI.SetTMPText(self._mapNode.txtTime, sPrefix .. sSuffix)
end
else
self._mapNode.goTime:SetActive(false)
end
end
function MallSkinItemCtrl:Awake()
end
function MallSkinItemCtrl:OnEnable()
end
function MallSkinItemCtrl:OnDisable()
end
function MallSkinItemCtrl:OnDestroy()
end
return MallSkinItemCtrl
+607
View File
@@ -0,0 +1,607 @@
local MallSkinPreviewCtrl = class("MallSkinPreviewCtrl", BaseCtrl)
local PlayerCharData = PlayerData.Char
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local SkinData = require("GameCore.Data.DataClass.SkinData")
local Animator = CS.UnityEngine.Animator
local typeof = typeof
local ClientManager = CS.ClientManager.Instance
MallSkinPreviewCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
rawImgActor2D = {
sNodeName = "----Actor2D----",
sComponentName = "RawImage"
},
rtRawImgActor2D = {
sNodeName = "----Actor2D----",
sComponentName = "RectTransform"
},
eventSkinDrag = {
sNodeName = "btnSkin",
sComponentName = "UIDrag",
callback = "OnUIDrag_Drag"
},
eventSkinZoom = {
sNodeName = "btnSkin",
sComponentName = "UIZoom",
callback = "OnUIZoom_Skin"
},
btnSkin = {
sComponentName = "Button",
callback = "OnBtnClick_Skin"
},
goSkinDesc = {},
txtSkinDesc = {sComponentName = "TMP_Text"},
goTheme = {},
imgTheme = {sComponentName = "Image"},
txtTheme = {sComponentName = "TMP_Text"},
goPreview = {},
btnFullScene = {
sComponentName = "UIButton",
callback = "OnBtnClick_FullScene"
},
btnSwitchModel = {
sComponentName = "UIButton",
callback = "OnBtnClick_SwitchModel"
},
goPortrait = {},
go3D = {},
sv = {
sComponentName = "LoopScrollView"
},
trSv = {sNodeName = "sv", sComponentName = "Transform"},
txtSkinName = {sComponentName = "TMP_Text"},
imgRoleBg = {},
txtRoleName = {sComponentName = "TMP_Text"},
btnReplace = {
sComponentName = "UIButton",
callback = "OnBtnClick_Replace"
},
txtBtnReplace = {
sComponentName = "TMP_Text",
sLanguageId = "Skin_Replace"
},
btnBuy = {
sComponentName = "UIButton",
callback = "OnBtnClick_Buy"
},
txtSaleTip = {sComponentName = "TMP_Text"},
goCurrency = {},
imgCurrency = {sComponentName = "Image"},
txtPrice = {sComponentName = "TMP_Text"},
txtSalePrice = {sComponentName = "TMP_Text"},
imgEquipped = {},
txtSkinEquipped = {
sComponentName = "TMP_Text",
sLanguageId = "Skin_Equipped"
},
txtSkinHas = {sComponentName = "TMP_Text", sLanguageId = "Skin_Has"},
txtTips = {
sComponentName = "TMP_Text",
sLanguageId = "Skin_UnUsed_Tip"
},
btnSwitchHalf = {
sComponentName = "UIButton",
callback = "OnBtnClick_SwitchHalf"
},
txtPortrait = {
sComponentName = "TMP_Text",
sLanguageId = "CharacterSkin_Portrait"
},
txt3D = {
sComponentName = "TMP_Text",
sLanguageId = "CharacterSkin_3D"
},
goLeft = {sNodeName = "---Left---"},
goRight = {
sNodeName = "---Right---"
},
canvasGroupRight = {
sNodeName = "---Right---",
sComponentName = "CanvasGroup"
},
UIParallax3DStage = {
sComponentName = "UIParallaxStageCameraController"
},
aniSafeAreaRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "Animator"
},
aniArrow = {sNodeName = "goArrow", sComponentName = "Animator"},
topBarAnim = {sNodeName = "goBack", sComponentName = "Animator"}
}
MallSkinPreviewCtrl._mapEventConfig = {
[EventId.UIBackConfirm] = "OnBtnClick_Back",
[EventId.UIHomeConfirm] = "OnBtnClick_Home",
MallOrderClear = "OnEvent_BuyMallPackageSuccess"
}
local show_mode_2d = 1
local show_mode_3d = 2
function MallSkinPreviewCtrl:SortSkinList()
table.sort(self.tbSkinList, function(a, b)
return a.nId < b.nId
end)
end
function MallSkinPreviewCtrl:GetTimeStr(nRemainTime)
local str = ""
if nRemainTime <= 3600 then
str = ConfigTable.GetUIText("Mall_Package_WithinHour")
elseif 3600 < nRemainTime and nRemainTime <= 86400 then
str = orderedFormat(ConfigTable.GetUIText("Mall_Package_Hour") or "", math.floor(nRemainTime / 3600))
elseif 86400 < nRemainTime then
str = orderedFormat(ConfigTable.GetUIText("Mall_Package_Day") or "", math.floor(nRemainTime / 86400))
end
return str
end
function MallSkinPreviewCtrl:RefreshSelectSkinInfo()
local skinData = self.tbSkinList[self.nSelectIndex]
if nil == skinData then
return
end
self._mapNode.txtSaleTip.gameObject:SetActive(false)
self.nSkinId = skinData.nId
self.nCharId = 0
local bUsed = false
local bCharUnlock = false
local bUnlock = PlayerData.CharSkin:CheckSkinUnlock(self.nSkinId)
local mapSkinCfg = ConfigTable.GetData_CharacterSkin(self.nSkinId)
if mapSkinCfg ~= nil then
self.nCharId = mapSkinCfg.CharId
local usingSkinId = PlayerCharData:GetCharUsedSkinId(self.nCharId)
bUsed = usingSkinId == self.nSkinId
bCharUnlock = PlayerData.Char:CheckCharUnlock(self.nCharId)
self._mapNode.goSkinDesc:SetActive(mapSkinCfg.Desc ~= "")
NovaAPI.SetTMPText(self._mapNode.txtSkinDesc, mapSkinCfg.Desc)
NovaAPI.SetTMPText(self._mapNode.txtSkinName, mapSkinCfg.Name)
local mapCharCfg = ConfigTable.GetData_Character(self.nCharId)
self._mapNode.imgRoleBg.gameObject:SetActive(false)
if mapCharCfg ~= nil then
self._mapNode.imgRoleBg.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtRoleName, mapCharCfg.Name)
end
end
self._mapNode.btnBuy.gameObject:SetActive(not bUnlock)
self._mapNode.btnReplace.gameObject:SetActive(bUnlock and not bUsed and bCharUnlock)
self._mapNode.imgEquipped.gameObject:SetActive(bUnlock and (bUsed or not bCharUnlock))
self._mapNode.txtSkinEquipped.gameObject:SetActive(bUsed)
self._mapNode.txtSkinHas.gameObject:SetActive(bUnlock and not bCharUnlock)
if not bUnlock then
local mapCfg = skinData.mapCfg
self._mapNode.txtSalePrice.gameObject:SetActive(0 < mapCfg.BasePrice)
if mapCfg.CurrencyType == GameEnum.currencyType.Cash then
self._mapNode.goCurrency:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, tostring(mapCfg.CurrencyShowPrice))
NovaAPI.SetTMPText(self._mapNode.txtSalePrice, tostring(mapCfg.CurrencyShowBasePrice))
elseif mapCfg.CurrencyType == GameEnum.currencyType.Item then
self._mapNode.goCurrency:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtPrice, mapCfg.CurrencyItemQty)
NovaAPI.SetTMPText(self._mapNode.txtSalePrice, mapCfg.BasePrice)
self:SetPngSprite(self._mapNode.imgCurrency, ConfigTable.GetData_Item(mapCfg.CurrencyItemId).Icon2)
elseif mapCfg.CurrencyType == GameEnum.currencyType.Free then
self._mapNode.goCurrency:SetActive(false)
self._mapNode.txtSalePrice:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, ConfigTable.GetUIText("Mall_Package_Free"))
end
local bSale = mapCfg.IsSaleSkin
if bSale then
local nDeListTime = PlayerData.Shop:ChangeToTimeStamp(mapCfg.DeListTime)
local nCurTime = ClientManager.serverTimeStamp
local nTime = nDeListTime - nCurTime
if 0 < nTime then
self._mapNode.txtSaleTip.gameObject:SetActive(true)
local sTimeStr = self:GetTimeStr(nTime)
NovaAPI.SetTMPText(self._mapNode.txtSaleTip, orderedFormat(ConfigTable.GetUIText("Mall_Skin_Sale_End"), sTimeStr))
end
end
end
self._mapNode.goTheme.gameObject:SetActive(mapSkinCfg.SkinTheme ~= 0)
if mapSkinCfg.SkinTheme ~= 0 then
local themeCfg = ConfigTable.GetData("CharacterSkinTheme", mapSkinCfg.SkinTheme)
if nil ~= themeCfg then
self:SetPngSprite(self._mapNode.imgTheme, themeCfg.Icon)
NovaAPI.SetTMPText(self._mapNode.txtTheme, themeCfg.Name)
end
end
if self.nShowMode == show_mode_2d then
self:RefreshActor2D()
elseif self.nShowMode == show_mode_3d then
self:LoadCharacter()
end
end
function MallSkinPreviewCtrl:RefreshActor2D()
Actor2DManager.SetActor2D(self:GetPanelId(), self._mapNode.rawImgActor2D, self.nCharId, self.nSkinId)
end
function MallSkinPreviewCtrl:RefreshPreviewMode(bPreview)
self.bPreview = bPreview
self._mapNode.goPreview.gameObject:SetActive(true)
self._mapNode.btnSkin.gameObject:SetActive(bPreview)
self._mapNode.eventSkinZoom:SetZoomLock(not bPreview)
if not bPreview then
self:RefreshSelectSkinInfo()
if self.nShowMode == show_mode_3d then
self._mapNode.aniArrow:Play("CharacterSkin_3D_Out")
self.curShowModel.transform.localEulerAngles = Vector3(0, 180, 0)
end
self._mapNode.aniSafeAreaRoot:Play("CharacterSkin_preview_in")
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.canvasGroupRight, true)
Actor2DManager.ResetActor2DDragOffset(self.v3Offset)
else
if self.bUseFull then
self:OnBtnClick_SwitchHalf()
self:AddTimer(1, 0.7, function()
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.canvasGroupRight, false)
self.v3Offset = Actor2DManager.SwitchActor2DDragOffset()
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.7)
else
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.canvasGroupRight, false)
self.v3Offset = Actor2DManager.SwitchActor2DDragOffset()
if self.nShowMode == show_mode_3d and self.bDragValid then
self._mapNode.aniArrow:Play("CharacterSkin_3D_In")
end
end
self._mapNode.aniSafeAreaRoot:Play("CharacterSkin_preview_out")
end
end
function MallSkinPreviewCtrl:RefreshFullScene(bFullScene)
self._mapNode.goPreview.gameObject:SetActive(not bFullScene)
self._mapNode.TopBar.gameObject:SetActive(not bFullScene)
if not bFullScene and self.timerFullScene == nil then
self.timerFullScene = self:AddTimer(1, 5, function()
self._mapNode.TopBar.gameObject:SetActive(false)
self.timerFullScene = nil
end, true, true, true)
end
end
function MallSkinPreviewCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceId] then
self.tbGridCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.TemplateEx.TemplateSkinCtrl")
end
local skinData = self.tbSkinList[nIndex].skinData
self.tbGridCtrl[nInstanceId]:SetSkinData(skinData, false, true)
if nIndex == self.nSelectIndex then
self.tbGridCtrl[nInstanceId]:SetSelect(true)
end
end
function MallSkinPreviewCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
local goSelect = self._mapNode.trSv:Find("Viewport/Content/" .. self.nSelectIndex - 1)
if goSelect then
self.tbGridCtrl[goSelect.gameObject:GetInstanceID()]:SetSelect(false)
end
self.tbGridCtrl[nInstanceId]:SetSelect(true)
self._mapNode.sv:SetScrollGridPos(nIndex - 1, 0.1, 0)
self.nSelectIndex = nIndex
self:RefreshSelectSkinInfo()
end
function MallSkinPreviewCtrl:LoadCharacter()
if self.nShowModelSkinId == self.nSkinId then
return
end
self.nShowModelSkinId = self.nSkinId
local bNeedLoad = true
for skinId, v in pairs(self.tbModelList) do
if skinId == self.nSkinId then
bNeedLoad = false
v.gameObject:SetActive(true)
v.transform.localEulerAngles = Vector3(0, 180, 0)
self.nModelDragRot = v.transform.localEulerAngles.y
self.curShowModel = v
self:WaitReadyClipFinish()
else
v.gameObject:SetActive(false)
end
end
if bNeedLoad then
local mapSkin = ConfigTable.GetData_CharacterSkin(self.nSkinId)
local sFullPath = string.format("%s.prefab", mapSkin.Model_Show)
local LoadModelCallback = function(obj)
local idx = 1
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, idx - 1)
local go = instantiate(obj, self.rtSceneOriginPos)
self.tbModelList[self.nSkinId] = go
self.curShowModel = go
self:WaitReadyClipFinish()
NovaAPI.BindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, idx - 1, go)
if self.rtSceneOriginPos ~= nil then
go.transform.position = self.rtSceneOriginPos.position
go.transform.localEulerAngles = Vector3(0, 180, 0)
self.nModelDragRot = go.transform.localEulerAngles.y
go.transform.localScale = Vector3.zero
local animator = go:GetComponent(typeof(Animator))
if animator ~= nil and animator:IsNull() == false then
animator:SetBool("standby", true)
end
GameUIUtils.SetCustomModelMaterialVariant(go, CS.CustomModelMaterialVariantComponent.VariantNames.FormationView)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
go.transform.localScale = Vector3.one * (mapSkin.ModelShowScale / 10000)
end
cs_coroutine.start(wait)
end
EventManager.Hit(EventId.BlockInput, false)
end
self:LoadAssetAsync(sFullPath, typeof(GameObject), LoadModelCallback)
EventManager.Hit(EventId.BlockInput, true)
end
end
function MallSkinPreviewCtrl:WaitReadyClipFinish()
if self.waitReadyClipCor ~= nil then
cs_coroutine.stop(self.waitReadyClipCor)
end
if self.curShowModel == nil then
return
end
local director = self.curShowModel:GetComponent("PlayableDirector")
if director == nil then
return
end
local readyClipName = self.nCharId .. "_Ready"
local wait = function()
while CS.AdventureModuleHelper.CheckTimelineClipFinish(director, readyClipName) == false do
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
end
self.bDragValid = true
if self.bPreview and self.nShowMode == show_mode_3d then
self._mapNode.aniArrow:Play("CharacterSkin_3D_In")
end
end
self.bDragValid = false
self.waitReadyClipCor = cs_coroutine.start(wait)
end
function MallSkinPreviewCtrl:DestroyCharacter()
local sSceneName = ConfigTable.GetConfigValue("CharacterSkin_Scene")
local callback = function()
end
CS.MainMenuModuleHelper.DeActiveScene(sSceneName, callback)
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, 1)
for _, v in pairs(self.tbModelList) do
destroy(v)
end
self.tbModelList = {}
self.curShowModel = nil
self.nModelDragRot = 0
if nil ~= self.goSelectRolePrefab then
destroy(self.goSelectRolePrefab)
end
self.goSelectRolePrefab = nil
end
function MallSkinPreviewCtrl:Awake()
self.canvas = self.gameObject:GetComponent("Canvas")
self.gameObject:SetActive(false)
self.tbGridCtrl = {}
self.nSelectIndex = nil
self.nShowModelSkinId = 0
self.tbModelList = {}
self.curShowModel = nil
self.nModelDragRot = 0
self.v3Offset = Vector3.zero
self.nShowMode = show_mode_2d
self.tbZoomRange = ConfigTable.GetConfigArray("SkinZoomRange")
self.bUseFull = false
end
function MallSkinPreviewCtrl:OnEnable()
self.bPreview = false
self.bStartDrag = false
self.bDragValid = true
local tbParam = self:GetPanelParam()
local tbMallList = tbParam[1]
self.nSkinId = tbParam[2]
self.nSelectIndex = tbParam[3]
self.tbSkinList = {}
for _, v in ipairs(tbMallList) do
local mapCfg = ConfigTable.GetData("MallPackage", v.sId)
local tbParam = decodeJson(mapCfg.Items)
local nSkinId = 0
for nId, v in pairs(tbParam) do
nSkinId = tonumber(nId)
break
end
local nUnlock = PlayerData.CharSkin:CheckSkinUnlock(nSkinId) and 1 or 0
local skinData = SkinData.new(nSkinId, 0, nUnlock)
table.insert(self.tbSkinList, {
nId = nSkinId,
mapCfg = mapCfg,
skinData = skinData
})
end
self._mapNode.eventSkinZoom:SetZoomLock(true)
self._mapNode.eventSkinZoom:SetZoomLimitValue(tonumber(self.tbZoomRange[1]), tonumber(self.tbZoomRange[2]))
for insId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[insId] = nil
end
if self.nSelectIndex == nil then
for k, v in ipairs(self.tbSkinList) do
if v.nId == self.nSkinId then
self.nSelectIndex = k
break
end
end
end
if self.nSelectIndex == nil then
self.nSelectIndex = 1
end
self._mapNode.sv:Init(#self.tbSkinList, self, self.OnGridRefresh, self.OnGridBtnClick)
self._mapNode.sv:SetScrollGridPos(self.nSelectIndex - 1, 0)
self._mapNode.goPreview.gameObject:SetActive(true)
self._mapNode.btnSkin.gameObject:SetActive(false)
self._mapNode.go3D.gameObject:SetActive(self.nShowMode == show_mode_3d)
self._mapNode.goPortrait.gameObject:SetActive(self.nShowMode == show_mode_2d)
local sSceneName = ConfigTable.GetConfigValue("CharacterSkin_Scene")
NovaAPI.SetComponentEnable(self.canvas, false)
local callback = function(bSuccess)
NovaAPI.SetComponentEnable(self.canvas, true)
if bSuccess == true then
local sceneRoot = CS.MainMenuModuleHelper.GetMainMenuSceneRoot(sSceneName)
self.rtSceneOriginPos = sceneRoot.transform:Find("==== Scene ====")
self.goSelectRolePrefab = self:CreatePrefabInstance("UI/CharacterSkin/CharSkin3DShowPrefab.prefab", self.rtSceneOriginPos)
local goSelectRoleCam = self.goSelectRolePrefab.transform:Find("Camera"):GetComponent("Camera")
NovaAPI.SetupUIParallaxStageCameraControllerForModelView(self._mapNode.UIParallax3DStage, goSelectRoleCam)
else
self._mapNode.UIParallax3DStage.gameObject:SetActive(false)
end
self.gameObject:SetActive(true)
self:RefreshSelectSkinInfo()
EventManager.Hit(EventId.SetTransition)
end
CS.MainMenuModuleHelper.GetActiveScene(sSceneName, callback)
end
function MallSkinPreviewCtrl:OnDisable()
self.tbSkinList = nil
for insId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[insId] = nil
end
self.tbGridCtrl = {}
self.bStartDrag = nil
self.bDragValid = nil
if self.waitReadyClipCor ~= nil then
cs_coroutine.stop(self.waitReadyClipCor)
end
Actor2DManager.UnsetActor2D()
self:DestroyCharacter()
end
function MallSkinPreviewCtrl:OnDestroy()
end
function MallSkinPreviewCtrl:OnBtnClick_FullScene()
self:RefreshPreviewMode(true)
self:RefreshFullScene(true)
end
function MallSkinPreviewCtrl:OnBtnClick_SwitchModel()
self.nShowMode = self.nShowMode == show_mode_2d and show_mode_3d or show_mode_2d
self._mapNode.btnSwitchHalf.gameObject:SetActive(self.nShowMode == show_mode_2d)
self._mapNode.go3D.gameObject:SetActive(self.nShowMode == show_mode_3d)
self._mapNode.goPortrait.gameObject:SetActive(self.nShowMode == show_mode_2d)
if self.nShowMode == show_mode_2d then
local tweener = NovaAPI.DoRawImageColor(self._mapNode.rawImgActor2D, Color(1, 1, 1, 1), 0.5)
tweener:SetUpdate(true)
self._mapNode.rtRawImgActor2D:DOScale(1, 0.5):SetUpdate(true)
elseif self.nShowMode == show_mode_3d then
local tweener = NovaAPI.DoRawImageColor(self._mapNode.rawImgActor2D, Color(1, 1, 1, 0), 0.5)
tweener:SetUpdate(true)
self._mapNode.rtRawImgActor2D:DOScale(1.5, 0.5):SetUpdate(true)
end
self:RefreshSelectSkinInfo()
end
function MallSkinPreviewCtrl:OnBtnClick_SkinPreview()
self:RefreshPreviewMode(true)
end
function MallSkinPreviewCtrl:OnBtnClick_Skin()
if not self.bStartDrag then
self:RefreshFullScene(false)
end
end
function MallSkinPreviewCtrl:OnBtnClick_Buy()
local mapData = self.tbSkinList[self.nSelectIndex]
local mapCfg = mapData.mapCfg
if not mapCfg then
return
end
local bUnlock = PlayerData.CharSkin:CheckSkinUnlock(self.nSkinId)
if bUnlock then
return
end
local nCurrencyType = mapCfg.CurrencyType
if nCurrencyType == GameEnum.currencyType.Cash then
PlayerData.Mall:BuyPackage(mapCfg.Id, mapCfg.StatisticalGroup)
else
if nCurrencyType == GameEnum.currencyType.Item then
local nHas = 0
if mapCfg.CurrencyItemId == AllEnum.CoinItemId.FREESTONE or mapCfg.CurrencyItemId == AllEnum.CoinItemId.STONE then
nHas = PlayerData.Coin:GetCoinCount(AllEnum.CoinItemId.FREESTONE) + PlayerData.Coin:GetCoinCount(AllEnum.CoinItemId.STONE)
else
nHas = PlayerData.Coin:GetCoinCount(mapCfg.CurrencyItemId)
end
if nHas < mapCfg.CurrencyItemQty then
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = orderedFormat(ConfigTable.GetUIText("Recruit_Charge") or "", ConfigTable.GetData_Item(AllEnum.CoinItemId.STONE).Id),
callbackConfirm = function()
EventManager.Hit(EventId.CloesCurPanel)
EventManager.Hit("OpenMallTog", AllEnum.MallToggle.Gem)
end,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
return
end
end
PlayerData.Mall:SendMallPackageOrderReq(mapCfg.Id)
end
end
function MallSkinPreviewCtrl:OnBtnClick_Replace()
local func_callback = function()
PlayerData.Char:SetCharSkinId(self.nCharId, self.nSkinId)
self:RefreshSelectSkinInfo()
end
local msgSend = {}
msgSend.CharId = self.nCharId
msgSend.SkinId = self.nSkinId
HttpNetHandler.SendMsg(NetMsgId.Id.char_skin_set_req, msgSend, nil, func_callback)
end
function MallSkinPreviewCtrl:OnBtnClick_Back(nPanelId)
if self._panel._nPanelId ~= nPanelId then
return
end
if self.bPreview then
self:RefreshPreviewMode(false)
if self.timerFullScene ~= nil then
self.timerFullScene:Cancel()
self.timerFullScene = nil
end
else
EventManager.Hit(EventId.CloesCurPanel)
end
end
function MallSkinPreviewCtrl:OnBtnClick_Home(nPanelId)
if self._panel._nPanelId ~= nPanelId then
return
end
PanelManager.Home()
end
function MallSkinPreviewCtrl:OnEvent_BuyMallPackageSuccess(bMoney)
if not bMoney then
PlayerData.CharSkin:TryOpenSkinShowPanel()
end
self:RefreshSelectSkinInfo()
end
function MallSkinPreviewCtrl:OnBtnClick_SwitchHalf()
self.bUseFull = not self.bUseFull
Actor2DManager.SwitchFullHalf()
end
function MallSkinPreviewCtrl:OnUIDrag_Drag(mDrag)
if not self.bDragValid then
return
end
if mDrag.DragEventType == AllEnum.UIDragType.DragStart then
self.bStartDrag = true
elseif mDrag.DragEventType == AllEnum.UIDragType.Drag then
if true == self.bStartDrag then
if self.nShowMode == show_mode_2d then
Actor2DManager.SyncLocalPos(mDrag.EventData.delta.x, mDrag.EventData.delta.y, nil, self._mapNode.rtRawImgActor2D)
elseif self.nShowMode == show_mode_3d and nil ~= self.curShowModel then
self.nModelDragRot = self.nModelDragRot - mDrag.EventData.delta.x * 0.5
self.curShowModel.transform.localEulerAngles = Vector3(0, self.nModelDragRot, 0)
end
end
elseif mDrag.DragEventType == AllEnum.UIDragType.DragEnd then
self.bStartDrag = false
end
end
function MallSkinPreviewCtrl:OnUIZoom_Skin(mZoom)
if mZoom.InZoom then
if mZoom.ZoomValue ~= 0 then
self.bDragValid = false
Actor2DManager.SyncLocalScale(mZoom.ZoomValue)
end
else
self.bDragValid = true
end
end
return MallSkinPreviewCtrl
@@ -0,0 +1,8 @@
local MallSkinPreviewPanel = class("MallSkinPreviewPanel", BasePanel)
MallSkinPreviewPanel._tbDefine = {
{
sPrefabPath = "Mall/MallSkinPreviewPanel.prefab",
sCtrlName = "Game.UI.Mall.MallSkinPreviewCtrl"
}
}
return MallSkinPreviewPanel
+27
View File
@@ -0,0 +1,27 @@
local OrderWaitCtrl = class("OrderWaitCtrl", BaseCtrl)
OrderWaitCtrl._mapNodeConfig = {
blur = {
sNodeName = "t_fullscreen_blur_blue"
},
aniBlur = {
sNodeName = "t_fullscreen_blur_blue",
sComponentName = "Animator"
},
txtConnecting = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_OrderWait"
}
}
OrderWaitCtrl._mapEventConfig = {}
function OrderWaitCtrl:Open()
end
function OrderWaitCtrl:Awake()
end
function OrderWaitCtrl:OnEnable()
self:Open()
end
function OrderWaitCtrl:OnDisable()
end
function OrderWaitCtrl:OnDestroy()
end
return OrderWaitCtrl
+18
View File
@@ -0,0 +1,18 @@
local OrderWaitPanel = class("OrderWaitPanel", BasePanel)
OrderWaitPanel._bAddToBackHistory = false
OrderWaitPanel._sSortingLayerName = AllEnum.SortingLayerName.UI_Top
OrderWaitPanel._tbDefine = {
{
sPrefabPath = "Mall/OrderWaitPanel.prefab",
sCtrlName = "Game.UI.Mall.OrderWaitCtrl"
}
}
function OrderWaitPanel:Awake()
end
function OrderWaitPanel:OnEnable()
end
function OrderWaitPanel:OnDisable()
end
function OrderWaitPanel:OnDestroy()
end
return OrderWaitPanel