autoImport("SkillItemData") autoImport("SkillDynamicInfo") autoImport("EquipedSkills") SkillProxy = class('SkillProxy', pm.Proxy) SkillProxy.Instance = nil; SkillProxy.NAME = "SkillProxy" SkillProxy.UNLOCKPROSKILLPOINTS = 40 SkillProxy.ManulSkillsIndex = 1 SkillProxy.AutoSkillsIndex = 2 SkillProxy.AutoSkillsWithComboIndex = 3 --場景管理,場景的載入佇列管理等 function SkillProxy:ctor(proxyName, data) self.proxyName = proxyName or SkillProxy.NAME if(SkillProxy.Instance == nil) then SkillProxy.Instance = self end if data ~= nil then self:setData(data) end self.professionSkills = {} self.transformProfess = SkillProfessData.new(99999,0) --放到手動快捷欄的技能,hash表,key為skillidlevel self.equipedSkills = {} --放到自動快捷欄的技能,hash表,key為skillidlevel self.equipedAutoSkills = {} self.equipedSkillsArrays = {{},{},{}} self.comboGetPrevious = {} self.equipedAutoArrayDirty = false self:ResetTransformSkills(0) self.learnedSkills = {} self.sameProfessionType = {} --動態屬性數據,hash表,key為skillID self.dynamicSkillInfos = {} self:initSameProfessionType() -- self:InitCombo() FunctionSkillEnableCheck.Me():Launch() end function SkillProxy:InitCombo() if(GameConfig.AutoSkillGroup) then for k,v in pairs(GameConfig.AutoSkillGroup) do if(#v>1) then for i=#v,2,-1 do self.comboGetPrevious[v[i]] = v[i-1] end end end end end function SkillProxy:initSameProfessionType( ) for key,value in pairs(Table_Class) do local singleItem = Table_Class[key] self.sameProfessionType[singleItem.Type] = self.sameProfessionType[singleItem.Type] or {} table.insert(self.sameProfessionType[singleItem.Type],singleItem) end for key,value in pairs(self.sameProfessionType) do table.sort(value,function (l,r) -- body return l.id <= r.id end) local list = {} for i=1,#value do local cur = value[i] local advanceClasses = cur.AdvanceClass if(advanceClasses) then for j=1,#advanceClasses do local single = advanceClasses[j] -- local tmp = list[tostring(single)] or {} -- table.insert(tmp,cur) list[tostring(single)] = cur end end end for i=1,#value do local cur = value[i] local singleData = list[tostring(cur.id)] if(not singleData and key ~=0)then singleData = Table_Class[1] end -- printRed("cur:"..cur.id) -- if(key ~=0)then -- printRed("pre:"..singleData.id) -- end cur.previousClasses = singleData end end end --在手動技能快捷欄里查詢sortid function SkillProxy:GetEquipedSkillBySort(sortID) for k,v in pairs(self.equipedSkills) do if(v.sortID == sortID and v.sourceId ==0) then return true end end return false end function SkillProxy:GetEquipedSkillByGuid( skillId ,includeAuto) local skill = self.equipedSkills[skillId] if(skill == nil and includeAuto) then skill = self:GetEquipedAutoSkillByGuid(skillId) end return skill end function SkillProxy:GetEquipedAutoSkillByGuid( skillId ) return self.equipedAutoSkills[skillId] end function SkillProxy:startCdTimeBySkillId( skillId ) local sortID = math.floor(skillId / 1000) local skills = self.learnedSkills[sortID] local findSkill = self:FindSkill(skillId) local skillCD,skillDelayCD if(findSkill and Game.Myself ~= nil) then local skillInfo = Game.LogicManager_Skill:GetSkillInfo(findSkill:GetID()) -- if(findSkill.staticData.CD) skillCD = skillInfo:GetCD(Game.Myself) skillDelayCD = skillInfo:GetDelayCD(Game.Myself) if(skills) then local skill for i=1,#skills do skill = self:GetEquipedSkillByGuid(skills[i].guid,true) if(skill == nil) then skill = self:GetTransformedSkill(skills[i].id) end --自動欄組合 if(skill == nil) then skill = skills[i] end self:_InnerStartCD(skill,skillCD,skillDelayCD) end else self:_InnerStartCD(findSkill,skillCD,skillDelayCD) end GameFacade.Instance:sendNotification(SkillEvent.SkillStartEvent) end end function SkillProxy:_InnerStartCD(skillItemData,skillCD,skillDelayCD) if(skillItemData) then --技能CD if(skillCD) then CDProxy.Instance:AddSkillCD(skillItemData.id,0,skillCD,skillCD) end --handle special cd local staticData = skillItemData:GetStaticData() if(staticData) then local buff if(Game.MapManager:IsPVPMode()) then buff = staticData.Buff else buff = staticData.Pvp_buff end if(buff.self~=nil) then local buffConfig,cdTime,buffcd for i=1,#buff.self do buffConfig = Table_Buffer[buff.self[i]] if(buffConfig and buffConfig.BuffEffect and buffConfig.BuffEffect.type and buffConfig.BuffEffect.type=="AddSkillCD") then buffcd = buffConfig.BuffEffect.cd if(buffcd) then for j=1,#buffcd do cdTime = buffcd[j].time CDProxy.Instance:AddSkillCDBySortID(buffcd[j].id,0,cdTime,cdTime) end end end end end end if(skillDelayCD and skillDelayCD>0) then --技能公共CD CDProxy.Instance:AddSkillCD(CDProxy.CommunalSkillCDID,0,skillDelayCD,skillDelayCD) end end end ---------------new-------- function SkillProxy:HasEnoughSkillPoint(pro) local p = self:FindProfessSkill(pro) if(p) then return p.points >=SkillProxy.UNLOCKPROSKILLPOINTS end return false end function SkillProxy:FindProfessSkill(pro,autoCreate) if self.multiSaveId ~= nil then local skills = SaveInfoProxy.Instance:GetProfessionSkill(self.multiSaveId, self.multiSaveType) if skills ~= nil then for i=1,#skills do if pro == skills[i].profession then return skills[i] end end end else for i=1,#self.professionSkills do if(pro==self.professionSkills[i].profession) then return self.professionSkills[i] end end end if(autoCreate) then local professData = SkillProfessData.new(pro,0) local p = Table_Class[pro] for i=1,#p.Skill do professData:AutoFillAdd(p.Skill[i]) end self:AddProfessSkill(professData) return professData end return nil end function SkillProxy:FindSkill(skillID,profession) local professionSkill = nil if(profession) then professionSkill = self:FindProfessSkill(profession) if(professionSkill) then return professionSkill:FindSkillById(skillID) end end local skill for i=1,#self.professionSkills do skill = self.professionSkills[i]:FindSkillById(skillID) if(skill) then return skill end end return self:GetTransformedSkill(skillID) end function SkillProxy:ServerReInit(serverData) Game.Myself:Client_SetAutoFakeDead(0) self.professionSkills = {} self:ClearEquipedSkill() self:ClearEquipedSkill(true) self.learnedSkills = {} local professSkill for i=1,#serverData.data do self:AddProfessSkill(self:CreateProfessSkill(serverData.data[i])) end end function SkillProxy:ClearEquipedSkill(isAutoMode) local t = isAutoMode and self.equipedAutoSkills or self.equipedSkills for k,v in pairs(t) do FunctionSkillEnableCheck.Me():RemoveCheckSkill(v) end if(isAutoMode) then self.equipedAutoSkills = {} self.equipedSkillsArrays[SkillProxy.AutoSkillsIndex] = {} else self.equipedSkills = {} self.equipedSkillsArrays[SkillProxy.ManulSkillsIndex] = {} end end function SkillProxy:CreateProfessSkill(serverSkillData) local data local skill local professSkill = SkillProfessData.new(serverSkillData.profession,serverSkillData.usedpoint) local shortCutAuto = ShortCutProxy.SkillShortCut.Auto for j=1,#serverSkillData.items do data = serverSkillData.items[j] skill = professSkill:UpdateSkill(data) -- SkillUtils.RefreshPlayerSkillData(data.id) if self:_CheckPosInShortCut(skill) then self:AddEquipSkill(skill) end if skill:GetPosInShortCutGroup(shortCutAuto) > 0 then self:AddEquipSkill(skill,true) end if(skill.learned) then self:LearnedSkill(skill) end end professSkill:SortSkills() professSkill:UpdateBasePoints(serverSkillData.primarypoint) return professSkill end function SkillProxy:_CheckPosInShortCut(skill) if skill ~= nil then local _ShortCutEnum = ShortCutProxy.ShortCutEnum for k,v in pairs(_ShortCutEnum) do if skill:GetPosInShortCutGroup(v) > 0 then return true end end end return false end function SkillProxy:AddProfessSkill(professSkill) self.professionSkills[#self.professionSkills + 1] = professSkill table.sort(self.professionSkills,function (l,r) return l.profession < r.profession end) end function SkillProxy:AddEquipSkill(skillItemData,isAutoMode) local skilltable = isAutoMode and self.equipedAutoSkills or self.equipedSkills local skill = skilltable[skillItemData.guid] if(skill==nil or skill~=skillItemData) then EventManager.Me():PassEvent(SkillEvent.SkillEquip,skillItemData) skilltable[skillItemData.guid] = skillItemData end local skillArray = self:GetEquipedSkillsArray(isAutoMode) if(skillItemData.shadow == false) then local shortCutType if isAutoMode then shortCutType = ShortCutProxy.SkillShortCut.Auto else shortCutType = ShortCutProxy.ShortCutEnum.ID1 end if(TableUtil.IndexOf(skillArray,skillItemData) == 0) then local added = false for i=1,#skillArray do if(skillArray[i]:GetPosInShortCutGroup(shortCutType) > skillItemData:GetPosInShortCutGroup(shortCutType)) then table.insert(skillArray,i,skillItemData) added = true break elseif(skillArray[i]:GetPosInShortCutGroup(shortCutType) == skillItemData:GetPosInShortCutGroup(shortCutType)) then skillArray[i] = skillItemData added = true break end end if(not added) then skillArray[#skillArray + 1] = skillItemData end if(isAutoMode) then self.equipedAutoArrayDirty = true if(skillItemData.staticData.SkillType == SkillType.FakeDead) then Game.Myself:Client_SetAutoFakeDead(skillItemData:GetID()) end end else table.sort(skillArray,function(l,r) return l:GetPosInShortCutGroup(shortCutType) < r:GetPosInShortCutGroup(shortCutType) end) end else TableUtil.Remove(skillArray,skillItemData) end end function SkillProxy:RemoveEquipSkill(skillItemData,isAutoMode) local skilltable = isAutoMode and self.equipedAutoSkills or self.equipedSkills skilltable[skillItemData.guid] = nil local skillArray = self:GetEquipedSkillsArray(isAutoMode) if(TableUtil.Remove(skillArray,skillItemData)>0)then if(isAutoMode) then self.equipedAutoArrayDirty = true end end if(self.equipedAutoSkills[skillItemData.guid] == nil and self.equipedSkills[skillItemData.guid] ==nil) then EventManager.Me():PassEvent(SkillEvent.SkillDisEquip,skillItemData) end if(isAutoMode and self.equipedAutoSkills[skillItemData.guid] == nil) then if(skillItemData.staticData.SkillType == SkillType.FakeDead) then Game.Myself:Client_SetAutoFakeDead(0) end end end function SkillProxy:LearnedSkill(skillItemData) self.equipedAutoArrayDirty = true local skills = self.learnedSkills[skillItemData.sortID] if(not skills) then skills = {} self.learnedSkills[skillItemData.sortID] = skills skills[1] = skillItemData else if(TableUtil.IndexOf(skills,skillItemData)==0) then skills[#skills+1] = skillItemData end end if(skillItemData.id == GameConfig.Expression_Blink.needskill) then FunctionPlayerHead.Me():EnableBlinkEye() end local beings = self:GetSummonBeings(skillItemData.staticData) if(beings and #beings>0) then CreatureSkillProxy.Instance:SetEnableBeings(beings,true) end end function SkillProxy:GetSummonBeings(staticData) local Logic_Param = staticData.Logic_Param if(Logic_Param) then return Logic_Param.being_ids end end function SkillProxy:RemoveLearnedSkill(skillItemData) local skills = self.learnedSkills[skillItemData.sortID] if(skills) then TableUtil.Remove(skills,skillItemData) if(#skills==0) then self.learnedSkills[skillItemData.sortID] = nil local beings = self:GetSummonBeings(skillItemData.staticData) if(beings and #beings>0) then CreatureSkillProxy.Instance:SetEnableBeings(beings,false) end end end end function SkillProxy:GetUsedPoints() if(self.usedPointDirty) then self.usedPointDirty = false self.totalUsedPoint = 0 for i=1,#self.professionSkills do if(self.professionSkills[i].points) then self.totalUsedPoint = self.totalUsedPoint + self.professionSkills[i].points end end end return self.totalUsedPoint end function SkillProxy:Update( data ) -- printRed("update") local update = data.update local del = data.del local myself = Game.Myself; local proId = myself.data.userdata:Get(UDEnum.PROFESSION); local profess = nil local professSkill local data local skill for i=1,#del do profess = del[i] professSkill = self:FindProfessSkill(profess.profession) if(professSkill) then for j=1,#profess.items do data = profess.items[j] skill = professSkill:RemoveSkill(data) if(skill) then self:RemoveEquipSkill(skill) self:RemoveEquipSkill(skill,true) self:RemoveLearnedSkill(skill) end end end end for i=1,#update do profess = update[i] professSkill = self:FindProfessSkill(profess.profession) if(professSkill) then self.usedPointDirty = true professSkill:UpdatePoints(profess.usedpoint) local shortCutAuto = ShortCutProxy.SkillShortCut.Auto for j=1,#profess.items do data = profess.items[j] -- LogUtility.InfoFormat("新增技能..{0} 職業:{1}",data.id,profess.profession) skill = professSkill:UpdateSkill(data) if(data.consume) then GameFacade.Instance:sendNotification(SkillEvent.SkillWithUseTimesChanged,skill.id) end -- SkillUtils.RefreshPlayerSkillData(data.id) if self:_CheckPosInShortCut(skill) then self:AddEquipSkill(skill) else self:RemoveEquipSkill(skill) end if skill:GetPosInShortCutGroup(shortCutAuto) > 0 then self:AddEquipSkill(skill,true) else self:RemoveEquipSkill(skill,true) end if(skill.learned) then self:LearnedSkill(skill) end -- if(skill:getCdTime()>0) then -- self:startCdTimeBySkillId(skill.id) -- end end professSkill:UpdateBasePoints(profess.primarypoint) professSkill:SortSkills() else self:AddProfessSkill(self:CreateProfessSkill(profess)) end end end function SkillProxy:GetEquipedSkillsArray(isAuto) if(isAuto) then return self.equipedSkillsArrays[SkillProxy.AutoSkillsIndex] else return self.equipedSkillsArrays[SkillProxy.ManulSkillsIndex] end end function SkillProxy:IsEquipedSkillEmpty(shortCutID) local pos for k,v in pairs(self.equipedSkills) do pos = v:GetPosInShortCutGroup(shortCutID) if pos ~= nil and pos ~= 0 then return false end end return true end --手動技能快捷欄數據,autoFill是否補全空欄上的數據,id技能快捷欄id function SkillProxy:GetCurrentEquipedSkillData( autoFill ,shortCutID) if(shortCutID==nil) then shortCutID = ShortCutProxy.ShortCutEnum.ID1 end if(autoFill) then local equipedSkillData = {} if(autoFill)then for i=1,ShortCutData.CONFIGSKILLNUM do local item = SkillItemData.new(0,i,nil,nil,nil,i) item:SetPosInShortCutGroup(shortCutID, i) equipedSkillData[i] = item end end local pos local equipedSkills if self.multiSaveId ~= nil then equipedSkills = SaveInfoProxy.Instance:GetEquipedSkills(self.multiSaveId, self.multiSaveType) end equipedSkills = equipedSkills or self.equipedSkills for k,v in pairs(equipedSkills) do if(autoFill)then pos = v:GetPosInShortCutGroup(shortCutID) if pos ~= nil and pos ~= 0 then equipedSkillData[pos] = v end elseif(not v.shadow) then table.insert(equipedSkillData,v) end end if(not autoFill) then local ID1 = ShortCutProxy.ShortCutEnum.ID1 table.sort(equipedSkillData,function(l,r) return l:GetPosInShortCutGroup(ID1) < r:GetPosInShortCutGroup(ID1) end) end return equipedSkillData end return self:GetEquipedSkillsArray(false) end --自動技能快捷欄數據 function SkillProxy:GetEquipedAutoSkillData(autoFill) if(autoFill) then local equipedSkillData = {} if(autoFill)then for i=1,ShortCutData.CONFIGAUTOSKILLNUM do local item = SkillItemData.new(0,0,i) equipedSkillData[i] = item end end local equipedAutoSkills if self.multiSaveId ~= nil then equipedAutoSkills = SaveInfoProxy.Instance:GetEquipedAutoSkills(self.multiSaveId, self.multiSaveType) end equipedAutoSkills = equipedAutoSkills or self.equipedAutoSkills local shortCutAuto = ShortCutProxy.SkillShortCut.Auto for k,v in pairs(equipedAutoSkills) do if(autoFill)then equipedSkillData[v:GetPosInShortCutGroup(shortCutAuto)] = v elseif(not v.shadow) then table.insert(equipedSkillData,v) end end local sproxy = ShortCutProxy.Instance table.sort(equipedSkillData,function(l,r) if sproxy:AutoSkillIsLocked(l:GetPosInShortCutGroup(shortCutAuto)) == sproxy:AutoSkillIsLocked(r:GetPosInShortCutGroup(shortCutAuto)) then return l:GetPosInShortCutGroup(shortCutAuto) < r:GetPosInShortCutGroup(shortCutAuto) end return not sproxy:AutoSkillIsLocked(l:GetPosInShortCutGroup(shortCutAuto)) end) return equipedSkillData end return self:GetEquipedSkillsArray(true) end function SkillProxy:GetEquipedAutoSkillNum(includeShadow) local num = 0 local shortCutAuto = ShortCutProxy.SkillShortCut.Auto for k,v in pairs(self.equipedAutoSkills) do if(not v.shadow or (v.shadow and includeShadow)) then if not ShortCutProxy.Instance:AutoSkillIsLocked(v:GetPosInShortCutGroup(shortCutAuto)) then num = num + 1 end end end return num end function SkillProxy:HasLearnedSkill(skillID) local skill = self:GetLearnedSkillWithSameSort(skillID) return skill~= nil and skill.id >= skillID end function SkillProxy:HasLearnedSkillBySort(skillSortID) local skill = self:GetLearnedSkillBySortID(skillSortID) return skill~= nil end function SkillProxy:GetLearnedSkill(skillID) local sortID = math.floor(skillID / 1000) local skills = self.learnedSkills[sortID] if(skills) then for i=1,#skills do if(skills[i].id == skillID) then return skills[i] end end end return nil end function SkillProxy:GetLearnedSkillWithSameSort(skillID) local sortID = math.floor(skillID / 1000) return self:GetLearnedSkillBySortID(sortID) end function SkillProxy:GetLearnedSkillBySortID(sortID) local skills = self.learnedSkills[sortID] return skills ~= nil and skills[1] or nil end function SkillProxy:ForbitUse(skillItemData) if(skillItemData and skillItemData.staticData and skillItemData.staticData.ForbidUse~=nil) then if(Game.MapManager:IsPVPMode_GVGDetailed()) then return skillItemData.staticData.ForbidUse & SkillItemData.ForbidUse.GVG > 0 end end return false end function SkillProxy:SkillCanBeUsed(skillItem) local myselfData = Game.Myself.data if self:CanMagicSkillUse(skillItem) == false then return false end if myselfData:HasLimitSkill() then local skillID if(type(skillItem)=="number") then skillID = skillItem else skillID = skillItem:GetID() end if myselfData:GetLimitSkillTarget(skillID) == nil then return false end elseif myselfData:HasLimitNotSkill() then local skillID if type(skillItem) == "number" then skillID = skillItem else skillID = skillItem:GetID() end if myselfData:GetLimitNotSkill(skillID) ~= nil then return false end end if(self:ForbitUse(skillItem)) then return false end return (not self:IsInCD(skillItem) and self:HasEnoughSp(skillItem) and self:HasEnoughHp(skillItem) and self:IsFitPreCondition(skillItem) and self:HasFitSpecialCost(skillItem)) or false end function SkillProxy:SkillCanBeUsedByID(skillID, allowNoLearned) local myselfData = Game.Myself.data if myselfData:HasLimitSkill() then if myselfData:GetLimitSkillTarget(skillID) == nil then return false end elseif myselfData:HasLimitNotSkill() then if myselfData:GetLimitNotSkill(skillID) ~= nil then return false end end local learnedSkill = self:GetLearnedSkill(skillID) if(learnedSkill) then if self:CanMagicSkillUse(learnedSkill) == false then return false end local canBeUsed = (not self:IsInCD(learnedSkill) and self:HasEnoughSp(learnedSkill) and self:HasEnoughHp(learnedSkill) and self:IsFitPreCondition(learnedSkill) and self:HasFitSpecialCost(learnedSkill)) or false if(self:ForbitUse(skillItem)) then return false end -- if not canBeUsed then -- print(string.format("skill(%d) InCD=%s, HasSP=%s, FitPreCondion=%s", -- skillID, -- tostring(self:IsInCD(learnedSkill)), -- tostring(self:HasEnoughSp(learnedSkill)), -- tostring(self:IsFitPreCondition(learnedSkill)))) -- end return canBeUsed else learnedSkill = self:FindSkill(skillID) if(learnedSkill) then return self:SkillCanBeUsed(learnedSkill) end return allowNoLearned or false end end function SkillProxy:IsInCD(skillItem) if(skillItem) then if(skillItem.staticData.id == Game.Myself.data:GetAttackSkillIDAndLevel()) then return false end return CDProxy.Instance:SkillIsInCD(skillItem.sortID) end return true -- return skillItem:getCdTime()>0 end function SkillProxy:IsFitPreCondition(skillItem) return skillItem.fitPreCondion end function SkillProxy:HasEnoughSp(skillItem,sp) local myself = Game.Myself if(myself.data:IsTransformed()) then return true end if(sp == nil) then sp = myself.data.props.Sp:GetValue() end return self:_HasEnoughProp(myself,skillItem,"GetSP",sp) end function SkillProxy:HasEnoughHp(skillItem,hp) local myself = Game.Myself if(hp == nil) then hp = myself.data.props.Hp:GetValue() end return self:_HasEnoughProp(myself,skillItem,"GetHP",hp) end function SkillProxy:_HasEnoughProp(myself,skillItem,skillInfoFuncName,value) local skillID if(type(skillItem)=="number") then skillID = skillItem else skillID = skillItem:GetID() end local skillInfo = Game.LogicManager_Skill:GetSkillInfo(skillID) if(skillInfo) then --備戰精英 if skillID == 50066001 then local cost = self:GetCombatEliteSpCost(); if(cost and value < cost) then return false else return true end else local func = skillInfo[skillInfoFuncName] if(func) then local cost = func(skillInfo,myself) if(cost and value < cost) then return false else return true end end end end return false end --備戰精英 function SkillProxy:GetProfessSkills() local myProfess = SkillProxy.Instance:GetMyProfession() local professTree = ProfessionProxy.Instance:GetProfessionTreeByClassId(myProfess) datas = {}; 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 ]] ps = SkillProxy.Instance:FindProfessSkill(p.id) if (ps) then professes[#professes + 1] = ps TableUtil.InsertArray(skills, ps.skills) end -- 一轉職業不顯示2、3轉技能 if(mydepth == 1)then break; end p = p:GetNextByBranch(typeBranch) end --設定技能選擇列表 --self.optionList:ResetDatas(skills) for i=1,#skills do if(skills[i].staticData.SkillType == "Buff" and skills[i].learned and (skills[i].staticData.Logic == 'SkillNone' or skills[i].staticData.Logic =='SkillSelfRange')) then datas[#datas+1] = skills[i].staticData; end end end return datas; end function SkillProxy:GetCombatEliteOptionSkills() local skills = SkillProxy.Instance:GetProfessSkills(); local datas = {}; local skillOptions = SkillProxy.Instance:FindSkillOptions(); for i=1,#skills do local skillData = skills[i]; local optId = math.floor(skillData.id/1000); if(TableUtil.HasValue(skillOptions, optId)) then datas[#datas+1] = skills[i]; end end return datas; end function SkillProxy:GetCombatEliteSpCost() local skills = self: GetCombatEliteOptionSkills(); local totalSpCost = 0; for i=1,#skills do local skillData = skills[i] local spCost = 0; if (skillData.SkillCost ~= nil and skillData.SkillCost.sp ~= nil) then spCost = skillData.SkillCost.sp; end totalSpCost = totalSpCost + spCost; end return totalSpCost; end function SkillProxy:HasValue (tab, val) for index, value in ipairs(tab) do if value == val then return true end end return false end function SkillProxy:FindSkillOptions () local array = {} for i=1,7 do local skillID = Game.SkillOptionManager:GetSkillOption(i+5) if skillID > 0 then array[i] = skillID end end return array end function SkillProxy:HasFitSpecialCost(skillItem) local myself = Game.Myself if(myself.data:IsTransformed()) then return true end local skillStaticData if(type(skillItem)=="number") then skillStaticData = Table_Skill[skillItem] else skillStaticData = skillItem:GetStaticData() end if(skillStaticData) then local dynamicSkillInfo = myself.data:GetDynamicSkillInfo(skillStaticData.id) local dynamicAllSkillInfo = self:GetDynamicAllSkillInfo() local isNoItem = dynamicAllSkillInfo ~= nil and dynamicAllSkillInfo:GetIsNoItem() if(#skillStaticData.SkillCost>0) then local specialCost,num for i=1,#skillStaticData.SkillCost do specialCost = skillStaticData.SkillCost[i] if specialCost.itemID and not isNoItem then if(dynamicSkillInfo~=nil) then num = dynamicSkillInfo:GetItemNewCost(specialCost.itemID,specialCost.num) else num = specialCost.num end if(BagProxy.Instance:GetItemNumByStaticID(specialCost.itemID)0) then if(BagProxy.Instance:GetItemNumByStaticID(cost[1])0) then return skills[1].level end return 0 end function SkillProxy:HasAttackSkill(skills) local hasAttackTypeSkill for k,skillData in pairs(skills) do if(skillData and skillData.staticData) then local config = Table_SkillMould[skillData.sortID*1000 + 1] if(config and config.Atktype and config.Atktype==1) then hasAttackTypeSkill = true break end end end return hasAttackTypeSkill end function SkillProxy:GetTransformedSkills() if(self.dynamicTransformedSkills) then return self.dynamicTransformedSkills:GetSkills() end return self.equipedTransformSkills end function SkillProxy:UpdateTransformedSkills(update,del,clear) local data -- if(del and self.dynamicTransformedSkills) then -- for i=1,#del do -- data = del[i] -- skill = self.transformProfess:RemoveSkill(data) -- if(skill) then -- self.dynamicTransformedSkills:RemoveSkill(skill) -- self:RemoveLearnedSkill(skill) -- end -- if(self.dynamicTransformedSkills:IsEmpty()) then -- self.dynamicTransformedSkills = nil -- end -- end -- end if(update and #update >0) then if(self.dynamicTransformedSkills==nil) then self.dynamicTransformedSkills = TransformedEquipSkills.new("pos") end self.dynamicTransformedSkills:RefreshServerSkills(update) elseif(self.dynamicTransformedSkills)then self.dynamicTransformedSkills:RefreshServerSkills({}) end if(clear) then self.dynamicTransformedSkills = nil end end function SkillProxy:ResetTransformSkills(monsterID) if(monsterID==0) then if(self.equipedTransformSkills) then for i=1,#self.equipedTransformSkills do self:RemoveLearnedSkill(self.equipedTransformSkills[i]) end end self.equipedTransformSkills = nil self:UpdateTransformedSkills(nil,nil,true) else local monster = Table_Monster[monsterID] if(monster) then self.equipedTransformSkills = {} local skills = monster.Transform_Skill for i=1,#skills do local skill = SkillItemData.new(skills[i],i,0,0,0) self.equipedTransformSkills[#self.equipedTransformSkills+1] = skill self:LearnedSkill(skill) end end end end function SkillProxy:GetAutoBattleSkills() if(self.equipedTransformSkills~=nil and #self.equipedTransformSkills>0) then return self.equipedTransformSkills end -- return self:GetEquipedSkillsArray(true) return self:GetEquipedAutoSkillData() end local _removeDuplicates = {} function SkillProxy:GetAutoBattleSkillsWithCombo() if(self.equipedTransformSkills ~=nil and #self.equipedTransformSkills>0) then return self.equipedTransformSkills end local array = self.equipedSkillsArrays[SkillProxy.AutoSkillsWithComboIndex] if(self.equipedAutoArrayDirty) then self.equipedAutoArrayDirty = false TableUtility.ArrayClear(array) TableUtility.TableClear(_removeDuplicates) local rawAutos = self:GetEquipedAutoSkillData() local skill,sortID,comboPrevious local shortCutAuto = ShortCutProxy.SkillShortCut.Auto if(GameConfig.AutoSkillGroup) then for k,v in pairs(GameConfig.AutoSkillGroup) do local duplicateCount = 0 if(#v>1) then for i=#v,1,-1 do skill = self:GetLearnedSkillBySortID(v[i]) if skill and skill:GetPosInShortCutGroup(shortCutAuto) > 0 then duplicateCount = duplicateCount + 1 if(duplicateCount>1) then _removeDuplicates[skill:GetPosInShortCutGroup(shortCutAuto)] = 1 end end end end end end for i=#rawAutos,1,-1 do skill = rawAutos[i] if _removeDuplicates[skill:GetPosInShortCutGroup(shortCutAuto)] == nil then -- helplog("準備遞迴",skill.id,skill.staticData.NameZh) self:_RecursiveGetComboPrevious(array,skill) end end end return array end function SkillProxy:_RecursiveGetComboPrevious( array,skill ) if(skill~=nil) then comboPrevious = self.comboGetPrevious[skill.sortID] --kick out passive and fake dead if(skill.staticData.SkillType ~= GameConfig.SkillType.Passive.type and skill.staticData.SkillType ~= SkillType.FakeDead) then table.insert(array,1,skill) end if(comboPrevious ~= nil) then skill = self:GetLearnedSkillBySortID(comboPrevious) while (skill == nil and comboPrevious~=nil) do comboPrevious = self.comboGetPrevious[comboPrevious] skill = self:GetLearnedSkillBySortID(comboPrevious) end self:_RecursiveGetComboPrevious(array,skill) end end end function SkillProxy:GetTransformedSkill(id) local skills = self:GetTransformedSkills() if(skills~=nil and #skills>0) then for i=1,#skills do if(skills[i].id == id) then return skills[i] end end end end function SkillProxy:RefreshSkills() if(self.learnedSkills) then for k,skills in pairs(self.learnedSkills) do for i=1,#skills do SkillUtils.RefreshPlayerSkillData(skills[i].id) end end end end function SkillProxy:LearnedExpressionBlink() return self:HasLearnedSkill(GameConfig.Expression_Blink.needskill) end function SkillProxy:Server_UpdateDynamicSkillInfos(serverData) local dynamicServerData local dynamicData for i=1,#serverData.specinfo do dynamicServerData = serverData.specinfo[i] dynamicData = self.dynamicSkillInfos[dynamicServerData.id] if(dynamicData==nil) then dynamicData = SkillDynamicInfo.new() self.dynamicSkillInfos[dynamicServerData.id] = dynamicData end dynamicData:SetServerInfo(dynamicServerData) local skill = self:GetLearnedSkillBySortID(dynamicServerData.id) if(skill) then if self:_CheckPosInShortCut(skill) then EventManager.Me():PassEvent(SkillEvent.SkillFitPreCondtion,skill) end end end if self.dynamicAllSkillInfo == nil then self.dynamicAllSkillInfo = SkillDynamicInfo.new() end self.dynamicAllSkillInfo:SetServerInfo(serverData.allskillInfo) end --skillidlevel function SkillProxy:GetDynamicSkillInfoByID(skillID) local sortID = math.floor(skillID / 1000) return self.dynamicSkillInfos[sortID] end function SkillProxy:GetDynamicAllSkillInfo() return self.dynamicAllSkillInfo end function SkillProxy:GetSkillCanBreak() if(MyselfProxy.Instance:HasJobBreak()) then return self:GetUsedPoints()>=GameConfig.Peak.SkillPointToBreak end return false end function SkillProxy:SetMultiSave(multiSaveId, multiSaveType) self.multiSaveId = multiSaveId self.multiSaveType = multiSaveType end function SkillProxy:IsMultiSave() return self.multiSaveId ~= nil end function SkillProxy:GetMyProfession() if self.multiSaveId ~= nil then local profession = SaveInfoProxy.Instance:GetProfession(self.multiSaveId, self.multiSaveType) if profession ~= nil then return profession end end return MyselfProxy.Instance:GetMyProfession() end function SkillProxy:GetBeingNpcInfo(beingid) if beingid == nil then return nil end if self.multiSaveId == nil then return PetProxy.Instance:GetMyBeingNpcInfo(beingid) else return SaveInfoProxy.Instance:GetBeingInfo(self.multiSaveId, beingid, self.multiSaveType) end end function SkillProxy:CanMagicSkillUse(skillItem) if skillItem == nil then return false end if skillItem:IsMagicType() and Game.Myself.data:NoMagicSkill() then return false end return true end