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:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user