2025-06-04 05:12:01 +08:00

654 lines
20 KiB
Plaintext

autoImport("SubView")
autoImport("SkillTip")
autoImport("PeakSkillPreviewTip")
autoImport("SkillCell")
SkillContentPage = class("SkillContentPage",SubView)
local tmpPos = LuaVector3.zero
function SkillContentPage:Init()
-- self.isEditMode = false
self.tipdata = {}
self.cellHeight = 0
self.cellWidth = 0
self:FindObjs()
self:InitCommonSkill()
self:InitProfessSkill()
-- self:InitProfessBtns()
self:AddViewListener()
self:RegisterGuide()
end
function SkillContentPage:OnEnter()
self.professDatas = nil
self.proContentScroll:ResetPosition()
self.proContentScroll.panel.clipOffset = Vector2.zero
self.proContentScroll.transform.localPosition = Vector3.zero
self.professesSkillCenterPos = {}
self:SetEditMode(false)
FunctionSkillSimulate.Me():CancelSimulate()
self:SetCommonSkills()
self:SetProfessSkills(nil,true)
self:RefreshPoints()
self:TrySimulate()
local profess = SkillProxy.Instance:GetMyProfession()
self:SetScrollToProfess(profess)
self.comContentPanel:ResetAndUpdateAnchors()
self.proContentPanel:ResetAndUpdateAnchors()
end
function SkillContentPage:AddViewListener()
-- self:AddListenEvt(MyselfEvent.SkillPointChange,self.RefreshPoints)
self:AddListenEvt(FunctionSkillSimulate.SimulateSkillPointChange,self.RefreshPointsAndUpdateCurrent)
self:AddListenEvt(FunctionSkillSimulate.HasNoModifiedSkills,self.NoModifiedHandler)
self:AddListenEvt(SkillEvent.SkillUpdate,self.RefreshSkills)
self:AddListenEvt(MyselfEvent.MyDataChange,self.HandleMyDataChange)
-- self:AddListenEvt(MyselfEvent.SkillPointChange,self.RefreshPoints)
end
function SkillContentPage:FindObjs()
local scrollArea = self:FindGO("ScrollArea")
self.scrollAreaMines = self:FindGO("Mines",scrollArea)
self.contentMines = self:FindGO("Mines",self:FindGO("Contents"))
local UpLeft = self:FindGO("Up")
self.upleftMines = self:FindGO("Mines",UpLeft)
local BottomLeft = self:FindGO("BottomLeft")
local BottomRight = self:FindGO("BottomRight")
local Right = self:FindGO("RightBtns")
self.bottomleftMines = self:FindGO("Mines",BottomLeft)
self.bottomrightMines = self:FindGO("Mines",Right)
self.leftPointsLabel = self:FindGO("SkillPoints"):GetComponent(UILabel)
self.confirmBtn = self:FindGO("ConfirmBtn"):GetComponent(UIButton)
self.cancelBtn = self:FindGO("CancelBtn"):GetComponent(UIButton)
self.shortCutArea = self:FindGO("ShortCutArea"):GetComponent(UIWidget)
self.commonScrollArea = self:FindGO("CommonArea")
self.professScrollArea = self:FindGO("ProfessArea")
self.proContentPanel = self:FindGO("ProfessContent"):GetComponent(UIPanel)
self.proContentScroll = self:FindGO("ProfessContent"):GetComponent(ScrollViewWithProgress)
self.comContentPanel = self:FindGO("CommonContent"):GetComponent(UIPanel)
self.commonGrid = self:FindGO("CommonGrid"):GetComponent(UIGrid)
self.professGrid = self:FindGO("ProfessGrid")
self.skillCellPlaceHolder = self:FindGO("SkillCellPlaceHolder")
self.professBtnGrid = self:FindGO("ProfessionGrid"):GetComponent(UIGrid)
self.professBgGrid = self:FindGO("ProfessBgGrid"):GetComponent(UITable)
self.sperate = self:FindGO("Sperate")
self.comContentPanel:ResetAndUpdateAnchors()
self.proContentPanel:ResetAndUpdateAnchors()
-- print(self.contentPanel.height)
if(ApplicationInfo.IsIphoneX()) then
self.professGrid.transform.localPosition = Vector3(0,53,0)
end
self.cellHeight = math.min(self.comContentPanel.height/5 ,self.proContentPanel.height/5)- 3
self.cellWidth = 75
self.professBtnGrid.cellHeight = self.cellHeight
self.commonGrid.cellHeight = self.cellHeight
self.commonGrid.transform.localPosition = Vector3(0,self.cellHeight + self.comContentPanel.baseClipRegion.y,0)
self:AddClickEvent(self.cancelBtn.gameObject,function ()
self:CancelSimulate()
end)
self:AddClickEvent(self.confirmBtn.gameObject,function ()
local skillIDs = FunctionSkillSimulate.Me():GetModifiedSkills()
self:CheckNeedShowOverFlow(skillIDs)
ServiceSkillProxy.Instance:CallLevelupSkill(SceneSkill_pb.ELEVELUPTYPE_MT,skillIDs)
end)
self.proContentScroll.onProgressStateChange = function (progress,state)
self:ScrollStateChange(progress,state)
end
end
function SkillContentPage:Switch(val)
if(self.switch~=val) then
self.switch = val
if(val) then
self:Show(self.upleftMines)
self:Show(self.bottomleftMines)
self:Show(self.scrollAreaMines)
self:Show(self.contentMines)
self:Show(self.bottomrightMines)
else
self:Hide(self.upleftMines)
self:Hide(self.bottomleftMines)
self:Hide(self.scrollAreaMines)
self:Hide(self.contentMines)
self:Hide(self.bottomrightMines)
end
end
end
function SkillContentPage:RegisterGuide()
self:AddOrRemoveGuideId(self.confirmBtn.gameObject,30)
end
function SkillContentPage:InitCommonSkill()
self.commonList = ListCtrl.new(self.commonGrid,AdventureSkillCell,"SkillCell")
self.commonList:AddEventListener(MouseEvent.MouseClick,self.ShowTipHandler,self)
end
function SkillContentPage:InitProfessSkill()
self.professList = ListCtrl.new(self.professGrid,SkillCell,"SkillCell")
self.professList:AddEventListener(MouseEvent.MouseClick,self.ShowTipHandler,self)
self.professList:AddEventListener(SkillCell.Click_PreviewPeak,self.ShowPeakTipHandler,self)
self.professList:AddEventListener(SkillCell.SimulationUpgrade,self.SimulationUpgradeHandler,self)
self.professList:AddEventListener(SkillCell.SimulationDowngrade,self.SimulationDowngradeHandler,self)
end
function SkillContentPage:ShowTipHandler(cell)
self:_ShowTip(cell,SkillTip,"SkillTip")
end
function SkillContentPage:ShowPeakTipHandler(cell)
self:_ShowTip(cell,PeakSkillPreviewTip,"PeakSkillPreviewTip")
end
function SkillContentPage:_ShowTip(cell,tipCtrl,tipView)
local camera = NGUITools.FindCameraForLayer (cell.gameObject.layer);
if(camera) then
local viewPos = camera:WorldToViewportPoint(cell.gameObject.transform.position)
local data = cell.data
if(self.isEditMode) then
data = SimulateSkillProxy.Instance:GetSimulateSkillItemData(data.sortID)
end
self.tipdata.data = data
TipsView.Me():ShowTip(tipCtrl,self.tipdata,tipView)
local tip = TipsView.Me().currentTip
if(tip) then
tip:SetCheckClick(self:TipClickCheck())
if(viewPos.x <=0.5) then
tmpPos[1],tmpPos[2],tmpPos[3] = self.comContentPanel.width/4,0,0
else
tmpPos[1],tmpPos[2],tmpPos[3] = -self.comContentPanel.width/4,0,0
end
if(tip.data.staticData.id == 50066001 and tmpPos[1]<-200) then
tmpPos[1] = 200
end
tip.gameObject.transform.localPosition = tmpPos
end
end
end
function SkillContentPage:TipClickCheck()
if(self.tipCheck == nil) then
self.tipCheck = function ()
local click = UICamera.selectedObject
if(click) then
local cells = self.commonList:GetCells()
if(self:CheckIsClickCell(cells,click)) then
return true
end
cells = self.professList:GetCells()
if(self:CheckIsClickCell(cells,click)) then
return true
end
end
return false
end
end
return self.tipCheck
end
function SkillContentPage:CheckIsClickCell(cells,clickedObj)
for i=1,#cells do
if(cells[i]:IsClickMe(clickedObj)) then
return true
end
end
return false
end
function SkillContentPage:ClickProfessBtn(cell)
-- self:ScrollToProfess(cell,true)
end
function SkillContentPage:SetScrollToProfess(profess)
local index
local datas = self.professDatas
if(datas) then
for i=1,#datas do
if(profess==datas[i].data.profession) then
index = i
end
end
end
if(index) then
self:ScrollToProfess(index,false)
end
end
function SkillContentPage:ScrollToProfess(index,spring)
local sv = self.proContentScroll
local data = self.professesSkillCenterPos[index]
local offset = data.pos
if (not sv.canMoveHorizontally) then offset.x = self.proContentPanel.cachedTransform.localPosition.x end
if (not sv.canMoveVertically) then offset.y = self.proContentPanel.cachedTransform.localPosition.y end
if(spring) then
SpringPanel.Begin(self.proContentPanel.cachedGameObject, offset, 10);
else
self.proContentScroll:MoveRelative(offset)
end
end
function SkillContentPage:SimulationUpgradeHandler(cell)
if(FunctionSkillSimulate.Me():Upgrade(cell)) then
self:SetEditMode(true)
self:RefreshPoints()
self:UpdateCurrentProfessSkillPoints()
end
end
function SkillContentPage:SimulationDowngradeHandler(cell)
FunctionSkillSimulate.Me():Downgrade(cell)
self:RefreshPoints()
self:UpdateCurrentProfessSkillPoints()
end
function SkillContentPage:NoModifiedHandler(note)
self:SetEditMode(false)
end
function SkillContentPage:RefreshSkills(note)
self:CancelSimulate()
if(self.currentScrollProfessData) then
self.container:UpdateTopByProfess(self.currentScrollProfessData.data.profession)
end
end
function SkillContentPage:RefreshProfess(note)
-- self.professesSkillCenterPos = {}
-- self.professDatas = nil
-- self:RefreshSkills()
-- local myProfess = MyselfProxy.Instance:GetMyProfession()
-- local professTree = ProfessionProxy.Instance:GetProfessionTreeByClassId(myProfess)
-- if(professTree~=nil) then
-- self:LayOutProfessSkills(professTree)
-- end
-- self:SetScrollToProfess(myProfess)
end
function SkillContentPage:QuitProfess(toDo,owner)
if(self.isEditMode)then
MsgManager.ConfirmMsgByID( 602,function()
self:CancelSimulate()
toDo(owner)
end)
else
toDo(owner)
end
end
function SkillContentPage:TrySimulate()
if self.container.multiSaveId ~= nil then
local cells = self.professList:GetCells()
for i=1,#cells do
local cell = cells[i]
if cell then
cell:ShowUpgrade(false)
cell:SetDragEnable(false)
end
end
local commoncells = self.commonList:GetCells()
for i=1,#commoncells do
local cell = commoncells[i]
if cell then
cell:SetDragEnable(false)
end
end
return
end
if(not FunctionSkillSimulate.Me().isIsSimulating) then
FunctionSkillSimulate.Me():StartSimulate(self.professList:GetCells(),self.professDatas,self:GetSkillPoint())
end
end
function SkillContentPage:CancelSimulate()
self:SetEditMode(false)
FunctionSkillSimulate.Me():CancelSimulate()
self:SetProfessSkills()
self:TrySimulate()
self:RefreshPoints()
end
function SkillContentPage:ShowCommon()
self.ShowingCommon = true
self:Show(self.commonScrollArea)
self:Show(self.comContentPanel.gameObject)
self:Hide(self.professScrollArea)
self:Hide(self.proContentPanel.gameObject)
self:Hide(self.professBtnGrid.gameObject)
self:SetEditMode(false)
self.commonGrid:Reposition()
end
function SkillContentPage:ShowProfess()
self.ShowingCommon = false
self:Hide(self.commonScrollArea)
self:Hide(self.comContentPanel.gameObject)
self:Show(self.professScrollArea)
self:Show(self.proContentPanel.gameObject)
-- if(#self.professBtnList:GetCells() > 1) then
-- self:Show(self.professBtnGrid.gameObject)
-- else
-- self:Hide(self.professBtnGrid.gameObject)
-- end
self:SetEditMode(false)
end
function SkillContentPage:SetCommonSkills(professSkill)
professSkill = professSkill or SkillProxy.Instance:FindProfessSkill(ProfessionProxy.Instance.rootProfession.id)
if(professSkill) then
local num = 0
for i=1,#professSkill.skills do
if(not professSkill.skills[i].shadow) then
num = num + 1
end
end
local pos = self.commonGrid.transform.localPosition
if(num<=self.commonGrid.maxPerLine) then
pos.x = 0
else
num = math.floor((num-1)/self.commonGrid.maxPerLine)
pos.x = (-num)*self.commonGrid.cellWidth / 2
end
pos.x = pos.x - 80
self.commonGrid.transform.localPosition = pos
self.commonList:ResetDatas(professSkill.skills)
end
end
function SkillContentPage:SetProfessSkills(skills,needLayout)
local myProfess = SkillProxy.Instance:GetMyProfession()
local professTree = ProfessionProxy.Instance:GetProfessionTreeByClassId(myProfess)
if(professTree~=nil) then
--如果不是初心者的話(找到職業技能樹),才需要顯示職業技能
local professes = {}
local skills = {}
local p = professTree.transferRoot
local ps = nil
local typeBranch = Table_Class[myProfess].TypeBranch
local mydepth = professTree:GetProfessDataByClassID(myProfess).depth;
while p~=nil do
ps = SkillProxy.Instance:FindProfessSkill(p.id,true)
professes[#professes + 1] = ps
TableUtil.InsertArray(skills, ps.skills)
-- 一轉職業不顯示2、3轉技能
if(mydepth == 1)then
break;
end
p = p:GetNextByBranch(typeBranch)
end
self:SetProfessBtns(professes)
self.professList:ResetDatas(skills,true,false)
if(needLayout) then
self:LayOutProfessSkills(professTree)
-- self.proContentScroll:ResetPosition()
end
end
end
function SkillContentPage:LayOutProfessSkills(professTree)
professTree:InitSkillPath(SkillProxy.Instance:GetMyProfession())
local cells = self.professList:GetCells()
local firstCell
local cell
local x,y
local minCell = {x=1000,y=1000}
local config
local sortMap = {}
local requiringCells = {}
local professDatas = {}
local professData
local professCount = 0
for i=1,#cells do
cell = cells[i]
sortMap[cell.data.sortID] = cell
if(cell.data.requiredSkillID) then
requiringCells[#requiringCells+1] = cell
end
cell:RemoveLink()
cell:ResetLink()
x,y = cell:GetGridXY()
minCell.x = math.min(minCell.x,x)
if(x == minCell.x) then
minCell.y = math.min(minCell.y,y)
if(y == minCell.y) then firstCell = cell end
end
tmpPos:Set(self:GetX(x),-(y-3)*self.cellHeight,0)
cell.gameObject.transform.localPosition = tmpPos
-- + self.comContentPanel.height/2 + 70
professData = professDatas[cell.data.profession]
if(professData == nil) then
professCount = professCount + 1
professData = {minX=10000,maxX=0,id=cell.data.profession}
professDatas[cell.data.profession] = professData
end
professData.minX = math.min(professData.minX,x)
professData.maxX = math.max(professData.maxX,x)
end
local requiredSkill
local requiredSort
for i=1,#requiringCells do
cell = requiringCells[i]
requiredSort = math.floor(cell.data.requiredSkillID/1000)
requiredSkill = sortMap[requiredSort]
-- print(cell.data.sortID,"需要 技能",requiredSort)
if(requiredSkill) then
local x,y = requiredSkill:GetGridXY()
local path = professTree.paths[y][x]
requiredSkill:DrawLink(cell,path.between,path.up)
if self.container.multiSaveId ~= nil then
requiredSkill:LinkUnlock(requiredSkill.data.id >= cell.data.requiredSkillID and requiredSkill.data.learned)
end
end
end
self:SetProgressScroll(professDatas,professData.maxX)
self:TrySperate(professDatas,professCount>1)
--place holder
tmpPos:Set(self:GetX(professData.maxX+4),0)
self.skillCellPlaceHolder.transform.localPosition = tmpPos
--註冊第一個技能升級按鈕
if(firstCell~=nil) then
self:AddOrRemoveGuideId(firstCell.upgradeBtn,32)
end
end
function SkillContentPage:GetX(x)
return x*self.cellWidth - self.comContentPanel.width/2
end
function SkillContentPage:TrySperate(professDatas,needCreate)
if(self.sperates) then
for i=1,#self.sperates do
GameObject.Destroy(self.sperates[i])
end
end
self.sperates = {}
if(needCreate) then
local xs = {}
for k,v in pairs(professDatas) do
xs[#xs+1] = v.maxX
end
table.sort(xs)
table.remove(xs,#xs)
local height = self.comContentPanel.height - 30
local centerY = self.professGrid.transform.localPosition.y
for i=1,#xs do
local s = GameObject.Instantiate(self.sperate)
s.transform:SetParent(self.sperate.transform.parent)
s:SetActive(true)
s.transform.localScale = Vector3.one
s.transform.localPosition = Vector3(self:GetX(xs[i] + 3.5),centerY,0)
local sp = self:FindGO("SUp",s):GetComponent(UISprite)
sp.height = height/2
sp = self:FindGO("SDown",s):GetComponent(UISprite)
sp.height = height/2
self.sperates[#self.sperates+1] = s
end
end
end
function SkillContentPage:SetProgressScroll(gridXYs,max)
local datas = self.professDatas
local progress = 0
local professData
--背景
self.professesSkillCenterCell = {}
local stateMax
for i=1,#datas do
professData = gridXYs[datas[i].data.profession]
local centerX = math.ceil((professData.maxX+professData.minX)/2)
local x = -centerX*self.cellWidth + self.comContentPanel.width/2
if(x>0) then
x = x - professData.minX * self.cellWidth
else
x = x - 120
end
self.professesSkillCenterPos[#self.professesSkillCenterPos + 1] = {pos = Vector3(x,0,0),minX = professData.minX,maxX = professData.maxX}
-- self.proContentScroll:AddStateRange(i,professData.minX/max,professData.maxX/max,false)
stateMax = professData.maxX/max
self.proContentScroll:AddStateRange(i,progress,stateMax,false)
progress = stateMax
end
local state = self.proContentScroll.state
self.proContentScroll:CheckState()
if(state == self.proContentScroll.state) then
self:ScrollStateChange(0,state)
end
end
function SkillContentPage:ScrollStateChange(progress,state)
if(self.professDatas==nil) then
return
end
local cellData = self.professDatas[state]
if(cellData ~= self.currentScrollProfessData) then
self.currentScrollProfessData = cellData
end
if(self.currentScrollProfessData) then
self.container:UpdateTopByProfess(self.currentScrollProfessData.data.profession)
end
self:UpdateCurrentProfessSkillPoints()
end
function SkillContentPage:UpdateCurrentProfessSkillPoints()
if(self.currentScrollProfessData) then
self.container:UpdateProfessSkillPoints(self.currentScrollProfessData.points)
end
end
function SkillContentPage:SetProfessBtns(professes)
if(self.professDatas==nil) then
self.professDatas = {}
for i=1,#professes do
self.professDatas[#self.professDatas + 1] = {data = professes[i],points = professes[i].points}
end
end
end
function SkillContentPage:SetEditMode(val)
if(self.isEditMode~=val) then
self.isEditMode = val
if(val) then
self:Show(self.confirmBtn.gameObject)
self:Show(self.cancelBtn.gameObject)
else
self:Hide(self.confirmBtn.gameObject)
self:Hide(self.cancelBtn.gameObject)
self:ResetProfessPoints()
end
end
end
function SkillContentPage:ResetProfessPoints()
if(self.professDatas) then
local data
for i=1,#self.professDatas do
data = self.professDatas[i]
data.points = data.data.points
end
self:UpdateCurrentProfessSkillPoints()
end
end
function SkillContentPage:RefreshPointsAndUpdateCurrent()
self:RefreshPoints()
self:UpdateCurrentProfessSkillPoints()
end
function SkillContentPage:RefreshPoints()
local points
if(self.isEditMode) then
points = FunctionSkillSimulate.Me().totalPoints
else
points = self:GetSkillPoint()
end
self.leftPointsLabel.text = string.format(ZhString.SkillView_LeftSkillPointText,points)
FunctionGuide.Me():skillPointCheck(points)
end
function SkillContentPage:OnExit()
FunctionSkillSimulate.Me():CancelSimulate()
end
function SkillContentPage:CheckNeedShowOverFlow(levelUpSkillIDs)
--是否滿足首次
if(FunctionFirstTime.Me():IsFirstTime(FunctionFirstTime.SkillOverFlow)) then
local cells = self.container.shortCutList:GetCells()
local equipedNum = 0
for i=1,#cells do
if(cells[i].data and cells[i].data.staticData) then
equipedNum = equipedNum + 1
end
end
local skillProxy = SkillProxy.Instance
--快捷欄目前已滿
if(equipedNum>=ShortCutProxy.Instance:GetUnLockSkillMaxIndex()) then
--檢測學習的技能是否有主動技能
local flag = false
for i=1,#levelUpSkillIDs do
if(Table_Skill[levelUpSkillIDs[i]].SkillType ~= GameConfig.SkillType.Passive.type) then
if(skillProxy:GetEquipedSkillBySort(math.floor(levelUpSkillIDs[i]/1000))==false) then
flag = true
break
end
end
end
if(flag) then
FunctionFirstTime.Me():DoneFirstTime(FunctionFirstTime.SkillOverFlow)
TipManager.Instance:ShowBubbleTipById(BubbleID.SkillFirstTimeOverFlow, self.shortCutArea, nil, {275,-20})
end
end
end
end
function SkillContentPage:GetSkillPoint()
local multiSaveId = self.container.multiSaveId
if multiSaveId ~= nil then
local point = SaveInfoProxy.Instance:GetUnusedSkillPoint(multiSaveId, self.container.multiSaveType)
if point ~= nil then
return point
end
end
return Game.Myself.data.userdata:Get(UDEnum.SKILL_POINT)
end
function SkillContentPage:HandleMyDataChange(note)
local data = note.body
if data ~= nil then
local skillType = ProtoCommon_pb.EUSERDATATYPE_SKILL_POINT
for i=1,#data do
if data[i].type == skillType then
self:RefreshPoints()
break
end
end
end
end