JibanLogic.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. local Msg = require("core.Msg")
  2. local Util = require("common.Util")
  3. local CombatPosLogic = require("combat.CombatPosLogic")
  4. local HeroGrid = require("hero.HeroGrid")
  5. local BeSkill = require("combat.BeSkill")
  6. local CombatDefine = require("combat.CombatDefine")
  7. local JibanExcel = require("excel.jiban")
  8. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  9. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  10. local Broadcast = require("broadcast.Broadcast")
  11. local Lang = require("common.Lang")
  12. local HeroLogic = require("hero.HeroLogic")
  13. local GuideLogic = require("guide.GuideLogic")
  14. local CombatExcel = require("excel.combat")
  15. local Json = require("common.Json")
  16. local HeroConfig = require("excel.hero").hero
  17. local AnotherWorldBattleNS
  18. local HeroBook
  19. local ServerCommerceActBattleGroundNS
  20. CMD1 = 1 -- 主线通关
  21. CMD2 = 2 -- 获得英雄
  22. CMD3 = 3 -- 通关通天塔
  23. CMD4 = 4 -- 等级
  24. FATHER2ID = nil
  25. HERO2ID = nil
  26. CMD2POS = nil
  27. JIBATEMP = nil
  28. local function getDB(human)
  29. human.db.jiban = human.db.jiban or {[1] = 1}
  30. return human.db.jiban
  31. end
  32. -- 获取全部设置的羁绊位置英雄ID
  33. local function getDB_AllJibanHeroID(human)
  34. human.db.jibanheroid = human.db.jibanheroid or {}
  35. return human.db.jibanheroid
  36. end
  37. -- 获取某个羁绊位置英雄ID
  38. local function getDB_JibanHeroIDByIndex(human, nIndex)
  39. local jibanheroid = getDB_AllJibanHeroID(human)
  40. return jibanheroid[nIndex] and jibanheroid[nIndex] or -1
  41. end
  42. -- 设置羁绊位置英雄ID
  43. local function setDB_JibanHeroID(human, nIndex, nHeroID)
  44. local jibanheroid = getDB_AllJibanHeroID(human)
  45. jibanheroid[nIndex] = nHeroID
  46. end
  47. -- -- 通过阵容类型获取羁绊英雄数据
  48. -- local function getJibanHeroData(human, combatType)
  49. -- human.db.jibanHeroData = human.db.jibanHeroData or {}
  50. -- human.db.jibanHeroData[combatType] = human.db.jibanHeroData[combatType] or {}
  51. -- return human.db.jibanHeroData[combatType]
  52. -- end
  53. -- -- 获取某个阵容羁绊英雄Id
  54. -- local function getJibanHeroId(human, combatType, heroIdx)
  55. -- local singleJibanHeroData = getJibanHeroData(human, combatType)
  56. -- return singleJibanHeroData[heroIdx] and singleJibanHeroData[heroIdx] or -1
  57. -- end
  58. -- -- 设置羁绊位置英雄ID
  59. -- local function setJiBanHero(human, combatType, heroIdx, heroId)
  60. -- local singleJibanHeroData = getJibanHeroData(human, combatType)
  61. -- singleJibanHeroData[heroIdx] = heroId
  62. -- end
  63. local function fontJibanInfo(net,id)
  64. local conf = JibanExcel.jiban[id]
  65. net.id = id
  66. net.name = conf.name
  67. net.desc = conf.desc
  68. net.quality = conf.quality
  69. local len = 0
  70. for _,v in ipairs(conf.hero) do
  71. len = len + 1
  72. HeroGrid.makeHeroSimpleByID(net.heroList[len], v)
  73. end
  74. net.heroList[0] = len
  75. end
  76. function initAfterHot()
  77. -- 同一father下的羁绊互斥
  78. --[[
  79. FATHER2ID = {
  80. [jibanCfg.father] = {
  81. jibanCfg.id,
  82. } -- array
  83. }
  84. ]]
  85. FATHER2ID = {}
  86. HERO2ID = {}
  87. --[[
  88. temp = {
  89. {jibanCfg.quality,jibanCfg.id},
  90. } -- array
  91. ]]
  92. JIBATEMP = {}
  93. for k,v in ipairs(JibanExcel.jiban) do
  94. JIBATEMP[#JIBATEMP + 1] = {v.quality,k}
  95. for _,v1 in ipairs(v.hero) do
  96. HERO2ID[v1] = HERO2ID[v1] or {}
  97. HERO2ID[v1][#HERO2ID[v1] + 1] = k
  98. end
  99. end
  100. table.sort(JIBATEMP,function(a,b)
  101. if a[1] > b[1] then
  102. return true
  103. elseif a[1] == b[1] and a[2] < b[2] then
  104. return true
  105. else
  106. return false
  107. end
  108. end)
  109. local msgRet = Msg.gc.GC_JIBAN_PREVIEW
  110. local len = 0
  111. for k,v in ipairs(JIBATEMP) do
  112. local conf = JibanExcel.jiban[v[2]]
  113. FATHER2ID[conf.father] = FATHER2ID[conf.father] or {}
  114. FATHER2ID[conf.father][#FATHER2ID[conf.father] + 1] = v[2]
  115. -- len = len + 1
  116. -- local net = msgRet.list[len]
  117. -- fontJibanInfo(net,k)
  118. end
  119. -- msgRet.list[0] = len
  120. CMD2POS = {}
  121. for k,v in ipairs(JibanExcel.pos) do
  122. if v.cmd > 0 then
  123. CMD2POS[v.cmd] = k
  124. end
  125. end
  126. end
  127. function query(human,combatType,heroID, extraArgs)
  128. local flag = RoleSystemLogic.isOpen(human,RoleSystemDefine.ROLE_SYS_ID_207)
  129. if flag ~= true then
  130. return
  131. end
  132. local msgRet = Msg.gc.GC_JIBAN_QUERY
  133. local len = 0
  134. if HERO2ID[heroID] then
  135. for k,v in ipairs(HERO2ID[heroID]) do
  136. len = len + 1
  137. local net = msgRet.jibanList[len]
  138. fontJibanInfo(net,v)
  139. end
  140. end
  141. msgRet.jibanList[0] = len
  142. len = 0
  143. local db = getDB(human)
  144. local combatHeroDB
  145. if combatType == CombatDefine.COMBAT_TYPE36 and extraArgs then
  146. AnotherWorldBattleNS = AnotherWorldBattleNS or require("anotherWorldBattle.AnotherWorldBattleNS")
  147. local v1,v2, v3
  148. v1, v2, v3, combatHeroDB = AnotherWorldBattleNS.getCombatHeros(human, combatType, extraArgs)
  149. combatHeroDB = combatHeroDB or {}
  150. else
  151. combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  152. end
  153. local jibanDB = combatHeroDB.jiban or {}
  154. for k,v in ipairs(JibanExcel.pos) do
  155. len = len + 1
  156. local net = msgRet.posList[len]
  157. net.id = k
  158. net.tip = v.tip
  159. net.isOpen = db[k] or 0
  160. net.sort = v.sort
  161. local heroGrid
  162. -- if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" then
  163. -- heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  164. -- end
  165. -- if not heroGrid then
  166. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  167. -- if -1 ~= nHeroID then
  168. -- local heroGridList = HeroLogic.getHeroListById(human, nHeroID)
  169. -- if nil ~= _G.next(heroGridList) then
  170. -- local nHeroIndex = heroGridList[1]
  171. -- heroGrid = HeroLogic.getHeroGrid(human, nHeroID, nHeroIndex)
  172. -- end
  173. -- end
  174. -- end
  175. if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" and jibanDB[k] ~= 0 then
  176. -- len = len + 1
  177. -- local net = msgRet.posList[len]
  178. -- net.id = k
  179. -- net.tip = v.tip
  180. -- net.isOpen = db[k] or 0
  181. -- net.sort = v.sort
  182. -- local heroGrid
  183. -- 之前阵容数据的羁绊数据里保存的是英雄的uuid, 最新改成保存英雄id
  184. local heroId = tonumber(jibanDB[k])
  185. if heroId then
  186. heroGrid = {id = heroId }
  187. else
  188. -- heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  189. if combatType == CombatDefine.COMBAT_TYPE37 then
  190. ServerCommerceActBattleGroundNS = ServerCommerceActBattleGroundNS or require("serverCommerce.ServerCommerceActBattleGroundNS")
  191. heroGrid = ServerCommerceActBattleGroundNS.getHeroGridByUuid(human, jibanDB[k])
  192. else
  193. heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  194. end
  195. end
  196. end
  197. local index = heroGrid and heroGrid.bagIndex or 0
  198. HeroGrid.makeHeroSimple(net.hero, heroGrid, index)
  199. end
  200. msgRet.posList[0] = len
  201. Msg.send(msgRet,human.fd)
  202. end
  203. --
  204. function sendQuery(human,combatType, teamType)
  205. local msgRet = Msg.gc.GC_JIBAN_QUERY_ALL
  206. local len = 0
  207. local db = getDB(human)
  208. msgRet.type = teamType
  209. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  210. local jibanDB = combatHeroDB.jiban or {}
  211. for k,v in ipairs(JibanExcel.pos) do
  212. len = len + 1
  213. local net = msgRet.posList[len]
  214. net.id = k
  215. net.tip = v.tip
  216. net.isOpen = db[k] or 0
  217. net.sort = v.sort
  218. local heroGrid
  219. -- if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" then
  220. -- heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  221. -- end
  222. -- if not heroGrid then
  223. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  224. -- if -1 ~= nHeroID then
  225. -- local heroGridList = HeroLogic.getHeroListById(human, nHeroID)
  226. -- if nil ~= _G.next(heroGridList) then
  227. -- local nHeroIndex = heroGridList[1]
  228. -- heroGrid = HeroLogic.getHeroGrid(human, nHeroID, nHeroIndex)
  229. -- end
  230. -- end
  231. -- end
  232. if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" and jibanDB[k] ~= 0 then
  233. -- 之前阵容数据的羁绊数据里保存的是英雄的uuid, 最新改成保存英雄id
  234. local heroId = tonumber(jibanDB[k])
  235. if heroId then
  236. heroGrid = {id = heroId }
  237. else
  238. -- heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  239. if combatType == CombatDefine.COMBAT_TYPE37 then
  240. ServerCommerceActBattleGroundNS = ServerCommerceActBattleGroundNS or require("serverCommerce.ServerCommerceActBattleGroundNS")
  241. heroGrid = ServerCommerceActBattleGroundNS.getHeroGridByUuid(human, jibanDB[k])
  242. else
  243. heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  244. end
  245. end
  246. end
  247. local index = heroGrid and heroGrid.bagIndex or 0
  248. HeroGrid.makeHeroSimple(net.hero, heroGrid, index)
  249. end
  250. msgRet.posList[0] = len
  251. Msg.send(msgRet,human.fd)
  252. end
  253. function preview(human)
  254. local msgRet = Msg.gc.GC_JIBAN_PREVIEW
  255. msgRet.list[0] = 0
  256. msgRet.isend = 0
  257. local len = 0
  258. for k,v in ipairs(JIBATEMP) do
  259. len = len + 1
  260. local net = msgRet.list[len]
  261. fontJibanInfo(net,k)
  262. if len >=20 then
  263. msgRet.list[0] = len
  264. Msg.send(msgRet,human.fd)
  265. len = 0
  266. end
  267. end
  268. msgRet.list[0] = len
  269. msgRet.isend = 1
  270. Msg.send(msgRet,human.fd)
  271. end
  272. function getPosList(human)
  273. return getDB(human)
  274. end
  275. function onCallback(human,cmd,arg)
  276. local pos = CMD2POS[cmd]
  277. local db = getDB(human)
  278. if db[pos] then
  279. return
  280. end
  281. local conf = JibanExcel.pos[pos]
  282. if arg >= conf.arg then
  283. db[pos] = 1
  284. end
  285. end
  286. function getJiban(objList,jibanList)
  287. local objHero = {}
  288. local jibanHero = {}
  289. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  290. local obj = objList[i]
  291. -- 不是玩家不计算羁绊
  292. if obj and obj.type == CombatDefine.COMBAT_OBJ_TYPE1 then
  293. objHero[obj.id] = objHero[obj.id] or 0
  294. objHero[obj.id] = objHero[obj.id] + 1
  295. end
  296. end
  297. if jibanList then
  298. -- for k,v in pairs(jibanList) do
  299. -- if v > 0 then
  300. -- objHero[v] = objHero[v] or 0
  301. -- objHero[v] = objHero[v] + 1
  302. -- end
  303. -- end
  304. for _, heroInfo in pairs(jibanList) do
  305. local heroID = heroInfo.heroID
  306. if heroID > 0 then
  307. jibanHero[heroID] = heroInfo
  308. end
  309. end
  310. end
  311. -- local jiban = {}
  312. -- for _,v in pairs(FATHER2ID) do
  313. -- for _,v1 in ipairs(v) do
  314. -- local conf = JibanExcel.jiban[v1]
  315. -- local canUse = true
  316. -- for _,v2 in ipairs(conf.hero) do
  317. -- if not objHero[v2] then
  318. -- canUse = false
  319. -- break
  320. -- end
  321. -- end
  322. -- if canUse then
  323. -- jiban[v1] = 1
  324. -- break
  325. -- end
  326. -- end
  327. -- end
  328. -- return jiban
  329. local jiban = {}
  330. for _,v in pairs(FATHER2ID) do
  331. for _,v1 in ipairs(v) do
  332. local conf = JibanExcel.jiban[v1]
  333. local canUse = true
  334. local jbHeroList = {}
  335. for _,v2 in ipairs(conf.hero) do
  336. if not objHero[v2] and not jibanHero[v2] then
  337. canUse = false
  338. break
  339. end
  340. if jibanHero[v2] then
  341. jbHeroList[v2] = 1
  342. end
  343. end
  344. if canUse then
  345. jiban[v1] = {}
  346. for jbHeroID in pairs(jbHeroList) do
  347. jiban[v1][jbHeroID] = jibanHero[jbHeroID]
  348. end
  349. end
  350. end
  351. end
  352. return jiban
  353. end
  354. function getJibanHero(human,combatHeroDB)
  355. local jibanHero = {}
  356. -- local jibanheroid = getDB_AllJibanHeroID(human)
  357. if combatHeroDB.jiban then
  358. -- for k, uuid in pairs(combatHeroDB.jiban) do
  359. -- if uuid ~= "0" and uuid ~= "" then
  360. -- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  361. -- if heroGrid then
  362. -- jibanHero[k] = heroGrid.id
  363. -- else
  364. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  365. -- if -1 ~= nHeroID then
  366. -- jibanHero[k] = nHeroID
  367. -- end
  368. -- end
  369. -- end
  370. -- end
  371. for k, uuid in pairs(combatHeroDB.jiban) do
  372. if uuid ~= "0" and uuid ~= "" and uuid ~= 0 then
  373. local finalId = tonumber(uuid)
  374. if finalId then
  375. local heroCfg = HeroConfig[finalId]
  376. jibanHero[k] = {
  377. heroID = finalId,
  378. icon = heroCfg and heroCfg.head or 0,
  379. star = 1,
  380. camp = heroCfg and heroCfg.camp or 1,
  381. grade = heroCfg and heroCfg.grade or 1,
  382. }
  383. else
  384. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  385. if heroGrid then
  386. local heroCfg = HeroConfig[heroGrid.id]
  387. jibanHero[k] = {
  388. heroID = heroGrid.id,
  389. icon = heroGrid.head or (heroCfg and heroCfg.head or 0),
  390. star = heroGrid.star or 1,
  391. camp = heroCfg and heroCfg.camp or 1,
  392. grade = heroGrid.grade or (heroCfg and heroCfg.grade or 1),
  393. }
  394. end
  395. end
  396. end
  397. -- if heroGrid then
  398. -- local heroCfg = HeroConfig[heroGrid.id]
  399. -- jibanHero[k] = {
  400. -- heroID = heroGrid.id,
  401. -- icon = heroGrid.head or (heroCfg and heroCfg.head or 0),
  402. -- star = heroGrid.star or 1,
  403. -- camp = heroCfg and heroCfg.camp or 1,
  404. -- grade = heroGrid.grade or (heroCfg and heroCfg.grade or 1),
  405. -- }
  406. -- else
  407. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  408. -- if -1 ~= nHeroID then
  409. -- local heroCfg = HeroConfig[nHeroID]
  410. -- jibanHero[k] = {
  411. -- heroID = nHeroID,
  412. -- icon = heroCfg and heroCfg.head or 0,
  413. -- star = 1,
  414. -- camp = heroCfg and heroCfg.camp or 1,
  415. -- grade = heroCfg.grade or 1,
  416. -- }
  417. -- end
  418. -- end
  419. end
  420. end
  421. return jibanHero
  422. end
  423. function getDesc(jiban)
  424. -- local desc = {}
  425. -- local len = 0
  426. -- for k,v in pairs(jiban) do
  427. -- local conf = JibanExcel.jiban[k]
  428. -- if len > 0 then
  429. -- len = len + 1
  430. -- desc[len] = "|"
  431. -- end
  432. -- len = len + 1
  433. -- desc[len] = conf.name
  434. -- len = len + 1
  435. -- desc[len] = ","
  436. -- len = len + 1
  437. -- desc[len] = conf.desc
  438. -- len = len + 1
  439. -- desc[len] = ","
  440. -- len = len + 1
  441. -- desc[len] = conf.quality
  442. -- end
  443. -- local descStr = table.concat(desc)
  444. -- return descStr
  445. local len = 0
  446. local JiBanInfo = {}
  447. for k, jbHeroInfo in pairs(jiban) do
  448. local conf = JibanExcel.jiban[k]
  449. len = len + 1
  450. JiBanInfo[len] = {
  451. name = conf.name,
  452. desc = conf.desc,
  453. quality = conf.quality,
  454. hero = conf.hero,
  455. }
  456. if next(jbHeroInfo) then
  457. JiBanInfo[len].jbHeroInfo = {}
  458. local info = JiBanInfo[len].jbHeroInfo
  459. for jbHeroId, data in pairs(jbHeroInfo) do
  460. info[jbHeroId] = data
  461. end
  462. end
  463. end
  464. return Json.Encode(JiBanInfo)
  465. end
  466. function setBeSkill(objList,jiban)
  467. if not jiban then return end
  468. local skillList = {}
  469. for k in pairs(jiban) do
  470. local conf = JibanExcel.jiban[k]
  471. local skillID = conf.skill
  472. if skillID > 0 then
  473. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  474. local obj = objList[i]
  475. if obj then
  476. BeSkill.setBeSkillID(obj,skillID)
  477. end
  478. end
  479. end
  480. end
  481. end
  482. -- 更新羁绊
  483. function update(human,combatType,jibanListStr, heroIdStr, extraArgs)
  484. local conf = CombatExcel.combat[combatType]
  485. if not conf then return end
  486. local posList = getPosList(human)
  487. local jibanList = Util.split(jibanListStr,",")
  488. local jibanHeroIdArr = Util.split(heroIdStr,",", true)
  489. local combatHeroDB
  490. if combatType == CombatDefine.COMBAT_TYPE36 and extraArgs then
  491. AnotherWorldBattleNS = AnotherWorldBattleNS or require("anotherWorldBattle.AnotherWorldBattleNS")
  492. local v1,v2, v3
  493. v1, v2, v3, combatHeroDB = AnotherWorldBattleNS.getCombatHeros(human, combatType, extraArgs)
  494. if not combatHeroDB then
  495. return
  496. end
  497. else
  498. combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  499. end
  500. HeroBook = HeroBook or require("hero.HeroBook")
  501. for k,v in ipairs(jibanList) do
  502. local uuid = v or "0"
  503. local heroId = jibanHeroIdArr[k] or 0
  504. if uuid ~= "" and uuid ~= "0" and heroId ~= 0 then
  505. --检测有没有再阵容上
  506. for _, combatUuid in ipairs(combatHeroDB.list) do
  507. if uuid == combatUuid then return end
  508. end
  509. if not posList[k] then return end
  510. -- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  511. -- if not heroGrid then return end
  512. -- setDB_JibanHeroID(human, k, heroGrid.id)
  513. local res = HeroBook.isGetHero(human, heroId)
  514. if not res or res == HeroBook.LIEZHUAN_REWARD_NO then
  515. return
  516. end
  517. -- setDB_JibanHeroID(human, k, heroId)
  518. end
  519. end
  520. combatHeroDB.jiban = jibanHeroIdArr
  521. if combatType == CombatDefine.COMBAT_TYPE36 and extraArgs then
  522. return query(human, combatType, 0, extraArgs)
  523. end
  524. GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_JIBAN_GROUP)
  525. sendQuery(human,combatType, conf.teamType)
  526. end