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