| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858 |
- -- 碎片逻辑
- local ItemExcel = require("excel.item")
- local DropExcel = require("excel.drop")
- local HeroExcel = require("excel.hero")
- local Lang = require("common.Lang")
- local Msg = require("core.Msg")
- local HeroGrid = require("hero.HeroGrid")
- local HeroDefine = require("hero.HeroDefine")
- local HeroLogic = require("hero.HeroLogic")
- local BagLogic = require("bag.BagLogic")
- local ItemDefine = require("bag.ItemDefine")
- local DropSpecial = require("bag.DropSpecial")
- local Grid = require("bag.Grid")
- local Broadcast = require("broadcast.Broadcast")
- SUMMON_TYPE_TARGET = 1 -- 指定目标兑换
- SUMMON_TYPE_DROP = 2 -- 随机掉落表兑换
- SUMMON_TYPE_HERO_SP = 3 -- 英雄条件兑换
- SUMMON_TYPE_SHENQI_SP = 4 -- 神器条件兑换
- SUMMON_SUBTYPE_HERO = 1 -- 英雄
- SUMMON_SUBTYPE_EQUIP = 2 -- 装备
- SUMMON_SUBTYPE_SKIN = 3 -- 皮肤
- -- 查询
- function query(human, itemID)
- local itemConfig = ItemExcel.item[itemID]
- if itemConfig == nil then return end
- if itemConfig.get[1] ~= SUMMON_TYPE_TARGET then
- return
- end
- if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO then
- return
- end
-
- local heroID = itemConfig.get[3]
- local heroGrid = HeroGrid.getCacheHeroGridTujian(heroID)
- if not heroGrid then return end
- local msgRet = Msg.gc.GC_SUIPIAN_HERO_QUERY
- msgRet.id = itemID
- HeroGrid.makeHeroSimple(msgRet.heroSimple, heroGrid, nil, human, nil, true)
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- end
- -- 召唤
- function summon(human, itemID, itemUseCnt)
- if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then
- return
- end
-
- local itemConfig = ItemExcel.item[itemID]
- if itemConfig == nil then
- return
- end
-
- if itemConfig.get[1] ~= SUMMON_TYPE_TARGET
- and itemConfig.get[1] ~= SUMMON_TYPE_DROP
- and itemConfig.get[1] ~= SUMMON_TYPE_HERO_SP
- and itemConfig.get[1] ~= SUMMON_TYPE_SHENQI_SP then
- return
- end
- if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
- return
- end
-
- local leftHeroBox = HeroLogic.getEmptyCnt(human)
-
- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
- if leftHeroBox <= 0 then
- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
- end
- end
- local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt)
- if realItemCnt < 1 then
- return
- end
- if realItemCnt * itemConfig.fullCnt ~= itemUseCnt then
- return
- end
- local isHero = 0
- local outItemIDList = nil
- local targetID = nil
- if itemConfig.get[1] == SUMMON_TYPE_TARGET then
- -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
- local leftHeroBox = HeroLogic.getEmptyCnt(human)
- if realItemCnt > leftHeroBox then
- realItemCnt = leftHeroBox
- end
- -- 指定目标
- targetID = itemConfig.get[3]
- elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
-
- -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
- local leftHeroBox = HeroLogic.getEmptyCnt(human)
- if realItemCnt > leftHeroBox then
- realItemCnt = leftHeroBox
- end
- end
- -- 掉落表随机掉落
- for i = 1, realItemCnt do
- local dropID = itemConfig.get[3]
- targetID = getDropTargetID(dropID)
- outItemIDList = outItemIDList or {}
- outItemIDList[targetID] = outItemIDList[targetID] or 0
- outItemIDList[targetID] = outItemIDList[targetID] + 1
- end
- elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
-
-
- -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数
- local leftHeroBox = HeroLogic.getEmptyCnt(human)
- if realItemCnt > leftHeroBox then
- realItemCnt = leftHeroBox
- end
- -- 英雄条件兑换
- local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
- for i = 1, realItemCnt do
- local randTemp = math.random(1, #dropTable)
- targetID = dropTable[randTemp]
- outItemIDList = outItemIDList or {}
- outItemIDList[targetID] = outItemIDList[targetID] or 0
- outItemIDList[targetID] = outItemIDList[targetID] + 1
- end
- elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
- -- 神器条件兑换
- local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
- for i = 1, realItemCnt do
- local randTemp = math.random(1, #dropTable)
- targetID = dropTable[randTemp]
- outItemIDList = outItemIDList or {}
- outItemIDList[targetID] = outItemIDList[targetID] or 0
- outItemIDList[targetID] = outItemIDList[targetID] + 1
- end
- end
-
- if targetID == nil and outItemIDList == nil then
- assert(nil)
- end
- local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
- BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon")
-
- local fenJieList = nil
- local itemList = {}
- if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
- isHero = 1
- if outItemIDList then
- -- 多个id
- for k, v in pairs(outItemIDList) do
- local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
- local heroID = k
- local hero = HeroExcel.hero[heroID]
- if fjlist and type(fjlist) == "table" then
- for fjItemID, fjItemCnt in pairs(fjlist) do
- fenJieList = fenJieList or {}
- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
- end
- end
- end
- else
- -- 单个id
- local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
- local heroID = targetID
- local hero = HeroExcel.hero[heroID]
- if fjlist and type(fjlist) == "table" then
- for fjItemID, fjItemCnt in pairs(fjlist) do
- fenJieList = fenJieList or {}
- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
- end
- end
- end
- else
- if outItemIDList then
- -- 多个id
- for k, v in pairs(outItemIDList) do
- BagLogic.addItem(human, k, v, "item_summon")
- itemList[k] = itemList[k] or 0
- itemList[k] = itemList[k] + v
- end
- else
- -- 单个id
- BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
- itemList[targetID] = itemList[targetID] or 0
- itemList[targetID] = itemList[targetID] + realItemCnt
- end
- end
-
- BagLogic.sendItemGetList(human, itemList, "item_summon")
- local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
- msgRet.isHero = isHero
- msgRet.list[0] = 0
- msgRet.heroList[0] = 0
- msgRet.fenJieList[0] = 0
- local netList = (isHero == 1) and msgRet.heroList or msgRet.list
-
- if outItemIDList then
- -- 多个id
- for k, v in pairs(outItemIDList) do
- netList[0] = netList[0] + 1
- makeResultItemData(netList[netList[0]], k, v, isHero)
- end
- else
- netList[0] = netList[0] + 1
- makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
- end
- if fenJieList then
- for fjItemID, fjItemCnt in pairs(fenJieList) do
- msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1
- Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt)
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- end
- function makeResultItemData(net, id, cnt, isHero)
- if isHero == 1 then
- HeroGrid.makeHeroSimpleByID(net, id)
- net.cnt = cnt
- else
- Grid.makeItem(net, id, cnt)
- end
- end
- -- 根据掉落id 获取id
- function getDropTargetID(dropID)
- local dropConfig = DropExcel.dropSuipian[dropID]
- if dropConfig == nil then
- return
- end
-
- -- 计算总权重
- local totalWeight = 0
- for k, v in ipairs(dropConfig.dropRule) do
- local weight = v[2]
- totalWeight = totalWeight + weight
- end
- local heroWeight = nil
- local r = math.random(1, totalWeight)
- for k, v in ipairs(dropConfig.dropRule) do
- local weight = v[2]
- if r <= weight then
- heroWeight = v[1]
- break
- else
- r = r - weight
- end
- end
-
- if heroWeight == nil then
- assert()
- end
- local len = #dropConfig.camp
- local index = math.random(1, len)
- local heroID = HeroDefine.getRandHeroByWeightLvAndCamp(heroWeight, dropConfig.camp[index])
- return heroID
- end
- local function queryBoxList(human, itemConfig)
- local itemList = itemConfig.cmd[2]
- if not itemList then return end
- local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY
- msgRet.items[0] = #itemList
- for i = 1, msgRet.items[0] do
- local itemID = itemList[i][1]
- local itemCnt = itemList[i][2]
- local quality = itemList[i][3]
- Grid.makeItem(msgRet.items[i], itemID, itemCnt, nil, nil, nil, nil, quality)
- end
- Msg.send(msgRet, human.fd)
- end
- --碎片英雄召唤预览
- function CG_SUIPIAN_HERO_SUMMON_QUERY(human, itemID)
- local itemConfig = ItemExcel.item[itemID]
- if not itemConfig then return end
-
- local cmdStr = itemConfig.cmd[1]
- if cmdStr == "box" or cmdStr == "boxAll" then
- return queryBoxList(human, itemConfig)
- end
- if itemConfig.get[1] ~= SUMMON_TYPE_TARGET
- and itemConfig.get[1] ~= SUMMON_TYPE_DROP
- and itemConfig.get[1] ~= SUMMON_TYPE_HERO_SP
- and itemConfig.get[1] ~= SUMMON_TYPE_SHENQI_SP then
- return
- end
- if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
- return
- end
-
- local realItemCnt = 1
- if human.db.bag[itemID] ~= nil then
- realItemCnt = math.floor(human.db.bag[itemID])
- end
-
- if realItemCnt < 1 then
- return
- end
-
- local outItemIDList = nil
- local targetID = nil
- if itemConfig.get[1] == SUMMON_TYPE_TARGET then
- -- 指定目标
- targetID = itemConfig.get[3]
- elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
- local dropID = itemConfig.get[3]
- local dropConfig = DropExcel.dropSuipian[dropID]
- if dropConfig == nil then
- return
- end
- local totalCnt = #dropConfig.dropRule
- local heroWeight
-
- local weightLvAndCampHeros = nil
- for i=1,totalCnt do
- targetID = dropConfig.dropRule[i]
- heroWeight = targetID[1]
- for _, camp in ipairs(dropConfig.camp) do
- weightLvAndCampHeros = HeroDefine.getHeroByWeightLvAndCamp(heroWeight, camp)
- for k, v in pairs(weightLvAndCampHeros) do
- outItemIDList = outItemIDList or {}
- outItemIDList[v] = outItemIDList[v] or 0
- outItemIDList[v] = outItemIDList[v] + 1
- end
- end
- end
- elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
-
- -- 英雄条件兑换
- local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
- for i = 1, realItemCnt do
- local randTemp = math.random(1, #dropTable)
- targetID = dropTable[randTemp]
- outItemIDList = outItemIDList or {}
- outItemIDList[targetID] = outItemIDList[targetID] or 0
- outItemIDList[targetID] = outItemIDList[targetID] + 1
- end
- elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
- -- 神器条件兑换
- local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
- for i = 1, realItemCnt do
- local randTemp = math.random(1, #dropTable)
- targetID = dropTable[randTemp]
- outItemIDList = outItemIDList or {}
- outItemIDList[targetID] = outItemIDList[targetID] or 0
- outItemIDList[targetID] = outItemIDList[targetID] + 1
- end
- end
-
- if targetID == nil and outItemIDList == nil then
- assert(nil)
- end
-
- if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
- local msgRet = Msg.gc.GC_SUIPIAN_HERO_SUMMON_QUERY
- if outItemIDList then
- local len = 0
- for heroID, _ in pairs(outItemIDList) do
- if heroID and HeroExcel.hero[heroID] == nil then
- assert(nil, "why heroID no config " .. heroID .. " " .. itemID)
- end
- if len >= 50 then
- break
- end
- len = len + 1
- HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[len], heroID)
- end
- msgRet.heroSimple[0] = len
- else
- local heroID = targetID
- msgRet.heroSimple[0] = 1
- HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[1], heroID)
- end
- Msg.send(msgRet, human.fd)
- else
- local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY
- local cnt = 0
- if outItemIDList then
- for k, v in pairs(outItemIDList) do
- cnt = cnt + 1
- Grid.makeItem(msgRet.items[cnt], k, v)
- end
- if cnt > 0 then
- msgRet.items[0] = cnt
- Msg.send(msgRet, human.fd)
- end
- else
- msgRet.items[0] = 1
- Grid.makeItem(msgRet.items[1], targetID, 1)
- Msg.send(msgRet, human.fd)
- end
- end
- end
- local HEROID_2_SUIPIANID = nil
- function getSuipianIDbyHeroID(heroID)
- if not HEROID_2_SUIPIANID then
- HEROID_2_SUIPIANID = {}
- for itemID, itemConfig in pairs(ItemExcel.item) do
- if itemConfig.get[1] == SUMMON_TYPE_TARGET and
- itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
- local targetID = itemConfig.get[3]
- HEROID_2_SUIPIANID[targetID] = itemID
- end
- end
- end
- return HEROID_2_SUIPIANID[heroID]
- end
- -- 碎片合成
- -- itemID 合成消耗物品ID
- -- itemUseCnt 合成消耗物品当前数量
- -- function SUIPIAN_SYNTHESIS(human, itemID, itemUseCnt)
- -- if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then
- -- return
- -- end
-
- -- local itemConfig = ItemExcel.item[itemID]
- -- if itemConfig == nil then
- -- return
- -- end
- -- local leftHeroBox = HeroLogic.getEmptyCnt(human)
- -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
- -- if leftHeroBox <= 0 then
- -- return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
- -- end
- -- end
- -- local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt)
- -- if realItemCnt < 1 then
- -- return
- -- end
- -- local isHero = 0
- -- local outItemIDList = nil
- -- local targetID = nil
- -- if itemConfig.get[1] == SUMMON_TYPE_TARGET then
- -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
- -- if realItemCnt > leftHeroBox then
- -- realItemCnt = leftHeroBox
- -- end
- -- -- 指定目标
- -- targetID = itemConfig.get[3]
- -- elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
- -- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
- -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
- -- if realItemCnt > leftHeroBox then
- -- realItemCnt = leftHeroBox
- -- end
- -- end
- -- -- 掉落表随机掉落
- -- for i = 1, realItemCnt do
- -- local dropID = itemConfig.get[3]
- -- targetID = getDropTargetID(dropID)
- -- if nil == targetID then
- -- print("[SUIPIAN_SYNTHESIS] 获取目标ID失败 dropID = "..dropID)
- -- return
- -- end
- -- outItemIDList = outItemIDList or {}
- -- outItemIDList[targetID] = outItemIDList[targetID] or 0
- -- outItemIDList[targetID] = outItemIDList[targetID] + 1
- -- end
- -- elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
- -- --local leftHeroBox = HeroLogic.getEmptyCnt(human)
- -- if realItemCnt > leftHeroBox then
- -- realItemCnt = leftHeroBox
- -- end
- -- local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
- -- for i = 1, realItemCnt do
- -- local randTemp = math.random(1, #dropTable)
- -- targetID = dropTable[randTemp]
- -- outItemIDList = outItemIDList or {}
- -- outItemIDList[targetID] = outItemIDList[targetID] or 0
- -- outItemIDList[targetID] = outItemIDList[targetID] + 1
- -- end
- -- elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
- -- local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
- -- for i = 1, realItemCnt do
- -- local randTemp = math.random(1, #dropTable)
- -- targetID = dropTable[randTemp]
- -- outItemIDList = outItemIDList or {}
- -- outItemIDList[targetID] = outItemIDList[targetID] or 0
- -- outItemIDList[targetID] = outItemIDList[targetID] + 1
- -- end
- -- end
- -- if targetID == nil and outItemIDList == nil then
- -- assert(nil)
- -- end
- -- local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
- -- BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon")
- -- print("[SUIPIAN_SYNTHESIS] 实际上删除的碎片数量 realItemCnt = "
- -- ..realItemCnt.. " realSuiPianCnt = "..realSuiPianCnt.. " itemUseCnt = "..itemUseCnt)
- -- local fenJieList = nil
- -- local itemList = {}
- -- if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
- -- isHero = 1
- -- if outItemIDList then
- -- -- 多个id
- -- for k, v in pairs(outItemIDList) do
- -- local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
- -- local heroID = k
- -- local hero = HeroExcel.hero[heroID]
- -- if fjlist and type(fjlist) == "table" then
- -- for fjItemID, fjItemCnt in pairs(fjlist) do
- -- fenJieList = fenJieList or {}
- -- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
- -- end
- -- end
- -- end
- -- else
- -- -- 单个id
- -- local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
- -- local heroID = targetID
- -- local hero = HeroExcel.hero[heroID]
- -- if fjlist and type(fjlist) == "table" then
- -- for fjItemID, fjItemCnt in pairs(fjlist) do
- -- fenJieList = fenJieList or {}
- -- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
- -- end
- -- end
- -- end
- -- else
- -- if outItemIDList then
- -- -- 多个id
- -- for k, v in pairs(outItemIDList) do
- -- BagLogic.addItem(human, k, v, "item_summon")
- -- itemList[k] = itemList[k] or 0
- -- itemList[k] = itemList[k] + v
- -- end
- -- else
- -- -- 单个id
- -- BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
- -- itemList[targetID] = itemList[targetID] or 0
- -- itemList[targetID] = itemList[targetID] + realItemCnt
- -- end
- -- end
-
- -- BagLogic.sendItemGetList(human, itemList, "item_summon")
- -- local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
- -- msgRet.isHero = isHero
- -- msgRet.list[0] = 0
- -- msgRet.heroList[0] = 0
- -- msgRet.fenJieList[0] = 0
- -- local netList = (isHero == 1) and msgRet.heroList or msgRet.list
-
- -- if outItemIDList then
- -- -- 多个id
- -- for k, v in pairs(outItemIDList) do
- -- netList[0] = netList[0] + 1
- -- makeResultItemData(netList[netList[0]], k, v, isHero)
- -- print("[SUIPIAN_SYNTHESIS] 合成的数量 英雄ID k = "
- -- ..k .. " v ="..v.." cnt = "..netList[netList[0]].cnt)
- -- end
- -- else
- -- netList[0] = netList[0] + 1
- -- makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
- -- print("[SUIPIAN_SYNTHESIS] 合成的数量 英雄ID targetID = "
- -- ..targetID .." realItemCnt = "..realItemCnt.. " cnt = "..netList[netList[0]].cnt)
- -- end
- -- if fenJieList then
- -- for fjItemID, fjItemCnt in pairs(fenJieList) do
- -- msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1
- -- Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt)
- -- end
- -- end
- -- --Msg.trace(msgRet)
- -- Msg.send(msgRet, human.fd)
- -- end
- -- 通用合成碎片具体逻辑
- function Suipan_BeginSyntheticFragments(human, nItemID, nItemNum, tMsgData)
- if human.db.bag[nItemID] == nil or human.db.bag[nItemID] < nItemNum then
- return false
- end
-
- local itemConfig = ItemExcel.item[nItemID]
- if itemConfig == nil then
- return false
- end
- local leftHeroBox = HeroLogic.getEmptyCnt(human)
- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
- if leftHeroBox <= 0 then
- return false
- end
- end
- local realItemCnt = math.floor(nItemNum/itemConfig.fullCnt)
- if realItemCnt < 1 then
- return false
- end
- local isHero = 0
- local outItemIDList = nil
- local targetID = nil
- if itemConfig.get[1] == SUMMON_TYPE_TARGET then
- if realItemCnt > leftHeroBox then
- realItemCnt = leftHeroBox
- end
- -- 指定目标
- targetID = itemConfig.get[3]
- elseif itemConfig.get[1] == SUMMON_TYPE_DROP then
- if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then
- if realItemCnt > leftHeroBox then
- realItemCnt = leftHeroBox
- end
- end
- -- 掉落表随机掉落
- for i = 1, realItemCnt do
- local dropID = itemConfig.get[3]
- targetID = getDropTargetID(dropID)
- if nil == targetID then
- print("[Suipan_BeginSyntheticFragments] 获取目标ID失败 dropID = "..dropID)
- return false
- end
- outItemIDList = outItemIDList or {}
- outItemIDList[targetID] = outItemIDList[targetID] or 0
- outItemIDList[targetID] = outItemIDList[targetID] + 1
- end
- elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then
- if realItemCnt > leftHeroBox then
- realItemCnt = leftHeroBox
- end
- local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3])
- for i = 1, realItemCnt do
- local randTemp = math.random(1, #dropTable)
- targetID = dropTable[randTemp]
- outItemIDList = outItemIDList or {}
- outItemIDList[targetID] = outItemIDList[targetID] or 0
- outItemIDList[targetID] = outItemIDList[targetID] + 1
- end
- elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then
- local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4])
- for i = 1, realItemCnt do
- local randTemp = math.random(1, #dropTable)
- targetID = dropTable[randTemp]
- outItemIDList = outItemIDList or {}
- outItemIDList[targetID] = outItemIDList[targetID] or 0
- outItemIDList[targetID] = outItemIDList[targetID] + 1
- end
- end
- if targetID == nil and outItemIDList == nil then
- -- assert(nil)
- return false
- end
- local realSuiPianCnt = realItemCnt * itemConfig.fullCnt
- BagLogic.delItem(human, nItemID, realSuiPianCnt, "item_summon")
- print("[Suipan_BeginSyntheticFragments] 实际上删除的碎片数量 realItemCnt = "
- ..realItemCnt.. " itemID" .. nItemID.. " realSuiPianCnt = "..realSuiPianCnt.. " nItemNum = "..nItemNum)
- local fenJieList = nil
- local itemList = {}
- if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then
- isHero = 1
- if outItemIDList then
- -- 多个id
- for k, v in pairs(outItemIDList) do
- local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon")
- local heroID = k
- local hero = HeroExcel.hero[heroID]
- if fjlist and type(fjlist) == "table" then
- for fjItemID, fjItemCnt in pairs(fjlist) do
- fenJieList = fenJieList or {}
- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
- end
- end
- end
- else
- -- 单个id
- local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon")
- local heroID = targetID
- local hero = HeroExcel.hero[heroID]
- if fjlist and type(fjlist) == "table" then
- for fjItemID, fjItemCnt in pairs(fjlist) do
- fenJieList = fenJieList or {}
- fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt
- end
- end
- end
- else
- if outItemIDList then
- -- 多个id
- for k, v in pairs(outItemIDList) do
- BagLogic.addItem(human, k, v, "item_summon")
- itemList[k] = itemList[k] or 0
- itemList[k] = itemList[k] + v
- end
- else
- -- 单个id
- BagLogic.addItem(human, targetID, realItemCnt, "item_summon")
- itemList[targetID] = itemList[targetID] or 0
- itemList[targetID] = itemList[targetID] + realItemCnt
- end
- end
-
- BagLogic.sendItemGetList(human, itemList, "item_summon")
- local netList = (isHero == 1) and tMsgData.heroList or tMsgData.list
-
- if outItemIDList then
- -- 多个id
- for k, v in pairs(outItemIDList) do
- netList[0] = netList[0] + 1
- makeResultItemData(netList[netList[0]], k, v, isHero)
- print("[Suipan_BeginSyntheticFragments] 合成的数量 英雄ID k = "
- ..k .. " v ="..v.." cnt = "..netList[netList[0]].cnt)
- end
- else
- netList[0] = netList[0] + 1
- makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero)
- print("[Suipan_BeginSyntheticFragments] 合成的数量 英雄ID targetID = "
- ..targetID .." realItemCnt = "..realItemCnt.. " cnt = "..netList[netList[0]].cnt)
- end
- if fenJieList then
- for fjItemID, fjItemCnt in pairs(fenJieList) do
- tMsgData.fenJieList[0] = tMsgData.fenJieList[0] + 1
- Grid.makeItem(tMsgData.fenJieList[tMsgData.fenJieList[0]], fjItemID, fjItemCnt)
- end
- end
- return true
- --Msg.trace(msgRet)
- --Msg.send(msgRet, human.fd)
- end
- -- 碎片合成
- function SUIPIAN_SYNTHESIS(human, tCompositeTable)
- if not human or nil == tCompositeTable or nil == _G.next(tCompositeTable) then
- return false
- end
- -- 英雄背包空余格子数
- local nLefeHeroNum = HeroLogic.getEmptyCnt(human)
- if 0 >= nLefeHeroNum then
- Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
- print("[SUIPIAN_SYNTHESIS] 背包格子不够直接返回 nLefeHeroNum = "..nLefeHeroNum)
- return false
- end
- -- 检查一次数量信息
- local nAllnum = 0
- for nID, nNum in pairs(tCompositeTable) do
- if human.db.bag[nID] == nil or human.db.bag[nID] < nNum then
- print("[SUIPIAN_SYNTHESIS] 背包中数量不正确,无法合成直接返回 nID = "..nID.." nNum = "..nNum)
- return false
- end
- local itemConfig = ItemExcel.item[nID]
- if itemConfig == nil then
- print("[SUIPIAN_SYNTHESIS] 不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
- return false
- end
- local nRealNum = math.floor(nNum / itemConfig.fullCnt)
- if 0 >= nRealNum then
- print("[SUIPIAN_SYNTHESIS] 真实生成的数量不正确 nID = "
- ..nID.." nNum = "..nNum.." fullCnt = "..itemConfig.fullCnt)
- return false
- end
- print("[SUIPIAN_SYNTHESIS] 进行合成的碎片信息 nID = "..nID.." nNum = "..nNum)
- nAllnum = nAllnum + 1
- end
- if nAllnum >= 100 then
- print("[SUIPIAN_SYNTHESIS] 真实生成的数量大于了协议生成最大长度 nAllnum = "..nAllnum)
- return false
- end
- local msgRet = Msg.gc.GC_SUIPIAN_SUMMON
- msgRet.isHero = 1
- msgRet.list[0] = 0
- msgRet.heroList[0] = 0
- msgRet.fenJieList[0] = 0
- -- 正式开始正式生成
- for nID, nNum in pairs(tCompositeTable) do
- -- 不存在剩余空位
- if 0 >= nLefeHeroNum then
- break
- end
- local itemConfig = ItemExcel.item[nID]
- if itemConfig then
- local nCanCreateNum = math.floor(nNum / itemConfig.fullCnt)
- if nCanCreateNum > nLefeHeroNum then
- nCanCreateNum = nLefeHeroNum
- end
-
- nLefeHeroNum = nLefeHeroNum - nCanCreateNum
- local bRet = Suipan_BeginSyntheticFragments(human, nID, nNum, msgRet)
- if false == bRet then
- print("[SUIPIAN_SYNTHESIS] 合成碎片失败 nID = "..nID.." nNum = "..nNum)
- break
- end
- else
- print("[SUIPIAN_SYNTHESIS] 检测过居然还不存在对应物品的配置 nID = "..nID.." nNum = "..nNum)
- end
- end
- Msg.send(msgRet, human.fd)
- end
- function CG_SUIPIAN_SYNTHESIS(human)
- local msgRet = Msg.gc.GC_SUIPIAN_SYNTHESIS
- local status = 1
- local tCompositeTable = {}
- for itemID,itemCnt in pairs(human.db.bag) do
- local itemConfig = ItemExcel.item[itemID]
- if itemConfig ~= nil and
- itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and
- itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then
- if itemCnt >= itemConfig.fullCnt then
- tCompositeTable[itemID] = tCompositeTable[itemID] or 0
- tCompositeTable[itemID] = tCompositeTable[itemID] + itemCnt
- end
- end
- end
- if nil ~= _G.next(tCompositeTable) then
- status = 0
- SUIPIAN_SYNTHESIS(human, tCompositeTable)
- end
- msgRet.status = status
- Msg.send(msgRet, human.fd)
- end
|