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