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. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  88. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  89. if realItemCnt > leftHeroBox then
  90. realItemCnt = leftHeroBox
  91. end
  92. end
  93. -- 指定目标
  94. targetID = itemConfig.get[3]
  95. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  96. --如果是合成英雄才这么处理
  97. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  98. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  99. if realItemCnt > leftHeroBox then
  100. realItemCnt = leftHeroBox
  101. end
  102. end
  103. -- 掉落表随机掉落
  104. for i = 1, realItemCnt do
  105. local dropID = itemConfig.get[3]
  106. targetID = getDropTargetID(dropID)
  107. outItemIDList = outItemIDList or {}
  108. outItemIDList[targetID] = outItemIDList[targetID] or 0
  109. outItemIDList[targetID] = outItemIDList[targetID] + 1
  110. end
  111. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  112. --如果是合成英雄才这么处理
  113. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  114. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  115. if realItemCnt > leftHeroBox then
  116. realItemCnt = leftHeroBox
  117. end
  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. Grid.makeItem(net, id, cnt, nil,nil,nil, Grid.getOpflagAtBag(id))
  221. end
  222. end
  223. -- 根据掉落id 获取id
  224. function getDropTargetID(dropID)
  225. local dropConfig = DropExcel.dropSuipian[dropID]
  226. if dropConfig == nil then
  227. return
  228. end
  229. -- 计算总权重
  230. local totalWeight = 0
  231. for k, v in ipairs(dropConfig.dropRule) do
  232. local weight = v[2]
  233. totalWeight = totalWeight + weight
  234. end
  235. local heroWeight = nil
  236. local r = math.random(1, totalWeight)
  237. for k, v in ipairs(dropConfig.dropRule) do
  238. local weight = v[2]
  239. if r <= weight then
  240. heroWeight = v[1]
  241. break
  242. else
  243. r = r - weight
  244. end
  245. end
  246. if heroWeight == nil then
  247. assert()
  248. end
  249. local len = #dropConfig.camp
  250. local index = math.random(1, len)
  251. local heroID = HeroDefine.getRandHeroByWeightLvAndCamp(heroWeight, dropConfig.camp[index])
  252. return heroID
  253. end
  254. local function queryBoxList(human, itemConfig)
  255. local itemList = itemConfig.cmd[2]
  256. if not itemList then return end
  257. local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY
  258. msgRet.items[0] = #itemList
  259. for i = 1, msgRet.items[0] do
  260. local itemID = itemList[i][1]
  261. local itemCnt = itemList[i][2]
  262. local quality = itemList[i][3]
  263. Grid.makeItem(msgRet.items[i], itemID, itemCnt, nil, nil, nil, nil, quality)
  264. end
  265. Msg.send(msgRet, human.fd)
  266. end
  267. --碎片英雄召唤预览
  268. function CG_SUIPIAN_HERO_SUMMON_QUERY(human, itemID)
  269. local itemConfig = ItemExcel.item[itemID]
  270. if not itemConfig then return end
  271. local cmdStr = itemConfig.cmd[1]
  272. if cmdStr == "box" or cmdStr == "boxAll" then
  273. return queryBoxList(human, itemConfig)
  274. end
  275. if itemConfig.get[1] ~= SUMMON_TYPE_TARGET
  276. and itemConfig.get[1] ~= SUMMON_TYPE_DROP
  277. and itemConfig.get[1] ~= SUMMON_TYPE_HERO_SP
  278. and itemConfig.get[1] ~= SUMMON_TYPE_SHENQI_SP then
  279. return
  280. end
  281. if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  282. return
  283. end
  284. local realItemCnt = 1
  285. if human.db.bag[itemID] ~= nil then
  286. realItemCnt = math.floor(human.db.bag[itemID])
  287. end
  288. if realItemCnt < 1 then
  289. return
  290. end
  291. local outItemIDList = nil
  292. local targetID = nil
  293. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  294. -- 指定目标
  295. targetID = itemConfig.get[3]
  296. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  297. local dropID = itemConfig.get[3]
  298. local dropConfig = DropExcel.dropSuipian[dropID]
  299. if dropConfig == nil then
  300. return
  301. end
  302. local totalCnt = #dropConfig.dropRule
  303. local heroWeight
  304. local weightLvAndCampHeros = nil
  305. for i=1,totalCnt do
  306. targetID = dropConfig.dropRule[i]
  307. heroWeight = targetID[1]
  308. for _, camp in ipairs(dropConfig.camp) do
  309. weightLvAndCampHeros = HeroDefine.getHeroByWeightLvAndCamp(heroWeight, camp)
  310. for k, v in pairs(weightLvAndCampHeros) do
  311. outItemIDList = outItemIDList or {}
  312. outItemIDList[v] = outItemIDList[v] or 0
  313. outItemIDList[v] = outItemIDList[v] + 1
  314. end
  315. end
  316. end
  317. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  318. -- 英雄条件兑换
  319. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  320. for i = 1, realItemCnt do
  321. local randTemp = math.random(1, #dropTable)
  322. targetID = dropTable[randTemp]
  323. outItemIDList = outItemIDList or {}
  324. outItemIDList[targetID] = outItemIDList[targetID] or 0
  325. outItemIDList[targetID] = outItemIDList[targetID] + 1
  326. end
  327. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  328. -- 神器条件兑换
  329. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  330. for i = 1, realItemCnt do
  331. local randTemp = math.random(1, #dropTable)
  332. targetID = dropTable[randTemp]
  333. outItemIDList = outItemIDList or {}
  334. outItemIDList[targetID] = outItemIDList[targetID] or 0
  335. outItemIDList[targetID] = outItemIDList[targetID] + 1
  336. end
  337. end
  338. if targetID == nil and outItemIDList == nil then
  339. assert(nil)
  340. end
  341. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  342. local msgRet = Msg.gc.GC_SUIPIAN_HERO_SUMMON_QUERY
  343. if outItemIDList then
  344. local len = 0
  345. for heroID, _ in pairs(outItemIDList) do
  346. if heroID and HeroExcel.hero[heroID] == nil then
  347. assert(nil, "why heroID no config " .. heroID .. " " .. itemID)
  348. end
  349. if len >= 50 then
  350. break
  351. end
  352. len = len + 1
  353. HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[len], heroID)
  354. end
  355. msgRet.heroSimple[0] = len
  356. else
  357. local heroID = targetID
  358. msgRet.heroSimple[0] = 1
  359. HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[1], heroID)
  360. end
  361. Msg.send(msgRet, human.fd)
  362. else
  363. local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY
  364. local cnt = 0
  365. if outItemIDList then
  366. for k, v in pairs(outItemIDList) do
  367. cnt = cnt + 1
  368. Grid.makeItem(msgRet.items[cnt], k, v)
  369. end
  370. if cnt > 0 then
  371. msgRet.items[0] = cnt
  372. Msg.send(msgRet, human.fd)
  373. end
  374. else
  375. msgRet.items[0] = 1
  376. Grid.makeItem(msgRet.items[1], targetID, 1)
  377. Msg.send(msgRet, human.fd)
  378. end
  379. end
  380. end
  381. local HEROID_2_SUIPIANID = nil
  382. function getSuipianIDbyHeroID(heroID)
  383. if not HEROID_2_SUIPIANID then
  384. HEROID_2_SUIPIANID = {}
  385. for itemID, itemConfig in pairs(ItemExcel.item) do
  386. if itemConfig.get[1] == SUMMON_TYPE_TARGET and
  387. itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  388. local targetID = itemConfig.get[3]
  389. HEROID_2_SUIPIANID[targetID] = itemID
  390. end
  391. end
  392. end
  393. return HEROID_2_SUIPIANID[heroID]
  394. end
  395. -- 碎片合成
  396. -- itemID 合成消耗物品ID
  397. -- itemUseCnt 合成消耗物品当前数量
  398. -- function SUIPIAN_SYNTHESIS(human, itemID, itemUseCnt)
  399. -- if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then
  400. -- return
  401. -- end
  402. -- local itemConfig = ItemExcel.item[itemID]
  403. -- if itemConfig == nil then
  404. -- return
  405. -- end
  406. -- local leftHeroBox = HeroLogic.getEmptyCnt(human)
  407. -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  408. -- if leftHeroBox <= 0 then
  409. -- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  410. -- end
  411. -- end
  412. -- local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt)
  413. -- if realItemCnt < 1 then
  414. -- return
  415. -- end
  416. -- local isHero = 0
  417. -- local outItemIDList = nil
  418. -- local targetID = nil
  419. -- if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  420. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  421. -- if realItemCnt > leftHeroBox then
  422. -- realItemCnt = leftHeroBox
  423. -- end
  424. -- -- 指定目标
  425. -- targetID = itemConfig.get[3]
  426. -- elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  427. -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  428. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  429. -- if realItemCnt > leftHeroBox then
  430. -- realItemCnt = leftHeroBox
  431. -- end
  432. -- end
  433. -- -- 掉落表随机掉落
  434. -- for i = 1, realItemCnt do
  435. -- local dropID = itemConfig.get[3]
  436. -- targetID = getDropTargetID(dropID)
  437. -- if nil == targetID then
  438. -- print("[SUIPIAN_SYNTHESIS] 获取目标ID失败 dropID = "..dropID)
  439. -- return
  440. -- end
  441. -- outItemIDList = outItemIDList or {}
  442. -- outItemIDList[targetID] = outItemIDList[targetID] or 0
  443. -- outItemIDList[targetID] = outItemIDList[targetID] + 1
  444. -- end
  445. -- elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  446. -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
  447. -- if realItemCnt > leftHeroBox then
  448. -- realItemCnt = leftHeroBox
  449. -- end
  450. -- local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  451. -- for i = 1, realItemCnt do
  452. -- local randTemp = math.random(1, #dropTable)
  453. -- targetID = dropTable[randTemp]
  454. -- outItemIDList = outItemIDList or {}
  455. -- outItemIDList[targetID] = outItemIDList[targetID] or 0
  456. -- outItemIDList[targetID] = outItemIDList[targetID] + 1
  457. -- end
  458. -- elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  459. -- local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  460. -- for i = 1, realItemCnt do
  461. -- local randTemp = math.random(1, #dropTable)
  462. -- targetID = dropTable[randTemp]
  463. -- outItemIDList = outItemIDList or {}
  464. -- outItemIDList[targetID] = outItemIDList[targetID] or 0
  465. -- outItemIDList[targetID] = outItemIDList[targetID] + 1
  466. -- end
  467. -- end
  468. -- if targetID == nil and outItemIDList == nil then
  469. -- assert(nil)
  470. -- end
  471. -- local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  472. -- BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon")
  473. -- print("[SUIPIAN_SYNTHESIS] 实际上删除的碎片数量 realItemCnt = "
  474. -- ..realItemCnt.. " realSuiPianCnt = "..realSuiPianCnt.. " itemUseCnt = "..itemUseCnt)
  475. -- local fenJieList = nil
  476. -- local itemList = {}
  477. -- if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  478. -- isHero = 1
  479. -- if outItemIDList then
  480. -- -- 多个id
  481. -- for k, v in pairs(outItemIDList) do
  482. -- local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  483. -- local heroID = k
  484. -- local hero = HeroExcel.hero[heroID]
  485. -- if fjlist and type(fjlist) == "table" then
  486. -- for fjItemID, fjItemCnt in pairs(fjlist) do
  487. -- fenJieList = fenJieList or {}
  488. -- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  489. -- end
  490. -- end
  491. -- end
  492. -- else
  493. -- -- 单个id
  494. -- local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  495. -- local heroID = targetID
  496. -- local hero = HeroExcel.hero[heroID]
  497. -- if fjlist and type(fjlist) == "table" then
  498. -- for fjItemID, fjItemCnt in pairs(fjlist) do
  499. -- fenJieList = fenJieList or {}
  500. -- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  501. -- end
  502. -- end
  503. -- end
  504. -- else
  505. -- if outItemIDList then
  506. -- -- 多个id
  507. -- for k, v in pairs(outItemIDList) do
  508. -- BagLogic.addItem(human, k, v, "item_summon")
  509. -- itemList[k] = itemList[k] or 0
  510. -- itemList[k] = itemList[k] + v
  511. -- end
  512. -- else
  513. -- -- 单个id
  514. -- BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  515. -- itemList[targetID] = itemList[targetID] or 0
  516. -- itemList[targetID] = itemList[targetID] + realItemCnt
  517. -- end
  518. -- end
  519. -- BagLogic.sendItemGetList(human, itemList, "item_summon")
  520. -- local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  521. -- msgRet.isHero = isHero
  522. -- msgRet.list[0] = 0
  523. -- msgRet.heroList[0] = 0
  524. -- msgRet.fenJieList[0] = 0
  525. -- local netList = (isHero == 1) and msgRet.heroList or msgRet.list
  526. -- if outItemIDList then
  527. -- -- 多个id
  528. -- for k, v in pairs(outItemIDList) do
  529. -- netList[0] = netList[0] + 1
  530. -- makeResultItemData(netList[netList[0]], k, v, isHero)
  531. -- print("[SUIPIAN_SYNTHESIS] 合成的数量 英雄ID k = "
  532. -- ..k .. " v ="..v.." cnt = "..netList[netList[0]].cnt)
  533. -- end
  534. -- else
  535. -- netList[0] = netList[0] + 1
  536. -- makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
  537. -- print("[SUIPIAN_SYNTHESIS] 合成的数量 英雄ID targetID = "
  538. -- ..targetID .." realItemCnt = "..realItemCnt.. " cnt = "..netList[netList[0]].cnt)
  539. -- end
  540. -- if fenJieList then
  541. -- for fjItemID, fjItemCnt in pairs(fenJieList) do
  542. -- msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1
  543. -- Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt)
  544. -- end
  545. -- end
  546. -- --Msg.trace(msgRet)
  547. -- Msg.send(msgRet, human.fd)
  548. -- end
  549. -- 通用合成碎片具体逻辑
  550. function Suipan_BeginSyntheticFragments(human, nItemID, nItemNum, tMsgData)
  551. if human.db.bag[nItemID] == nil or human.db.bag[nItemID] < nItemNum then
  552. return false
  553. end
  554. local itemConfig = ItemExcel.item[nItemID]
  555. if itemConfig == nil then
  556. return false
  557. end
  558. local leftHeroBox = HeroLogic.getEmptyCnt(human)
  559. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  560. if leftHeroBox <= 0 and itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  561. return false
  562. end
  563. end
  564. local realItemCnt = math.floor(nItemNum/itemConfig.fullCnt)
  565. if realItemCnt < 1 then
  566. return false
  567. end
  568. local isHero = 0
  569. local outItemIDList = nil
  570. local targetID = nil
  571. if itemConfig.get[1] == SUMMON_TYPE_TARGET then
  572. if realItemCnt > leftHeroBox and itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  573. realItemCnt = leftHeroBox
  574. end
  575. -- 指定目标
  576. targetID = itemConfig.get[3]
  577. elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
  578. if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
  579. if realItemCnt > leftHeroBox and itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  580. realItemCnt = leftHeroBox
  581. end
  582. end
  583. -- 掉落表随机掉落
  584. for i = 1, realItemCnt do
  585. local dropID = itemConfig.get[3]
  586. targetID = getDropTargetID(dropID)
  587. if nil == targetID then
  588. print("[Suipan_BeginSyntheticFragments] 获取目标ID失败 dropID = "..dropID)
  589. return false
  590. end
  591. outItemIDList = outItemIDList or {}
  592. outItemIDList[targetID] = outItemIDList[targetID] or 0
  593. outItemIDList[targetID] = outItemIDList[targetID] + 1
  594. end
  595. elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
  596. if realItemCnt > leftHeroBox and itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  597. realItemCnt = leftHeroBox
  598. end
  599. local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
  600. for i = 1, realItemCnt do
  601. local randTemp = math.random(1, #dropTable)
  602. targetID = dropTable[randTemp]
  603. outItemIDList = outItemIDList or {}
  604. outItemIDList[targetID] = outItemIDList[targetID] or 0
  605. outItemIDList[targetID] = outItemIDList[targetID] + 1
  606. end
  607. elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
  608. local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
  609. for i = 1, realItemCnt do
  610. local randTemp = math.random(1, #dropTable)
  611. targetID = dropTable[randTemp]
  612. outItemIDList = outItemIDList or {}
  613. outItemIDList[targetID] = outItemIDList[targetID] or 0
  614. outItemIDList[targetID] = outItemIDList[targetID] + 1
  615. end
  616. end
  617. if targetID == nil and outItemIDList == nil then
  618. -- assert(nil)
  619. return false
  620. end
  621. local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
  622. BagLogic.delItem(human, nItemID, realSuiPianCnt, "item_summon")
  623. print("[Suipan_BeginSyntheticFragments] 实际上删除的碎片数量 realItemCnt = "
  624. ..realItemCnt.. " itemID" .. nItemID.. " realSuiPianCnt = "..realSuiPianCnt.. " nItemNum = "..nItemNum)
  625. local fenJieList = nil
  626. local itemList = {}
  627. if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
  628. isHero = 1
  629. if outItemIDList then
  630. -- 多个id
  631. for k, v in pairs(outItemIDList) do
  632. local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
  633. local heroID = k
  634. local hero = HeroExcel.hero[heroID]
  635. if fjlist and type(fjlist) == "table" then
  636. for fjItemID, fjItemCnt in pairs(fjlist) do
  637. fenJieList = fenJieList or {}
  638. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  639. end
  640. end
  641. end
  642. else
  643. -- 单个id
  644. local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
  645. local heroID = targetID
  646. local hero = HeroExcel.hero[heroID]
  647. if fjlist and type(fjlist) == "table" then
  648. for fjItemID, fjItemCnt in pairs(fjlist) do
  649. fenJieList = fenJieList or {}
  650. fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
  651. end
  652. end
  653. end
  654. else
  655. if outItemIDList then
  656. -- 多个id
  657. for k, v in pairs(outItemIDList) do
  658. BagLogic.addItem(human, k, v, "item_summon")
  659. itemList[k] = itemList[k] or 0
  660. itemList[k] = itemList[k] + v
  661. end
  662. else
  663. -- 单个id
  664. BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
  665. itemList[targetID] = itemList[targetID] or 0
  666. itemList[targetID] = itemList[targetID] + realItemCnt
  667. end
  668. end
  669. BagLogic.sendItemGetList(human, itemList, "item_summon")
  670. local netList = (isHero == 1) and tMsgData.heroList or tMsgData.list
  671. if outItemIDList then
  672. -- 多个id
  673. for k, v in pairs(outItemIDList) do
  674. netList[0] = netList[0] + 1
  675. makeResultItemData(netList[netList[0]], k, v, isHero)
  676. print("[Suipan_BeginSyntheticFragments] 合成的数量 道具ID k = "
  677. ..k .. " v ="..v.." cnt = "..netList[netList[0]].cnt)
  678. end
  679. else
  680. netList[0] = netList[0] + 1
  681. makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
  682. print("[Suipan_BeginSyntheticFragments] 合成的数量 道具ID targetID = "
  683. ..targetID .." realItemCnt = "..realItemCnt.. " cnt = "..netList[netList[0]].cnt)
  684. end
  685. if fenJieList then
  686. for fjItemID, fjItemCnt in pairs(fenJieList) do
  687. tMsgData.fenJieList[0] = tMsgData.fenJieList[0] + 1
  688. Grid.makeItem(tMsgData.fenJieList[tMsgData.fenJieList[0]], fjItemID, fjItemCnt)
  689. end
  690. end
  691. return true
  692. --Msg.trace(msgRet)
  693. --Msg.send(msgRet, human.fd)
  694. end
  695. -- 碎片合成
  696. function SUIPIAN_SYNTHESIS(human, tCompositeTable, isHaveHero)
  697. if not human or nil == tCompositeTable or nil == _G.next(tCompositeTable) then
  698. return false
  699. end
  700. -- 英雄背包空余格子数
  701. local nLefeHeroNum = HeroLogic.getEmptyCnt(human)
  702. if 0 >= nLefeHeroNum and isHaveHero then
  703. Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
  704. print("[SUIPIAN_SYNTHESIS] 背包格子不够直接返回 nLefeHeroNum = "..nLefeHeroNum)
  705. return false
  706. end
  707. -- 检查一次数量信息
  708. local nAllnum = 0
  709. for nID, nNum in pairs(tCompositeTable) do
  710. if human.db.bag[nID] == nil or human.db.bag[nID] < nNum then
  711. print("[SUIPIAN_SYNTHESIS] 背包中数量不正确,无法合成直接返回 nID = "..nID.." nNum = "..nNum)
  712. return false
  713. end
  714. local itemConfig = ItemExcel.item[nID]
  715. if itemConfig == nil then
  716. print("[SUIPIAN_SYNTHESIS] 不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
  717. return false
  718. end
  719. local nRealNum = math.floor(nNum / itemConfig.fullCnt)
  720. if 0 >= nRealNum then
  721. print("[SUIPIAN_SYNTHESIS] 真实生成的数量不正确 nID = "
  722. ..nID.." nNum = "..nNum.." fullCnt = "..itemConfig.fullCnt)
  723. return false
  724. end
  725. print("[SUIPIAN_SYNTHESIS] 进行合成的碎片信息 nID = "..nID.." nNum = "..nNum)
  726. nAllnum = nAllnum + 1
  727. end
  728. if nAllnum >= 100 then
  729. print("[SUIPIAN_SYNTHESIS] 真实生成的数量大于了协议生成最大长度 nAllnum = "..nAllnum)
  730. return false
  731. end
  732. local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
  733. msgRet.isHero = isHaveHero and 1 or 0
  734. msgRet.list[0] = 0
  735. msgRet.heroList[0] = 0
  736. msgRet.fenJieList[0] = 0
  737. -- 正式开始正式生成
  738. for nID, nNum in pairs(tCompositeTable) do
  739. -- 不存在剩余空位
  740. if 0 >= nLefeHeroNum and isHaveHero then
  741. break
  742. end
  743. local itemConfig = ItemExcel.item[nID]
  744. if itemConfig then
  745. if isHaveHero then
  746. local nCanCreateNum = math.floor(nNum / itemConfig.fullCnt)
  747. if nCanCreateNum > nLefeHeroNum then
  748. nCanCreateNum = nLefeHeroNum
  749. end
  750. nLefeHeroNum = nLefeHeroNum - nCanCreateNum
  751. end
  752. local bRet = Suipan_BeginSyntheticFragments(human, nID, nNum, msgRet)
  753. if false == bRet then
  754. print("[SUIPIAN_SYNTHESIS] 合成碎片失败 nID = "..nID.." nNum = "..nNum)
  755. break
  756. end
  757. else
  758. print("[SUIPIAN_SYNTHESIS] 检测过居然还不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
  759. end
  760. end
  761. Msg.send(msgRet, human.fd)
  762. end
  763. function CG_SUIPIAN_SYNTHESIS(human, synthesisType)
  764. if not synthesisType or synthesisType < SUMMON_SUBTYPE_HERO or synthesisType > SUMMON_SUBTYPE_TALISAM then
  765. print("[CG_SUIPIAN_SYNTHESIS] 合成类型错误 synthesisType = "..synthesisType)
  766. return
  767. end
  768. --目前只有两种碎片能合成
  769. if synthesisType ~= SUMMON_SUBTYPE_HERO and synthesisType ~= SUMMON_SUBTYPE_TALISAM then
  770. print("[CG_SUIPIAN_SYNTHESIS] 合成类型错误 synthesisType = "..synthesisType)
  771. return
  772. end
  773. local msgRet = Msg.gc.GC_SUIPIAN_SYNTHESIS
  774. local status = 1
  775. local isHaveHero = false
  776. local tCompositeTable = {}
  777. -- for itemID,itemCnt in pairs(human.db.bag) do
  778. -- local itemConfig = ItemExcel.item[itemID]
  779. -- if itemConfig ~= nil and
  780. -- itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and
  781. -- (itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN or
  782. -- itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM) then
  783. -- if itemCnt >= itemConfig.fullCnt then
  784. -- tCompositeTable[itemID] = tCompositeTable[itemID] or 0
  785. -- tCompositeTable[itemID] = tCompositeTable[itemID] + itemCnt
  786. -- if itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
  787. -- isHaveHero = true
  788. -- end
  789. -- end
  790. -- end
  791. -- end
  792. --后续可以优化下,把值对应起来
  793. local targetSubType = 0
  794. if synthesisType == SUMMON_SUBTYPE_HERO then
  795. targetSubType = ItemDefine.ITEM_SUBTYPE_SUIPIAN
  796. elseif synthesisType == SUMMON_SUBTYPE_TALISAM then
  797. targetSubType = ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM
  798. end
  799. for itemID,itemCnt in pairs(human.db.bag) do
  800. local itemConfig = ItemExcel.item[itemID]
  801. if itemConfig and itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and itemCnt >= itemConfig.fullCnt then
  802. if itemConfig.subType == targetSubType then
  803. tCompositeTable[itemID] = tCompositeTable[itemID] or 0
  804. tCompositeTable[itemID] = tCompositeTable[itemID] + itemCnt
  805. if synthesisType == SUMMON_SUBTYPE_HERO then
  806. isHaveHero = true
  807. end
  808. end
  809. end
  810. end
  811. if nil ~= _G.next(tCompositeTable) then
  812. status = 0
  813. SUIPIAN_SYNTHESIS(human, tCompositeTable, isHaveHero)
  814. end
  815. msgRet.status = status
  816. Msg.send(msgRet, human.fd)
  817. end