SuipianLogic.lua 30 KB

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