SuipianLogic.lua 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858
  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. -- itemID 合成消耗物品ID
  383. -- itemUseCnt 合成消耗物品当前数量
  384. -- function SUIPIAN_SYNTHESIS(human, itemID, itemUseCnt)
  385. -- if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then
  386. -- return
  387. -- end
  388. -- local itemConfig = ItemExcel.item[itemID]
  389. -- if itemConfig == nil then
  390. -- return
  391. -- end
  392. -- local leftHeroBox = HeroLogic.getEmptyCnt(human)
  393. -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  394. -- if leftHeroBox <= 0 then
  395. -- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  396. -- end
  397. -- end
  398. -- local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt)
  399. -- if realItemCnt < 1 then
  400. -- return
  401. -- end
  402. -- local isHero = 0
  403. -- local outItemIDList = nil
  404. -- local targetID = nil
  405. -- if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  406. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  407. -- if realItemCnt > leftHeroBox then
  408. -- realItemCnt = leftHeroBox
  409. -- end
  410. -- -- 指定目标
  411. -- targetID = itemConfig.get[3]
  412. -- elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  413. -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  414. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  415. -- if realItemCnt > leftHeroBox then
  416. -- realItemCnt = leftHeroBox
  417. -- end
  418. -- end
  419. -- -- 掉落表随机掉落
  420. -- for i = 1, realItemCnt do
  421. -- local dropID = itemConfig.get[3]
  422. -- targetID = getDropTargetID(dropID)
  423. -- if nil == targetID then
  424. -- print("[SUIPIAN_SYNTHESIS] 获取目标ID失败 dropID = "..dropID)
  425. -- return
  426. -- end
  427. -- outItemIDList = outItemIDList or {}
  428. -- outItemIDList[targetID] = outItemIDList[targetID] or 0
  429. -- outItemIDList[targetID] = outItemIDList[targetID] + 1
  430. -- end
  431. -- elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  432. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  433. -- if realItemCnt > leftHeroBox then
  434. -- realItemCnt = leftHeroBox
  435. -- end
  436. -- local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  437. -- for i = 1, realItemCnt do
  438. -- local randTemp = math.random(1, #dropTable)
  439. -- targetID = dropTable[randTemp]
  440. -- outItemIDList = outItemIDList or {}
  441. -- outItemIDList[targetID] = outItemIDList[targetID] or 0
  442. -- outItemIDList[targetID] = outItemIDList[targetID] + 1
  443. -- end
  444. -- elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  445. -- local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  446. -- for i = 1, realItemCnt do
  447. -- local randTemp = math.random(1, #dropTable)
  448. -- targetID = dropTable[randTemp]
  449. -- outItemIDList = outItemIDList or {}
  450. -- outItemIDList[targetID] = outItemIDList[targetID] or 0
  451. -- outItemIDList[targetID] = outItemIDList[targetID] + 1
  452. -- end
  453. -- end
  454. -- if targetID == nil and outItemIDList == nil then
  455. -- assert(nil)
  456. -- end
  457. -- local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  458. -- BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon")
  459. -- print("[SUIPIAN_SYNTHESIS] 实际上删除的碎片数量 realItemCnt = "
  460. -- ..realItemCnt.. " realSuiPianCnt = "..realSuiPianCnt.. " itemUseCnt = "..itemUseCnt)
  461. -- local fenJieList = nil
  462. -- local itemList = {}
  463. -- if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  464. -- isHero = 1
  465. -- if outItemIDList then
  466. -- -- 多个id
  467. -- for k, v in pairs(outItemIDList) do
  468. -- local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  469. -- local heroID = k
  470. -- local hero = HeroExcel.hero[heroID]
  471. -- if fjlist and type(fjlist) == "table" then
  472. -- for fjItemID, fjItemCnt in pairs(fjlist) do
  473. -- fenJieList = fenJieList or {}
  474. -- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  475. -- end
  476. -- end
  477. -- end
  478. -- else
  479. -- -- 单个id
  480. -- local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  481. -- local heroID = targetID
  482. -- local hero = HeroExcel.hero[heroID]
  483. -- if fjlist and type(fjlist) == "table" then
  484. -- for fjItemID, fjItemCnt in pairs(fjlist) do
  485. -- fenJieList = fenJieList or {}
  486. -- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  487. -- end
  488. -- end
  489. -- end
  490. -- else
  491. -- if outItemIDList then
  492. -- -- 多个id
  493. -- for k, v in pairs(outItemIDList) do
  494. -- BagLogic.addItem(human, k, v, "item_summon")
  495. -- itemList[k] = itemList[k] or 0
  496. -- itemList[k] = itemList[k] + v
  497. -- end
  498. -- else
  499. -- -- 单个id
  500. -- BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  501. -- itemList[targetID] = itemList[targetID] or 0
  502. -- itemList[targetID] = itemList[targetID] + realItemCnt
  503. -- end
  504. -- end
  505. -- BagLogic.sendItemGetList(human, itemList, "item_summon")
  506. -- local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  507. -- msgRet.isHero = isHero
  508. -- msgRet.list[0] = 0
  509. -- msgRet.heroList[0] = 0
  510. -- msgRet.fenJieList[0] = 0
  511. -- local netList = (isHero == 1) and msgRet.heroList or msgRet.list
  512. -- if outItemIDList then
  513. -- -- 多个id
  514. -- for k, v in pairs(outItemIDList) do
  515. -- netList[0] = netList[0] + 1
  516. -- makeResultItemData(netList[netList[0]], k, v, isHero)
  517. -- print("[SUIPIAN_SYNTHESIS] 合成的数量 英雄ID k = "
  518. -- ..k .. " v ="..v.." cnt = "..netList[netList[0]].cnt)
  519. -- end
  520. -- else
  521. -- netList[0] = netList[0] + 1
  522. -- makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
  523. -- print("[SUIPIAN_SYNTHESIS] 合成的数量 英雄ID targetID = "
  524. -- ..targetID .." realItemCnt = "..realItemCnt.. " cnt = "..netList[netList[0]].cnt)
  525. -- end
  526. -- if fenJieList then
  527. -- for fjItemID, fjItemCnt in pairs(fenJieList) do
  528. -- msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1
  529. -- Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt)
  530. -- end
  531. -- end
  532. -- --Msg.trace(msgRet)
  533. -- Msg.send(msgRet, human.fd)
  534. -- end
  535. -- 通用合成碎片具体逻辑
  536. function Suipan_BeginSyntheticFragments(human, nItemID, nItemNum, tMsgData)
  537. if human.db.bag[nItemID] == nil or human.db.bag[nItemID] < nItemNum then
  538. return false
  539. end
  540. local itemConfig = ItemExcel.item[nItemID]
  541. if itemConfig == nil then
  542. return false
  543. end
  544. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  545. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  546. if leftHeroBox <= 0 then
  547. return false
  548. end
  549. end
  550. local realItemCnt = math.floor(nItemNum/itemConfig.fullCnt)
  551. if realItemCnt < 1 then
  552. return false
  553. end
  554. local isHero = 0
  555. local outItemIDList = nil
  556. local targetID = nil
  557. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  558. if realItemCnt > leftHeroBox then
  559. realItemCnt = leftHeroBox
  560. end
  561. -- 指定目标
  562. targetID = itemConfig.get[3]
  563. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  564. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  565. if realItemCnt > leftHeroBox then
  566. realItemCnt = leftHeroBox
  567. end
  568. end
  569. -- 掉落表随机掉落
  570. for i = 1, realItemCnt do
  571. local dropID = itemConfig.get[3]
  572. targetID = getDropTargetID(dropID)
  573. if nil == targetID then
  574. print("[Suipan_BeginSyntheticFragments] 获取目标ID失败 dropID = "..dropID)
  575. return false
  576. end
  577. outItemIDList = outItemIDList or {}
  578. outItemIDList[targetID] = outItemIDList[targetID] or 0
  579. outItemIDList[targetID] = outItemIDList[targetID] + 1
  580. end
  581. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  582. if realItemCnt > leftHeroBox then
  583. realItemCnt = leftHeroBox
  584. end
  585. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  586. for i = 1, realItemCnt do
  587. local randTemp = math.random(1, #dropTable)
  588. targetID = dropTable[randTemp]
  589. outItemIDList = outItemIDList or {}
  590. outItemIDList[targetID] = outItemIDList[targetID] or 0
  591. outItemIDList[targetID] = outItemIDList[targetID] + 1
  592. end
  593. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  594. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  595. for i = 1, realItemCnt do
  596. local randTemp = math.random(1, #dropTable)
  597. targetID = dropTable[randTemp]
  598. outItemIDList = outItemIDList or {}
  599. outItemIDList[targetID] = outItemIDList[targetID] or 0
  600. outItemIDList[targetID] = outItemIDList[targetID] + 1
  601. end
  602. end
  603. if targetID == nil and outItemIDList == nil then
  604. -- assert(nil)
  605. return false
  606. end
  607. local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  608. BagLogic.delItem(human, nItemID, realSuiPianCnt, "item_summon")
  609. print("[Suipan_BeginSyntheticFragments] 实际上删除的碎片数量 realItemCnt = "
  610. ..realItemCnt.. " itemID" .. nItemID.. " realSuiPianCnt = "..realSuiPianCnt.. " nItemNum = "..nItemNum)
  611. local fenJieList = nil
  612. local itemList = {}
  613. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  614. isHero = 1
  615. if outItemIDList then
  616. -- 多个id
  617. for k, v in pairs(outItemIDList) do
  618. local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  619. local heroID = k
  620. local hero = HeroExcel.hero[heroID]
  621. if fjlist and type(fjlist) == "table" then
  622. for fjItemID, fjItemCnt in pairs(fjlist) do
  623. fenJieList = fenJieList or {}
  624. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  625. end
  626. end
  627. end
  628. else
  629. -- 单个id
  630. local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  631. local heroID = targetID
  632. local hero = HeroExcel.hero[heroID]
  633. if fjlist and type(fjlist) == "table" then
  634. for fjItemID, fjItemCnt in pairs(fjlist) do
  635. fenJieList = fenJieList or {}
  636. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  637. end
  638. end
  639. end
  640. else
  641. if outItemIDList then
  642. -- 多个id
  643. for k, v in pairs(outItemIDList) do
  644. BagLogic.addItem(human, k, v, "item_summon")
  645. itemList[k] = itemList[k] or 0
  646. itemList[k] = itemList[k] + v
  647. end
  648. else
  649. -- 单个id
  650. BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  651. itemList[targetID] = itemList[targetID] or 0
  652. itemList[targetID] = itemList[targetID] + realItemCnt
  653. end
  654. end
  655. BagLogic.sendItemGetList(human, itemList, "item_summon")
  656. local netList = (isHero == 1) and tMsgData.heroList or tMsgData.list
  657. if outItemIDList then
  658. -- 多个id
  659. for k, v in pairs(outItemIDList) do
  660. netList[0] = netList[0] + 1
  661. makeResultItemData(netList[netList[0]], k, v, isHero)
  662. print("[Suipan_BeginSyntheticFragments] 合成的数量 英雄ID k = "
  663. ..k .. " v ="..v.." cnt = "..netList[netList[0]].cnt)
  664. end
  665. else
  666. netList[0] = netList[0] + 1
  667. makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
  668. print("[Suipan_BeginSyntheticFragments] 合成的数量 英雄ID targetID = "
  669. ..targetID .." realItemCnt = "..realItemCnt.. " cnt = "..netList[netList[0]].cnt)
  670. end
  671. if fenJieList then
  672. for fjItemID, fjItemCnt in pairs(fenJieList) do
  673. tMsgData.fenJieList[0] = tMsgData.fenJieList[0] + 1
  674. Grid.makeItem(tMsgData.fenJieList[tMsgData.fenJieList[0]], fjItemID, fjItemCnt)
  675. end
  676. end
  677. return true
  678. --Msg.trace(msgRet)
  679. --Msg.send(msgRet, human.fd)
  680. end
  681. -- 碎片合成
  682. function SUIPIAN_SYNTHESIS(human, tCompositeTable)
  683. if not human or nil == tCompositeTable or nil == _G.next(tCompositeTable) then
  684. return false
  685. end
  686. -- 英雄背包空余格子数
  687. local nLefeHeroNum = HeroLogic.getEmptyCnt(human)
  688. if 0 >= nLefeHeroNum then
  689. Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  690. return false
  691. end
  692. -- 检查一次数量信息
  693. local nAllnum = 0
  694. for nID, nNum in pairs(tCompositeTable) do
  695. if human.db.bag[nID] == nil or human.db.bag[nID] < nNum then
  696. print("[SUIPIAN_SYNTHESIS] 背包中数量不正确,无法合成直接返回 nID = "..nID.." nNum = "..nNum)
  697. return false
  698. end
  699. local itemConfig = ItemExcel.item[nID]
  700. if itemConfig == nil then
  701. print("[SUIPIAN_SYNTHESIS] 不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
  702. return false
  703. end
  704. local nRealNum = math.floor(nNum / itemConfig.fullCnt)
  705. if 0 >= nRealNum then
  706. print("[SUIPIAN_SYNTHESIS] 真实生成的数量不正确 nID = "
  707. ..nID.." nNum = "..nNum.." fullCnt = "..itemConfig.fullCnt)
  708. return false
  709. end
  710. print("[SUIPIAN_SYNTHESIS] 进行合成的碎片信息 nID = "..nID.." nNum = "..nNum)
  711. nAllnum = nAllnum + 1
  712. end
  713. if nAllnum >= 100 then
  714. print("[SUIPIAN_SYNTHESIS] 真实生成的数量大于了协议生成最大长度 nAllnum = "..nAllnum)
  715. return false
  716. end
  717. local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  718. msgRet.isHero = 1
  719. msgRet.list[0] = 0
  720. msgRet.heroList[0] = 0
  721. msgRet.fenJieList[0] = 0
  722. -- 正式开始正式生成
  723. for nID, nNum in pairs(tCompositeTable) do
  724. -- 不存在剩余空位
  725. if 0 >= nLefeHeroNum then
  726. break
  727. end
  728. local itemConfig = ItemExcel.item[nID]
  729. if itemConfig then
  730. local nCanCreateNum = math.floor(nNum / itemConfig.fullCnt)
  731. if nCanCreateNum > nLefeHeroNum then
  732. nCanCreateNum = nLefeHeroNum
  733. end
  734. nLefeHeroNum = nLefeHeroNum - nCanCreateNum
  735. local bRet = Suipan_BeginSyntheticFragments(human, nID, nNum, msgRet)
  736. if false == bRet then
  737. print("[SUIPIAN_SYNTHESIS] 合成碎片失败 nID = "..nID.." nNum = "..nNum)
  738. break
  739. end
  740. else
  741. print("[SUIPIAN_SYNTHESIS] 检测过居然还不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
  742. end
  743. end
  744. Msg.send(msgRet, human.fd)
  745. end
  746. function CG_SUIPIAN_SYNTHESIS(human)
  747. local msgRet = Msg.gc.GC_SUIPIAN_SYNTHESIS
  748. local status = 1
  749. local tCompositeTable = {}
  750. for itemID,itemCnt in pairs(human.db.bag) do
  751. local itemConfig = ItemExcel.item[itemID]
  752. if itemConfig ~= nil and
  753. itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and
  754. itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  755. if itemCnt >= itemConfig.fullCnt then
  756. tCompositeTable[itemID] = tCompositeTable[itemID] or 0
  757. tCompositeTable[itemID] = tCompositeTable[itemID] + itemCnt
  758. end
  759. end
  760. end
  761. if nil ~= _G.next(tCompositeTable) then
  762. status = 0
  763. SUIPIAN_SYNTHESIS(human, tCompositeTable)
  764. end
  765. msgRet.status = status
  766. Msg.send(msgRet, human.fd)
  767. end