| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587 |
- -- 战区争霸(普通服)
- local Config = require("Config")
- local Msg = require("core.Msg")
- local Lang = require("common.Lang")
- local ObjHuman = require("core.ObjHuman")
- local Broadcast = require("broadcast.Broadcast")
- local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
- local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
- local CombatDefine = require("combat.CombatDefine")
- local RoleDBLogic = require("role.RoleDBLogic")
- local CombatPosLogic = require("combat.CombatPosLogic")
- local CombatLogic = require("combat.CombatLogic")
- local MailExcel = require("excel.mail")
- local Util = require("common.Util")
- local InnerMsg = require("core.InnerMsg")
- local RoleHeadLogic = require("role.RoleHeadLogic")
- local MailManager = require("mail.MailManager")
- local AreaBattleConfig = require("excel.areaBattle").reward
- local HeroExcel = require("excel.hero")
- local Log = require("common.Log")
- local Timer = require("core.Timer")
- local CommonDB = require("common.CommonDB")
- local RoleSystemExcel = require("excel.roleSystem")
- local Grid = require("bag.Grid")
- local BillboardLogic = require("billboard.BillboardLogic")
- local BillboardDefine = require("billboard.BillboardDefine")
- local AreaBattleDefine = require("areaBattle.AreaBattleDefine")
- local mailQueue = {
- uuidArray = {},
- insertMaxNum = 100, -- 一次最多插入数据库的邮件数量
- repeatMaxTimes = 3, -- 第一次失败后重试次数
- repeatTb = {}
- }
- -- 检查是否开启
- local function openCheck()
- local wDay = Util.getWeekDay()
- if not table.find(AreaBattleDefine.OPEN_WDAY_AREA, wDay) then
- return false
- end
- local now = os.time()
- local toDayStartTime = Util.getDayStartTime(now)
- if wDay == AreaBattleDefine.OPEN_WDAY_AREA[1] and now < (toDayStartTime + AreaBattleDefine.PREPARE_STATE_START_SEC) then
- return false
- end
- if wDay == AreaBattleDefine.OPEN_WDAY_AREA[2] and now > (toDayStartTime + AreaBattleDefine.END_STATE_START_SEC) then
- return false
- end
- return true
- end
- -- 生成符合协议数据结构的奖励数据
- local function populateAwardMsg(msgTb, awardCfg)
- for idx, itemCfg in ipairs(awardCfg) do
- msgTb[0] = idx
- Grid.makeItem(msgTb[idx], itemCfg[1], itemCfg[2])
- end
- end
- -- 生成符合协议数据结构的英雄数据
- local function populateObjMsg(net, data)
- net.name = data.name or ""
- net.power = data.power or 0
- net.head = data.head or 0
- net.headFrame = data.headFrame or 0
- net.playerLv = data.playerLv or 90
- net.heroList[0] = 0
- for k, heroInfo in ipairs(data.heroList) do
- net.heroList[0] = k
- net.heroList[k].heroId = heroInfo.heroId or 1001
- net.heroList[k].heroColor = heroInfo.heroColor or 0
- net.heroList[k].heroStar = heroInfo.heroStar or 1
- net.heroList[k].heroLv = heroInfo.heroLv or 1
- net.heroList[k].heroCamp = heroInfo.heroCamp or 999
- end
- end
- local function sendMail(mailId, receiverUuid, itemArray)
- if not mailId or not receiverUuid then
- return
- end
- local mailCfg = MailExcel.mail[mailId]
- local content = mailCfg.content
- MailManager.add(MailManager.SYSTEM, receiverUuid, mailCfg.title, content, itemArray, mailCfg.senderName or "GM")
- end
- local function writeLog(logStr)
- Log.write(Log.LOGID_OSS_AREABATTLE_AWARD, logStr)
- end
- function mailQueue:add(playerInfo)
- table.insert(self.uuidArray, playerInfo)
- end
- function mailQueue:clear()
- Util.cleanTable(self.uuidArray)
- Util.cleanTable(self.repeatTb)
- end
- function mailQueue:insertDB()
- local maxNum = math.min(self.insertMaxNum, #self.uuidArray)
- for i=1, maxNum do
- local resTag = AreaBattleDefine.MAIL_SUCC_TAG
- local playerInfo = table.remove(self.uuidArray)
- local uuid = playerInfo[1]
- local awardType = playerInfo[3]
- local ok, err = pcall(sendMail, AreaBattleDefine.AWARDTYPE2MAILID[awardType], uuid, playerInfo[2])
- if not ok then
- if not self.repeatTb[uuid] or self.repeatTb[uuid] < self.repeatMaxTimes then -- 插入失败后,最多重新插入3次
- mailQueue:add(playerInfo)
- self.repeatTb[uuid] = (self.repeatTb[uuid] or 0) + 1
- end
- resTag = AreaBattleDefine.MAIL_FAIL_TAG
- end
- local str = string.format("Result: %s, playerUuid: %s, AwardType: %d, insertErrTimes: %d, errInfo: %s",
- resTag, uuid, awardType, self.repeatTb[uuid] or 0, err)
- writeLog(str)
- end
- if #self.uuidArray > 0 then
- Timer.addLater(3, mailQueue.insertDB, mailQueue)
- end
- end
- local function insertPlayerAward(playerArr, battlePlyerArr, awardArr, awardType)
- local len = #playerArr
- for _, uuid in pairs(battlePlyerArr or {}) do
- len = len + 1
- local item = {}
- for idx, itemInfo in ipairs(awardArr) do
- item[idx] = {itemInfo[1], itemInfo[2]}
- end
- playerArr[len] = {uuid, item, awardType}
- end
- end
- local function genPlayerAwardArray(srvBattleRes)
- local DataCache = require("core.DataCache")
- local playerUidList = DataCache.Get_PlayerUuidList()
- local winAwardType, defeateAwardType, normalAwardType = AreaBattleDefine.AWARD_TYPE1, AreaBattleDefine.AWARD_TYPE2, AreaBattleDefine.AWARD_TYPE3
- local battleWinAwward, battleDefeatAward, normalAward = AreaBattleConfig[1].winAward1, AreaBattleConfig[1].winAward2, AreaBattleConfig[1].winAward3
- if srvBattleRes.isWin == 0 then
- winAwardType, defeateAwardType, normalAwardType = AreaBattleDefine.AWARD_TYPE4, AreaBattleDefine.AWARD_TYPE5, AreaBattleDefine.AWARD_TYPE6
- battleWinAwward, battleDefeatAward, normalAward = AreaBattleConfig[1].defeatAward1, AreaBattleConfig[1].defeatAward2, AreaBattleConfig[1].defeatAward3
- end
- local len = 0
- local playerAwardArray = {}
- insertPlayerAward(playerAwardArray, srvBattleRes.winPlayerArr, battleWinAwward, winAwardType)
- insertPlayerAward(playerAwardArray, srvBattleRes.winPlayerArr, normalAward, normalAwardType)
- insertPlayerAward(playerAwardArray, srvBattleRes.defeatPlayerArr, battleDefeatAward, defeateAwardType)
- insertPlayerAward(playerAwardArray, srvBattleRes.defeatPlayerArr, normalAward, normalAwardType)
- len = #playerAwardArray
- for uuid in pairs(playerUidList) do
- if not table.find(srvBattleRes.winPlayerArr, uuid) and not table.find(srvBattleRes.defeatPlayerArr, uuid) then
- len = len + 1
- local item = {}
- for idx, itemInfo in ipairs(normalAward) do
- item[idx] = {itemInfo[1], itemInfo[2]}
- end
- playerAwardArray[len] = {uuid, item, normalAwardType}
- end
- end
- if len == 0 then
- return
- end
- return playerAwardArray
- end
- -- 开服天数检查
- local function checkSvrOpenDays()
- local openDay = CommonDB.getServerOpenDay()
- local ctrlCfg = RoleSystemExcel.roleSystem[RoleSystemDefine.ROLE_SYS_ID_1306]
- if ctrlCfg.openSvrDay > openDay then
- return false
- end
- return true
- end
- -- 单个英雄数据
- local function getHeroInfo(human, targetHeroUuid)
- local HeroLogic = require("hero.HeroLogic")
- local heroGrid = HeroLogic.getHeroGridByUuid(human, targetHeroUuid)
- if heroGrid then
- local heroCfg = HeroExcel.hero[heroGrid.id]
- local heroInfo = {
- heroUuid = targetHeroUuid,
- heroStar = heroGrid.star,
- heroLevel = heroGrid.lv,
- heroCamp = heroGrid.camp or heroCfg.camp,
- heroBody = heroCfg.body
- }
- return heroInfo
- end
- end
- -- 获取上阵英雄数据
- local function getHeroListInfo(human, targetHeroUuid)
- local len = 0
- local heroArr = {}
- local heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE32)
- if not next(heroList) then
- heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE1)
- end
- for _, heroUuid in pairs(heroList) do
- if not targetHeroUuid or targetHeroUuid == heroUuid then
- len = len + 1
- heroArr[len] = getHeroInfo(human, heroUuid)
- end
- end
- if len == 0 then
- return
- end
- return heroArr
- end
- -- 生成玩家展示数据
- local function genPlayerShowData(playerUuid)
- local human = ObjHuman.onlineUuid[playerUuid]
- if not human then
- local db = RoleDBLogic.getDb(playerUuid)
- if not db then
- return
- end
- human = {}
- human.db = db
- end
- local showInfo = {}
- showInfo.uuid = playerUuid
- showInfo.power = human.db.zhandouli
- showInfo.name = human.db.name
- showInfo.head = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1)
- showInfo.headFrame = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2)
- -- showInfo.heroList = getHeroListInfo(human)
- return showInfo
- end
- -- 生成本服参战列表
- local function genJoinBattleArray()
- local rankList = BillboardLogic.GetRankList(BillboardDefine.TYPE_ZHANDOULI)
- if not rankList then
- return
- end
- local len = 0
- local joinBattleArray = {}
- for _, PlayerData in ipairs(rankList) do
- if len >= AreaBattleDefine.JOIN_BATTLE_MAX_CNT then
- break
- end
- local pkayerInfo = genPlayerShowData(PlayerData.uuid)
- if pkayerInfo then
- len = len + 1
- joinBattleArray[len] = pkayerInfo
- end
- end
- table.shuffle(joinBattleArray)
- return joinBattleArray
- end
- function getActState(human)
- local state, leftTime = 1, 0
- if not openCheck() then
- state = 0
- end
- return state, leftTime
- end
- function isOpen(human)
- return RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1306)
- end
- function getCombatObjList(human, side, args, combatType)
- if side == CombatDefine.ATTACK_SIDE and not human then return end
- if side == CombatDefine.DEFEND_SIDE and human then
- return
- end
- if not human then
- local uuid = args[1]
- local db = RoleDBLogic.getDb(uuid)
- if not db then
- return
- end
- human = {}
- human.db = db
- end
- local heroList = CombatPosLogic.getCombatHeros(human, combatType)
- if next(heroList) then
- return CombatLogic.getHumanObjList(human, combatType)
- else
- return CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
- end
- end
- --------------------------------------------N2C----------------------------------------------------
- -- 加入战斗
- local function joinBattle()
- local joinBattleArray = genJoinBattleArray()
- -- if not joinBattleArray or #joinBattleArray <= 0 then
- -- return
- -- end
- print("================joinBattle================", #joinBattleArray)
- local msgData = InnerMsg.lw.LW_AREABATTLE_JOIN_BATTLE
- msgData.sourceServerId = Config.SVR_INDEX
- msgData.joinBattleArray = joinBattleArray or {}
- InnerMsg.sendMsg(0, msgData)
- end
- -- 获取活动基础信息
- function GetBaseInfo(human)
- local msgData = InnerMsg.lw.LW_AREABATTLE_BASEINFO_QUERY
- msgData.sourceServerId = Config.SVR_INDEX
- msgData.playerUuid = human.db._id
- InnerMsg.sendMsg(0, msgData)
- end
- -- 获取本服参战玩家列表
- function GetJoinPlayerArr(human)
- -- if not openCheck() then
- -- local msgRet = Msg.gc.GC_AREABATTLE_JOINPLAYER_QUERY
- -- msgRet.errCode = -2
- -- msgRet.isJoin = 0
- -- msgRet.playerArray[0] = 0
- -- return Msg.send(msgRet, human.fd)
- -- end
- local msgData = InnerMsg.lw.LW_AREABATTLE_JOINPLAYER_QUERY
- msgData.sourceServerId = Config.SVR_INDEX
- msgData.playerUuid = human.db._id
- InnerMsg.sendMsg(0, msgData)
- end
- -- 获取区服匹配列表(两两匹配)
- function GetMatchList(human)
- -- if not openCheck() then
- -- local msgRet = Msg.gc.GC_AREABATTLE_MATCHLIST_QUERY
- -- msgRet.errCode = -2
- -- msgRet.matchList[0] = 0
- -- return Msg.send(msgRet, human.fd)
- -- end
- local msgData = InnerMsg.lw.LW_AREABATTLE_MATCHLIST_QUERY
- msgData.sourceServerId = Config.SVR_INDEX
- msgData.playerUuid = human.db._id
- InnerMsg.sendMsg(0, msgData)
- end
- --获取录像
- function GetCombatVideo(human)
- -- if not openCheck() then
- -- local msgRet = Msg.gc.GC_GODSAREA_QUERY_COMBATVIDEO
- -- msgRet.errCode = -2
- -- msgRet.leftWinTimes = 0
- -- msgRet.rightWinTimes = 0
- -- msgRet.leftSrvName = ""
- -- msgRet.leftSrvPower = 0
- -- msgRet.rightSrvName = ""
- -- msgRet.rightSrvPower = 0
- -- msgRet.videoList[0] = 0
- -- return Msg.send(msgRet, human.fd)
- -- end
- local msgData = InnerMsg.lw.LW_AREABATTLE_VIDEOSHOW_QUERY
- msgData.sourceServerId = Config.SVR_INDEX
- msgData.playerUuid = human.db._id
- InnerMsg.sendMsg(0, msgData)
- end
- -- 获取奖励列表
- function GetAwardInfo(human)
- local msgRet = Msg.gc.GC_AREABATTLE_REWARD_QUERY
- populateAwardMsg(msgRet.winJoinAward, AreaBattleConfig[1].winAward1)
- populateAwardMsg(msgRet.winJoinAward2, AreaBattleConfig[1].winAward2)
- populateAwardMsg(msgRet.winNormalAward, AreaBattleConfig[1].winAward3)
- populateAwardMsg(msgRet.defaultJoinAward, AreaBattleConfig[1].defeatAward1)
- populateAwardMsg(msgRet.defaultJoinAward2, AreaBattleConfig[1].defeatAward2)
- populateAwardMsg(msgRet.defaultNormalAward, AreaBattleConfig[1].defeatAward3)
- Msg.send(msgRet, human.fd)
- end
- --------------------------------------------C2N----------------------------------------------------
- -- 收到活动开启通知
- function C2N_BattleStart()
- if not checkSvrOpenDays() then
- return
- end
- joinBattle()
- end
- -- 收到活动基础信息
- function C2N_BaseInfo(msg)
- local human = ObjHuman.onlineUuid[msg.playerUuid]
- if not human then
- return
- end
- local msgRet = Msg.gc.GC_AREABATTLE_BASEINFO_QUERY
- msgRet.stage = msg.stage
- msgRet.startTime = msg.startTime
- msgRet.endTime = msg.endTime
- Msg.send(msgRet, human.fd)
- end
- -- 收到本服参战玩家列表
- function C2N_JoinPlayerArr(msg)
- local human = ObjHuman.onlineUuid[msg.playerUuid]
- if not human then
- return
- end
- local msgRet = Msg.gc.GC_AREABATTLE_JOINPLAYER_QUERY
- msgRet.errCode = msg.errCode
- msgRet.isJoin = 0
- msgRet.playerArray[0] = 0
- if msg.errCode == 0 then
- local playerArray = msg.playerArray
- table.sort(playerArray, function (a, b)
- return a.power > b.power
- end)
- for k, v in ipairs(playerArray) do
- msgRet.playerArray[0] = k
- msgRet.playerArray[k].name = v.name
- msgRet.playerArray[k].power = v.power
- msgRet.playerArray[k].head = v.head
- msgRet.playerArray[k].headFrame = v.headFrame
- if v.uuid == msg.playerUuid then
- msgRet.isJoin = 1
- end
- end
- end
- Msg.send(msgRet, human.fd)
- end
- -- 收到本轮活动的区服匹配列表
- function C2N_MatchList(msg)
- local human = ObjHuman.onlineUuid[msg.playerUuid]
- if not human then
- return
- end
- local msgRet = Msg.gc.GC_AREABATTLE_MATCHLIST_QUERY
- msgRet.errCode = 0
- local matchListMsg = msgRet.matchList
- matchListMsg[0] = 0
- if not next(msg.matchList) then
- msgRet.errCode = -1
- else
- for k, v in ipairs(msg.matchList) do
- matchListMsg[0] = k
- --for _, srvInfo in ipairs(v) do
- local leftSrv = v[1]
- local rightSrv = v[2]
- matchListMsg[k].leftSrvName = (leftSrv[1] - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
- matchListMsg[k].leftSrvPower = leftSrv[2]
- matchListMsg[k].rightSrvName = (rightSrv[1] - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
- matchListMsg[k].rightSrvPower = rightSrv[2]
- --end
- end
- end
- Msg.send(msgRet, human.fd)
- end
- -- 收到本服的战斗录像展示数据
- function C2N_VideoShowData(msg)
- local human = ObjHuman.onlineUuid[msg.playerUuid]
- if not human then
- return
- end
- local errCode = msg.errCode
- local msgRet = Msg.gc.GC_GODSAREA_QUERY_COMBATVIDEO
- msgRet.errCode = errCode
- msgRet.leftWinTimes = 0
- msgRet.rightWinTimes = 0
- msgRet.leftSrvName = ""
- msgRet.leftSrvPower = 0
- msgRet.rightSrvName = ""
- msgRet.rightSrvPower = 0
- msgRet.videoList[0] = 0
- if errCode ~= 0 then
- return Msg.send(msgRet, human.fd)
- end
- local srvInfo = msg.srvInfo
- msgRet.leftWinTimes = srvInfo.leftWinTimes
- msgRet.rightWinTimes = srvInfo.rightWinTimes
- msgRet.leftSrvName = (srvInfo.leftSrvId - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
- msgRet.leftSrvPower = srvInfo.leftSrvPower
- msgRet.rightSrvName = (srvInfo.rightSrvId - AreaBattleDefine.SRV_START_IDX) .. AreaBattleDefine.SRV_NAME_STR
- msgRet.rightSrvPower = srvInfo.rightSrvPower
- for k, v in ipairs(msg.videoShowData) do
- msgRet.videoList[0] = k
- -- msgRet.videoList[k].atkData = v.atkData
- -- msgRet.videoList[k].defenerData = v.defenerData
- populateObjMsg(msgRet.videoList[k].atkData, v.atkData)
- populateObjMsg(msgRet.videoList[k].defenerData, v.defenerData)
- msgRet.videoList[k].atkFormation = v.atkFormation
- msgRet.videoList[k].defenerFormation = v.defenerFormation
- msgRet.videoList[k].round = v.round
- msgRet.videoList[k].maxRound = v.maxRound
- msgRet.videoList[k].time = v.time
- msgRet.videoList[k].videoUuid = v.videoUuid
- msgRet.videoList[k].result = v.result
- end
- Msg.send(msgRet, human.fd)
- end
- -- 收到给玩家发奖励通知
- function C2N_SendReward(msg)
- print("================C2N_SendReward000===================")
- local playerAwardArray = genPlayerAwardArray(msg.srvBattleRes)
- if not playerAwardArray then
- return
- end
- print("================C2N_SendReward001===================")
- mailQueue:clear()
- for _, playerInfo in ipairs(playerAwardArray) do
- mailQueue:add(playerInfo)
- end
- mailQueue:insertDB()
- end
|