SuipianLogic.lua 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  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. Grid.makeItem(net, id, cnt, nil,nil,nil, Grid.getOpflagAtBag(id))
  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 and itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN 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, isHaveHero)
  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 and isHaveHero then
  702. Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  703. print("[SUIPIAN_SYNTHESIS] 背包格子不够直接返回 nLefeHeroNum = "..nLefeHeroNum)
  704. return false
  705. end
  706. -- 检查一次数量信息
  707. local nAllnum = 0
  708. for nID, nNum in pairs(tCompositeTable) do
  709. if human.db.bag[nID] == nil or human.db.bag[nID] < nNum then
  710. print("[SUIPIAN_SYNTHESIS] 背包中数量不正确,无法合成直接返回 nID = "..nID.." nNum = "..nNum)
  711. return false
  712. end
  713. local itemConfig = ItemExcel.item[nID]
  714. if itemConfig == nil then
  715. print("[SUIPIAN_SYNTHESIS] 不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
  716. return false
  717. end
  718. local nRealNum = math.floor(nNum / itemConfig.fullCnt)
  719. if 0 >= nRealNum then
  720. print("[SUIPIAN_SYNTHESIS] 真实生成的数量不正确 nID = "
  721. ..nID.." nNum = "..nNum.." fullCnt = "..itemConfig.fullCnt)
  722. return false
  723. end
  724. print("[SUIPIAN_SYNTHESIS] 进行合成的碎片信息 nID = "..nID.." nNum = "..nNum)
  725. nAllnum = nAllnum + 1
  726. end
  727. if nAllnum >= 100 then
  728. print("[SUIPIAN_SYNTHESIS] 真实生成的数量大于了协议生成最大长度 nAllnum = "..nAllnum)
  729. return false
  730. end
  731. local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  732. msgRet.isHero = 1
  733. msgRet.list[0] = 0
  734. msgRet.heroList[0] = 0
  735. msgRet.fenJieList[0] = 0
  736. -- 正式开始正式生成
  737. for nID, nNum in pairs(tCompositeTable) do
  738. -- 不存在剩余空位
  739. if 0 >= nLefeHeroNum and isHaveHero then
  740. break
  741. end
  742. local itemConfig = ItemExcel.item[nID]
  743. if itemConfig then
  744. local nCanCreateNum = math.floor(nNum / itemConfig.fullCnt)
  745. if nCanCreateNum > nLefeHeroNum and isHaveHero then
  746. nCanCreateNum = nLefeHeroNum
  747. end
  748. nLefeHeroNum = nLefeHeroNum - nCanCreateNum
  749. local bRet = Suipan_BeginSyntheticFragments(human, nID, nNum, msgRet)
  750. if false == bRet then
  751. print("[SUIPIAN_SYNTHESIS] 合成碎片失败 nID = "..nID.." nNum = "..nNum)
  752. break
  753. end
  754. else
  755. print("[SUIPIAN_SYNTHESIS] 检测过居然还不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
  756. end
  757. end
  758. Msg.send(msgRet, human.fd)
  759. end
  760. function CG_SUIPIAN_SYNTHESIS(human, synthesisType)
  761. if not synthesisType or synthesisType < SUMMON_SUBTYPE_HERO or synthesisType > SUMMON_SUBTYPE_TALISAM then
  762. print("[CG_SUIPIAN_SYNTHESIS] 合成类型错误 synthesisType = "..synthesisType)
  763. return
  764. end
  765. --目前只有两种碎片能合成
  766. if synthesisType ~= SUMMON_SUBTYPE_HERO and synthesisType ~= SUMMON_SUBTYPE_TALISAM then
  767. print("[CG_SUIPIAN_SYNTHESIS] 合成类型错误 synthesisType = "..synthesisType)
  768. return
  769. end
  770. local msgRet = Msg.gc.GC_SUIPIAN_SYNTHESIS
  771. local status = 1
  772. local isHaveHero = false
  773. local tCompositeTable = {}
  774. -- for itemID,itemCnt in pairs(human.db.bag) do
  775. -- local itemConfig = ItemExcel.item[itemID]
  776. -- if itemConfig ~= nil and
  777. -- itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and
  778. -- (itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN or
  779. -- itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM) then
  780. -- if itemCnt >= itemConfig.fullCnt then
  781. -- tCompositeTable[itemID] = tCompositeTable[itemID] or 0
  782. -- tCompositeTable[itemID] = tCompositeTable[itemID] + itemCnt
  783. -- if itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  784. -- isHaveHero = true
  785. -- end
  786. -- end
  787. -- end
  788. -- end
  789. --后续可以优化下,把值对应起来
  790. local targetSubType = 0
  791. if synthesisType == SUMMON_SUBTYPE_HERO then
  792. targetSubType = ItemDefine.ITEM_SUBTYPE_SUIPIAN
  793. elseif synthesisType == SUMMON_SUBTYPE_TALISAM then
  794. targetSubType = ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM
  795. end
  796. for itemID,itemCnt in pairs(human.db.bag) do
  797. local itemConfig = ItemExcel.item[itemID]
  798. if itemConfig and itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and itemCnt >= itemConfig.fullCnt then
  799. if itemConfig.subType == targetSubType then
  800. tCompositeTable[itemID] = tCompositeTable[itemID] or 0
  801. tCompositeTable[itemID] = tCompositeTable[itemID] + itemCnt
  802. if synthesisType == SUMMON_SUBTYPE_HERO then
  803. isHaveHero = true
  804. end
  805. end
  806. end
  807. end
  808. if nil ~= _G.next(tCompositeTable) then
  809. status = 0
  810. SUIPIAN_SYNTHESIS(human, tCompositeTable, isHaveHero)
  811. end
  812. msgRet.status = status
  813. Msg.send(msgRet, human.fd)
  814. end