SuipianLogic.lua 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707
  1. -- 碎片逻辑
  2. local ItemExcel = require("excel.item")
  3. local DropExcel = require("excel.drop")
  4. local HeroExcel = require("excel.hero")
  5. local Lang = require("common.Lang")
  6. local Msg = require("core.Msg")
  7. local HeroGrid = require("hero.HeroGrid")
  8. local HeroDefine = require("hero.HeroDefine")
  9. local HeroLogic = require("hero.HeroLogic")
  10. local BagLogic = require("bag.BagLogic")
  11. local ItemDefine = require("bag.ItemDefine")
  12. local DropSpecial = require("bag.DropSpecial")
  13. local Grid = require("bag.Grid")
  14. local Broadcast = require("broadcast.Broadcast")
  15. local Util = require("common.Util")
  16. SUMMON_TYPE_TARGET = 1 -- 指定目标兑换
  17. SUMMON_TYPE_DROP = 2 -- 随机掉落表兑换
  18. SUMMON_TYPE_HERO_SP = 3 -- 英雄条件兑换
  19. SUMMON_TYPE_SHENQI_SP = 4 -- 神器条件兑换
  20. SUMMON_SUBTYPE_HERO = 1 -- 英雄
  21. SUMMON_SUBTYPE_EQUIP = 2 -- 装备
  22. SUMMON_SUBTYPE_SKIN = 3 -- 皮肤
  23. -- 查询
  24. function query(human, itemID)
  25. local itemConfig = ItemExcel.item[itemID]
  26. if itemConfig == nil then return end
  27. if itemConfig.get[1] ~= SUMMON_TYPE_TARGET then
  28. return
  29. end
  30. if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO then
  31. return
  32. end
  33. local heroID = itemConfig.get[3]
  34. local heroGrid = HeroGrid.getCacheHeroGridTujian(heroID)
  35. if not heroGrid then return end
  36. local msgRet = Msg.gc.GC_SUIPIAN_HERO_QUERY
  37. msgRet.id = itemID
  38. HeroGrid.makeHeroSimple(msgRet.heroSimple, heroGrid, nil, human, nil, true)
  39. --Msg.trace(msgRet)
  40. Msg.send(msgRet, human.fd)
  41. end
  42. -- 召唤
  43. function summon(human, itemID, itemUseCnt)
  44. if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then
  45. return
  46. end
  47. local itemConfig = ItemExcel.item[itemID]
  48. if itemConfig == nil then
  49. return
  50. end
  51. if itemConfig.get[1] ~= SUMMON_TYPE_TARGET
  52. and itemConfig.get[1] ~= SUMMON_TYPE_DROP
  53. and itemConfig.get[1] ~= SUMMON_TYPE_HERO_SP
  54. and itemConfig.get[1] ~= SUMMON_TYPE_SHENQI_SP then
  55. return
  56. end
  57. if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  58. return
  59. end
  60. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  61. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  62. if leftHeroBox <= 0 then
  63. return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  64. end
  65. end
  66. local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt)
  67. if realItemCnt < 1 then
  68. return
  69. end
  70. if realItemCnt * itemConfig.fullCnt ~= itemUseCnt then
  71. return
  72. end
  73. local isHero = 0
  74. local outItemIDList = nil
  75. local targetID = nil
  76. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  77. -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
  78. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  79. if realItemCnt > leftHeroBox then
  80. realItemCnt = leftHeroBox
  81. end
  82. -- 指定目标
  83. targetID = itemConfig.get[3]
  84. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  85. -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
  86. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  87. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  88. if realItemCnt > leftHeroBox then
  89. realItemCnt = leftHeroBox
  90. end
  91. end
  92. -- 掉落表随机掉落
  93. for i = 1, realItemCnt do
  94. local dropID = itemConfig.get[3]
  95. targetID = getDropTargetID(dropID)
  96. outItemIDList = outItemIDList or {}
  97. outItemIDList[targetID] = outItemIDList[targetID] or 0
  98. outItemIDList[targetID] = outItemIDList[targetID] + 1
  99. end
  100. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  101. -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
  102. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  103. if realItemCnt > leftHeroBox then
  104. realItemCnt = leftHeroBox
  105. end
  106. -- 英雄条件兑换
  107. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  108. for i = 1, realItemCnt do
  109. local randTemp = math.random(1, #dropTable)
  110. targetID = dropTable[randTemp]
  111. outItemIDList = outItemIDList or {}
  112. outItemIDList[targetID] = outItemIDList[targetID] or 0
  113. outItemIDList[targetID] = outItemIDList[targetID] + 1
  114. end
  115. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  116. -- 神器条件兑换
  117. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  118. for i = 1, realItemCnt do
  119. local randTemp = math.random(1, #dropTable)
  120. targetID = dropTable[randTemp]
  121. outItemIDList = outItemIDList or {}
  122. outItemIDList[targetID] = outItemIDList[targetID] or 0
  123. outItemIDList[targetID] = outItemIDList[targetID] + 1
  124. end
  125. end
  126. if targetID == nil and outItemIDList == nil then
  127. assert(nil)
  128. end
  129. local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  130. BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon")
  131. local fenJieList = nil
  132. local itemList = {}
  133. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  134. isHero = 1
  135. if outItemIDList then
  136. -- 多个id
  137. for k, v in pairs(outItemIDList) do
  138. local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  139. local heroID = k
  140. local hero = HeroExcel.hero[heroID]
  141. if fjlist and type(fjlist) == "table" then
  142. for fjItemID, fjItemCnt in pairs(fjlist) do
  143. fenJieList = fenJieList or {}
  144. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  145. end
  146. end
  147. end
  148. else
  149. -- 单个id
  150. local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  151. local heroID = targetID
  152. local hero = HeroExcel.hero[heroID]
  153. if fjlist and type(fjlist) == "table" then
  154. for fjItemID, fjItemCnt in pairs(fjlist) do
  155. fenJieList = fenJieList or {}
  156. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  157. end
  158. end
  159. end
  160. else
  161. if outItemIDList then
  162. -- 多个id
  163. for k, v in pairs(outItemIDList) do
  164. BagLogic.addItem(human, k, v, "item_summon")
  165. itemList[k] = itemList[k] or 0
  166. itemList[k] = itemList[k] + v
  167. end
  168. else
  169. -- 单个id
  170. BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  171. itemList[targetID] = itemList[targetID] or 0
  172. itemList[targetID] = itemList[targetID] + realItemCnt
  173. end
  174. end
  175. BagLogic.sendItemGetList(human, itemList, "item_summon")
  176. local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  177. msgRet.isHero = isHero
  178. msgRet.list[0] = 0
  179. msgRet.heroList[0] = 0
  180. msgRet.fenJieList[0] = 0
  181. local netList = (isHero == 1) and msgRet.heroList or msgRet.list
  182. if outItemIDList then
  183. -- 多个id
  184. for k, v in pairs(outItemIDList) do
  185. netList[0] = netList[0] + 1
  186. makeResultItemData(netList[netList[0]], k, v, isHero)
  187. end
  188. else
  189. netList[0] = netList[0] + 1
  190. makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
  191. end
  192. if fenJieList then
  193. for fjItemID, fjItemCnt in pairs(fenJieList) do
  194. msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1
  195. Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt)
  196. end
  197. end
  198. --Msg.trace(msgRet)
  199. Msg.send(msgRet, human.fd)
  200. end
  201. function makeResultItemData(net, id, cnt, isHero)
  202. if isHero == 1 then
  203. HeroGrid.makeHeroSimpleByID(net, id)
  204. net.cnt = cnt
  205. else
  206. Grid.makeItem(net, id, cnt)
  207. end
  208. end
  209. -- 根据掉落id 获取id
  210. function getDropTargetID(dropID)
  211. local dropConfig = DropExcel.dropSuipian[dropID]
  212. if dropConfig == nil then
  213. return
  214. end
  215. -- 计算总权重
  216. local totalWeight = 0
  217. for k, v in ipairs(dropConfig.dropRule) do
  218. local weight = v[2]
  219. totalWeight = totalWeight + weight
  220. end
  221. local heroWeight = nil
  222. local r = math.random(1, totalWeight)
  223. for k, v in ipairs(dropConfig.dropRule) do
  224. local weight = v[2]
  225. if r <= weight then
  226. heroWeight = v[1]
  227. break
  228. else
  229. r = r - weight
  230. end
  231. end
  232. if heroWeight == nil then
  233. assert()
  234. end
  235. local len = #dropConfig.camp
  236. local index = math.random(1, len)
  237. local heroID = HeroDefine.getRandHeroByWeightLvAndCamp(heroWeight, dropConfig.camp[index])
  238. return heroID
  239. end
  240. local function queryBoxList(human, itemConfig)
  241. local itemList = itemConfig.cmd[2]
  242. if not itemList then return end
  243. local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY
  244. msgRet.items[0] = #itemList
  245. for i = 1, msgRet.items[0] do
  246. local itemID = itemList[i][1]
  247. local itemCnt = itemList[i][2]
  248. local quality = itemList[i][3]
  249. Grid.makeItem(msgRet.items[i], itemID, itemCnt, nil, nil, nil, nil, quality)
  250. end
  251. Msg.send(msgRet, human.fd)
  252. end
  253. --碎片英雄召唤预览
  254. function CG_SUIPIAN_HERO_SUMMON_QUERY(human, itemID)
  255. local itemConfig = ItemExcel.item[itemID]
  256. if not itemConfig then return end
  257. local cmdStr = itemConfig.cmd[1]
  258. if cmdStr == "box" or cmdStr == "boxAll" then
  259. return queryBoxList(human, itemConfig)
  260. end
  261. if itemConfig.get[1] ~= SUMMON_TYPE_TARGET
  262. and itemConfig.get[1] ~= SUMMON_TYPE_DROP
  263. and itemConfig.get[1] ~= SUMMON_TYPE_HERO_SP
  264. and itemConfig.get[1] ~= SUMMON_TYPE_SHENQI_SP then
  265. return
  266. end
  267. if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  268. return
  269. end
  270. local realItemCnt = 1
  271. if human.db.bag[itemID] ~= nil then
  272. realItemCnt = math.floor(human.db.bag[itemID])
  273. end
  274. if realItemCnt < 1 then
  275. return
  276. end
  277. local outItemIDList = nil
  278. local targetID = nil
  279. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  280. -- 指定目标
  281. targetID = itemConfig.get[3]
  282. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  283. local dropID = itemConfig.get[3]
  284. local dropConfig = DropExcel.dropSuipian[dropID]
  285. if dropConfig == nil then
  286. return
  287. end
  288. local totalCnt = #dropConfig.dropRule
  289. local heroWeight
  290. local weightLvAndCampHeros = nil
  291. for i=1,totalCnt do
  292. targetID = dropConfig.dropRule[i]
  293. heroWeight = targetID[1]
  294. for _, camp in ipairs(dropConfig.camp) do
  295. weightLvAndCampHeros = HeroDefine.getHeroByWeightLvAndCamp(heroWeight, camp)
  296. for k, v in pairs(weightLvAndCampHeros) do
  297. outItemIDList = outItemIDList or {}
  298. outItemIDList[v] = outItemIDList[v] or 0
  299. outItemIDList[v] = outItemIDList[v] + 1
  300. end
  301. end
  302. end
  303. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  304. -- 英雄条件兑换
  305. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  306. for i = 1, realItemCnt do
  307. local randTemp = math.random(1, #dropTable)
  308. targetID = dropTable[randTemp]
  309. outItemIDList = outItemIDList or {}
  310. outItemIDList[targetID] = outItemIDList[targetID] or 0
  311. outItemIDList[targetID] = outItemIDList[targetID] + 1
  312. end
  313. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  314. -- 神器条件兑换
  315. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  316. for i = 1, realItemCnt do
  317. local randTemp = math.random(1, #dropTable)
  318. targetID = dropTable[randTemp]
  319. outItemIDList = outItemIDList or {}
  320. outItemIDList[targetID] = outItemIDList[targetID] or 0
  321. outItemIDList[targetID] = outItemIDList[targetID] + 1
  322. end
  323. end
  324. if targetID == nil and outItemIDList == nil then
  325. assert(nil)
  326. end
  327. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  328. local msgRet = Msg.gc.GC_SUIPIAN_HERO_SUMMON_QUERY
  329. if outItemIDList then
  330. local len = 0
  331. for heroID, _ in pairs(outItemIDList) do
  332. if heroID and HeroExcel.hero[heroID] == nil then
  333. assert(nil, "why heroID no config " .. heroID .. " " .. itemID)
  334. end
  335. if len >= 50 then
  336. break
  337. end
  338. len = len + 1
  339. HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[len], heroID)
  340. end
  341. msgRet.heroSimple[0] = len
  342. else
  343. local heroID = targetID
  344. msgRet.heroSimple[0] = 1
  345. HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[1], heroID)
  346. end
  347. Msg.send(msgRet, human.fd)
  348. else
  349. local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY
  350. local cnt = 0
  351. if outItemIDList then
  352. for k, v in pairs(outItemIDList) do
  353. cnt = cnt + 1
  354. Grid.makeItem(msgRet.items[cnt], k, v)
  355. end
  356. if cnt > 0 then
  357. msgRet.items[0] = cnt
  358. Msg.send(msgRet, human.fd)
  359. end
  360. else
  361. msgRet.items[0] = 1
  362. Grid.makeItem(msgRet.items[1], targetID, 1)
  363. Msg.send(msgRet, human.fd)
  364. end
  365. end
  366. end
  367. local HEROID_2_SUIPIANID = nil
  368. function getSuipianIDbyHeroID(heroID)
  369. if not HEROID_2_SUIPIANID then
  370. HEROID_2_SUIPIANID = {}
  371. for itemID, itemConfig in pairs(ItemExcel.item) do
  372. if itemConfig.get[1] == SUMMON_TYPE_TARGET and
  373. itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  374. local targetID = itemConfig.get[3]
  375. HEROID_2_SUIPIANID[targetID] = itemID
  376. end
  377. end
  378. end
  379. return HEROID_2_SUIPIANID[heroID]
  380. end
  381. -- 碎片合成
  382. function SUIPIAN_SYNTHESIS(human, itemID, itemUseCnt,heros)
  383. if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then
  384. BagLogic.sendBagList(human)
  385. return 0,0
  386. end
  387. local itemConfig = ItemExcel.item[itemID]
  388. if itemConfig == nil then
  389. return 0,0
  390. end
  391. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  392. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  393. if leftHeroBox <= 0 then
  394. BagLogic.sendBagList(human)
  395. Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  396. return 1,0
  397. end
  398. end
  399. local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt)
  400. if realItemCnt < 1 then
  401. return 0,0
  402. end
  403. local isHero = 0
  404. local outItemIDList = nil
  405. local targetID = nil
  406. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  407. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  408. if realItemCnt > leftHeroBox then
  409. realItemCnt = leftHeroBox
  410. end
  411. -- 指定目标
  412. targetID = itemConfig.get[3]
  413. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  414. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  415. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  416. if realItemCnt > leftHeroBox then
  417. realItemCnt = leftHeroBox
  418. end
  419. end
  420. -- 掉落表随机掉落
  421. for i = 1, realItemCnt do
  422. local dropID = itemConfig.get[3]
  423. targetID = getDropTargetID(dropID)
  424. outItemIDList = outItemIDList or {}
  425. outItemIDList[targetID] = outItemIDList[targetID] or 0
  426. outItemIDList[targetID] = outItemIDList[targetID] + 1
  427. end
  428. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  429. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  430. if realItemCnt > leftHeroBox then
  431. realItemCnt = leftHeroBox
  432. end
  433. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  434. for i = 1, realItemCnt do
  435. local randTemp = math.random(1, #dropTable)
  436. targetID = dropTable[randTemp]
  437. outItemIDList = outItemIDList or {}
  438. outItemIDList[targetID] = outItemIDList[targetID] or 0
  439. outItemIDList[targetID] = outItemIDList[targetID] + 1
  440. end
  441. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  442. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  443. for i = 1, realItemCnt do
  444. local randTemp = math.random(1, #dropTable)
  445. targetID = dropTable[randTemp]
  446. outItemIDList = outItemIDList or {}
  447. outItemIDList[targetID] = outItemIDList[targetID] or 0
  448. outItemIDList[targetID] = outItemIDList[targetID] + 1
  449. end
  450. end
  451. if targetID == nil and outItemIDList == nil then
  452. assert(nil)
  453. end
  454. local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  455. BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon")
  456. local fenJieList = nil
  457. local itemList = {}
  458. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  459. isHero = 1
  460. if outItemIDList then
  461. -- 多个id
  462. for k, v in pairs(outItemIDList) do
  463. local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  464. local heroID = k
  465. local hero = HeroExcel.hero[heroID]
  466. if fjlist and type(fjlist) == "table" then
  467. for fjItemID, fjItemCnt in pairs(fjlist) do
  468. fenJieList = fenJieList or {}
  469. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  470. end
  471. end
  472. end
  473. else
  474. -- 单个id
  475. local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  476. local heroID = targetID
  477. local hero = HeroExcel.hero[heroID]
  478. if fjlist and type(fjlist) == "table" then
  479. for fjItemID, fjItemCnt in pairs(fjlist) do
  480. fenJieList = fenJieList or {}
  481. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  482. end
  483. end
  484. end
  485. else
  486. if outItemIDList then
  487. -- 多个id
  488. for k, v in pairs(outItemIDList) do
  489. BagLogic.addItem(human, k, v, "item_summon")
  490. itemList[k] = itemList[k] or 0
  491. itemList[k] = itemList[k] + v
  492. end
  493. else
  494. -- 单个id
  495. BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  496. itemList[targetID] = itemList[targetID] or 0
  497. itemList[targetID] = itemList[targetID] + realItemCnt
  498. end
  499. end
  500. BagLogic.sendItemGetList(human, itemList, "item_summon")
  501. local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  502. msgRet.isHero = isHero
  503. msgRet.list[0] = 0
  504. msgRet.heroList[0] = 0
  505. msgRet.fenJieList[0] = 0
  506. local cnnt = 0
  507. if outItemIDList then
  508. -- 多个id
  509. for k, v in pairs(outItemIDList) do
  510. heros[0] = heros[0] + 1
  511. makeResultItemData(heros[heros[0]], k, v, isHero)
  512. cnnt = cnnt + 1
  513. end
  514. else
  515. heros[0] = heros[0] + 1
  516. makeResultItemData(heros[heros[0]], targetID, realItemCnt, isHero)
  517. cnnt = cnnt + 1
  518. end
  519. if fenJieList then
  520. for fjItemID, fjItemCnt in pairs(fenJieList) do
  521. msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1
  522. Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt)
  523. end
  524. end
  525. return 2,cnnt
  526. end
  527. function CHECK_SYNTHESIS(human)
  528. local items = {}
  529. local count = 0
  530. for itemID,itemCnt in pairs(human.db.bag) do
  531. local itemConfig = ItemExcel.item[itemID]
  532. if itemConfig ~= nil and
  533. itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and
  534. itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  535. if itemCnt >= itemConfig.fullCnt then
  536. table.insert(items,itemID)
  537. count = count + 1
  538. end
  539. end
  540. end
  541. return count,items
  542. end
  543. function CG_SUIPIAN_SYNTHESIS(human)
  544. local msgRet = Msg.gc.GC_SUIPIAN_SYNTHESIS
  545. local status = 1
  546. local count,items = CHECK_SYNTHESIS(human)
  547. local curIndex = 0
  548. local heros = {}
  549. local retNotify = Msg.gc.GC_SUIPIAN_SUMMON
  550. retNotify.isHero = 1
  551. retNotify.list[0] = 0
  552. retNotify.heroList[0] = 0
  553. retNotify.fenJieList[0] = 0
  554. for i=1,100 do
  555. heros[i]={
  556. id=nil,
  557. index=nil,
  558. uuid=nil,
  559. icon=nil,
  560. lv=nil,
  561. camp=nil,
  562. job=nil,
  563. zhandouli=nil,
  564. star=nil,
  565. quality=nil,
  566. isget=nil,
  567. isLock=nil,
  568. hp=nil,
  569. hpMax=nil,
  570. up=nil,
  571. gl=nil,
  572. body=nil,
  573. cnt=nil,
  574. weightLv=nil,
  575. name=nil,
  576. grade=nil,
  577. jobDesc=nil,
  578. label=nil,
  579. order=nil,
  580. isGongMing=nil,
  581. general={
  582. [1]={
  583. cm=nil,
  584. age=nil,
  585. character=nil,
  586. kg=nil,
  587. cup=nil,
  588. interest=nil,
  589. desc=nil,
  590. },
  591. [2]={
  592. cm=nil,
  593. age=nil,
  594. character=nil,
  595. kg=nil,
  596. cup=nil,
  597. interest=nil,
  598. desc=nil,
  599. },
  600. },
  601. xLv=nil,
  602. }
  603. end
  604. heros[0] = 0
  605. local cnt = 0
  606. local bBagFull = false
  607. for itemID,itemCnt in pairs(human.db.bag) do
  608. local itemConfig = ItemExcel.item[itemID]
  609. if itemConfig ~= nil and
  610. itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and
  611. itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  612. if itemCnt >= itemConfig.fullCnt then
  613. curIndex = curIndex + 1
  614. local ret,r = SUIPIAN_SYNTHESIS(human,itemID,itemCnt,heros)
  615. cnt = cnt + r
  616. status = 0
  617. if ret == 1 then
  618. bBagFull = true
  619. HeroLogic.sendHeroBagList(human)
  620. break
  621. end
  622. end
  623. end
  624. end
  625. retNotify.heroList[0] = heros[0]
  626. for i = 1,heros[0] do
  627. retNotify.heroList[i]=heros[i]
  628. end
  629. if (curIndex == count) or (bBagFull and status == 0 and cnt >= 1) then
  630. Msg.send(retNotify, human.fd)
  631. end
  632. if bBagFull and cnt == 0 then
  633. status = 1
  634. end
  635. msgRet.status = status
  636. Msg.send(msgRet, human.fd)
  637. BagLogic.sendBagList(human)
  638. end