SuipianLogic.lua 30 KB

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