| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- local Msg = require("core.Msg")
- local CommonDB = require("common.CommonDB")
- local relicModule = require("excel.ServerRelic")
- local Grid = require("bag.Grid")
- local BagLogic = require("bag.BagLogic")
- local RoleAttr = require("role.RoleAttr")
- local ObjHuman = require("core.ObjHuman")
- local RoleDefine = require("role.RoleDefine")
- local Lang = require("common.Lang")
- local Broadcast = require("broadcast.Broadcast")
- local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
- local HeroConfig = require("excel.hero").hero
- local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
- local HeroLogic = require("hero.HeroLogic")
- local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
- local LOGTYPE = "WinnerRelic"
- local relicUpgradeConfig = relicModule.RelicUpgrade -- 获取升级配置表
- local relicDataConfig = relicModule.RelicData -- 获取遗物数据表
- local COND_TOWER_LEVEL = 500 --开启本系统需要通关恶魔之塔的层数
- --[[
- DB =
- {{
- -- 激活状态
- status ={
- --{[1601] = 3,(star级别)
- --[1602] = 0,
- }
- -- 装备状态(整合到同一命名空间)
- --equipped = {
- [1601] = {heoidx, heoidx}
- -- }}
- ]]
- --判断是否开启圣者遗物
- function isOpen(human)
- local towerLevel = HuanJingTowerLogic.getTowerLevel(human)
- if towerLevel >= COND_TOWER_LEVEL then
- return true
- end
- return false
- end
- -- 获取对应类型的遗物
- local function generateCfgByType(type_m)
- local tbl = {}
- for relicId, relicCfg in pairs(relicDataConfig) do
- if relicCfg.nType == type_m then
- tbl[relicId] = relicCfg
- end
- end
- if not next(tbl) then
- return nil
- end
- return tbl
- end
- -- 填充协议
- -- 红点判断
- local function dotJudgment(human, cfgHtbl)
- local relicData = human.db.relicListData
- for relicId, relicCfg in pairs(cfgHtbl) do
- local nLevel = 0
- if relicData and relicData.status and relicData.status[relicId] then
- nLevel = relicData.status[relicId]
- end
- if nLevel == 0 and nLevel <= 10 then
- if BagLogic.getItemCnt(human, relicCfg.nProp) >= 1 then
- return true
- end
- end
- end
- return false
- end
- local function AddTableAttr(tNode, tConfig, tConfig2)
- tNode[0] = 4
- tNode[1].key = tConfig.HP
- tNode[1].value = tConfig2.nLife
- tNode[2].key = tConfig.ATK
- tNode[2].value= tConfig2.nAttack
- tNode[3].key = tConfig.DEF
- tNode[3].value = tConfig2.nDefense
- tNode[4].key = tConfig.SPEED
- tNode[4].value = tConfig2.nSpeed
- end
- function Listofrelics(human)
- local tMsgData = Msg.gc.GC_SACRED_RELIC_QUERY
- local RelicConfigs = tMsgData.SacredRelicConfigs
- local relicData = human.db.relicListData or {} --数据库
- relicData.status = relicData.status or {}
- relicData.equipped = relicData.equipped or {}
- RelicConfigs[0] = 0
- local len = 0
- for relicId, relicCfg in pairs(relicDataConfig) do
- len = len + 1
- RelicConfigs[0] = len
- local playerRelicData = (relicData and relicData.status and relicData.status[relicId]) or 0 -- 默认未激活
- local currentStar = playerRelicData or 0
- local msgEntry = RelicConfigs[len]
- -- 基础属性
- msgEntry.id = relicId
- msgEntry.name = relicCfg.nName
- msgEntry.activateItem = relicCfg.nProp
- AddTableAttr(msgEntry.attr, RoleDefine, relicCfg)
- AddTableAttr(msgEntry.nextattr, RoleDefine, relicCfg)
- msgEntry.effectDesc = relicCfg.nEffectdescription
- local bonusValues = {}
- if relicCfg.nLifeBonus then table.insert(bonusValues, relicCfg.nLifeBonus) end
- if relicCfg.nAttackBonus then table.insert(bonusValues, relicCfg.nAttackBonus) end
- if relicCfg.nDefenseBonus then table.insert(bonusValues, relicCfg.nDefenseBonus) end
- if relicCfg.nSpeedBonus then table.insert(bonusValues, relicCfg.nSpeedBonus) end
- msgEntry.effectData[0] = 4
- msgEntry.effectNextData[0] = 4
- msgEntry.effectMaxData[0] = 4
- for i, bonusArray in ipairs(bonusValues) do
- local replaceValue = currentStar > 0 and bonusArray[currentStar] or 0
- local replaceValueNext = currentStar + 1 > 0 and currentStar + 1 <= 10 and bonusArray[currentStar+1] or 0
- local replaceValueMax = bonusArray and bonusArray[10] or 0
- -- effectDesc = string.gsub(effectDesc, "X%%", tostring(replaceValue).."%%", 1)
- msgEntry.effectData[i] = replaceValue
- msgEntry.effectNextData[i] = replaceValueNext
- msgEntry.effectMaxData[i] = replaceValueMax
- end
- msgEntry.type = relicCfg.nType
- local nextStar = currentStar + 1
- local costNum = nextStar <= 10 and relicUpgradeConfig and relicUpgradeConfig[nextStar] and relicUpgradeConfig[nextStar].CostNum or 0
- Grid.makeItem(msgEntry.upGradeCost, relicCfg.nProp, costNum)
- msgEntry.upGradeCost.cnt = costNum or 0
- msgEntry.starLevel = currentStar or 0
- -- print("当前下发的遗物等级为:",currentStar)
- -- print("当前各种遗物的星级",msgEntry.starLevel)
- if relicUpgradeConfig and relicUpgradeConfig[currentStar] then
- msgEntry.equipLimit = relicUpgradeConfig[currentStar].EquipHeroNum or 0
- else
- msgEntry.equipLimit = 0
- end
- if relicData and relicData.equipped and relicData.equipped[relicId] then
- msgEntry.heroIdx[0] = #relicData.equipped[relicId]
- for idx, rid in ipairs(relicData.equipped[relicId]) do
- msgEntry.heroIdx[idx] = rid
- end
- else
- msgEntry.heroIdx = {} -- 先初始化为空表
- msgEntry.heroIdx[0] = 0
- end
- end
-
- Msg.send(tMsgData, human.fd)
- end
- function ActiveandUpgrade(human,relicId)
- print("开始激活圣者遗物11111111111111111")
- -- 基础校验
- if not isOpen(human) then
- return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
- end
- local relicCfg = relicDataConfig[relicId]
- if not relicCfg then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- human.db.relicListData = human.db.relicListData or {}
- human.db.relicListData.status = human.db.relicListData.status or {}
- local relicData=human.db.relicListData
- local playerRelicData = relicData and relicData.status and relicData.status[relicId] or 0
- local currentStar = playerRelicData or 0
- -- 检查是否已达到最大星级
- if currentStar >=10 then
- return Broadcast.sendErr(human, Lang.COMMON_MAX_LEVEL)
- end
- local nextStar = currentStar +1
- print("激活/升级,当前取得遗物的星级为",currentStar)
- print("激活/升级,当前遗物下一星级",nextStar)
- if nextStar > 10 or not relicUpgradeConfig or not relicUpgradeConfig[nextStar] then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- local costItemId = relicCfg and relicCfg.nProp
- local costNum = relicUpgradeConfig and relicUpgradeConfig[nextStar] and relicUpgradeConfig[nextStar].CostNum or 0
- if not costItemId or BagLogic.getItemCnt(human, costItemId) < costNum then
- return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
- end
- BagLogic.delItem(human, costItemId, costNum, LOGTYPE)
- --更新数据
- playerRelicData = nextStar or 0
- human.db.relicListData.status = human.db.relicListData.status or {}
- human.db.relicListData.status[relicId] = playerRelicData
- print("当前今激活或升级后存入数据库的星级",playerRelicData)
- --返回数据
- local tMsgData = Msg.gc.GC_SACRED_RELIC_UPGRADE
- local RelicData = tMsgData.data or {}
- RelicData.id = relicId
- RelicData.name = relicCfg.nName
- RelicData.activateItem = relicCfg.nProp
- AddTableAttr(RelicData.attr, RoleDefine, relicCfg)
- AddTableAttr(RelicData.nextattr, RoleDefine, relicCfg)
- local bonusValues = {}
- RelicData.effectDesc = relicCfg.nEffectdescription
- if relicCfg.nLifeBonus then table.insert(bonusValues, relicCfg.nLifeBonus) end
- if relicCfg.nAttackBonus then table.insert(bonusValues, relicCfg.nAttackBonus) end
- if relicCfg.nDefenseBonus then table.insert(bonusValues, relicCfg.nDefenseBonus) end
- if relicCfg.nSpeedBonus then table.insert(bonusValues, relicCfg.nSpeedBonus) end
- RelicData.effectData[0] = 4
- RelicData.effectNextData[0] = 4
- RelicData.effectMaxData[0] = 4
- for i, bonusArray in ipairs(bonusValues) do
- local replaceValue = currentStar > 0 and bonusArray[currentStar] or 0
- local replaceValueNext = currentStar + 1 > 0 and currentStar + 1 <= 10 and bonusArray[currentStar+1] or 0
- local replaceValueMax = bonusArray and bonusArray[10] or 0
- -- effectDesc = string.gsub(effectDesc, "X%%", tostring(replaceValue).."%%", 1)
- RelicData.effectData[i] = replaceValue
- RelicData.effectNextData[i] = replaceValueNext
- RelicData.effectMaxData[i] = replaceValueMax
- end
- RelicData.type = relicCfg.nType or {}
- local costNum = nextStar <= 10 and relicUpgradeConfig and relicUpgradeConfig[nextStar] and relicUpgradeConfig[nextStar].CostNum or 0
- Grid.makeItem(RelicData.upGradeCost, relicCfg.nProp, costNum)
- RelicData.upGradeCost.cnt = costNum or 0
- RelicData.starLevel = nextStar or 0
- if relicUpgradeConfig and relicUpgradeConfig[nextStar] then
- RelicData.equipLimit = relicUpgradeConfig[nextStar].EquipHeroNum or 0
- else
- RelicData.equipLimit = 0
- end
- if relicData and relicData.equipped and relicData.equipped[relicId] then
- RelicData.heroIdx[0] = #relicData.equipped[relicId]
- for idx, rid in ipairs(relicData.equipped[relicId]) do
- RelicData.heroIdx[idx] = rid
- end
- else
- RelicData.heroIdx = {} -- 先初始化为空表
- RelicData.heroIdx[0] = 0
- end
- -- tMsgData = relicData
- Msg.send(tMsgData, human.fd)
- --重算战力
- RoleAttr.cleanHeroAttrCache(human)
- RoleAttr.doCalc(human)
- ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
- --刷新红点,当所有可激活遗物均已被激活时
- if not dotJudgment(human, relicDataConfig) then
- local dotID = 0
- if relicCfg.nType == 1 then
- dotID = RoleSystemDefine.ROLE_SYS_ID_2022
- elseif relicCfg.nType == 2 then
- dotID = RoleSystemDefine.ROLE_SYS_ID_2023
- elseif relicCfg.nType == 3 then
- dotID = RoleSystemDefine.ROLE_SYS_ID_2024
- end
- RoleSystemLogic.onDot(human, dotID)
- --刷新入口处
- RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2021)
- end
- end
- -- 装备/卸下圣者遗物
- function EquipeandRemove(human, heroID, heroIdx, relicId, operate)
- local relicCfg = relicDataConfig and relicDataConfig[relicId]
- local playerRelicData = human.db.relicListData and human.db.relicListData.status and human.db.relicListData.status[relicId] or 0
- local currentStar = playerRelicData or 0
-
- -- 检查系统是否开启
- if not isOpen(human) then
- return Broadcast.sendErr(human, Lang.COMMON_NOT_OPEN)
- end
-
- --检查英雄是否存在
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIdx)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.HERO_NOT_EXIST)
- end
- --检查英雄是否达到14星
- if heroGrid.star < 14 then
- return Broadcast.sendErr(human, Lang.SACRED_RELIC_HERO_LEVEL_LIMIT)
- end
- -- 初始化遗物数据
- human.db.relicListData = human.db.relicListData or {}
- local relicData =human.db.relicListData or {}
- -- 装备操作
- local tMsgData = Msg.gc.GC_SACRED_RELIC_EQUIP
- local RelicData = tMsgData.olddata
- tMsgData.heroIdx = heroIdx
- RelicData.id = relicId
- RelicData.name = relicCfg.nName
- RelicData.activateItem = relicCfg.nProp
- AddTableAttr(RelicData.attr, RoleDefine, relicCfg)
- AddTableAttr(RelicData.nextattr, RoleDefine, relicCfg)
- RelicData.effectDesc = relicCfg.nEffectdescription
- local bonusValues = {}
- if relicCfg.nLifeBonus then table.insert(bonusValues, relicCfg.nLifeBonus) end
- if relicCfg.nAttackBonus then table.insert(bonusValues, relicCfg.nAttackBonus) end
- if relicCfg.nDefenseBonus then table.insert(bonusValues, relicCfg.nDefenseBonus) end
- if relicCfg.nSpeedBonus then table.insert(bonusValues, relicCfg.nSpeedBonus) end
- RelicData.effectData[0] = 4
- RelicData.effectNextData[0] = 4
- RelicData.effectMaxData[0] = 4
- for i, bonusArray in ipairs(bonusValues) do
- local replaceValue = currentStar > 0 and bonusArray[currentStar] or 0
- local replaceValueNext = currentStar + 1 > 0 and currentStar + 1 <= 10 and bonusArray[currentStar+1] or 0
- local replaceValueMax = bonusArray and bonusArray[10] or 0
- -- effectDesc = string.gsub(effectDesc, "X%%", tostring(replaceValue).."%%", 1)
- RelicData.effectData[i] = replaceValue
- RelicData.effectNextData[i] = replaceValueNext
- RelicData.effectMaxData[i] = replaceValueMax
- end
- RelicData.type = relicCfg.nType
- local costNum = currentStar+1 <= 10 and relicUpgradeConfig and relicUpgradeConfig[currentStar+1] and relicUpgradeConfig[currentStar+1].CostNum or 0
- Grid.makeItem(RelicData.upGradeCost, relicCfg.nProp, costNum)
- RelicData.upGradeCost.cnt = costNum or 0
- RelicData.starLevel = currentStar or 0
- if relicUpgradeConfig and relicUpgradeConfig[currentStar] then
- RelicData.equipLimit = relicUpgradeConfig[currentStar].EquipHeroNum or 0
- else
- RelicData.equipLimit = 0
- end
- -- 填充已装备英雄信息
- if relicData and relicData.equipped and relicData.equipped[relicId] then
- RelicData.heroIdx[0] = #relicData.equipped[relicId]
- for idx, rid in ipairs(relicData.equipped[relicId]) do
- RelicData.heroIdx[idx] = rid
- end
- else
- RelicData.heroIdx = {} -- 先初始化为空表
- RelicData.heroIdx[0] = 0
- end
- if operate == 1 then
- print("当前进入装备操作")
- -- 如果当前英雄已经装备了遗物
- human.db.relicListData.equipped = human.db.relicListData.equipped or {}
- human.db.relicListData.equipped[relicId] = human.db.relicListData.equipped[relicId] or {}
-
- -- 遍历找到对应的英雄索引并移除
- for i, equippedHeroIdx in ipairs(human.db.relicListData.equipped[relicId]) do
- if equippedHeroIdx == heroIdx then
- table.remove(human.db.relicListData.equipped[relicId], i)
- break
- end
- end
- print("当前进入装备操作22222")
- heroGrid.relic = {}
- local LEN = human.db.relicListData and human.db.relicListData.equipped and human.db.relicListData.equipped[relicId] and #human.db.relicListData.equipped[relicId]
- local star = human.db and human.db.relicListData and human.db.relicListData[relicId] or 0
- print("当前进入装备操作kkkkkkkkkkk",star)
- local NumLimit = relicUpgradeConfig and relicUpgradeConfig[star] and relicUpgradeConfig[star].EquipHeroNum or 0
- if LEN and LEN >= 5 then
- return Broadcast.sendErr(human, Lang.SACRED_RELIC_HERO_LEVEL_LIMIT)
- end
- if not human.db.relicListData.equipped[relicId] then
- human.db.relicListData.equipped[relicId] = {} -- 初始化
- end
- print("当前进入装备操作33333")
- if human.db.relicListData and human.db.relicListData.equipped and human.db.relicListData.equipped[relicId] then
- local alreadyExist = false
- for _, idx in ipairs(human.db.relicListData.equipped[relicId]) do
- if idx == heroIdx then
- alreadyExist = true
- break
- end
- end
- if not alreadyExist then
- table.insert(human.db.relicListData.equipped[relicId],heroIdx)
- print("成功装备遗物", relicId, "给英雄", heroIdx)
- else
- print("英雄已装备该遗物,无需重复操作", heroIdx, relicId)
- end
- end
- print("当前进入装备操作4444")
- heroGrid.relic = heroGrid.relic or {}
- heroGrid.relic.relicID = relicId
- heroGrid.relic.star = human.db.relicListData.status[relicId] or 0
- print("当前遗物装备完毕",heroGrid.relic.relicID)
- else
- for idx,rid in pairs(human.db.relicListData.equipped[relicId]) do
- if rid == heroIdx then
- table.remove(human.db.relicListData.equipped[relicId],idx)
- break
- end
- return Broadcast.sendErr(human, Lang.SACRED_RELIC_HERO_LEVEL_LIMIT)
- end
- end
- -- 获取更新之后的数据
- print("11111111111111111111111111111111ggg")
- local nRelicData = tMsgData.newdata
- nRelicData.id = relicId
- nRelicData.name = relicCfg.nName
- nRelicData.activateItem = relicCfg.nProp
- AddTableAttr(nRelicData.attr, RoleDefine, relicCfg)
- AddTableAttr(nRelicData.nextattr, RoleDefine, relicCfg)
- nRelicData.effectDesc = relicCfg.nEffectdescription
- local bonusValues = {}
- if relicCfg.nLifeBonus then table.insert(bonusValues, relicCfg.nLifeBonus) end
- if relicCfg.nAttackBonus then table.insert(bonusValues, relicCfg.nAttackBonus) end
- if relicCfg.nDefenseBonus then table.insert(bonusValues, relicCfg.nDefenseBonus) end
- if relicCfg.nSpeedBonus then table.insert(bonusValues, relicCfg.nSpeedBonus) end
- nRelicData.effectData[0] = 4
- nRelicData.effectNextData[0] = 4
- nRelicData.effectMaxData[0] = 4
- for i, bonusArray in ipairs(bonusValues) do
- local replaceValue = currentStar > 0 and bonusArray[currentStar] or 0
- local replaceValueNext = currentStar + 1 > 0 and currentStar + 1 <= 10 and bonusArray[currentStar+1] or 0
- local replaceValueMax = bonusArray and bonusArray[10] or 0
- -- effectDesc = string.gsub(effectDesc, "X%%", tostring(replaceValue).."%%", 1)
- nRelicData.effectData[i] = replaceValue
- nRelicData.effectNextData[i] = replaceValueNext
- nRelicData.effectMaxData[i] = replaceValueMax
- end
- nRelicData.type = relicCfg.nType
- local costNum = currentStar+1 <= 10 and relicUpgradeConfig and relicUpgradeConfig[currentStar+1] and relicUpgradeConfig[currentStar+1].CostNum or 0
- Grid.makeItem(RelicData.upGradeCost, relicCfg.nProp, costNum)
- nRelicData.upGradeCost.cnt = costNum or 0
- nRelicData.starLevel = currentStar or 0
- if relicUpgradeConfig and relicUpgradeConfig[currentStar] then
- nRelicData.equipLimit = relicUpgradeConfig[currentStar].EquipHeroNum or 0
- else
- nRelicData.equipLimit = 0
- end
- -- 填充已装备英雄信息
- if relicData and relicData.equipped and relicData.equipped[relicId] then
- nRelicData.heroIdx[0] = #relicData.equipped[relicId]
- print("当前长度111111111111111111",nRelicData.heroIdx[0])
- for idx, rid in ipairs(relicData.equipped[relicId]) do
- nRelicData.heroIdx[idx] = rid
- end
- else
- nRelicData.heroIdx = {} -- 先初始化为空表
- nRelicData.heroIdx[0] = 0
- end
- Msg.send(tMsgData, human.fd)
- --重算战力
- HeroLogic.sendHeroBagUpdate(human,heroIdx)
- -- table.print_lua_table(tMsgData)
- print("圣者遗物装备完毕")
- RoleAttr.cleanHeroAttrCache(human)
- RoleAttr.doCalc(human)
- ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
- end
- -- 遗物对英雄属性加成
- function doCalcHero(heroGrid,addAttrs)
- if not heroGrid or not heroGrid.relic then
- return
- end
- local relicid = heroGrid.relic and heroGrid.relic.relicID
- local star = heroGrid.relic and heroGrid.relic.star
- local Life,Attack,Defense,Speed = 0, 0, 0, 0
- local relicData = relicDataConfig[relicid]
- Life = relicData and relicData.nLifeBonus and relicData.nLifeBonus[star] or 0
- Attack = relicData and relicData.nAttackBonus and relicData.nAttackBonus[star] or 0
- Life = relicData and relicData.nDefenseBonus and relicData.nDefenseBonus[star] or 0
- Life = relicData and relicData.nSpeedBonus and relicData.nSpeedBonus[star] or 0
- RoleAttr.updateValue(RoleDefine.HP,Life,addAttrs)
- RoleAttr.updateValue(RoleDefine.ATK,Attack,addAttrs)
- RoleAttr.updateValue(RoleDefine.DEF,Defense,addAttrs)
- RoleAttr.updateValue(RoleDefine.SPEED,Speed,addAttrs)
- end
- --红点
- function isDot(human, dotConfig)
- if not isOpen(human) then
- return false
- end
- --入口处的红点判断
- if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2021 then
- return dotJudgment(human, relicDataConfig)
- else
- --单个分页的红点
- local RelicType = 0
- if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2022 then
- RelicType = 1
- elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2023 then
- RelicType = 2
- elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2024 then
- RelicType = 3
- end
- local cfgHtbl = generateCfgByType(RelicType)
- if not cfgHtbl then
- return 1
- end
- return dotJudgment(human, cfgHtbl)
- end
- end
|