SuipianLogic.lua 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  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. SUMMON_SUBTYPE_TALISAM = 4 --秘宝
  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
  58. and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP
  59. and itemConfig.get[2] ~= SUMMON_SUBTYPE_SKIN
  60. and itemConfig.get[2] ~= SUMMON_SUBTYPE_TALISAM then
  61. return
  62. end
  63. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  64. -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  65. -- if leftHeroBox <= 0 then
  66. -- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  67. -- end
  68. -- end
  69. --只有英雄碎片合成才判断英雄背包格子是否足够
  70. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  71. if leftHeroBox <= 0 then
  72. return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  73. end
  74. end
  75. local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt)
  76. if realItemCnt < 1 then
  77. return
  78. end
  79. if realItemCnt * itemConfig.fullCnt ~= itemUseCnt then
  80. return
  81. end
  82. local isHero = 0
  83. local outItemIDList = nil
  84. local targetID = nil
  85. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  86. -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
  87. --如果是合成英雄才这么处理
  88. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  89. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  90. if realItemCnt > leftHeroBox then
  91. realItemCnt = leftHeroBox
  92. end
  93. end
  94. -- 指定目标
  95. targetID = itemConfig.get[3]
  96. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  97. -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
  98. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  99. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  100. if realItemCnt > leftHeroBox then
  101. realItemCnt = leftHeroBox
  102. end
  103. end
  104. -- 掉落表随机掉落
  105. for i = 1, realItemCnt do
  106. local dropID = itemConfig.get[3]
  107. targetID = getDropTargetID(dropID)
  108. outItemIDList = outItemIDList or {}
  109. outItemIDList[targetID] = outItemIDList[targetID] or 0
  110. outItemIDList[targetID] = outItemIDList[targetID] + 1
  111. end
  112. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  113. -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
  114. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  115. if realItemCnt > leftHeroBox then
  116. realItemCnt = leftHeroBox
  117. end
  118. -- 英雄条件兑换
  119. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  120. for i = 1, realItemCnt do
  121. local randTemp = math.random(1, #dropTable)
  122. targetID = dropTable[randTemp]
  123. outItemIDList = outItemIDList or {}
  124. outItemIDList[targetID] = outItemIDList[targetID] or 0
  125. outItemIDList[targetID] = outItemIDList[targetID] + 1
  126. end
  127. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  128. -- 神器条件兑换
  129. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  130. for i = 1, realItemCnt do
  131. local randTemp = math.random(1, #dropTable)
  132. targetID = dropTable[randTemp]
  133. outItemIDList = outItemIDList or {}
  134. outItemIDList[targetID] = outItemIDList[targetID] or 0
  135. outItemIDList[targetID] = outItemIDList[targetID] + 1
  136. end
  137. end
  138. if targetID == nil and outItemIDList == nil then
  139. assert(nil)
  140. end
  141. local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  142. BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon")
  143. local fenJieList = nil
  144. local itemList = {}
  145. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  146. isHero = 1
  147. if outItemIDList then
  148. -- 多个id
  149. for k, v in pairs(outItemIDList) do
  150. local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  151. local heroID = k
  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. -- 单个id
  162. local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  163. local heroID = targetID
  164. local hero = HeroExcel.hero[heroID]
  165. if fjlist and type(fjlist) == "table" then
  166. for fjItemID, fjItemCnt in pairs(fjlist) do
  167. fenJieList = fenJieList or {}
  168. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  169. end
  170. end
  171. end
  172. else
  173. if outItemIDList then
  174. -- 多个id
  175. for k, v in pairs(outItemIDList) do
  176. BagLogic.addItem(human, k, v, "item_summon")
  177. itemList[k] = itemList[k] or 0
  178. itemList[k] = itemList[k] + v
  179. end
  180. else
  181. -- 单个id
  182. BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  183. itemList[targetID] = itemList[targetID] or 0
  184. itemList[targetID] = itemList[targetID] + realItemCnt
  185. end
  186. end
  187. BagLogic.sendItemGetList(human, itemList, "item_summon")
  188. local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  189. msgRet.isHero = isHero
  190. msgRet.list[0] = 0
  191. msgRet.heroList[0] = 0
  192. msgRet.fenJieList[0] = 0
  193. local netList = (isHero == 1) and msgRet.heroList or msgRet.list
  194. if outItemIDList then
  195. -- 多个id
  196. for k, v in pairs(outItemIDList) do
  197. netList[0] = netList[0] + 1
  198. makeResultItemData(netList[netList[0]], k, v, isHero)
  199. end
  200. else
  201. netList[0] = netList[0] + 1
  202. makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
  203. end
  204. if fenJieList then
  205. for fjItemID, fjItemCnt in pairs(fenJieList) do
  206. msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1
  207. Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt)
  208. end
  209. end
  210. --Msg.trace(msgRet)
  211. Msg.send(msgRet, human.fd)
  212. end
  213. function makeResultItemData(net, id, cnt, isHero)
  214. if isHero == 1 then
  215. HeroGrid.makeHeroSimpleByID(net, id)
  216. net.cnt = cnt
  217. else
  218. Grid.makeItem(net, id, cnt)
  219. end
  220. end
  221. -- 根据掉落id 获取id
  222. function getDropTargetID(dropID)
  223. local dropConfig = DropExcel.dropSuipian[dropID]
  224. if dropConfig == nil then
  225. return
  226. end
  227. -- 计算总权重
  228. local totalWeight = 0
  229. for k, v in ipairs(dropConfig.dropRule) do
  230. local weight = v[2]
  231. totalWeight = totalWeight + weight
  232. end
  233. local heroWeight = nil
  234. local r = math.random(1, totalWeight)
  235. for k, v in ipairs(dropConfig.dropRule) do
  236. local weight = v[2]
  237. if r <= weight then
  238. heroWeight = v[1]
  239. break
  240. else
  241. r = r - weight
  242. end
  243. end
  244. if heroWeight == nil then
  245. assert()
  246. end
  247. local len = #dropConfig.camp
  248. local index = math.random(1, len)
  249. local heroID = HeroDefine.getRandHeroByWeightLvAndCamp(heroWeight, dropConfig.camp[index])
  250. return heroID
  251. end
  252. local function queryBoxList(human, itemConfig)
  253. local itemList = itemConfig.cmd[2]
  254. if not itemList then return end
  255. local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY
  256. msgRet.items[0] = #itemList
  257. for i = 1, msgRet.items[0] do
  258. local itemID = itemList[i][1]
  259. local itemCnt = itemList[i][2]
  260. local quality = itemList[i][3]
  261. Grid.makeItem(msgRet.items[i], itemID, itemCnt, nil, nil, nil, nil, quality)
  262. end
  263. Msg.send(msgRet, human.fd)
  264. end
  265. --碎片英雄召唤预览
  266. function CG_SUIPIAN_HERO_SUMMON_QUERY(human, itemID)
  267. local itemConfig = ItemExcel.item[itemID]
  268. if not itemConfig then return end
  269. local cmdStr = itemConfig.cmd[1]
  270. if cmdStr == "box" or cmdStr == "boxAll" then
  271. return queryBoxList(human, itemConfig)
  272. end
  273. if itemConfig.get[1] ~= SUMMON_TYPE_TARGET
  274. and itemConfig.get[1] ~= SUMMON_TYPE_DROP
  275. and itemConfig.get[1] ~= SUMMON_TYPE_HERO_SP
  276. and itemConfig.get[1] ~= SUMMON_TYPE_SHENQI_SP then
  277. return
  278. end
  279. if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  280. return
  281. end
  282. local realItemCnt = 1
  283. if human.db.bag[itemID] ~= nil then
  284. realItemCnt = math.floor(human.db.bag[itemID])
  285. end
  286. if realItemCnt < 1 then
  287. return
  288. end
  289. local outItemIDList = nil
  290. local targetID = nil
  291. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  292. -- 指定目标
  293. targetID = itemConfig.get[3]
  294. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  295. local dropID = itemConfig.get[3]
  296. local dropConfig = DropExcel.dropSuipian[dropID]
  297. if dropConfig == nil then
  298. return
  299. end
  300. local totalCnt = #dropConfig.dropRule
  301. local heroWeight
  302. local weightLvAndCampHeros = nil
  303. for i=1,totalCnt do
  304. targetID = dropConfig.dropRule[i]
  305. heroWeight = targetID[1]
  306. for _, camp in ipairs(dropConfig.camp) do
  307. weightLvAndCampHeros = HeroDefine.getHeroByWeightLvAndCamp(heroWeight, camp)
  308. for k, v in pairs(weightLvAndCampHeros) do
  309. outItemIDList = outItemIDList or {}
  310. outItemIDList[v] = outItemIDList[v] or 0
  311. outItemIDList[v] = outItemIDList[v] + 1
  312. end
  313. end
  314. end
  315. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  316. -- 英雄条件兑换
  317. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  318. for i = 1, realItemCnt do
  319. local randTemp = math.random(1, #dropTable)
  320. targetID = dropTable[randTemp]
  321. outItemIDList = outItemIDList or {}
  322. outItemIDList[targetID] = outItemIDList[targetID] or 0
  323. outItemIDList[targetID] = outItemIDList[targetID] + 1
  324. end
  325. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  326. -- 神器条件兑换
  327. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  328. for i = 1, realItemCnt do
  329. local randTemp = math.random(1, #dropTable)
  330. targetID = dropTable[randTemp]
  331. outItemIDList = outItemIDList or {}
  332. outItemIDList[targetID] = outItemIDList[targetID] or 0
  333. outItemIDList[targetID] = outItemIDList[targetID] + 1
  334. end
  335. end
  336. if targetID == nil and outItemIDList == nil then
  337. assert(nil)
  338. end
  339. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  340. local msgRet = Msg.gc.GC_SUIPIAN_HERO_SUMMON_QUERY
  341. if outItemIDList then
  342. local len = 0
  343. for heroID, _ in pairs(outItemIDList) do
  344. if heroID and HeroExcel.hero[heroID] == nil then
  345. assert(nil, "why heroID no config " .. heroID .. " " .. itemID)
  346. end
  347. if len >= 50 then
  348. break
  349. end
  350. len = len + 1
  351. HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[len], heroID)
  352. end
  353. msgRet.heroSimple[0] = len
  354. else
  355. local heroID = targetID
  356. msgRet.heroSimple[0] = 1
  357. HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[1], heroID)
  358. end
  359. Msg.send(msgRet, human.fd)
  360. else
  361. local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY
  362. local cnt = 0
  363. if outItemIDList then
  364. for k, v in pairs(outItemIDList) do
  365. cnt = cnt + 1
  366. Grid.makeItem(msgRet.items[cnt], k, v)
  367. end
  368. if cnt > 0 then
  369. msgRet.items[0] = cnt
  370. Msg.send(msgRet, human.fd)
  371. end
  372. else
  373. msgRet.items[0] = 1
  374. Grid.makeItem(msgRet.items[1], targetID, 1)
  375. Msg.send(msgRet, human.fd)
  376. end
  377. end
  378. end
  379. local HEROID_2_SUIPIANID = nil
  380. function getSuipianIDbyHeroID(heroID)
  381. if not HEROID_2_SUIPIANID then
  382. HEROID_2_SUIPIANID = {}
  383. for itemID, itemConfig in pairs(ItemExcel.item) do
  384. if itemConfig.get[1] == SUMMON_TYPE_TARGET and
  385. itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  386. local targetID = itemConfig.get[3]
  387. HEROID_2_SUIPIANID[targetID] = itemID
  388. end
  389. end
  390. end
  391. return HEROID_2_SUIPIANID[heroID]
  392. end
  393. -- 碎片合成
  394. -- itemID 合成消耗物品ID
  395. -- itemUseCnt 合成消耗物品当前数量
  396. -- function SUIPIAN_SYNTHESIS(human, itemID, itemUseCnt)
  397. -- if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then
  398. -- return
  399. -- end
  400. -- local itemConfig = ItemExcel.item[itemID]
  401. -- if itemConfig == nil then
  402. -- return
  403. -- end
  404. -- local leftHeroBox = HeroLogic.getEmptyCnt(human)
  405. -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  406. -- if leftHeroBox <= 0 then
  407. -- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  408. -- end
  409. -- end
  410. -- local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt)
  411. -- if realItemCnt < 1 then
  412. -- return
  413. -- end
  414. -- local isHero = 0
  415. -- local outItemIDList = nil
  416. -- local targetID = nil
  417. -- if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  418. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  419. -- if realItemCnt > leftHeroBox then
  420. -- realItemCnt = leftHeroBox
  421. -- end
  422. -- -- 指定目标
  423. -- targetID = itemConfig.get[3]
  424. -- elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  425. -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  426. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  427. -- if realItemCnt > leftHeroBox then
  428. -- realItemCnt = leftHeroBox
  429. -- end
  430. -- end
  431. -- -- 掉落表随机掉落
  432. -- for i = 1, realItemCnt do
  433. -- local dropID = itemConfig.get[3]
  434. -- targetID = getDropTargetID(dropID)
  435. -- if nil == targetID then
  436. -- print("[SUIPIAN_SYNTHESIS] 获取目标ID失败 dropID = "..dropID)
  437. -- return
  438. -- end
  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_HERO_SP then
  444. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  445. -- if realItemCnt > leftHeroBox then
  446. -- realItemCnt = leftHeroBox
  447. -- end
  448. -- local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  449. -- for i = 1, realItemCnt do
  450. -- local randTemp = math.random(1, #dropTable)
  451. -- targetID = dropTable[randTemp]
  452. -- outItemIDList = outItemIDList or {}
  453. -- outItemIDList[targetID] = outItemIDList[targetID] or 0
  454. -- outItemIDList[targetID] = outItemIDList[targetID] + 1
  455. -- end
  456. -- elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  457. -- local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  458. -- for i = 1, realItemCnt do
  459. -- local randTemp = math.random(1, #dropTable)
  460. -- targetID = dropTable[randTemp]
  461. -- outItemIDList = outItemIDList or {}
  462. -- outItemIDList[targetID] = outItemIDList[targetID] or 0
  463. -- outItemIDList[targetID] = outItemIDList[targetID] + 1
  464. -- end
  465. -- end
  466. -- if targetID == nil and outItemIDList == nil then
  467. -- assert(nil)
  468. -- end
  469. -- local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  470. -- BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon")
  471. -- print("[SUIPIAN_SYNTHESIS] 实际上删除的碎片数量 realItemCnt = "
  472. -- ..realItemCnt.. " realSuiPianCnt = "..realSuiPianCnt.. " itemUseCnt = "..itemUseCnt)
  473. -- local fenJieList = nil
  474. -- local itemList = {}
  475. -- if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  476. -- isHero = 1
  477. -- if outItemIDList then
  478. -- -- 多个id
  479. -- for k, v in pairs(outItemIDList) do
  480. -- local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  481. -- local heroID = k
  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. -- -- 单个id
  492. -- local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  493. -- local heroID = targetID
  494. -- local hero = HeroExcel.hero[heroID]
  495. -- if fjlist and type(fjlist) == "table" then
  496. -- for fjItemID, fjItemCnt in pairs(fjlist) do
  497. -- fenJieList = fenJieList or {}
  498. -- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  499. -- end
  500. -- end
  501. -- end
  502. -- else
  503. -- if outItemIDList then
  504. -- -- 多个id
  505. -- for k, v in pairs(outItemIDList) do
  506. -- BagLogic.addItem(human, k, v, "item_summon")
  507. -- itemList[k] = itemList[k] or 0
  508. -- itemList[k] = itemList[k] + v
  509. -- end
  510. -- else
  511. -- -- 单个id
  512. -- BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  513. -- itemList[targetID] = itemList[targetID] or 0
  514. -- itemList[targetID] = itemList[targetID] + realItemCnt
  515. -- end
  516. -- end
  517. -- BagLogic.sendItemGetList(human, itemList, "item_summon")
  518. -- local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  519. -- msgRet.isHero = isHero
  520. -- msgRet.list[0] = 0
  521. -- msgRet.heroList[0] = 0
  522. -- msgRet.fenJieList[0] = 0
  523. -- local netList = (isHero == 1) and msgRet.heroList or msgRet.list
  524. -- if outItemIDList then
  525. -- -- 多个id
  526. -- for k, v in pairs(outItemIDList) do
  527. -- netList[0] = netList[0] + 1
  528. -- makeResultItemData(netList[netList[0]], k, v, isHero)
  529. -- print("[SUIPIAN_SYNTHESIS] 合成的数量 英雄ID k = "
  530. -- ..k .. " v ="..v.." cnt = "..netList[netList[0]].cnt)
  531. -- end
  532. -- else
  533. -- netList[0] = netList[0] + 1
  534. -- makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
  535. -- print("[SUIPIAN_SYNTHESIS] 合成的数量 英雄ID targetID = "
  536. -- ..targetID .." realItemCnt = "..realItemCnt.. " cnt = "..netList[netList[0]].cnt)
  537. -- end
  538. -- if fenJieList then
  539. -- for fjItemID, fjItemCnt in pairs(fenJieList) do
  540. -- msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1
  541. -- Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt)
  542. -- end
  543. -- end
  544. -- --Msg.trace(msgRet)
  545. -- Msg.send(msgRet, human.fd)
  546. -- end
  547. -- 通用合成碎片具体逻辑
  548. function Suipan_BeginSyntheticFragments(human, nItemID, nItemNum, tMsgData)
  549. if human.db.bag[nItemID] == nil or human.db.bag[nItemID] < nItemNum then
  550. return false
  551. end
  552. local itemConfig = ItemExcel.item[nItemID]
  553. if itemConfig == nil then
  554. return false
  555. end
  556. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  557. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  558. if leftHeroBox <= 0 then
  559. return false
  560. end
  561. end
  562. local realItemCnt = math.floor(nItemNum/itemConfig.fullCnt)
  563. if realItemCnt < 1 then
  564. return false
  565. end
  566. local isHero = 0
  567. local outItemIDList = nil
  568. local targetID = nil
  569. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  570. if realItemCnt > leftHeroBox then
  571. realItemCnt = leftHeroBox
  572. end
  573. -- 指定目标
  574. targetID = itemConfig.get[3]
  575. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  576. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  577. if realItemCnt > leftHeroBox then
  578. realItemCnt = leftHeroBox
  579. end
  580. end
  581. -- 掉落表随机掉落
  582. for i = 1, realItemCnt do
  583. local dropID = itemConfig.get[3]
  584. targetID = getDropTargetID(dropID)
  585. if nil == targetID then
  586. print("[Suipan_BeginSyntheticFragments] 获取目标ID失败 dropID = "..dropID)
  587. return false
  588. end
  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_HERO_SP then
  594. if realItemCnt > leftHeroBox then
  595. realItemCnt = leftHeroBox
  596. end
  597. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  598. for i = 1, realItemCnt do
  599. local randTemp = math.random(1, #dropTable)
  600. targetID = dropTable[randTemp]
  601. outItemIDList = outItemIDList or {}
  602. outItemIDList[targetID] = outItemIDList[targetID] or 0
  603. outItemIDList[targetID] = outItemIDList[targetID] + 1
  604. end
  605. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  606. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  607. for i = 1, realItemCnt do
  608. local randTemp = math.random(1, #dropTable)
  609. targetID = dropTable[randTemp]
  610. outItemIDList = outItemIDList or {}
  611. outItemIDList[targetID] = outItemIDList[targetID] or 0
  612. outItemIDList[targetID] = outItemIDList[targetID] + 1
  613. end
  614. end
  615. if targetID == nil and outItemIDList == nil then
  616. -- assert(nil)
  617. return false
  618. end
  619. local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  620. BagLogic.delItem(human, nItemID, realSuiPianCnt, "item_summon")
  621. print("[Suipan_BeginSyntheticFragments] 实际上删除的碎片数量 realItemCnt = "
  622. ..realItemCnt.. " itemID" .. nItemID.. " realSuiPianCnt = "..realSuiPianCnt.. " nItemNum = "..nItemNum)
  623. local fenJieList = nil
  624. local itemList = {}
  625. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  626. isHero = 1
  627. if outItemIDList then
  628. -- 多个id
  629. for k, v in pairs(outItemIDList) do
  630. local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  631. local heroID = k
  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. -- 单个id
  642. local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  643. local heroID = targetID
  644. local hero = HeroExcel.hero[heroID]
  645. if fjlist and type(fjlist) == "table" then
  646. for fjItemID, fjItemCnt in pairs(fjlist) do
  647. fenJieList = fenJieList or {}
  648. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  649. end
  650. end
  651. end
  652. else
  653. if outItemIDList then
  654. -- 多个id
  655. for k, v in pairs(outItemIDList) do
  656. BagLogic.addItem(human, k, v, "item_summon")
  657. itemList[k] = itemList[k] or 0
  658. itemList[k] = itemList[k] + v
  659. end
  660. else
  661. -- 单个id
  662. BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  663. itemList[targetID] = itemList[targetID] or 0
  664. itemList[targetID] = itemList[targetID] + realItemCnt
  665. end
  666. end
  667. BagLogic.sendItemGetList(human, itemList, "item_summon")
  668. local netList = (isHero == 1) and tMsgData.heroList or tMsgData.list
  669. if outItemIDList then
  670. -- 多个id
  671. for k, v in pairs(outItemIDList) do
  672. netList[0] = netList[0] + 1
  673. makeResultItemData(netList[netList[0]], k, v, isHero)
  674. print("[Suipan_BeginSyntheticFragments] 合成的数量 英雄ID k = "
  675. ..k .. " v ="..v.." cnt = "..netList[netList[0]].cnt)
  676. end
  677. else
  678. netList[0] = netList[0] + 1
  679. makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
  680. print("[Suipan_BeginSyntheticFragments] 合成的数量 英雄ID targetID = "
  681. ..targetID .." realItemCnt = "..realItemCnt.. " cnt = "..netList[netList[0]].cnt)
  682. end
  683. if fenJieList then
  684. for fjItemID, fjItemCnt in pairs(fenJieList) do
  685. tMsgData.fenJieList[0] = tMsgData.fenJieList[0] + 1
  686. Grid.makeItem(tMsgData.fenJieList[tMsgData.fenJieList[0]], fjItemID, fjItemCnt)
  687. end
  688. end
  689. return true
  690. --Msg.trace(msgRet)
  691. --Msg.send(msgRet, human.fd)
  692. end
  693. -- 碎片合成
  694. function SUIPIAN_SYNTHESIS(human, tCompositeTable)
  695. if not human or nil == tCompositeTable or nil == _G.next(tCompositeTable) then
  696. return false
  697. end
  698. -- 英雄背包空余格子数
  699. local nLefeHeroNum = HeroLogic.getEmptyCnt(human)
  700. if 0 >= nLefeHeroNum then
  701. Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  702. print("[SUIPIAN_SYNTHESIS] 背包格子不够直接返回 nLefeHeroNum = "..nLefeHeroNum)
  703. return false
  704. end
  705. -- 检查一次数量信息
  706. local nAllnum = 0
  707. for nID, nNum in pairs(tCompositeTable) do
  708. if human.db.bag[nID] == nil or human.db.bag[nID] < nNum then
  709. print("[SUIPIAN_SYNTHESIS] 背包中数量不正确,无法合成直接返回 nID = "..nID.." nNum = "..nNum)
  710. return false
  711. end
  712. local itemConfig = ItemExcel.item[nID]
  713. if itemConfig == nil then
  714. print("[SUIPIAN_SYNTHESIS] 不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
  715. return false
  716. end
  717. local nRealNum = math.floor(nNum / itemConfig.fullCnt)
  718. if 0 >= nRealNum then
  719. print("[SUIPIAN_SYNTHESIS] 真实生成的数量不正确 nID = "
  720. ..nID.." nNum = "..nNum.." fullCnt = "..itemConfig.fullCnt)
  721. return false
  722. end
  723. print("[SUIPIAN_SYNTHESIS] 进行合成的碎片信息 nID = "..nID.." nNum = "..nNum)
  724. nAllnum = nAllnum + 1
  725. end
  726. if nAllnum >= 100 then
  727. print("[SUIPIAN_SYNTHESIS] 真实生成的数量大于了协议生成最大长度 nAllnum = "..nAllnum)
  728. return false
  729. end
  730. local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  731. msgRet.isHero = 1
  732. msgRet.list[0] = 0
  733. msgRet.heroList[0] = 0
  734. msgRet.fenJieList[0] = 0
  735. -- 正式开始正式生成
  736. for nID, nNum in pairs(tCompositeTable) do
  737. -- 不存在剩余空位
  738. if 0 >= nLefeHeroNum then
  739. break
  740. end
  741. local itemConfig = ItemExcel.item[nID]
  742. if itemConfig then
  743. local nCanCreateNum = math.floor(nNum / itemConfig.fullCnt)
  744. if nCanCreateNum > nLefeHeroNum then
  745. nCanCreateNum = nLefeHeroNum
  746. end
  747. nLefeHeroNum = nLefeHeroNum - nCanCreateNum
  748. local bRet = Suipan_BeginSyntheticFragments(human, nID, nNum, msgRet)
  749. if false == bRet then
  750. print("[SUIPIAN_SYNTHESIS] 合成碎片失败 nID = "..nID.." nNum = "..nNum)
  751. break
  752. end
  753. else
  754. print("[SUIPIAN_SYNTHESIS] 检测过居然还不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
  755. end
  756. end
  757. Msg.send(msgRet, human.fd)
  758. end
  759. function CG_SUIPIAN_SYNTHESIS(human)
  760. local msgRet = Msg.gc.GC_SUIPIAN_SYNTHESIS
  761. local status = 1
  762. local tCompositeTable = {}
  763. for itemID,itemCnt in pairs(human.db.bag) do
  764. local itemConfig = ItemExcel.item[itemID]
  765. if itemConfig ~= nil and
  766. itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and
  767. itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  768. if itemCnt >= itemConfig.fullCnt then
  769. tCompositeTable[itemID] = tCompositeTable[itemID] or 0
  770. tCompositeTable[itemID] = tCompositeTable[itemID] + itemCnt
  771. end
  772. end
  773. end
  774. if nil ~= _G.next(tCompositeTable) then
  775. status = 0
  776. SUIPIAN_SYNTHESIS(human, tCompositeTable)
  777. end
  778. msgRet.status = status
  779. Msg.send(msgRet, human.fd)
  780. end