2025-06-04 05:02:57 +08:00

693 lines
18 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

ProfessionProxy = class('ProfessionProxy', pm.Proxy)
ProfessionProxy.Instance = nil;
ProfessionProxy.NAME = "ProfessionProxy"
--玩家背包数据管理
function ProfessionProxy:ctor(proxyName, data)
self.proxyName = proxyName or ProfessionProxy.NAME
if(ProfessionProxy.Instance == nil) then
ProfessionProxy.Instance = self
end
self.professionMap = {}
self:ParseProfession()
end
function ProfessionProxy:print( ... )
if(self.enableLog) then
print(...)
end
end
--解析职业树关系
function ProfessionProxy:ParseProfession()
self.professTreeByTypes = {}
--初心者
local rootID = 1
local rootClass = Table_Class[rootID]
self.rootProfession = ProfessionData.new(rootClass)
if(rootClass) then
self.professionMap[rootID] = self.rootProfession
local class
local profession
local tree
for i=1,#rootClass.AdvanceClass do
class = Table_Class[rootClass.AdvanceClass[i]]
profession = ProfessionData.new(class,1)
self.professionMap[class.id] = profession
tree = ProfessionTree.new(self.rootProfession,profession)
self:print("-----开始解析二转职业",class.id)
self:ParseNextProfession(tree,profession)
self.professTreeByTypes[class.Type] = tree
end
else
error(string.format("解析职业表出错未找到id %d的初心者",rootID))
end
end
function ProfessionProxy:ParseNextProfession(tree,profession)
local parentClass = profession.data
local class
local p
if(parentClass.AdvanceClass) then
for i=1,#parentClass.AdvanceClass do
class = Table_Class[parentClass.AdvanceClass[i]]
self:print("-----",class.id)
p = ProfessionData.new(class)
self.professionMap[class.id] = p
profession:AddNext(p)
self:ParseNextProfession(tree,p)
end
end
end
function ProfessionProxy:GetProfessionTreeByType(t)
if(t == 0) then
return nil
else
return self.professTreeByTypes[t]
end
end
--返回Nil的话为初心者也或者没找到
function ProfessionProxy:GetProfessionTreeByClassId(classID)
local class = Table_Class[classID]
return class and self:GetProfessionTreeByType(class.Type) or nil
end
function ProfessionProxy:GetDepthByClassId(classID)
local tree = self:GetProfessionTreeByClassId(classID)
if(not tree) then
return 0
else
local p = tree:GetProfessDataByClassID(classID)
if(p) then
return p.depth
end
end
end
function ProfessionProxy:GetThisIdPreviousId(id)
for k,v in pairs(Table_Class) do
local advanceTable = v.AdvanceClass
if advanceTable then
for k1,v1 in pairs(advanceTable) do
if id == v1 then
return v.id
end
end
end
end
return nil
end
function ProfessionProxy:GetThisIdJiuZhiTiaoJianLevel(id)
local previousId = self:GetThisIdPreviousId(id)
if previousId then
local thisIdData =Table_Class[id]
local previousData = Table_Class[previousId]
if previousData.MaxPeak~=nil then
local doublePreId = self:GetThisIdPreviousId(previousId)
if doublePreId then
return previousData.MaxPeak - previousData.MaxJobLevel + previousData.MaxJobLevel - Table_Class[doublePreId].MaxJobLevel
else
helplog("GetThisIdJiuZhiTiaoJianLevel(id) 检查配置表")
end
else
return thisIdData.MaxJobLevel - previousData.MaxJobLevel
end
else
helplog("GetThisIdJiuZhiTiaoJianLevel(id) 检查配置表")
end
end
function ProfessionProxy:GetThisJobLevelForClient(id,level)
local returnLevel = level or 0
local previousId = self:GetThisIdPreviousId(id) or 0
if level>Table_Class[id].MaxJobLevel and Table_Class[id].MaxPeak==nil then
--这里会发一个id11 level130过来 实际上id 11 只能达到40
level = Table_Class[id].MaxJobLevel or 0
elseif Table_Class[id].MaxPeak~=nil and level>Table_Class[id].MaxPeak then
level = Table_Class[id].MaxPeak or 0
end
if previousId and previousId~=0 then
local previousData = Table_Class[previousId]
if previousData.MaxPeak~=nil then
returnLevel = level - previousData.MaxPeak
elseif previousData.MaxJobLevel~=nil then
returnLevel = level - previousData.MaxJobLevel
end
end
if returnLevel<0 then
helplog("gm")
returnLevel = 1;
end
return returnLevel
end
function ProfessionProxy:GetPreviousProfess(pro)
local p = self.professionMap[pro]
if(p) then
return p.parentProfession
end
return nil
end
function ProfessionProxy:RecvUpdateBranchInfoUserCmd(data)
BranchInfoSaveProxy.Instance:RecvUpdateBranchInfoUserCmd(data)
end
function ProfessionProxy:SetCurProfessionUserInfo(data)
self.CurProfessionUserInfo = data
end
function ProfessionProxy:GetCurProfessionUserInfo()
return self.CurProfessionUserInfo or nil
end
function ProfessionProxy:RecvProfessionQueryUserCmd(data)
self.ProfessionQueryUserTable={}
if data~=nil and data.body~=nil and data.body.items~=nil then
local items = data.body.items
local haveFoundOriginBranch = false
for i = 1 ,#items do
local data = items[i]
if data.isbuy== nil then
helplog("isbuy 服务器没发!!!!")
end
self.ProfessionQueryUserTable[data.branch] = {}
self.ProfessionQueryUserTable[data.branch].branch = data.branch
self.ProfessionQueryUserTable[data.branch].profession = data.profession
self.ProfessionQueryUserTable[data.branch].joblv = data.joblv
self.ProfessionQueryUserTable[data.branch].isbuy = data.isbuy
self.ProfessionQueryUserTable[data.branch].iscurrent = data.iscurrent
if data.isbuy == false then
haveFoundOriginBranch = true
end
end
if haveFoundOriginBranch== false then
local curId = MyselfProxy:GetMyProfession()
local curClassData = Table_Class[curId]
self.ProfessionQueryUserTable[curClassData.TypeBranch]={}
self.ProfessionQueryUserTable[curClassData.TypeBranch].branch =curClassData.TypeBranch
self.ProfessionQueryUserTable[curClassData.TypeBranch].profession = MyselfProxy:GetMyProfession()
self.ProfessionQueryUserTable[curClassData.TypeBranch].joblv = MyselfProxy.Instance:JobLevel()
self.ProfessionQueryUserTable[curClassData.TypeBranch].isbuy = false
self.ProfessionQueryUserTable[curClassData.TypeBranch].iscurrent = true
ProfessionProxy.Instance:SetCurTypeBranch(curClassData.TypeBranch)
end
end
end
function ProfessionProxy:GetProfessionQueryUserTable()
return self.ProfessionQueryUserTable or {}
end
function ProfessionProxy:GetGeneraData()
local datas = {}
for i=1,#GameConfig.BaseAttrConfig do
local data = {}
local single = GameConfig.BaseAttrConfig[i]
local prop = Game.Myself.data.props[single];
local extraP = MyselfProxy.Instance.extraProps[single]
local data = {}
data.prop = prop
data.extraP = extraP
if(self.attr)then
data.addData = self.attr[prop.propVO.id] or 0
local maxProp = Game.Myself.data.props["Max"..data.prop.propVO.name]
maxProp = maxProp and maxProp.propVO or nil
maxProp = maxProp and maxProp.id or -999
data.maxAddData = self.attr[maxProp] or 0
end
data.type = BaseAttributeView.cellType.normal
table.insert(datas,data)
end
return datas
end
function ProfessionProxy:SetCurTypeBranch(curTypeBranch)
self.curTypeBranch = curTypeBranch
end
function ProfessionProxy:GetCurTypeBranch()
return self.curTypeBranch
end
function ProfessionProxy:GetFixedData()
local datas = AdventureDataProxy.Instance:GetAllFixProp()
if(#datas >0)then
table.sort(datas,function ( l,r )
return l.prop.propVO.id < r.prop.propVO.id
end)
else
end
return datas
end
function ProfessionProxy:IsThisIdYiJiuZhi(id)
local curOcc = Game.Myself.data:GetCurOcc()
self.curProfessionId = curOcc.profession
if self.curProfessionId==id then
return true
end
local curProfessionData = Table_Class[self.curProfessionId]
local thisIdClassData = Table_Class[id]
if curProfessionData==nil then
return false
end
if thisIdClassData==nil then
return false
end
local serverData = ProfessionProxy.Instance:GetProfessionQueryUserTable()[thisIdClassData.TypeBranch]
if serverData then
if serverData.profession>=id then
return true
else
return false
end
else
--这里还差一个判断条件如果
if id%10 == 1 then
local advanceClassIdTable = thisIdClassData.AdvanceClass
for k,v in pairs(advanceClassIdTable) do
local serverData = ProfessionProxy.Instance:GetProfessionQueryUserTable()[Table_Class[v].TypeBranch]
if serverData and serverData.profession>=id then
return true
end
end
end
return false
end
if id%10==1 then
if curProfessionData.Type == thisIdClassData.Type then
return true
end
elseif id%10>=2 then
if curProfessionData.TypeBranch == thisIdClassData.TypeBranch then
if id<=self.curProfessionId then
return true
end
end
end
return false
end
function ProfessionProxy:IsThisIdYiGouMai(id)
local curOcc = Game.Myself.data:GetCurOcc()
self.curTypeBranch = curOcc.professionData.TypeBranch
self.curProfessionId = curOcc.profession
--防止买了一个停在另一个职业的分支
local S_ProfessionDatas = ProfessionProxy.Instance:GetProfessionQueryUserTable()
for k,v in pairs(S_ProfessionDatas) do
if v.iscurrent then
self.curTypeBranch = v.branch
end
end
if id%10 == 1 then
local thisIdClassData = Table_Class[id]
for k,v in pairs(ProfessionProxy.Instance:GetProfessionQueryUserTable()) do
local SClassData = Table_Class[v.profession]
if SClassData then
if thisIdClassData.Type == SClassData.Type then
return true
end
end
end
elseif id%10>=2 then
local thisIdClassData = Table_Class[id]
local thisIdBranch = thisIdClassData.TypeBranch
local S_table = ProfessionProxy.Instance:GetProfessionQueryUserTable()
if S_table[thisIdBranch]~=nil then
return true
end
if self.curTypeBranch == thisIdClassData.TypeBranch then
if self.curProfessionId %10==1 then
return false
else
return true
end
end
end
return false
end
function ProfessionProxy:IsThisIdKeGouMai(id)
if id%10 == 1 then
return false
elseif id%10==2 then
return true
end
return false
end
function ProfessionProxy:isOriginProfession(id)
local thisClassData = Table_Class[id]
if thisClassData == nil then
return false
end
local S_data = ProfessionProxy.Instance:GetProfessionQueryUserTable()
local isOriginProfession = false
for k,v in pairs(S_data) do
if v.isbuy == false then
local sClassData = Table_Class[v.profession]
if sClassData.Type == thisClassData.Type then
isOriginProfession = true
break
end
end
end
return isOriginProfession
end
--多职业代码重构-
function ProfessionProxy:IsMPOpen()
if FunctionUnLockFunc.Me():CheckCanOpen(9006) == false then
return false
end
local isOpen = false
local S_data = ProfessionProxy.Instance:GetProfessionQueryUserTable()
for k,v in pairs(S_data) do
if v.isbuy == false and v.profession %10>=3 then
isOpen = true
end
end
return isOpen
end
function ProfessionProxy:PurchaseFunc(id)
local mapid = Game.MapManager:GetMapID()
local mapType = Table_Map[mapid].Type
if mapType == 4 or mapType==6 then
else
MsgManager.ShowMsgByID(25693)
do return end
end
local isOriginProfession = self:isOriginProfession(id)
local branch = Table_Class[id].TypeBranch
---有职业优惠券优先用券
if GameConfig.ProfessionExchangeTicket== nil then
if ApplicationInfo.IsRunOnEditor() then
MsgManager.FloatMsg(nil, "策划没有上传 GameConfig.ProfessionExchangeTicket")
end
do return end
end
for k,v in pairs(GameConfig.ProfessionExchangeTicket) do
if BagProxy.Instance:GetItemNumByStaticID(k)>0 and v == Table_Class[id].Type then
ServiceNUserProxy.Instance:CallProfessionBuyUserCmd(branch, true)
do return end
end
end
if isOriginProfession then
local needmoney = GameConfig.Profession.price_zeny or 0
if needmoney>MyselfProxy.Instance:GetROB() then
local sysMsgID = 25419
local item_100 = Table_Item[100]
MsgManager.ShowMsgByID(sysMsgID,item_100.NameZh)
else
ServiceNUserProxy.Instance:CallProfessionBuyUserCmd(branch, true)
end
else
local needmoney = GameConfig.Profession.price_gold
if needmoney>MyselfProxy.Instance:GetLottery() then
local sysMsgID = 25419
local item_151 = Table_Item[151]
MsgManager.ShowMsgByID(sysMsgID,item_151.NameZh)
else
ServiceNUserProxy.Instance:CallProfessionBuyUserCmd(branch, true)
end
end
end
function ProfessionProxy:NeedShowSelfData(targetBranch)
local currentBranch = ProfessionProxy.Instance:GetCurTypeBranch()
if currentBranch == targetBranch then
return true
else
return false
end
end
function ProfessionProxy:NeedShowSaveInfoData(targetBranch)
local cursaveData = BranchInfoSaveProxy.Instance:GetUsersaveData(targetBranch)
if cursaveData then
return true
else
return false
end
end
function ProfessionProxy:SetTopScrollChooseID(id)
self.topScrollChooseID = id
end
function ProfessionProxy:GetTopScrollChooseID()
return self.topScrollChooseID
end
function ProfessionProxy:ShouldThisIdVisible(id)
local findErZhuanId = (id-id%10)+2
if not self:IsThisIdYiJiuZhi(findErZhuanId) and id%10>2 then
return false
end
return true;
end
function ProfessionProxy:GetThisIdChuShiId(id)
return Table_Class[id].Type*10+1
end
function ProfessionProxy:GetTopScrollViewIconTable()
if self.topScrollViewIconTable==nil then
self.topScrollViewIconTable = {}
for k,v in pairs(Table_Class) do
if v.id %10==1 and v.id~=1 then
self.topScrollViewIconTable[v.Type] = self.topScrollViewIconTable[v.Type] or {}
self.topScrollViewIconTable[v.Type].id = v.id
self.topScrollViewIconTable[v.Type].Type = v.Type
self.topScrollViewIconTable[v.Type].isGrey = true
self.topScrollViewIconTable[v.Type].order = v.Type
end
end
end
---再次排序
local S_data = ProfessionProxy.Instance:GetProfessionQueryUserTable()
local curOcc = Game.Myself.data:GetCurOcc()
local curProfessionId = curOcc.profession
local chushiid = 0
for k,v in pairs(S_data) do
if v.isbuy == false then
chushiid = self:GetThisIdChuShiId(v.profession)
end
end
for k,v in pairs(self.topScrollViewIconTable) do
if v.id == chushiid then
v.order = 999999
v.isGrey = false
else
if self:IsThisIdYiGouMai(v.id) then
v.isGrey = false
v.order = 1000
else
v.isGrey = true
v.order = 0
end
end
end
table.sort(self.topScrollViewIconTable,
function(l,r)
return l.order>r.order
end
)
return self.topScrollViewIconTable
end
function ProfessionProxy:DoesThisIdCanBuyBranch(id,branch)
if not (id%10 == 1) then
helplog("GetThisIdCanBuyBranch reviewCode id:"..id)
end
for k,v in pairs(Table_Class[id].AdvanceClass) do
if Table_Class[v].TypeBranch == branch then
return true
end
end
return false
end
function ProfessionProxy:GetBoughtProfessionIdThroughBranch(branch)
for k,v in pairs (Table_Class) do
if v.TypeBranch == branch and v.id%10==2 then
return v.id
end
end
end
function ProfessionProxy:GetCurSex()
local userData = Game.Myself.data.userdata;
if userData then
local gender = userData:Get(UDEnum.SEX)
if gender then
return gender
end
end
return 1
end
ProfessionData = class("ProfessionData")
function ProfessionData:ctor(data,depth)
self.id = data.id
self.data = data
self.depth = (depth or 0)
--typebranch为key
self.nextProfessions = {}
self.parentProfession = nil
end
function ProfessionData:GetNextByBranch(typeBranch)
return self.nextProfessions[typeBranch]
end
function ProfessionData:AddNext(profession)
profession:SetParent(self)
profession.depth = self.depth + 1
self.nextProfessions[profession.data.TypeBranch] = profession
end
function ProfessionData:SetParent(parent)
self.parentProfession = parent
end
ProfessionTree = class("ProfessionTree")
function ProfessionTree:ctor(root,transferRoot)
self.root = root
self.transferRoot = transferRoot
end
function ProfessionTree:GetProfessDataByClassID(classID)
if(self.transferRoot) then
return self:RecurseFindClass(self.transferRoot,classID)
end
return nil
end
function ProfessionTree:RecurseFindClass(profess,classID)
if(profess) then
if(profess.id == classID) then
return profess
else
local find
for branch,profession in pairs(profess.nextProfessions) do
find = self:RecurseFindClass(profession,classID)
if(find) then
return find
end
end
end
end
return nil
end
function ProfessionTree:InitSkillPath(classID)
if(self.classID ~= classID) then
self.classID = classID
self.paths = {}
--递归以行列为键值map数据
local classData = Table_Class[self.classID]
self:RecurseParsePathByProfess(self.transferRoot,classData.TypeBranch)
ProfessionTree.HandlePath(self.paths)
end
end
function ProfessionTree:RecurseParsePathByProfess(data,typeBranch)
if(data) then
local skills = Table_Class[data.id].Skill
if(skills) then
ProfessionTree.ParsePath(skills,self.paths)
for k,v in pairs(data.nextProfessions) do
if(k == typeBranch) then
self:RecurseParsePathByProfess(v,typeBranch)
end
end
end
end
end
function ProfessionTree.HandlePath(paths)
local posData
local requiredData
for hang,hangPaths in pairs(paths) do
local up = true
local endlie
for lie,data in pairs(hangPaths) do
if(data.requiredID) then
--解析下,哪些技能连线中间有其他技能,并且线段需要上下走,不能打架
posData = Table_SkillMould[data.requiredID]
if(posData) then
posData = posData.Pos or {0,0}
up = endlie == nil or endlie>=posData[1]
requiredData = hangPaths[posData[1]]
if(requiredData) then
for i=posData[1]+1,lie-1 do
if(hangPaths[i]) then
requiredData.between = true
requiredData.up = up
endlie = lie
break
end
end
end
end
end
end
end
end
function ProfessionTree.ParsePath(skills,paths)
if(skills) then
local skill
local posData
local path
local requiredID
for i=1,#skills do
skill = skills[i]
posData = Table_SkillMould[skill]
skill = Table_Skill[skill]
if(posData) then
posData = posData.Pos
if(posData) then
path = paths[posData[2]]
if(path==nil) then
path = {}
paths[posData[2]] = path
end
requiredID = skill.Contidion and skill.Contidion.skillid or nil
if(requiredID) then
requiredID = math.floor(requiredID/1000)*1000 + 1
end
path[posData[1]] = {id=skill.id,requiredID = requiredID}
end
end
end
end
end