miduo_client/Assets/ManagedResources/~Lua/Modules/FindTreasure/FindTreasureDispatchPanel.lua

582 lines
24 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

starNumIamage = {
[1] = "x_xb_shuzi_01",
[2] = "x_xb_shuzi_02",
[3] = "x_xb_shuzi_03",
[4] = "x_xb_shuzi_04",
[5] = "x_xb_shuzi_05",
[6] = "x_xb_shuzi_06",
}
require("Base/BasePanel")
FindTreasureDispatchPanel = Inherit(BasePanel)
local curSelectHeroList={}
local tabs = {}
local selectHeroGrid = {}
local conditionGrid = {}
local proId = ProIdConst.All
local conFigData
local missionData
local allHeroData--显示英雄数据
local curSortHeroList--一键选择英雄数据
local needState
local conditionHeros = {}
local timer = Timer.New()
local curAllHeros = {}
local isMaterial = true
local curPanelHerosSortNum = 1
local tabsImg = {"z_icon_01_zh", "r_hero_huo 1_zh", "r_hero_feng 1_zh", "r_hero_shui 1_zh", "r_hero_dadi 1_zh"}
--初始化组件(用于子类重写)
function FindTreasureDispatchPanel:InitComponent()
self.spLoader = SpriteLoader.New()
self.BtnBack = Util.GetGameObject(self.transform, "btnBack")
self.btnSure = Util.GetGameObject(self.transform, "btnSure")
self.btnAutoSure = Util.GetGameObject(self.transform, "btnAutoSure")
self.btnAutoSureText = Util.GetGameObject(self.transform, "btnAutoSure/Text"):GetComponent("Text")
self.cardPre = Util.GetGameObject(self.gameObject, "item")
self.Scrollbar = Util.GetGameObject(self.gameObject, "Scrollbar"):GetComponent("Scrollbar")
local v = Util.GetGameObject(self.gameObject, "scroll"):GetComponent("RectTransform").rect
self.ScrollView = SubUIManager.Open(SubUIConfig.ScrollCycleView, Util.GetGameObject(self.gameObject, "scroll").transform,
self.cardPre, self.Scrollbar, Vector2.New(-v.x*2, -v.y), 1, 5, Vector2.New(25,32))
self.ScrollView.moveTween.MomentumAmount = 0
self.ScrollView.moveTween.Strength = 1
self.ScrollView.elastic = false
--self.ScrollView.itemCount = 15
self.selectBtn = Util.GetGameObject(self.gameObject, "Tabs/selectBtn")
for i = 0, 6 do
tabs[i] = Util.GetGameObject(self.transform, "Tabs/grid/Btn" .. i)
if tabsImg[i + 1] then
Util.GetGameObject(tabs[i], "Image"):GetComponent("Image").sprite = self.spLoader:LoadSprite(tabsImg[i + 1])
end
end
for i = 1, 5 do
selectHeroGrid[i] = Util.GetGameObject(self.transform, "selectHeroGrid/item (" .. i..")")
end
for i = 1, 5 do
conditionGrid[i] = Util.GetGameObject(self.transform, "conditionGrid/condition (" .. i..")")
end
self.matreiaObj = Util.GetGameObject(self.gameObject, "matreialTimeInfoBg/matreiaObj")
self.matreiaImage = Util.GetGameObject(self.gameObject, "matreialTimeInfoBg/matreiaObj/matreiaImage"):GetComponent("Image")
self.matreiaText = Util.GetGameObject(self.gameObject, "matreialTimeInfoBg/matreiaObj/numText"):GetComponent("Text")
self.timeText = Util.GetGameObject(self.gameObject, "matreialTimeInfoBg/timeObj/numText"):GetComponent("Text")
end
--绑定事件(用于子类重写)
function FindTreasureDispatchPanel:BindEvent()
Util.AddClick(self.BtnBack, function()
self:ClosePanel()
end)
Util.AddClick(self.matreiaObj, function()
UIManager.OpenPanel(UIName.RewardItemSingleShowPopup, FindTreasureManager.materialItemId)
end)
Util.AddClick(self.btnSure, function()
if not isMaterial then
PopupTipPanel.ShowTip(GetLanguageStrById(ConfigManager.GetConfigData(ConfigName.ItemConfig,FindTreasureManager.materialItemId).Name)..Language[10657])
return
end
for i = 1, #needState do
if needState[i] < 1 then
PopupTipPanel.ShowTip(Language[10658])
return
end
end
local curSelectHeroIdsTab = {}
for k, v in pairs(curSelectHeroList) do
table.insert(curSelectHeroIdsTab,k)
end
--Log("missionData.missionId "..missionData.missionId)
--for i = 1, #curSelectHeroIdsTab do
--Log("curSelectHeroIdsTab "..curSelectHeroIdsTab[i])
--end
NetManager.FindTreasureMissingRoomSendHeroRequest(missionData.missionId,curSelectHeroIdsTab,function()
TaskManager.RefreshFindTreasureHerosData(missionData.missionId,curSelectHeroIdsTab,conFigData.WasteTime)
Game.GlobalEvent:DispatchEvent(GameEvent.FindTreasure.RefreshFindTreasure,false)
self:ClosePanel()
end)
end)
Util.AddClick(self.btnAutoSure, function()
self:AutoSelectHero()
self:OnShowPanelData(curAllHeros,false,false)
end)
for i = 0, 6 do
Util.AddClick(tabs[i], function()
if i == proId then
proId = ProIdConst.All
else
proId = i
end
self:GetCurSortHeroListData()
end)
end
end
--添加事件监听(用于子类重写)
function FindTreasureDispatchPanel:AddListener()
end
--移除事件监听(用于子类重写)
function FindTreasureDispatchPanel:RemoveListener()
end
--界面打开时调用(用于子类重写)
function FindTreasureDispatchPanel:OnOpen(_missionData)
missionData =_missionData
end
--界面打开或者重新打开后,界面刷新时调用(用于子类重写)
function FindTreasureDispatchPanel:OnShow()
curPanelHerosSortNum = 1
curSelectHeroList = {}
curAllHeros = {}
isMaterial = true
conFigData = ConfigManager.GetConfigData(ConfigName.MazeTreasure,math.floor(missionData.missionId%10000))
allHeroData = HeroManager.GetFingTreasureAllHeroDatas()
curSortHeroList = HeroManager.GetFingTreasureAllHeroDatas()
self:SortHeroDatas(allHeroData)
self:SortHeroDatas2(curSortHeroList)
self:OnShowPanelData(allHeroData,true,true)
proId = ProIdConst.All
self:SetSelectBtn()
--显示选择的英雄
self:ShowSelectHeroData()
--显示条件
self:ShowNeedConditionData()
--赋值所有符合条件的英雄
self:GetConditionHeros()
self.matreiaImage.sprite = self.spLoader:LoadSprite(GetResourcePath(ConfigManager.GetConfigData(ConfigName.ItemConfig,FindTreasureManager.materialItemId).ResourceID))
local isJian = PrivilegeManager.GetSerData(155) ~= nil--PrivilegeManager.GetPrivilegeRemainValue(PRIVILEGE_TYPE.FINDTREASURE_EXPERT) > 0
local privilegeTypeConfig = ConfigManager.GetConfigDataByKey(ConfigName.PrivilegeTypeConfig,"PrivilegeType",PRIVILEGE_TYPE.FINDTREASURE_EXPERT)
local jianNum = (privilegeTypeConfig and isJian) and (privilegeTypeConfig.Condition[1][2])/10000 or 1
local takeItemNum = isJian and (conFigData.TakeItem[2] + conFigData.TakeItem[2] * jianNum) or conFigData.TakeItem[2]
--LogGreen("isJian "..tostring(isJian).." jianNum "..jianNum.." takeItemNum "..takeItemNum)
self.matreiaText.text = BagManager.GetItemCountById(FindTreasureManager.materialItemId) .. "/"..takeItemNum
self.timeText.text = self:TimeStampToDateString(conFigData.WasteTime)
if BagManager.GetItemCountById(FindTreasureManager.materialItemId) < takeItemNum then isMaterial = false end
self.btnAutoSureText.fontSize = GetCurLanguage() == 0 and 45 or 40
end
function FindTreasureDispatchPanel:OnShowPanelData(_allHeroData,isTop,isAni)
curAllHeros = _allHeroData
self.ScrollView:SetData(_allHeroData, function (index, go)
self:OnShowSingleCardData(go, _allHeroData[index])
end,not isTop,not isAni)
end
function FindTreasureDispatchPanel:OnShowSingleCardData(go,heroData)--isSelect 1选择 2 没选择
local choosed = Util.GetGameObject(go.transform, "choosed")
choosed:SetActive(false)
if curSelectHeroList[heroData.dynamicId] then
heroData.sortId = curPanelHerosSortNum
curPanelHerosSortNum = curPanelHerosSortNum + 1
curSelectHeroList[heroData.dynamicId]=heroData
choosed:SetActive(true)
end
self:OnShowCardData(go,heroData,1)
end
function FindTreasureDispatchPanel:ShowNeedConditionData(type)
needState = self:DetectionSelectHeros()
for i = 1, #conditionGrid do--curSelectHeroList
if #conFigData.Condition >= i then
conditionGrid[i]:SetActive(true)
local starIcon = Util.GetGameObject(conditionGrid[i], "starIcon")
local proIcon = Util.GetGameObject(conditionGrid[i], "proIcon")
starIcon:SetActive(conFigData.Condition[i][1] == FindTreasureNeedType.Star)
proIcon:SetActive(conFigData.Condition[i][1] == FindTreasureNeedType.Pro)
proIcon.transform.localScale = Vector3.one
if conFigData.Condition[i][1] == FindTreasureNeedType.Pro then
proIcon.transform.localScale = Vector3.New(1.5, 1.5, 1)
end
Util.SetGray(conditionGrid[i], needState[i] < 1)
local tipsStr = ""
if conFigData.Condition[i][1] == FindTreasureNeedType.Star then
tipsStr = Language[10659]..conFigData.Condition[i][2]..Language[10660]
Util.GetGameObject(conditionGrid[i], "starIcon/numImage"):GetComponent("Image").sprite = self.spLoader:LoadSprite(starNumIamage[self:GetHeroStarImage(conFigData.Condition[i][2],1)])
Util.GetGameObject(conditionGrid[i], "starIcon/starImage"):GetComponent("Image").sprite = self.spLoader:LoadSprite(self:GetHeroStarImage(conFigData.Condition[i][2],2))
elseif conFigData.Condition[i][1] == FindTreasureNeedType.Pro then
tipsStr = Language[10659]..HeroElementDef[conFigData.Condition[i][2]]..Language[10661]
proIcon:GetComponent("Image").sprite = self.spLoader:LoadSprite(GetProStrImageByProNum(conFigData.Condition[i][2]))
end
Util.AddOnceClick(conditionGrid[i], function()
PopupTipPanel.ShowTip(tipsStr)
end)
else
conditionGrid[i]:SetActive(false)
end
end
end
function FindTreasureDispatchPanel:ShowSelectHeroData()
local curSelectHeroSortList = {}
for i, v in pairs(curSelectHeroList) do
table.insert(curSelectHeroSortList,v)
--Log("v.dynamicId "..v.dynamicId.." "..v.heroConfig.ReadingName)
end
table.sort(curSelectHeroSortList, function(a, b)
return a.sortId < b.sortId
end)
for i = 1, #selectHeroGrid do--curSelectHeroList
if conFigData.NeedCard >= i then
selectHeroGrid[i]:SetActive(true)
if LengthOfTable(curSelectHeroSortList) >= i then--conFigData.NeedCard
Util.GetGameObject(selectHeroGrid[i], "GameObject"):SetActive(true)
if curSelectHeroSortList[i] then
self:OnShowCardData(Util.GetGameObject(selectHeroGrid[i], "GameObject"),curSelectHeroSortList[i],2)
end
else
Util.GetGameObject(selectHeroGrid[i], "GameObject"):SetActive(false)
end
else
selectHeroGrid[i]:SetActive(false)
end
end
end
function FindTreasureDispatchPanel:OnShowCardData(go,heroData,type)
Util.GetGameObject(go.transform, "frame"):GetComponent("Image").sprite = self.spLoader:LoadSprite(GetHeroQuantityImageByquality(heroData.heroConfig.Quality,heroData.star))
Util.GetGameObject(go.transform, "lv/Text"):GetComponent("Text").text = heroData.lv
Util.GetGameObject(go.transform, "icon"):GetComponent("Image").sprite = self.spLoader:LoadSprite(heroData.icon)
-- Util.GetGameObject(go.transform, "posIcon"):GetComponent("Image").sprite = self.spLoader:LoadSprite(heroData.professionIcon)
Util.GetGameObject(go.transform, "proIcon"):GetComponent("Image").sprite = self.spLoader:LoadSprite(GetProStrImageByProNum(heroData.changeProId))
--Util.GetGameObject(go.transform, "heroStage"):GetComponent("Image").sprite = self.spLoader:LoadSprite(HeroStageSprite[heroData.heroConfig.HeroStage])
-- Util.GetGameObject(go.transform, "heroStage"):SetActive(false)
Util.GetGameObject(go.transform, "posIcon"):SetActive(false)
Util.GetGameObject(go.transform, "heroStage"):SetActive(false)
local starGrid = Util.GetGameObject(go.transform, "star")
local star,starType = heroData.GetStar(1)
SetHeroStars(self.spLoader, starGrid, star,starType)
local effect=SetHeroFlyEffect(go,self.spLoader,heroData.star,self.sortingOrder + 1,1,3)
-- if effect then
-- local meshs2=effect:GetComponentsInChildren(typeof(UnityEngine.SkinnedMeshRenderer))
-- for key, value in pairs(meshs2:ToTable()) do
-- if value.material.shader.name=="YXZ/Effect/TransparentRim" then
-- value.material.shader=poolManager:LoadAsset("YXZ_Effect_TransparentRim_1",poolManager.AssetType.Other)
-- end
-- end
-- end
-- local meshs1=starGrid:GetComponentsInChildren(typeof(UnityEngine.ParticleSystem))
-- for key, value in pairs(meshs1:ToTable()) do
-- local mat=value:GetComponent(typeof(UnityEngine.Renderer))
-- if mat.material.shader.name=="UI Particles/Additive" then
-- mat.material.shader=poolManager:LoadAsset("UI-Particle-Add_1",poolManager.AssetType.Other)
-- end
-- end
local particles=go:GetComponentsInChildren(typeof(UnityEngine.ParticleSystem))
for key, value in pairs(particles:ToTable()) do
local mat=value:GetComponent(typeof(UnityEngine.Renderer))
if mat.material.shader.name=="CGwell FX/Additive Lv1" then
mat.material.shader=poolManager:LoadAsset("Add Lv1_1",poolManager.AssetType.Other)
elseif mat.material.shader.name=="UI Particles/Additive" then
mat.material.shader=poolManager:LoadAsset("UI-Particle-Add_1",poolManager.AssetType.Other)
elseif mat.material.shader.name=="YXZ/Effect/Mix Masking(Without Moving)_alphablend" then
mat.material.shader=poolManager:LoadAsset("YXZ_MixMaskingWithoutMoving_alphablend_1",poolManager.AssetType.Other)
end
end
local meshs=go:GetComponentsInChildren(typeof(UnityEngine.MeshRenderer))
for key, value in pairs(meshs:ToTable()) do
if value.material.shader.name=="Custom/S_03_UV_alpha_add" then
value.material.shader=poolManager:LoadAsset("S_03_uv_alpha_add_1",poolManager.AssetType.Other)
end
end
local meshs2=go:GetComponentsInChildren(typeof(UnityEngine.SkinnedMeshRenderer))
for key, value in pairs(meshs2:ToTable()) do
if value.material.shader.name=="YXZ/Effect/TransparentRim" then
value.material.shader=poolManager:LoadAsset("YXZ_Effect_TransparentRim_1",poolManager.AssetType.Other)
end
end
Util.SetParticleSortLayer(starGrid,self.sortingOrder + 1)
local cardBtn = Util.GetGameObject(go.transform, "icon")
local choosed = Util.GetGameObject(go.transform, "choosed")
Util.AddOnceClick(cardBtn, function()
if curSelectHeroList[heroData.dynamicId] then
choosed:SetActive(false)
curSelectHeroList[heroData.dynamicId]=nil
--监测方法
if type == 2 then
self:OnShowPanelData(curAllHeros,false,false)
end
self:ShowNeedConditionData()
self:ShowSelectHeroData()
return
end
if LengthOfTable(curSelectHeroList)>=conFigData.NeedCard then
PopupTipPanel.ShowTip(Language[10403])
return
end
heroData .sortId = curPanelHerosSortNum
curPanelHerosSortNum = curPanelHerosSortNum + 1
curSelectHeroList[heroData.dynamicId]=heroData
choosed:SetActive(true)
--监测方法
self:ShowNeedConditionData()
self:ShowSelectHeroData()
end)
end
--组合当前选项数据
function FindTreasureDispatchPanel:GetCurSortHeroListData()
local heros = {}
self:SetSelectBtn()
if proId ~= ProIdConst.All then
heros = self:GetCurProHeros(proId)
curSortHeroList = self:GetCurProHeros(proId)
else
heros = allHeroData
curSortHeroList = HeroManager.GetFingTreasureAllHeroDatas()
end
self:OnShowPanelData(heros,false,false)
end
function FindTreasureDispatchPanel:HeroSortData(heroData)
table.sort(heroData, function(a, b)
if a.id == b.id then
if a.lv == b.lv then
return a.id > b.id
else
return a.lv < b.lv
end
else
return a.id > b.id
end
end)
end
function FindTreasureDispatchPanel:SetSelectBtn()
self.selectBtn:SetActive(proId ~= ProIdConst.All)
if proId ~= ProIdConst.All then
self.selectBtn.transform.localPosition = tabs[proId].transform.localPosition
end
end
--一键派遣
function FindTreasureDispatchPanel:AutoSelectHero()
--思路 按条件顺序选择 没选择一个英雄检测其他条件是否有满足的 满足跳过 不管能不能派遣都显示
curSelectHeroList = {}
local conditionTabs = {}
for i = 1, #conFigData.Condition do
conditionTabs[i] = 0
end
for i = 1, #conditionHeros do
if #conditionHeros[i] > 0 then
local jixu = self:AutoSelectState(conditionTabs)
if jixu <= 0 then needState = conditionTabs return end
if i > jixu then jixu = i end
if #conditionHeros[jixu] <= 0 then return end
local num = self:AutoSelectState2(conditionTabs) - 1
local curSelectSingleHero = self:AutoSelectHeroId(conditionHeros[jixu],num)
curSelectSingleHero.sortId = curPanelHerosSortNum--排序
curPanelHerosSortNum = curPanelHerosSortNum + 1--排序
curSelectHeroList[curSelectSingleHero.dynamicId] = curSelectSingleHero
for k = 1, #conFigData.Condition do
if conFigData.Condition[k][1] == FindTreasureNeedType.Star then
for j, v in pairs(curSelectHeroList) do
if v.star >= conFigData.Condition[k][2] then
conditionTabs[k] = 1
end
end
elseif conFigData.Condition[k][1] == FindTreasureNeedType.Pro then
for j, v in pairs(curSelectHeroList) do
if v.changeProId == conFigData.Condition[k][2] then
conditionTabs[k] = 1
end
end
end
end
--监测方法
self:ShowNeedConditionData()
self:ShowSelectHeroData()
end
end
end
function FindTreasureDispatchPanel:AutoSelectState(conditionTabs)
for i = 1, #conditionTabs do
if conditionTabs[i] < 1 then
Log("jixu "..i)
return i
end
end
return 0
end
function FindTreasureDispatchPanel:AutoSelectState2(conditionTabs)
local needNum = 0
for i = 1, #conditionTabs do
if conditionTabs[i] < 1 then
needNum = needNum + 1
end
end
return needNum
end
function FindTreasureDispatchPanel:AutoSelectHeroId(conditionSingleHeros,num)
local heroData = conditionSingleHeros[1]
local endfeheNeedNum = 0
for i = 1, #conditionSingleHeros do
local feheNeedNum = 0
for j = 1, #conFigData.Condition do
if conFigData.Condition[j][1] == FindTreasureNeedType.Star then
if conditionSingleHeros[i].star >= conFigData.Condition[j][2] then
feheNeedNum = feheNeedNum + 1
end
elseif conFigData.Condition[j][1] == FindTreasureNeedType.Pro then
if conditionSingleHeros[i].changeProId == conFigData.Condition[j][2] then
feheNeedNum = feheNeedNum + 1
end
end
end
if num <= 1 then
if endfeheNeedNum < feheNeedNum then
return conditionSingleHeros[i]
end
elseif num > 1 then
if endfeheNeedNum < feheNeedNum then
endfeheNeedNum = feheNeedNum
heroData = conditionSingleHeros[i]
end
end
end
return heroData
end
function FindTreasureDispatchPanel:GetCurProHeros(_property)
local heros = {}
local index = 1
for i, v in pairs(allHeroData) do
if v.property == _property then
heros[index] = v
index = index + 1
end
end
return heros
end
--检测选择的英雄是否满足条件
function FindTreasureDispatchPanel:DetectionSelectHeros()
local conditionTabs = {}
for i = 1, #conFigData.Condition do
conditionTabs[i] = 0
if conFigData.Condition[i][1] == FindTreasureNeedType.Star then
for j, v in pairs(curSelectHeroList) do
if v.star >= conFigData.Condition[i][2] then
conditionTabs[i] = 1
end
end
elseif conFigData.Condition[i][1] == FindTreasureNeedType.Pro then
for j, v in pairs(curSelectHeroList) do
if v.changeProId == conFigData.Condition[i][2] then
conditionTabs[i] = 1
end
end
end
end
return conditionTabs
end
--
function FindTreasureDispatchPanel:GetConditionHeros()
conditionHeros = {}
for i = 1, #conFigData.Condition do
local curConditionHeros = {}
for k, v in pairs(curSortHeroList) do
if conFigData.Condition[i][1] == FindTreasureNeedType.Star then
if v.star >= conFigData.Condition[i][2] then
table.insert(curConditionHeros,v)
end
elseif conFigData.Condition[i][1] == FindTreasureNeedType.Pro then
if v.changeProId == conFigData.Condition[i][2] then
table.insert(curConditionHeros,v)
end
end
end
conditionHeros[i] = curConditionHeros
end
end
--英雄排序
function FindTreasureDispatchPanel:SortHeroDatas(_heroDatas)
--上阵最优先星级优先同星级等级优先同星级同等级按sortId排序。排序时降序排序。
table.sort(_heroDatas, function(a, b)
if a.star == b.star then
if a.heroConfig.Natural ==b.heroConfig.Natural then
if a.lv == b.lv then
return a.heroConfig.Id < b.heroConfig.Id
else
return a.lv > b.lv
end
else
return a.heroConfig.Natural > b.heroConfig.Natural
end
else
return a.star > b.star
end
end)
end
function FindTreasureDispatchPanel:SortHeroDatas2(_heroDatas)
--上阵最优先星级优先同星级等级优先同星级同等级按sortId排序。排序时降序排序。
table.sort(_heroDatas, function(a, b)
if a.star == b.star then
if a.heroConfig.Natural ==b.heroConfig.Natural then
if a.lv == b.lv then
return a.heroConfig.Id > b.heroConfig.Id
else
return a.lv < b.lv
end
else
return a.heroConfig.Natural < b.heroConfig.Natural
end
else
return a.star < b.star
end
end)
end
function FindTreasureDispatchPanel:GetHeroStarImage(star,type)
if type == 1 then
-- if star < 6 then
return star
-- elseif star > 5 then
-- return star%5
-- end
else
-- if star < 6 then
return "ui_1xing"
-- elseif star > 5 and star < 11 then
-- return "ui_1yue"
-- elseif star > 10 then
-- return "ui_1un"
-- end
end
end
function FindTreasureDispatchPanel:TimeStampToDateString(second)
local day = math.floor(second / (24 * 3600))
local minute = math.floor(second / 60) % 60
local sec = second % 60
local hour = math.floor(math.floor(second - day * 24 * 3600 - sec - minute * 60) / 3600)
return string.format("%02d:%02d:%02d", hour, minute, sec)
end
--界面关闭时调用(用于子类重写)
function FindTreasureDispatchPanel:OnClose()
Game.GlobalEvent:DispatchEvent(GameEvent.FindTreasure.RefreshFindTreasureRect)
if timer then
timer:Stop()
timer = nil
end
curAllHeros = {}
end
--界面销毁时调用(用于子类重写)
function FindTreasureDispatchPanel:OnDestroy()
self.spLoader:Destroy()
end
return FindTreasureDispatchPanel