| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045 |
- ---------------------------------------------------------------
- -- 英雄逻辑
- -- addHero 根据英雄id添加英雄
- -- addHeroByGrid 根据英雄grid添加英雄(注意grid没有被其它地方引用)
- -- delHeroByIndex 根据英雄下表删除英雄
- ---------------------------------------------------------------
- local HeroExcel = require("excel.hero")
- local UpNeedExcel = require("excel.upNeed")
- local TequanExcel = require("excel.qqTequan")
- local SkillExcel = require("excel.skill")
- local BufferExcel = require("excel.buffer")
- local SkinExcel = require("excel.skin")
- local EquipExcel = require("excel.equip")
- local Log = require("common.Log")
- local LogDefine = require("common.LogDefine")
- local Lang = require("common.Lang")
- local Util = require("common.Util")
- local Msg = require("core.Msg")
- local ObjHuman = require("core.ObjHuman")
- local Grid = require("bag.Grid")
- local BagLogic = require("bag.BagLogic")
- local ItemDefine = require("bag.ItemDefine")
- local Broadcast = require("broadcast.Broadcast")
- local BarTaskLogic = require("bar.BarTaskLogic")
- local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
- local RoleAttr = require("role.RoleAttr")
- local RoleDefine = require("role.RoleDefine")
- local RoleHeadLogic = require("role.RoleHeadLogic")
- local RoleDBLogic = require("role.RoleDBLogic")
- local HeroBook = require("hero.HeroBook")
- local HeroGrid = require("hero.HeroGrid")
- local HeroDefine = require("hero.HeroDefine")
- local HeroEquip = require("hero.HeroEquip")
- local CombatPosLogic = require("combat.CombatPosLogic")
- local CombatDefine = require("combat.CombatDefine")
- local SkinLogic = require("skin.SkinLogic")
- local FenjieLogic = require("hecheng.FenjieLogic")
- local MonthHecJuex = require("monthAct.MonthHecJuex")
- local JjcLogic = require("jjc.JjcLogic")
- local HechengLogic = require("hecheng.HechengLogic")
- local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
- local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
- local GuideLogic = require("guide.GuideLogic")
- local RoleLogic = require("role.RoleLogic")
- local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
- local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
- local TuiSongLiBao = require("present.TuiSongLiBao")
- local SuipianLogic = require("bag.SuipianLogic")
- local MoshouLogic = require("moshou.MoshouLogic")
- local LiLianLogic = require("dailyTask.LiLianLogic")
- local VipLogic = require("vip.VipLogic")
- local FuwenLogic = require("fuwen.FuwenLogic")
- local GlobalWorld = require("core.GlobalWorld")
- local SysParameter = require("common.SysParameter")
- local JibanLogic = require("combat.JibanLogic")
- local HeroLogic = require("hero.HeroLogic")
- local EquipLogic = require("equip.EquipLogic")
- local XingYaoGongMing = require("xingYaoMen.XingYaoGongMing")
- local HeroGrowUp = require("absAct.HeroGrowUp")
- local MengxinLogic = require("present.MengxinLogic")
- local Config = require("Config")
- local HeroLogLogic = require("absAct.HeroLogLogic")
- local ExclusiveTaskLogic = require("absAct.ExclusiveTaskLogic")
- local BingshuLogic = require("fuwen.BingshuLogic")
- local YunYingLogic = require("yunying.YunYingLogic")
- local BingshuLogic = require("fuwen.BingshuLogic")
- HERO_MAX_STAR = 15 -- 目前英雄最大星级
- local HERO_RESET_FREECNT = 3 -- 每日重置次数
- local HERO_RESET_MAXSTAR = 9 -- 只能重置9星以下(包含9星)
- local CHONGSHENG_RETURN_STAR = 5 -- 重生返还x星本体碎片
- ----------------------------------- 结构体封装 --------------------------------------
- -- 获取技能信息
- function makeSkillNet(net, id)
- local skillConfig = SkillExcel.skill[id]
- if not skillConfig then return end
- net.id = id
- net.icon = skillConfig.icon
- net.name = skillConfig.name
- net.type = skillConfig.type
- net.desc = skillConfig.desc
- net.need = skillConfig.need or 0
- net.lv = skillConfig.skillLv or 0
- -- todo
- net.cd[0] = #skillConfig.cd
- if net.cd[0] ~= 0 then
- net.cd[1] = skillConfig.cd[1]
- net.cd[2] = skillConfig.cd[2]
- end
- local len = #skillConfig.buffers
- for i = 1,len do
- local buffId = skillConfig.buffers[i][1]
- local buffConfig = BufferExcel.buffer[buffId]
- net.buff[i].id = buffId
- net.buff[i].name = buffConfig.name
- net.buff[i].desc = buffConfig.desc
- end
- net.buff[0] = len
- net.lvUpDesc = skillConfig.lvUpDesc
- -- todo
- end
- -- 封装UpStarCond协议结构体
- function makeUpStarCond(net, cond)
- local ttype = cond[1]
- net.type = ttype
- if ttype == HechengLogic.COND_TYPE_HEROID then
- local heroID = cond[2]
- local heroConfig = HeroExcel.hero[heroID]
- local star = cond[4] or heroConfig.star
- net.id = heroID
- net.icon = heroConfig.head
- net.star = star
- net.camp = heroConfig.camp
- net.name = heroConfig.name
- net.grade = heroConfig.grade
- net.cnt = cond[3]
- elseif ttype == HechengLogic.COND_TYPE_CAMPSTAR then
- net.id = 0
- net.icon = 0
- net.name = ""
- net.grade = 0
- net.camp = cond[2]
- net.star = cond[3]
- net.cnt = cond[4]
- end
- end
- -------------------------------- 英雄属性计算 ------------------------------------------
- --等级加成
- local function lvAdd(lv, upAttrs, attrs)
- for _, upAttr in ipairs(upAttrs) do
- local key = upAttr[1]
- local value = upAttr[2]
- attrs[key] = attrs[key] + value * (lv - 1)
- end
- end
- --星級加成
- local function starAdd(star, atkStarRate, hpStarRate, attrs)
- attrs[RoleDefine.ATK] = attrs[RoleDefine.ATK] * (1 + atkStarRate/10000)
- attrs[RoleDefine.HP] = attrs[RoleDefine.HP] * (1 + hpStarRate/10000)
- end
- --阶数加成
- local function qualityAdd(heroConfig, quality, attrs)
- local qualityConfig = HeroExcel.quality[heroConfig.quality]
- local qualityEnd = quality + 1
- for i = 1, qualityEnd do
- for key, rateConfig in pairs(qualityConfig) do
- local rate = rateConfig[i]
- if rate then
- if key == RoleDefine.DEF or key == RoleDefine.SPEED then
- attrs[key] = attrs[key] + rate[1]
- else
- attrs[key] = attrs[key] * rate[1]
- end
- end
- end
- end
- end
- -- 伙伴基础
- function doCalcHero(grid, attrs)
- if not grid and attrs then return end
- local heroConfig = HeroExcel.hero[grid.id]
- local attrConfig = HeroDefine.getAttrConfig(grid.id, grid.star)
- if not attrConfig then
- assert(nil, "attrConfig is nil id "..grid.id.." star "..grid.star)
- end
- for _,v in ipairs(attrConfig.attrs) do
- RoleAttr.updateValue(v[1], v[2], attrs)
- end
- lvAdd(grid.lv, attrConfig.up, attrs)
- starAdd(grid.star, attrConfig.atkStarRate, attrConfig.hpStarRate, attrs)
- qualityAdd(heroConfig, grid.quality, attrs)
- end
- -- 时装
- function doCalcHeroSkin(skinID, attrs)
- local skinConfig = SkinExcel.skin[skinID]
- for _, v in ipairs(skinConfig.attrs) do
- RoleAttr.updateValue(v[1], v[2], attrs)
- end
- end
- -------------------------------------------------------------------------------------
- -------------------------------------------------------------------------------------
- local function sortZhanli(a, b)
- return a[2] > b[2]
- end
- -- 下发英雄背包列表
- function sendHeroBagList(human)
- local msgRet = Msg.gc.GC_HERO_BAG_LIST
- local cnt = 0
- human.maxZDL = {}
- human.maxZDL.maxHero = {}
- human.maxZDL.heroCnt = 0
- human.maxZDL.zhandouli = 0
- local list = {}
- for index = 1, human.db.heroBag[0] do
- local heroGrid = human.db.heroBag[index]
- if heroGrid then
- cnt = cnt + 1
- HeroGrid.makeHeroSimple(msgRet.list[cnt], heroGrid, index, human)
- if cnt >= HeroDefine.PAGE_HERO_COUNT then
- msgRet.list[0] = cnt
- Msg.send(msgRet, human.fd)
- cnt = 0
- end
- list[#list + 1] = {heroGrid.uuid or "", heroGrid.zhandouli or 0}
- end
- end
- if cnt > 0 then
- msgRet.list[0] = cnt
- Msg.send(msgRet, human.fd)
- end
- if #list > 0 then
- table.sort( list , sortZhanli )
- local maxCnt = human.db.lv >= 100 and 6 or 5
- for i = 1 , maxCnt do
- local heroDb = list[i]
- if heroDb then
- human.maxZDL.heroCnt = human.maxZDL.heroCnt + 1
- human.maxZDL.maxHero[heroDb[1]] = heroDb[2]
- human.maxZDL.zhandouli = human.maxZDL.zhandouli + heroDb[2]
- end
- end
- end
- print(" human onLogin maxZDL is : ", human.maxZDL.zhandouli)
- end
- -- 修正 玩家最高战力
- function checkChangeMaxZDL(human, heroGrid)
- if human.maxZDL and heroGrid.uuid then
- if human.maxZDL.maxHero[heroGrid.uuid] then
- human.maxZDL.maxHero[heroGrid.uuid] = heroGrid.zhandouli
- human.maxZDL.zhandouli = 0
- for _, v in pairs(human.maxZDL.maxHero) do
- human.maxZDL.zhandouli = human.maxZDL.zhandouli + v
- end
- else
- local maxCnt = human.db.lv >= 100 and 6 or 5
- if human.maxZDL.heroCnt < maxCnt then
- human.maxZDL.maxHero[heroGrid.uuid] = heroGrid.zhandouli
- human.maxZDL.zhandouli = human.maxZDL.zhandouli + heroGrid.zhandouli
- human.maxZDL.heroCnt = human.maxZDL.heroCnt + 1
- else
- local minZDL = 0
- local minUuid
- for thisUuid, v in pairs(human.maxZDL.maxHero) do
- minUuid = minZDL == 0 and thisUuid or minUuid
- minZDL = minZDL == 0 and v or minZDL
- if minZDL > v then
- minZDL = v
- minUuid = thisUuid
- end
- end
- if minZDL < heroGrid.zhandouli then
- human.maxZDL.maxHero[minUuid] = nil
- human.maxZDL.maxHero[heroGrid.uuid] = heroGrid.zhandouli
- human.maxZDL.zhandouli = human.maxZDL.zhandouli - minZDL + heroGrid.zhandouli
- end
- end
- end
- print(" checkChangeMaxZDL ", human.maxZDL.zhandouli)
- end
-
- end
- -- 发送英雄详细信息:静态,只是1个英雄的
- function sendHeroBagStatic(human, id, tuJian)
- local heroConfig = HeroExcel.hero[id]
- if not heroConfig then return end
-
- local msgRet = Msg.gc.GC_HERO_BAG_STATIC
- HeroGrid.makeHeroStatic(msgRet.heroStatic, id, tuJian)
- Msg.send(msgRet, human.fd)
- end
- -- 玩家身上动态数据
- function sendHeroGridDynamic(human, heroGrid, index, isQuery)
- if not isQuery then sendHeroBagUpdate(human, index) end
- local msgRet = Msg.gc.GC_HERO_BAG_DYNAMIC
- msgRet.index = index or 0
- msgRet.canLv = isHeroLvDot(human, heroGrid) == true and 1 or 0
- msgRet.canUp = isHeroUpDot(human, heroGrid) == true and 1 or 0
- msgRet.canEquip = HeroEquip.isEquipDot(human, heroGrid) == true and 1 or 0
- msgRet.canFuwen = FuwenLogic.isFuwenDot(human, heroGrid) == true and 1 or 0
- msgRet.canJueXing = isHeroJuexingDot(human, index, heroGrid) == true and 1 or 0
- local bingShuState = BingshuLogic.isBingShuDot(human, heroGrid)
- if bingShuState == -1 then
- msgRet.canBingShu = -1
- else
- msgRet.canBingShu = bingShuState == true and 1 or 0
- end
- HeroGrid.makeHeroDynamic(msgRet.heroDynamic, heroGrid, index, human)
- Msg.send(msgRet, human.fd)
- end
- -- 配置数据
- function sendHeroBagDynamicByID(human, heroID, star)
- local msgRet = Msg.gc.GC_HERO_BAG_DYNAMIC_BY_ID
- HeroGrid.makeHeroDynamicByID(msgRet.heroDynamic, heroID, star)
- Msg.send(msgRet, human.fd)
- end
- -- 发送英雄详细信息
- function sendHeroBagDynamic(human, id, index, isQuery)
- local heroGrid = getHeroGrid(human, id, index)
- if not heroGrid then return end
- sendHeroGridDynamic(human, heroGrid, index, isQuery)
- end
- -- 发送英雄添加/变化
- function sendHeroBagUpdate(human, index)
- local heroGrid = human.db.heroBag[index]
- if type(heroGrid) ~= "table" then return end
- local msgRet = Msg.gc.GC_HERO_BAG_ADD
- HeroGrid.makeHeroSimple(msgRet.data, heroGrid, index, human)
- Msg.send(msgRet, human.fd)
- end
- -- 发送英雄删除
- function sendHeroBagDel(human, index)
- local msgRet = Msg.gc.GC_HERO_BAG_DELETE
- msgRet.index = index
- Msg.send(msgRet, human.fd)
- end
- -- 背包容量查询
- function sendHeroBagCap(human)
- calcHeroBagCap(human)
- local nowBuyCnt = human.db.buyCapCnt or 0
- local msgRet = Msg.gc.GC_HERO_CAP_QUERY
- msgRet.cap = human.db.heroBag[0]
- msgRet.buyZuanshi = (nowBuyCnt + 1) * 100
- if nowBuyCnt >= HeroDefine.BUY_CAP_CNT then
- msgRet.buyZuanshi = -1 --达到上限
- end
- Msg.send(msgRet, human.fd)
- end
- -----------------------------------------------------------------------------------------
- -- 锁定英雄
- function lockHero(human, isLock, heroID, heroIndex)
- local heroGrid = human.db.heroBag[heroIndex]
- if heroGrid == nil or heroGrid.id ~= heroID then
- return
- end
- if isLock == 1 then
- heroGrid.isLock = true
- elseif isLock == 0 then
- heroGrid.isLock = nil
- end
-
- local msgRet = Msg.gc.GC_HERO_BAG_LOCK
- msgRet.heroID = heroID
- msgRet.heroIndex = heroIndex
- msgRet.type = heroGrid.isLock and 1 or 0
- Msg.send(msgRet, human.fd)
- end
- -- 返回英雄背包空余格子数
- function getEmptyCnt(human)
- local emptyCnt = 0
- for i = 1, human.db.heroBag[0] do
- if human.db.heroBag[i] == nil then
- emptyCnt = emptyCnt + 1
- end
- end
- return emptyCnt
- end
- -- 获得英雄背包第一个空格子下标
- function getEmptyIndex(human)
- for index = 1, human.db.heroBag[0]do
- local grid = human.db.heroBag[index]
- if grid == nil then
- return index
- end
- end
- end
- -- 新增英雄
- function addHero(human, id, star, cnt, logType, noSend)
- if cnt < 1 then return end
- local heroConfig = HeroExcel.hero[id]
- if not heroConfig then return end
- -- 某些英雄自动分解
- local isFenjie, fenjieList = FenjieLogic.autoFenjie(human, id, cnt, logType)
- if isFenjie then
- return nil, fenjieList
- end
-
- -- 先判断英雄背包是否满
- if getEmptyCnt(human) < cnt then
- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
- end
- local heroIndex, uuid = nil
- for i = 1, cnt do
- local heroGrid = HeroGrid.createHeroGrid(id,star)
- heroIndex = addHeroByGrid(human, heroGrid, logType, noSend)
- uuid = heroGrid.uuid
- end
- return heroIndex, uuid
- end
- -- 英雄添加日志
- function writeLogHeroAdd(human, logType, heroGrid)
- Log.write(Log.LOGID_OSS_HERO, human.db._id, human.db.account, human.db.name, human.db.lv,
- LogDefine.DEFINE[logType] + LogDefine.TYPE["hero"] , heroGrid.id, 1, heroGrid.uuid, heroGrid.star)
- end
- -- 英雄删除日志
- function writeLogHeroDel(human, logType, heroGrid)
- Log.write(Log.LOGID_OSS_HERO, human.db._id, human.db.account, human.db.name, human.db.lv,
- LogDefine.DEFINE[logType] + LogDefine.TYPE["hero"] , heroGrid.id, -1, heroGrid.uuid, heroGrid.star)
- end
- -- 新增英雄
- function addHeroByGrid(human, heroGrid, logType, noSend)
- if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["hero"] then
- assert()
- end
-
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if not heroConfig then return end
- -- 某些英雄自动分解
- local isFenjie, fenjieList = FenjieLogic.autoFenjie(human, heroGrid.id, 1, logType)
- if isFenjie then
- return nil, fenjieList
- end
-
- -- 先判断英雄背包是否满
- if getEmptyCnt(human) < 1 then
- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
- end
- local emptyIndex = getEmptyIndex(human)
- if not emptyIndex then return end
- heroGrid.bagIndex = emptyIndex
- human.db.heroBag[emptyIndex] = heroGrid
- ObjHuman.doCalcHero(human, emptyIndex)
- if not noSend then
- sendHeroBagUpdate(human, emptyIndex)
- end
- onGetNewHero(human, heroGrid, logType, emptyIndex)
- writeLogHeroAdd(human, logType, heroGrid)
- checkChangeMaxZDL(human, heroGrid)
- return emptyIndex
- end
- local yunYingActParam = {}
- function onGetNewHero(human, heroGrid, logType, heroIndex)
- local heroConfig = HeroExcel.hero[heroGrid.id]
- local grade = heroConfig.grade
- HeroBook.onAddHero(human, heroGrid.id, heroGrid.star)
- RoleHeadLogic.onAddHero(human, heroGrid.id)
- -- 先知置换 和十星置换 不予计算活动
- if logType ~= "xianzhi_zhihuan" and logType ~= "tenStar_displace" then
- GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_HERO)
- TuiSongLiBao.tuiSongLiBaoOnTask(human, TuiSongLiBao.TUISONGLIBAOTASK_STARS_HERO, heroConfig.star, nil)
- HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE12, heroGrid.star)
- if grade == 4 then
- MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_15,1)
- end
- end
- XingYaoGongMing.onAddHero(human,heroGrid,heroIndex)
- HeroLogLogic.finishTaskCB(human, HeroLogLogic.HERO_LOG_TYPE_7, 1, heroGrid.id)
- for i in ipairs(yunYingActParam) do
- yunYingActParam[i] = nil
- end
- yunYingActParam[1] = logType
- yunYingActParam[2] = heroGrid.id
- yunYingActParam[3] = 1
- YunYingLogic.onCallBack(human, "onGetNewHeroAct", yunYingActParam)
-
- for i in ipairs(yunYingActParam) do
- yunYingActParam[i] = nil
- end
- yunYingActParam[1] = heroGrid.id
- yunYingActParam[2] = heroGrid.star
- yunYingActParam[3] = 1
- YunYingLogic.onCallBack(human, "onHeroStarChange", yunYingActParam)
- end
- -- 根据下标删除英雄
- function delHeroByIndex(human, index, logType, noSend)
- if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["hero"] then
- assert()
- end
- if human.db.heroBag[index] == nil then
- return
- end
-
- SkinLogic.onDelHero(human, index)
- local heroGrid = human.db.heroBag[index]
- human.db.heroBag[index] = nil
- human.heroAttrs[index] = nil
-
- if not noSend then
- sendHeroBagDel(human, index)
- end
-
- -- 删除酒馆任务中的上战的英雄
- BarTaskLogic.heroIndexByDelForPos(human, index)
- -- 删除 默认出站队列中的 英雄
- CombatPosLogic.heroIndexByDelForPos(human, heroGrid.uuid)
- XingYaoGongMing.onDelHero(human,heroGrid,index)
- ObjHuman.doCalc(human)
- writeLogHeroDel(human, logType, heroGrid)
- end
- -- 英雄升级
- function heroLvUp(human, heroID, heroIndex)
- local heroGrid = human.db.heroBag[heroIndex]
- if heroGrid == nil or heroGrid.id ~= heroID then
- return
- end
- local heroConfig = HeroExcel.hero[heroID]
- if not heroConfig then return end
- if XingYaoGongMing.isGongMing(human,heroIndex,XingYaoGongMing.XYHERO_LV) then
- return
- end
-
- -- 判断等级上限
- local star = heroGrid.star
- local nowLv = heroGrid.lv
- local maxLv = HeroGrid.getMaxLv(star, heroGrid.quality)
- local upLv, needJinbi, needSoulCnt = HeroGrid.getLevelUpCnt(human, nowLv, maxLv)
- --print(" upLv, needJinbi, needSoulCnt", upLv, needJinbi, needSoulCnt)
- if upLv < 1 then return end
-
- -- 判断消耗材料
- if human.db.jinbi < needJinbi then
- return Broadcast.sendErr(human, Lang.COMMON_NO_JINBI)
- end
- if BagLogic.getItemCnt(human, ItemDefine.ITEM_GREEN_EXP_ID) < needSoulCnt then
- local strName = ItemDefine.getValue(ItemDefine.ITEM_GREEN_EXP_ID, "name")
- return Broadcast.sendErr(human, Util.format(Lang.COMMON_NO_ITEM, strName))
- end
-
- -- 扣道具
- ObjHuman.updateJinbi(human, -needJinbi, "hero_up")
- BagLogic.delItem(human, ItemDefine.ITEM_GREEN_EXP_ID, needSoulCnt, "hero_up")
-
- -- 改db
- heroGrid.lv = nowLv + upLv
- ObjHuman.doCalcHero(human, heroIndex)
- sendHeroBagDynamic(human, heroID, heroIndex)
-
- local msgRet = Msg.gc.GC_HERO_LEVEL_UP
- msgRet.id = heroID
- msgRet.index = heroIndex
- Msg.send(msgRet, human.fd)
- GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_HEROUP)
- refreshDot(human, heroGrid.uuid)
- if nowLv < 50 and heroGrid.lv >= 50 then
- ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_6,1)
- elseif nowLv < 100 and heroGrid.lv >= 100 then
- MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_14,1)
- elseif nowLv < 200 and heroGrid.lv >= 200 then
- ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_20,1)
- elseif nowLv < 145 and heroGrid.lv >= 145 then
- MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_17,1)
- elseif nowLv < 185 and heroGrid.lv >= 185 then
- MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_18,1)
- end
-
- XingYaoGongMing.onHeroLvUp(human,heroGrid,heroIndex)
- Log.write(Log.LOGID_OSS_HEROLVUP, human.db._id, human.db.account, human.db.name, heroGrid.uuid, nowLv, heroGrid.lv)
- checkChangeMaxZDL(human, heroGrid)
- end
- -- 英雄升阶查询
- function heroUpgradeQuery(human, heroID, heroIndex)
- local heroGrid = human.db.heroBag[heroIndex]
- if heroGrid == nil or heroGrid.id ~= heroID then
- return
- end
- local cf = HeroExcel.hero[heroID]
- if not cf then return end
- local star = cf.star
- local nextQuality = heroGrid.quality + 1
- local maxLv = HeroGrid.getMaxLv(heroGrid.star, nextQuality)
- local upcf = UpNeedExcel.upQuality[nextQuality]
- if not maxLv or not upcf then
- return Broadcast.sendErr(human, Lang.HERO_UPGRADE_ERR_FULL)
- end
- local nextHeroGrid = HeroGrid.getHeroGridCalcCache(heroGrid)
- nextHeroGrid.quality = nextQuality
- local nextAttrs = RoleAttr.calcHeroGrid(nextHeroGrid, heroIndex, human)
- local zhandouli = RoleAttr.calcZhandouli(nextAttrs)
- local msgRet = Msg.gc.GC_HERO_UPGRADE_QUERY
- msgRet.id = heroID
- msgRet.index = heroIndex
- local net = msgRet.data
- net.id = heroID
- net.maxLv = maxLv
- net.zhandouli = zhandouli
- net.attr[0] = 4
- net.attr[1].key = RoleDefine.ATK
- net.attr[1].value = nextAttrs[RoleDefine.ATK]
- net.attr[2].key = RoleDefine.HP
- net.attr[2].value = nextAttrs[RoleDefine.HP]
- net.attr[3].key = RoleDefine.SPEED
- net.attr[3].value = nextAttrs[RoleDefine.SPEED]
- net.attr[4].key = RoleDefine.DEF
- net.attr[4].value = nextAttrs[RoleDefine.DEF]
- net.needJinbi = upcf.money
- net.needItemCnt = upcf.jinjieshi
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- end
- -- 英雄升阶
- function heroUpgradeDo(human, heroID, heroIndex)
- local heroConfig = HeroExcel.hero[heroID]
- if not heroConfig then return end
- local heroGrid = human.db.heroBag[heroIndex]
- if heroGrid == nil or heroGrid.id ~= heroID then
- return
- end
- if XingYaoGongMing.isGongMing(human,heroIndex,XingYaoGongMing.XYHERO_LV) then
- return
- end
-
- local heroConfig = HeroExcel.hero[heroID]
- if not heroConfig then return end
- local star = heroGrid.star
- local maxQuality = HeroGrid.getMaxQuality(star)
- local nextQuality = heroGrid.quality + 1
-
- -- 判断阶数上限
- if heroGrid.quality >= maxQuality then
- return
- end
- local upcf = UpNeedExcel.upQuality[nextQuality]
- if not upcf then return end
-
- -- 判断消耗材料
- local needJinbi = upcf.money
- local needItemCnt = upcf.jinjieshi
- if human.db.jinbi < needJinbi then
- return Broadcast.sendErr(human, Lang.COMMON_NO_JINBI)
- end
- local nowItemCnt = BagLogic.getItemCnt(human, ItemDefine.ITEM_HERO_UPGRADE_ID)
- if nowItemCnt < needItemCnt then
- local strName = ItemDefine.getValue(ItemDefine.ITEM_HERO_UPGRADE_ID, "name")
- return Broadcast.sendErr(human, Util.format(Lang.COMMON_NO_ITEM, strName))
- end
-
- -- 扣材料
- ObjHuman.updateJinbi(human, -needJinbi, "hero_upgrade")
- BagLogic.delItem(human, ItemDefine.ITEM_HERO_UPGRADE_ID, needItemCnt, "hero_upgrade")
-
- -- 改db
- heroGrid.quality = nextQuality
- ObjHuman.doCalcHero(human, heroIndex)
- sendHeroBagDynamic(human, heroID, heroIndex)
-
- GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_UPGRADE)
- ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_25,1)
- local msgRet = Msg.gc.GC_HERO_UPGRADE_DO
- msgRet.id = heroID
- msgRet.index = heroIndex
- Msg.send(msgRet, human.fd)
- refreshDot(human, heroGrid.uuid)
-
- XingYaoGongMing.onHeroUpgrade(human,heroGrid,heroIndex)
- checkChangeMaxZDL(human, heroGrid)
- end
- -- 重算背包熔炼
- function calcHeroBagCap(human)
- local buyCnt = math.min(human.db.buyCapCnt or 0, HeroDefine.BUY_CAP_CNT)
- local heroBagCnt = HeroDefine.HERO_BAG_CNT
- heroBagCnt = heroBagCnt + (VipLogic.getPowerArgs(human, VipLogic.VIP_POWER12) or 0)
- heroBagCnt = heroBagCnt + HeroDefine.HERO_BAG_BUY_ADD_CNT * buyCnt -- 购买获得背包格子
- if human.db.blue ~= nil and human.db.blue.isAdd ~= nil then -- 特权
- local cnt = TequanExcel.tequan[2].privilege
- heroBagCnt = heroBagCnt + cnt
- end
- if human.db.yellow ~= nil and human.db.yellow.isAdd ~= nil then -- 特权
- local cnt = TequanExcel.tequan[1].privilege
- heroBagCnt = heroBagCnt + cnt
- end
- -- 封印之章特权
- local cjPrivilege = ChengjiuLogic.checkPrivilege(human,ChengjiuDefine.PRIVILEGE_TYPE_1)
- if cjPrivilege then
- heroBagCnt = heroBagCnt + cjPrivilege
- end
- -- 特殊服务器处理
- -- vip需求砍掉之后,导致有的玩家英雄数量超过背包数量
- -- 经策划确认,140001-140021 服务器所有玩家增加背包数量300
- if Config.SVR_INDEX >= 140001 and Config.SVR_INDEX <= 140021 then
- heroBagCnt = heroBagCnt + 300
- end
- human.db.heroBag[0] = heroBagCnt
- end
- -- 购买英雄背包容量
- function buyHeroCap(human)
- -- 上限判断
- local nowBuyCnt = human.db.buyCapCnt or 0
- if nowBuyCnt >= HeroDefine.BUY_CAP_CNT then
- return Broadcast.sendErr(human, Lang.HERO_BAG_BUY_CAP_NO_CNT)
- end
- -- 判断消耗
- local needZuanshi = (nowBuyCnt + 1) * 100
- if not ObjHuman.checkRMB(human, needZuanshi) then
- return
- end
-
- -- 扣消耗
- ObjHuman.decZuanshi(human, -needZuanshi, "buy_hero_cap")
-
- -- 改db
- human.db.buyCapCnt = nowBuyCnt + 1
- sendHeroBagCap(human)
- Broadcast.sendErr(human, Lang.ITEM_BUY_SUCCESS)
- end
- -- 最大觉醒
- function sendHeroJueXingMax(human, heroID, heroIndex)
- local heroConfig = HeroExcel.hero[heroID]
- if not heroConfig then return end
- local msgRet = Msg.gc.GC_HERO_JUEXING_QUERY_MAX
- msgRet.id = heroID
- msgRet.index = heroIndex
- Msg.send(msgRet, human.fd)
- end
- local JUEXING_SKILL_DIFF_LIST = {}
- function getSkillDiffList(cf1, cf2)
- local diffCnt = 0
- for i = 1, #cf2.skillList do
- local skillID1 = cf1.skillList[i]
- local skillID2 = cf2.skillList[i]
- if skillID1 ~= skillID2 then
- diffCnt = diffCnt + 1
- local tb = JUEXING_SKILL_DIFF_LIST[diffCnt] or {}
- JUEXING_SKILL_DIFF_LIST[diffCnt] = tb
- tb[1] = skillID1
- tb[2] = skillID2
- end
- end
- for i = 1, #cf2.beSkillList do
- local skillID1 = cf1.beSkillList[i]
- local skillID2 = cf2.beSkillList[i]
- if skillID1 ~= skillID2 then
- diffCnt = diffCnt + 1
- local tb = JUEXING_SKILL_DIFF_LIST[diffCnt] or {}
- JUEXING_SKILL_DIFF_LIST[diffCnt] = tb
- tb[1] = skillID1
- tb[2] = skillID2
- end
- end
- return diffCnt, JUEXING_SKILL_DIFF_LIST
- end
- -- 英雄觉醒预览
- local JUEXING_SPEED_UP = {[4]=10}
- local JUEXING_ATK_UP = {[5]=40,[6]=40,[7]=40,[8]=40,[9]=40,[10]=20,[11]=20,[12]=20}
- local JUEXING_HP_UP = {[5]=50,[6]=50,[7]=50,[8]=50,[9]=50,[10]=30,[11]=30,[12]=30}
- function heroJueXingQuery(human, heroID, heroIndex)
- local heroConfig = HeroExcel.hero[heroID]
- if not heroConfig then return end
- local heroGrid = getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then return end
- -- 判断是否达到开放等级
- local isFix, upStarNeedLv, upStarNeedWorldLv = isFixUpStarLv(human, heroGrid.star+1)
- if not isFix then
- if upStarNeedLv and upStarNeedWorldLv and upStarNeedWorldLv > 0 then
- return Broadcast.sendErr(human, Util.format(Lang.HERO_JUEXING_ERR_HEROLV, upStarNeedLv, upStarNeedWorldLv))
- elseif upStarNeedLv then
- return Broadcast.sendErr(human, Util.format(Lang.HERO_JUEXING_ERR_HEROLV2, upStarNeedLv))
- end
- return
- end
-
- local attrConfig = HeroDefine.getAttrConfig(heroID, heroGrid.star)
- if not attrConfig then return end
- local nextAttrConfig = HeroDefine.getNextAttrConfig(heroID, heroGrid.star)
- if not nextAttrConfig then
- return sendHeroJueXingMax(human, heroID, heroIndex)
- end
-
- local msgRet = Msg.gc.GC_HERO_JUEXING_QUERY
- local dataNet = msgRet.data
- local maxQuality = HeroGrid.getMaxQuality(attrConfig.star)
- local nextMaxQuality = HeroGrid.getMaxQuality(nextAttrConfig.star)
- -- 判断是否达到开放等级
- local isFix, upStarNeedLv, upStarNeedWorldLv = isFixUpStarLv(human, heroGrid.star+1)
- if not isFix then
- if upStarNeedLv and upStarNeedWorldLv and upStarNeedWorldLv > 0 then
- return Broadcast.sendErr(human, Util.format(Lang.HERO_JUEXING_ERR_HEROLV, upStarNeedLv, upStarNeedWorldLv))
- elseif upStarNeedLv then
- return Broadcast.sendErr(human, Util.format(Lang.HERO_JUEXING_ERR_HEROLV2, upStarNeedLv))
- end
- return
- end
- dataNet.id = heroID
- dataNet.index = heroIndex
- dataNet.star = heroGrid.star
- dataNet.nextStar = nextAttrConfig.star
- dataNet.maxLv = HeroGrid.getMaxLv(heroGrid.star, maxQuality)
- dataNet.nextMaxLv = HeroGrid.getMaxLv(nextAttrConfig.star, nextMaxQuality)
- -- 展示变化的技能
- local diffCnt, diffList = getSkillDiffList(attrConfig, nextAttrConfig)
- diffCnt = diffCnt > #dataNet.skillUp and #dataNet.skillUp or diffCnt
- dataNet.isAllSkillUp = (diffCnt > 1) and 1 or 0
- dataNet.skillUp[0] = diffCnt
- for i=1, diffCnt do
- makeSkillNet(dataNet.skillUp[i], diffList[i][2])
- end
- dataNet.speedUp = JUEXING_SPEED_UP[heroConfig.star] or 0
- dataNet.atkUpRate = JUEXING_ATK_UP[heroConfig.star] or 0
- dataNet.hpUpRate = JUEXING_HP_UP[heroConfig.star] or 0
- dataNet.needItems[0] = #attrConfig.needItems
- for i = 1, dataNet.needItems[0] do
- local itemID = attrConfig.needItems[i][1]
- local itemCnt = attrConfig.needItems[i][2]
- Grid.makeItem(dataNet.needItems[i], itemID, itemCnt)
- end
- dataNet.needHeros[0] = 0
- for i = 1, #attrConfig.cond do
- dataNet.needHeros[0] = dataNet.needHeros[0] + 1
- local condNet = dataNet.needHeros[dataNet.needHeros[0]]
- makeUpStarCond(condNet, attrConfig.cond[i])
- end
- dataNet.needItemCnt = attrConfig.jinjieshi
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- end
- function fontJueXingHeroNet(net, heroGrid, index, human)
- local attrs = ObjHuman.getHeroAttrs(human, index)
- HeroGrid.makeHeroDynamic(net.dynamicData, heroGrid, index, human)
- HeroGrid.makeHeroSimple(net.simpleData, heroGrid, index, human)
- net.zhandouli = attrs[RoleDefine.ZHANDOULI] or 0
- net.atk = attrs[RoleDefine.ATK] or 0
- net.hp = attrs[RoleDefine.HP] or 0
- net.def = attrs[RoleDefine.DEF] or 0
- net.speed = attrs[RoleDefine.SPEED] or 0
- end
- -- 检查世界等级或者玩家等级是否满足条件
- -- 检查达到角色等级或者世界等级
- function isFixUpStarLv(human, targetStar)
- local config = HeroExcel.star[targetStar]
- if not config then
- return false
- end
- if config.upStarNeedLv >= 0 and human.db.lv >= config.upStarNeedLv then
- return true, config.upStarNeedLv, config.upStarNeedWorldLv
- end
- if config.upStarNeedWorldLv >= 0 and GlobalWorld.getWorldLv() >= config.upStarNeedWorldLv then
- return true, config.upStarNeedLv, config.upStarNeedWorldLv
- end
- return false, config.upStarNeedLv, config.upStarNeedWorldLv
- end
- -- 英雄觉醒
- local yunYingActParam = {}
- function heroJueXingDo(human, heroID, heroIndex, inputIDList, inputIndexList)
- local heroConfig = HeroExcel.hero[heroID]
- if not heroConfig then return end
- local heroGrid = getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then return end
- local attrConfig = HeroDefine.getAttrConfig(heroID, heroGrid.star)
- if not attrConfig then return end
- local nextAttrConfig = HeroDefine.getNextAttrConfig(heroID, heroGrid.star)
- if not nextAttrConfig then return end
- -- 判断是否达到开放等级
- local isFix, upStarNeedLv, upStarNeedWorldLv = isFixUpStarLv(human, heroGrid.star+1)
- if not isFix then
- if upStarNeedLv and upStarNeedWorldLv and upStarNeedWorldLv > 0 then
- return Broadcast.sendErr(human, Util.format(Lang.HERO_JUEXING_ERR_HEROLV, upStarNeedLv, upStarNeedWorldLv))
- elseif upStarNeedLv then
- return Broadcast.sendErr(human, Util.format(Lang.HERO_JUEXING_ERR_HEROLV2, upStarNeedLv))
- end
- return
- end
- -- 判断消耗材料
- local needItemCnt = attrConfig.jinjieshi
- if not BagLogic.checkItemCnt(human, ItemDefine.ITEM_HERO_UPGRADE_ID, needItemCnt) then
- return
- end
- -- 额外材料
- for i = 1, #attrConfig.needItems do
- local itemID = attrConfig.needItems[i][1]
- local itemCnt = attrConfig.needItems[i][2]
- if not BagLogic.checkItemCnt(human, itemID, itemCnt) then
- return
- end
- end
-
- -- 英雄材料
- if not HechengLogic.checkCond(human, inputIDList, inputIndexList, attrConfig.cond) then
- return Broadcast.sendErr(human, Lang.HERO_JUEXING_CAILIAO_ERR)
- end
- -- 比较特别的情况。。
- for i = 1, inputIndexList[0] do
- if inputIndexList[i] == heroIndex then
- return -- 本体同时作为材料,骗分解材料
- end
- end
- -- 扣消耗
- BagLogic.delItem(human, ItemDefine.ITEM_HERO_UPGRADE_ID, needItemCnt, "hero_juexing")
- local fenjieList = FenjieLogic.fenjie(human, FenjieLogic.FENJIE_DO_JUEXING, inputIDList, inputIndexList)
- -- 额外材料
- for i = 1, #attrConfig.needItems do
- local itemID = attrConfig.needItems[i][1]
- local itemCnt = attrConfig.needItems[i][2]
- BagLogic.delItem(human, itemID, itemCnt, "hero_juexing")
- end
- local msgRet = Msg.gc.GC_HERO_JUEXING_DO
- msgRet.id = heroID
- msgRet.index = heroIndex
- msgRet.upStarNeedLv = upStarNeedLv
- msgRet.upStarNeedWorldLv = upStarNeedWorldLv
- fontJueXingHeroNet(msgRet.oldData, heroGrid, heroIndex, human)
- -- 继承英雄等级 阶数 装备 水晶
- writeLogHeroDel(human, "hero_juexing", heroGrid)
- heroGrid.star = nextAttrConfig.star
- onGetNewHero(human, heroGrid, "hero_juexing", heroIndex)
- ObjHuman.doCalcHero(human, heroIndex)
- sendHeroBagDynamic(human, heroGrid.id, heroIndex)
- writeLogHeroAdd(human, "hero_juexing", heroGrid)
- fontJueXingHeroNet(msgRet.newData, heroGrid, heroIndex, human)
- local diffCnt, diffList = getSkillDiffList(attrConfig, nextAttrConfig)
- diffCnt = diffCnt > #msgRet.skillUp and #msgRet.skillUp or diffCnt
- msgRet.isAllSkillUp = (diffCnt > 1) and 1 or 0
- msgRet.skillUp[0] = diffCnt
- for i=1, diffCnt do
- makeSkillNet(msgRet.skillUp[i], diffList[i][2])
- end
-
- msgRet.itemList[0] = 0
- if fenjieList then
- for itemID, itemCnt in pairs(fenjieList) do
- if msgRet.itemList[0] >= #msgRet.itemList then
- break
- end
- msgRet.itemList[0] = msgRet.itemList[0] + 1
- Grid.makeItem(msgRet.itemList[msgRet.itemList[0]], itemID, itemCnt)
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- ChatPaoMaLogic.broadcast(human, ChatPaoMaLogic.PAOMA_TYPE_BROAD_TYPE12, nextAttrConfig.star,heroGrid.id)
- local newstar = nextAttrConfig.star or 0
- local newcamp = heroConfig.camp or 0
- LiLianLogic.onCallback(human,LiLianLogic.LILIAN_OUTID24,1,newcamp,newstar)
- if newstar == 5 then
- ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_11,1)
- end
- if newstar >= 5 then
- MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_13,1)
- end
- if newstar == 6 then
- ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_16,1)
- JibanLogic.onCallback(human,2,newstar)
- end
- if newstar == 10 then
- ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_23,1)
- end
- checkChangeMaxZDL(human, heroGrid)
- HeroLogLogic.finishTaskCB(human, HeroLogLogic.HERO_LOG_TYPE_8, 1, heroID, newstar)
- for i in ipairs(yunYingActParam) do
- yunYingActParam[i] = nil
- end
- yunYingActParam[1] = heroID
- yunYingActParam[2] = newstar
- yunYingActParam[3] = 1
- YunYingLogic.onCallBack(human, "onHeroStarChange", yunYingActParam)
- end
- -- 英雄重生预览
- function heroChongShengQuery(human, heroID, heroIndex)
- local heroConfig = HeroExcel.hero[heroID]
- if not heroConfig then return end
- local heroGrid = getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then return end
- if heroGrid.isLock then
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_LOCK)
- end
- local chongShengConfig = UpNeedExcel.chongSheng[heroGrid.star]
- if not chongShengConfig then -- 只能重生7-9星
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_ID)
- end
- -- 没有对应5星的存在
- local attrConfig = HeroDefine.getAttrConfig(heroID, CHONGSHENG_RETURN_STAR)
- if not attrConfig then
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_ID)
- end
- local suipianID = SuipianLogic.getSuipianIDbyHeroID(heroID)
- if not suipianID then -- 没有对应的本体碎片
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_SUIPIANID)
- end
- local otherSuipianID = chongShengConfig.suipianIDs[heroConfig.camp]
- if not otherSuipianID then -- 阵容不对
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_ID)
- end
- local msgRet = Msg.gc.GC_HERO_CHONGSHENG_QUERY
- msgRet.id = heroID
- msgRet.index = heroIndex
- msgRet.needItemCnt = chongShengConfig.needItemCnt
- Grid.makeItem(msgRet.bentiSuipian, suipianID, chongShengConfig.bentiCnt)
- Grid.makeItem(msgRet.otherSuipian, otherSuipianID, chongShengConfig.suipianCnt)
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- end
- -- 英雄重生
- function heroChongShengDo(human, heroID, heroIndex)
- local heroConfig = HeroExcel.hero[heroID]
- if not heroConfig then return end
- local heroGrid = getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then return end
- if heroGrid.isLock then
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_LOCK)
- end
- local chongShengConfig = UpNeedExcel.chongSheng[heroGrid.star]
- if not chongShengConfig then -- 只能重生7-9星
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_ID)
- end
- local attrConfig = HeroDefine.getAttrConfig(heroID, CHONGSHENG_RETURN_STAR)
- if not attrConfig then
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_ID)
- end
- local suipianID = SuipianLogic.getSuipianIDbyHeroID(heroID)
- if not suipianID then -- 没有对应的本体碎片
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_SUIPIANID)
- end
- local otherSuipianID = chongShengConfig.suipianIDs[heroConfig.camp]
- if not otherSuipianID then -- 阵营不对
- return Broadcast.sendErr(human, Lang.HERO_CHONGSHENG_ERR_ID)
- end
- local nowItemCnt = BagLogic.getItemCnt(human, ItemDefine.ITEM_HERO_CHONGSHENG_ID)
- local needItemCnt = chongShengConfig.needItemCnt
- if nowItemCnt < needItemCnt then
- local strName = ItemDefine.getValue(ItemDefine.ITEM_HERO_CHONGSHENG_ID, "name")
- local strRet = Util.format(Lang.COMMON_NO_ITEM, strName)
- return Broadcast.sendErr(human, strRet)
- end
- -- 删除材料
- BagLogic.delItem(human, ItemDefine.ITEM_HERO_CHONGSHENG_ID, needItemCnt, "hero_chongsheng")
- -- 重置到初始返还的材料
- local upList = getResetReturnItems(heroGrid)
- -- 先删除英雄
- delHeroByIndex(human, heroIndex, "hero_chongsheng")
- -- 返还装备
- for i = 1, ItemDefine.EQUIP_MAX_CNT do
- if i ~= ItemDefine.EQUIP_SUBTYPE_SHUIJIN and
- heroGrid.equip and heroGrid.equip[i] then
- local equipGrid = heroGrid.equip[i]
- if equipGrid then
- EquipLogic.addByEquipGrid(human, equipGrid, "hero_chongsheng")
- end
- end
- end
- -- 返还符文
- for i = 1, 2 do
- local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[i]
- if fuwenGrid and fuwenGrid.id then
- FuwenLogic.addByGrid(human, fuwenGrid, "hero_chongsheng")
- end
- end
- -- 再给东西
- BagLogic.addItem(human, suipianID, chongShengConfig.bentiCnt, "hero_chongsheng")
- BagLogic.addItem(human, otherSuipianID, chongShengConfig.suipianCnt, "hero_chongsheng")
- for itemID, itemCnt in pairs(upList) do
- BagLogic.addItem(human, itemID, itemCnt, "hero_chongsheng")
- end
-
- -- 通知客户端
- local msgRet = Msg.gc.GC_HERO_CHONGSHENG_DO
- msgRet.list[0] = 2
- Grid.makeItem(msgRet.list[1], suipianID, chongShengConfig.bentiCnt)
- Grid.makeItem(msgRet.list[2], otherSuipianID, chongShengConfig.suipianCnt)
- for itemID, itemCnt in pairs(upList) do
- msgRet.list[0] = msgRet.list[0] + 1
- Grid.makeItem(msgRet.list[msgRet.list[0]], itemID, itemCnt)
- end
- msgRet.list[0] = EquipLogic.makeEquipItem(human, msgRet.list, msgRet.list[0])
- Msg.send(msgRet, human.fd)
- checkChangeMaxZDL(human, heroGrid)
- end
- -- 回退
- local HUITUI_HERO_LIST = {}
- local HUITUI_ITEM_LIST = {}
- function getHuituiReturns(heroGrid)
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if not heroConfig then return end
- local config = UpNeedExcel.huiTui[heroGrid.star]
- if not config then return end
- local targetID = heroGrid.id
- if not targetID then return end
- -- 13星无法升级,但可以回退
- if heroGrid.star < 13 then
- local upStarConfig = HeroDefine.getNextAttrConfig(heroGrid.id, heroGrid.star)
- -- 不能升星的话也不能回退
- if not upStarConfig then
- return
- end
- end
- Util.cleanTable(HUITUI_HERO_LIST)
- Util.cleanTable(HUITUI_ITEM_LIST)
- local maxLv = HeroGrid.getMaxLv(config.targetStar, heroGrid.quality)
- local lv = heroGrid.lv
- if heroGrid.oldLV then
- lv = heroGrid.oldLV
- end
-
- local targetLv = math.min(lv, maxLv)
- -- 升级 不将阶
- for i = targetLv + 1, lv do
- local upcf = UpNeedExcel.upLv[i]
- if upcf then
- HUITUI_ITEM_LIST[ItemDefine.ITEM_GREEN_EXP_ID] = (HUITUI_ITEM_LIST[ItemDefine.ITEM_GREEN_EXP_ID] or 0) + upcf.soul
- HUITUI_ITEM_LIST[ItemDefine.ITEM_JINBI_ID] = (HUITUI_ITEM_LIST[ItemDefine.ITEM_JINBI_ID] or 0) + upcf.money
- end
- end
- -- 圣星文书
- HUITUI_ITEM_LIST[ItemDefine.ITEM_HERO_UPGRADE_BOOK] = (HUITUI_ITEM_LIST[ItemDefine.ITEM_HERO_UPGRADE_BOOK] or 0) + config.upBook
- -- 进阶石
- HUITUI_ITEM_LIST[ItemDefine.ITEM_HERO_UPGRADE_ID] = (HUITUI_ITEM_LIST[ItemDefine.ITEM_HERO_UPGRADE_ID] or 0) + config.jinjieshi
- -- 5星本体碎片数量
- local fiveBentiID = heroGrid.id
- local fiveBentiSuipianID = SuipianLogic.getSuipianIDbyHeroID(fiveBentiID)
- HUITUI_ITEM_LIST[fiveBentiSuipianID] = (HUITUI_ITEM_LIST[fiveBentiSuipianID] or 0) + config.fiveBentiCnt
- -- 5星同系碎片数量
- local materialConfig = UpNeedExcel.huiTuiMaterial[heroConfig.camp]
- HUITUI_ITEM_LIST[materialConfig.fiveHeroSuipian] = (HUITUI_ITEM_LIST[materialConfig.fiveHeroSuipian] or 0) + config.fiveSuipianCnt
- -- 9星傀儡数量
- local nineHeroCnt = (HUITUI_HERO_LIST[9] and HUITUI_HERO_LIST[9][2] or 0) + config.nineHeroCnt
- HUITUI_HERO_LIST[9] = {materialConfig.nineHero, nineHeroCnt}
- -- 10星傀儡数量
- local tenHeroCnt = (HUITUI_HERO_LIST[10] and HUITUI_HERO_LIST[10][2] or 0) + config.tenHeroCnt
- HUITUI_HERO_LIST[10] = {materialConfig.tenHero, tenHeroCnt}
- return config.targetStar, targetLv, config, HUITUI_ITEM_LIST, HUITUI_HERO_LIST
- end
- -- 回退查询
- function sendHuituiQuery(human, heroID, heroIndex)
- local heroGrid = getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then return end
- local star, targetLv, config, items, heros = getHuituiReturns(heroGrid)
- if not star then
- return Broadcast.sendErr(human, Lang.HERO_HUITUI_ERR_STAR)
- end
- local msgRet = Msg.gc.GC_HERO_HUITUI_QUERY
- msgRet.heroID = heroID
- msgRet.heroIndex = heroIndex
- HeroGrid.makeHeroSimple(msgRet.oldSimple, heroGrid, heroIndex, human)
- local others = HeroGrid.createOthers(targetLv, nil,nil, star)
- HeroGrid.makeHeroSimpleByID(msgRet.newSimple, heroID, heroIndex, others, nil, true)
- HeroGrid.makeHeroSimpleByGeneral(msgRet.newSimple, heroID)
- Grid.makeItem(msgRet.needItem, ItemDefine.ITEM_HERO_HUITUI_ID, config.needItemCnt)
- msgRet.returnItems[0] = 0
- for itemID, itemCnt in pairs(items) do
- if msgRet.returnItems[0] >= #msgRet.returnItems then
- break
- end
- if itemCnt > 0 then
- msgRet.returnItems[0] = msgRet.returnItems[0] + 1
- Grid.makeItem(msgRet.returnItems[msgRet.returnItems[0]], itemID, itemCnt)
- end
- end
- msgRet.returnHeros[0] = 0
- for star, v in pairs(heros) do
- local rHeroID = v[1]
- local rHeroCnt = v[2]
- for i = 1, rHeroCnt do
- if msgRet.returnHeros[0] >= #msgRet.returnHeros then
- break
- end
- local others = HeroGrid.createOthers(1, nil,nil, star)
- msgRet.returnHeros[0] = msgRet.returnHeros[0] + 1
- local heroNet = msgRet.returnHeros[msgRet.returnHeros[0]]
- HeroGrid.makeHeroSimpleByID(heroNet, rHeroID, nil, others, human)
- HeroGrid.makeHeroSimpleByGeneral(heroNet, rHeroID)
- heroNet.star = star
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- end
- -- 回退操作
- function huituiHero(human, heroID, heroIndex)
- local heroGrid = getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then return end
- local star, targetLv, config, items, heros = getHuituiReturns(heroGrid)
- if not star then
- return Broadcast.sendErr(human, Lang.HERO_HUITUI_ERR_STAR)
- end
- if heroGrid.isLock then
- return Broadcast.sendErr(human, Lang.HERO_HUITUI_ERR_LOCK)
- end
- local needHeroBagCnt = 0
- for star, v in pairs(heros) do
- local rHeroCnt = v[2]
- needHeroBagCnt = needHeroBagCnt + rHeroCnt
- end
- -- 检查英雄背包空间
- if getEmptyCnt(human) < needHeroBagCnt then
- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
- end
- if not BagLogic.checkItemCnt(human, ItemDefine.ITEM_HERO_HUITUI_ID, config.needItemCnt) then
- return
- end
- BagLogic.delItem(human, ItemDefine.ITEM_HERO_HUITUI_ID, config.needItemCnt, "hero_huitui")
- heroGrid.star = star
- heroGrid.lv = targetLv
- XingYaoGongMing.onDelHero(human,heroGrid,heroIndex)
- ObjHuman.doCalcHero(human, heroIndex)
- sendHeroBagDynamic(human, heroID, heroIndex)
- writeLogHeroAdd(human, "hero_huitui", heroGrid)
- for itemID, itemCnt in pairs(items) do
- if itemCnt > 0 then
- BagLogic.addItem(human, itemID, itemCnt, "hero_huitui")
- end
- end
- for star,v in pairs(heros) do
- local rHeroID = v[1]
- local rHeroCnt = v[2]
- if rHeroCnt > 0 then
- addHero(human, rHeroID,star, rHeroCnt, "hero_huitui")
- end
- end
-
- local msgRet = Msg.gc.GC_HERO_HUITUI
- msgRet.heroID = heroID
- msgRet.heroIndex = heroIndex
- HeroGrid.makeHeroSimple(msgRet.newSimple, heroGrid, heroIndex, human)
- msgRet.returnItems[0] = 0
- for itemID, itemCnt in pairs(items) do
- if msgRet.returnItems[0] >= #msgRet.returnItems then
- break
- end
- if itemCnt > 0 then
- msgRet.returnItems[0] = msgRet.returnItems[0] + 1
- Grid.makeItem(msgRet.returnItems[msgRet.returnItems[0]], itemID, itemCnt)
- end
- end
- msgRet.returnHeros[0] = 0
- for star,v in pairs(heros) do
- local rHeroID = v[1]
- local rHeroCnt = v[2]
- for i = 1, rHeroCnt do
- if msgRet.returnHeros[0] >= #msgRet.returnHeros then
- break
- end
- msgRet.returnHeros[0] = msgRet.returnHeros[0] + 1
- local heroNet = msgRet.returnHeros[msgRet.returnHeros[0]]
- HeroGrid.makeHeroSimpleByID(heroNet, rHeroID, nil, nil, human)
- heroNet.star = star
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- checkChangeMaxZDL(human, heroGrid)
- end
- function getHeroGrid(human, heroID, heroIndex)
- if not heroID then return end
- if not heroIndex then return end
- local heroGrid = human.db.heroBag[heroIndex]
- if type(heroGrid) ~= "table" or heroGrid.id ~= heroID then
- return
- end
- return heroGrid
- end
- -- 根据uuid 获取heroGrid
- function getHeroGridByUuid(human, uuid)
- if not uuid or uuid == "" or uuid == "0" then return end
- for index = 1, human.db.heroBag[0] do
- local heroGrid = human.db.heroBag[index]
- if heroGrid and type(heroGrid) == "table" then
- if heroGrid.uuid == uuid then
- return heroGrid
- end
- end
- end
- return nil
- end
- -- 获取下标英雄id
- function getHeroIdByIndex(human, heroIndex)
- if heroIndex <= 0 then
- return
- end
- local heroGrid = human.db.heroBag[heroIndex]
- if heroGrid == nil then
- return
- end
- return heroGrid.id
- end
- function makeHeroShare(msg, heroGrid, bagIndex, human)
- if type(heroGrid) ~= "table" then return end
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if not heroConfig then return end
- msg.uuid = human.db._id
- msg.heroIndex = bagIndex
- HeroGrid.makeHeroSimple(msg.heroSimple, heroGrid, bagIndex, human)
- HeroGrid.makeHeroStatic(msg.heroStatic, heroGrid.id)
- HeroGrid.makeHeroDynamic(msg.heroDynamic, heroGrid, bagIndex, human)
-
- -- 装备信息
- msg.equips[0] = 0
- for i = 1, ItemDefine.EQUIP_MAX_CNT do
- local equipGrid = heroGrid.equip and heroGrid.equip[i]
- if equipGrid then
- msg.equips[0] = msg.equips[0] + 1
- local equipNet = msg.equips[msg.equips[0]]
- Grid.makeItem(equipNet, equipGrid.id, 1, heroGrid.shuijingAttrID, equipGrid)
- end
- end
- -- 符文
- msg.fuWens[0] = 0
- for i = 1, 2 do
- local fuwenData = heroGrid.fuwen and heroGrid.fuwen[i]
- if fuwenData and fuwenData.id then
- msg.fuWens[0] = msg.fuWens[0] + 1
- local fuwenNet = msg.fuWens[msg.fuWens[0]]
- fuwenNet.pos = i
- Grid.makeItem(fuwenNet.fuwen, fuwenData.id, 1, nil, fuwenData, i,0)
- end
- end
- return true
- end
- function makeHeroShareMonster(msg, monsterID, mosnterLv)
- local others = HeroGrid.createOthers(mosnterLv)
- msg.uuid = ""
- msg.heroIndex = 0
- HeroGrid.makeHeroSimpleByMonsterID(msg.heroSimple, monsterID, others)
- HeroGrid.makeHeroStatic(msg.heroStatic, monsterID)
- HeroGrid.makeHeroDynamicByID(msg.heroDynamic, monsterID)
- msg.equips[0] = 0
- msg.fuWens[0] = 0
- end
- function getHeroShareGrid(uuid, heroIndex)
- local fakeHuman = ObjHuman.onlineUuid[uuid]
- if not fakeHuman then
- local db = RoleDBLogic.getDb(uuid, RoleLogic.getCombatField())
- if not db then
- return
- end
- fakeHuman = {db = db}
- end
- local bagIndex = heroIndex
- local heroGrid = bagIndex and fakeHuman.db.heroBag[bagIndex]
- return heroGrid, bagIndex, fakeHuman
- end
- function shareData(human, uuid, heroIndex)
- local msgRet = Msg.gc.GC_HERO_SHARE_DATA
- local heroGrid, bagIndex, fakeHuman = getHeroShareGrid(uuid, heroIndex)
- if heroGrid then
- if not makeHeroShare(msgRet.data, heroGrid, bagIndex, fakeHuman) then
- return
- end
- else
- local monsterID, mosnterLv = JjcLogic.getHeroShareMonster(uuid, heroIndex)
- if not monsterID then return end
- makeHeroShareMonster(msgRet.data, monsterID, mosnterLv)
- end
- Msg.send(msgRet, human.fd)
- end
- -- 获取英雄背包中 最大等级的英雄
- function getHeroBagMaxLev(human)
- local maxLv = 1
- for index,heroGrid in pairs(human.db.heroBag) do
- if index ~= 0 and heroGrid.lv > maxLv then
- maxLv = heroGrid.lv
- end
- end
- return maxLv
- end
- -- 获取英雄背包中 最大星级的英雄
- function getHeroBagMaxFuNeng(human)
- local maxStar = 0
- for index,heroGrid in pairs(human.db.heroBag) do
- if index ~= 0 and heroGrid.id then
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if heroConfig and heroConfig.star > 10 then
- local star = heroConfig.star - 10
- if star > maxStar then
- maxStar = star
- end
- if maxStar >= HERO_MAX_STAR - 10 then
- return maxStar
- end
- end
- end
-
- end
- return maxStar
- end
- -- 战力最高的6个英雄战力和
- local function sortCombat(a, b)
- return a.zhandouli > b.zhandouli
- end
- local HeroSortTable = {}
- function getHerosZDL(human)
- Util.cleanTable(HeroSortTable)
- local len = 0
- for index,heroGrid in pairs(human.db.heroBag) do
- if index ~= 0 then
- len = len + 1
- HeroSortTable[len] = heroGrid
- end
- end
- if len > 1 then
- table.sort(HeroSortTable, sortCombat)
- end
- local zhandouli = 0
- for i = 1, 6 do
- local grid = HeroSortTable[i]
- zhandouli = zhandouli + (grid and grid.zhandouli or 0)
- end
- return zhandouli
- end
- --
- function getHeroMaxZDL(human, camp)
- local zhandouli = 0
- local maxGrid = nil
- for index,heroGrid in pairs(human.db.heroBag) do
- if index ~= 0 then
- local heroConfig = heroGrid and HeroExcel.hero[heroGrid.id]
- if heroConfig and ((camp or 0) == 0 or heroConfig.camp == camp)
- and heroGrid.zhandouli > zhandouli then
- zhandouli = heroGrid.zhandouli
- maxGrid = heroGrid
- end
- end
- end
- return zhandouli, maxGrid
- end
- -- 武将系统红点
- function isDot(human)
- if human.db.lv < 9 then
- return false
- end
- local combatHero = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE1)
- if not combatHero then return end
- for i = 1, CombatDefine.COMBAT_HERO_CNT do
- local uuid = combatHero[i]
- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
- if heroGrid then
- if isHeroDot(human, heroGrid) then
- return true
- end
-
- if HeroBook.isDot(human) == 1 then
- return true
- end
- end
- end
- end
- -- 某个伙伴是否有红点
- function isHeroDot(human, heroGrid)
- if not heroGrid then return end
- if human.db.lv < 9 then
- return false
- end
- -- 装备
- if HeroEquip.isEquipDot(human, heroGrid) then
- return true
- end
- if FuwenLogic.isFuwenDot(human, heroGrid) then
- return true
- end
- -- 升级/进阶
- if isHeroLevelDot(human, heroGrid) and
- not XingYaoGongMing.isGongMing(human,heroIndex) then
- return true
- end
- --
- if isHeroJuexingDot(human, heroGrid.bagIndex, heroGrid) then
- return true
- end
- if BingshuLogic.isBingShuDot(human, heroGrid) then
- return
- end
- end
- -- 升级判定
- function isHeroLvDot(human, heroGrid)
- if human.db.lv < 9 then
- return false
- end
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if not heroConfig then return end
- local lv = heroGrid and heroGrid.lv or 1
- local star = heroConfig and heroConfig.star or 0
- local quality = heroGrid and heroGrid.quality or 0
- local maxLv = HeroGrid.getMaxLv(heroGrid.star, quality)
- if lv < maxLv then -- 升级
- local conf = UpNeedExcel.upLv[lv + 1]
- if not conf then return end
- if human.db.jinbi < conf.money then return end
- if BagLogic.getItemCnt(human, ItemDefine.ITEM_GREEN_EXP_ID) < conf.soul then
- return
- end
- return true
- end
- end
- -- 进阶判断
- function isHeroUpDot(human, heroGrid)
- if human.db.lv < 9 then
- return false
- end
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if not heroConfig then return end
- local lv = heroGrid and heroGrid.lv or 1
- local star = heroGrid and heroGrid.star or 0
- local quality = heroGrid and heroGrid.quality or 0
-
- -- 进阶
- local maxQuality = HeroGrid.getMaxQuality(star)
- if quality >= maxQuality then
- return
- end
- local maxLv = HeroGrid.getMaxLv(heroGrid.star, maxQuality)
- if lv < maxLv then
- return
- end
- local conf = UpNeedExcel.upQuality[quality + 1]
- if not conf then return end
- if human.db.jinbi < conf.money then return end
- if BagLogic.getItemCnt(human, ItemDefine.ITEM_HERO_UPGRADE_ID) < conf.jinjieshi then
- return
- end
- return true
- end
- -- 升级/进阶判断
- function isHeroLevelDot(human, heroGrid)
- if human.db.lv < 9 then
- return false
- end
- if isHeroLvDot(human, heroGrid) then -- 升级
- return true
- end
- if isHeroUpDot(human, heroGrid) then -- 进阶判断
- return true
- end
- end
- -- 升星/觉醒红点
- function isHeroJuexingDot(human, heroIndex, heroGrid)
- if human.db.lv < 9 then
- return
- end
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if not heroConfig then return end
- local attrConfig = HeroDefine.getAttrConfig(heroGrid.id, heroGrid.star)
- if not attrConfig then return end
- local nextAttrConfig = HeroDefine.getNextAttrConfig(heroGrid.id, heroGrid.star)
- if not nextAttrConfig then
- return sendHeroJueXingMax(human, heroGrid.id, heroIndex)
- end
- -- 角色等级/世界等级是否可以
- local isFix = isFixUpStarLv(human, heroGrid.star+1)
- if not isFix then return end
- -- 判断消耗材料
- local needItemCnt = attrConfig.jinjieshi
- if BagLogic.getItemCnt(human, ItemDefine.ITEM_HERO_UPGRADE_ID) < needItemCnt then
- return
- end
- -- 额外材料
- for i = 1, #attrConfig.needItems do
- local itemID = attrConfig.needItems[i][1]
- local itemCnt = attrConfig.needItems[i][2]
- if BagLogic.getItemCnt(human, itemID) < itemCnt then
- return
- end
- end
- local without = {}
- without[heroIndex] = true
- for _, cond in ipairs(attrConfig.cond) do
- local ctype = cond[1]
- local needCnt = cond[3]
- if not needCnt then return end
- if ctype == HechengLogic.COND_TYPE_CAMPSTAR then
- needCnt = cond[4]
- end
- for i = 1, needCnt do
- local index = selectJuexingGrid(human, ctype, cond, without)
- if not index then return end
- without[index] = true
- end
- end
- return true
- end
- -- 查找升星材料
- function selectJuexingGrid(human, ctype, cond, without)
- for index,heroGrid in pairs(human.db.heroBag) do
- if index ~= 0 and not without[index] and
- isFixJuexingCond(heroGrid, ctype, cond) then
- return index
- end
- end
- end
- -- 是否满足材料需求
- function isFixJuexingCond(grid, ctype, cond)
- local heroConfig = HeroExcel.hero[grid.id]
- if not heroConfig then return end
- if ctype == HechengLogic.COND_TYPE_HEROID then
- local needConfig = HeroExcel.hero[cond[2]]
- if not needConfig then return end
- local needStar = cond[4] or needConfig.star
- if grid.id == cond[2] and needStar == grid.star then
- return true
- end
- elseif ctype == HechengLogic.COND_TYPE_CAMPSTAR then
- if cond[2] ~= 0 and cond[2] ~= heroConfig.camp then
- return
- end
- if cond[3] ~= grid.star then
- return
- end
- return true
- end
- end
- function sendBagDots(human)
- local combatHero = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE1)
- local msgRet = Msg.gc.GC_HERO_BAG_DOTS
- msgRet.list[0] = 0
- for i = 1, CombatDefine.COMBAT_HERO_CNT do
- local uuid = combatHero and combatHero[i]
- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
- if heroGrid then
- msgRet.list[0] = msgRet.list[0] + 1
- local net = msgRet.list[msgRet.list[0]]
- net.bagIndex = heroGrid.bagIndex
- net.isDot = isHeroDot(human, heroGrid) and 1 or 0
- end
- end
- --Msg.trace(msgRet)
- msgRet.bookDot = HeroBook.isDot(human)
- Msg.send(msgRet, human.fd)
- refreshDot(human)
- end
- function refreshDot(human, uuid)
- local combatHero = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE1)
- if not combatHero then return end
- local isFind = nil
- for i = 1, CombatDefine.COMBAT_HERO_CNT do
- if uuid == nil or combatHero[i] == uuid then
- isFind = true
- break
- end
- end
- if not isFind then return end
- RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_301)
- end
- -- 今日英雄重置剩余次数
- function getResetLeftCnt(human)
- local heroResetCnt = human.db.heroResetCnt or 0
- return math.max(HERO_RESET_FREECNT - heroResetCnt, 0)
- end
- -- 重置返还材料
- local RESET_RETURN_ITEMS = {}
- function getResetReturnItems(heroGrid)
- Util.cleanTable(RESET_RETURN_ITEMS)
- -- 升级
- local lv = heroGrid.lv
- if heroGrid.oldLV then
- lv = heroGrid.oldLV
- end
-
- for i = 2, lv do
- local upcf = UpNeedExcel.upLv[i]
- if upcf then
- RESET_RETURN_ITEMS[ItemDefine.ITEM_GREEN_EXP_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_GREEN_EXP_ID] or 0) + upcf.soul
- RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] or 0) + upcf.money
- end
- end
- -- 升阶
- local quality = heroGrid.quality
- if heroGrid.oldQuality then
- quality = heroGrid.oldQuality
- end
-
- -- 升阶
- for i = 1, quality do
- local upcf = UpNeedExcel.upQuality[i]
- if upcf then
- RESET_RETURN_ITEMS[ItemDefine.ITEM_HERO_UPGRADE_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_HERO_UPGRADE_ID] or 0) + upcf.jinjieshi
- RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] or 0) + upcf.money
- end
- end
- -- 升星材料
- for i = 1,heroGrid.star do
- local attrConfig = HeroDefine.getAttrConfig(heroGrid.id, i)
- if attrConfig then
- if attrConfig.jinjieshi > 0 then RESET_RETURN_ITEMS[ItemDefine.ITEM_HERO_UPGRADE_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_HERO_UPGRADE_ID] or 0) + attrConfig.jinjieshi end
- for j = 1,#attrConfig.needItems do
- RESET_RETURN_ITEMS[attrConfig.needItems[j][1]] = (RESET_RETURN_ITEMS[attrConfig.needItems[j][1]] or 0) + attrConfig.needItems[j][2]
- end
- end
- end
- -- 护符/水晶材料
- local maxCnt = 100 -- 防止死循环
- local equipID = heroGrid.equip and heroGrid.equip[ItemDefine.EQUIP_SUBTYPE_SHUIJIN]
- while equipID do
- maxCnt = maxCnt - 1
- if maxCnt < 0 then
- assert()
- end
- local eupcf = EquipExcel.shuijingUpNeed[equipID]
- if not eupcf then break end
- local preEquipID = eupcf.prevID
- equipID = preEquipID
- if preEquipID > 0 then
- RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] or 0) + eupcf.money
- RESET_RETURN_ITEMS[ItemDefine.ITEM_SHUIJING_UPLEVEL_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_SHUIJING_UPLEVEL_ID] or 0) + eupcf.jinghua
- end
- end
- return RESET_RETURN_ITEMS
- end
- function getRealResetReturnItems(heroGrid)
- Util.cleanTable(RESET_RETURN_ITEMS)
- -- 升级
- local lv = heroGrid.lv
- if heroGrid.oldLV then
- lv = heroGrid.oldLV
- end
-
- for i = 2, lv do
- local upcf = UpNeedExcel.upLv[i]
- if upcf then
- RESET_RETURN_ITEMS[ItemDefine.ITEM_GREEN_EXP_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_GREEN_EXP_ID] or 0) + upcf.soul
- RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] or 0) + upcf.money
- end
- end
- -- 升阶
- local quality = heroGrid.quality
- if heroGrid.oldQuality then
- quality = heroGrid.oldQuality
- end
-
- -- 升阶
- for i = 1, quality do
- local upcf = UpNeedExcel.upQuality[i]
- if upcf then
- RESET_RETURN_ITEMS[ItemDefine.ITEM_HERO_UPGRADE_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_HERO_UPGRADE_ID] or 0) + upcf.jinjieshi
- RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] = (RESET_RETURN_ITEMS[ItemDefine.ITEM_JINBI_ID] or 0) + upcf.money
- end
- end
- return RESET_RETURN_ITEMS
- end
- -- 重置花费
- function getResetNeedZuanshi(lv)
- if lv > 100 then
- return 50
- end
- return 0
- end
- -- 重置查询
- function resetHeroQuery(human, heroID, heroIndex)
- local heroGrid = getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then return end
- if XingYaoGongMing.isGongMing(human,heroIndex,XingYaoGongMing.XYHERO_RESET) then
- return
- end
-
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if not heroConfig then return end
- if heroConfig.star > HERO_RESET_MAXSTAR then
- return Broadcast.sendErr(human, Util.format(Lang.HERO_RESET_ERR_STAR, HERO_RESET_MAXSTAR + 1))
- end
- ObjHuman.updateDaily(human)
- --[[if getResetLeftCnt(human) < 1 then
- return Broadcast.sendErr(human, Lang.HERO_RESET_ERR_CNT)
- end--]]
- local list = getRealResetReturnItems(heroGrid)
- local msgRet = Msg.gc.GC_HERO_RESET_QUERY
- msgRet.heroID = heroID
- msgRet.heroIndex = heroIndex
- msgRet.needZuanshi = getResetNeedZuanshi(heroGrid.lv)
- msgRet.maxFreeCnt = HERO_RESET_FREECNT
- msgRet.leftFreeCnt = getResetLeftCnt(human)
- msgRet.items[0] = 0
- for itemID, itemCnt in pairs(list) do
- if msgRet.items[0] >= #msgRet.items then
- break
- end
- msgRet.items[0] = msgRet.items[0] + 1
- Grid.makeItem(msgRet.items[msgRet.items[0]], itemID, itemCnt)
- end
- if msgRet.items[0] < 1 then
- return Broadcast.sendErr(human, Lang.HERO_RESET_ERR_NONE)
- end
- -- Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- end
- -- 英雄重置
- function resetHero(human, heroID, heroIndex)
- local heroGrid = getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then return end
- if XingYaoGongMing.isGongMing(human,heroIndex,XingYaoGongMing.XYHERO_RESET) then
- return
- end
-
- local heroConfig = HeroExcel.hero[heroGrid.id]
- if not heroConfig then return end
- if heroConfig.star > HERO_RESET_MAXSTAR then
- return Broadcast.sendErr(human, Util.format(Lang.HERO_RESET_ERR_STAR, HERO_RESET_MAXSTAR + 1))
- end
- local list = getRealResetReturnItems(heroGrid)
- if not next(list) then
- return Broadcast.sendErr(human, Lang.HERO_RESET_ERR_NONE)
- end
- if getResetLeftCnt(human) < 1 then
- return Broadcast.sendErr(human, Lang.HERO_RESET_ERR_CNT)
- end
- local needZuanshi = getResetNeedZuanshi(heroGrid.lv)
- if not ObjHuman.checkRMB(human, needZuanshi) then
- return
- end
- ObjHuman.decZuanshi(human, -needZuanshi, "hero_reset")
- human.db.heroResetCnt = (human.db.heroResetCnt or 0) + 1
- heroGrid.lv = 1
- heroGrid.quality = 0
- if heroGrid.equip and heroGrid.equip[ItemDefine.EQUIP_SUBTYPE_SHUIJIN] then
- heroGrid.equip[ItemDefine.EQUIP_SUBTYPE_SHUIJIN] = nil
- heroGrid.shuijingAttrID = nil
- end
- for itemID, itemCnt in pairs(list) do
- BagLogic.addItem(human, itemID, itemCnt, "hero_reset")
- end
- HeroEquip.putOffQuick(human, heroID, heroIndex, true)
- FuwenLogic.putOffQuick(human, heroID, heroIndex, true)
- XingYaoGongMing.onDelHero(human,heroGrid,heroIndex)
- heroGrid.fuwen = nil
- ObjHuman.doCalcHero(human,heroIndex)
- sendHeroBagDynamic(human, heroID, heroIndex)
- refreshDot(human, heroGrid.uuid)
- local msgRet = Msg.gc.GC_HERO_RESET
- msgRet.heroID = heroID
- msgRet.heroIndex = heroIndex
- msgRet.items[0] = 0
- for itemID, itemCnt in pairs(list) do
- if msgRet.items[0] >= #msgRet.items then
- break
- end
- if not ItemDefine.isEquip(itemID) then
- msgRet.items[0] = msgRet.items[0] + 1
- Grid.makeItem(msgRet.items[msgRet.items[0]], itemID, itemCnt)
- end
- end
- msgRet.items[0] = EquipLogic.makeEquipItem(human, msgRet.items, msgRet.items[0])
- Msg.send(msgRet, human.fd)
- checkChangeMaxZDL(human, heroGrid)
- end
|