| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- ----------------------------------------------
- -- 战斗录像 相关
- -- db.combatVideos [index] = videoUuid
- ----------------------------------------------
- local LuaMongo = _G.lua_mongo
- local Config = require("Config")
- local Msg = require("core.Msg")
- local ObjHuman = require("core.ObjHuman")
- local DB = require("common.DB")
- local Util = require("common.Util")
- local Lang = require("common.Lang")
- local CombatDefine = require("combat.CombatDefine")
- local CombatLogic = require("combat.CombatLogic")
- local Broadcast = require("broadcast.Broadcast")
- local RoleLogic = require("role.RoleLogic")
- VIDEO_SINGLE_MAXCNT = 5 -- 个人记录条数上限
- TOWER_PER_MAXCNT = 3 -- 通天塔每层保留3条记录
- THRONE_RECORD_MAX_CNT = 10 -- 王者争霸记录条数
- BATTLE_RECORD_MAX_CNT = 1 -- 战役战斗记录条数
- -- 录像类型
- VIDEOTYPE_COMMON = 1 -- 个人记录
- VIDEOTYPE_JJC = 2 -- 单人竞技场
- VIDEOTYPE_TOWER = 3 -- 通天塔
- VIDEOTYPE_THRONE = 4 -- 王者争霸
- VIDEOTYPE_BATTLE = 5 -- 战役记录
- --------------------------------------------- db ---------------------------------------------------
- local QueryByUuid = {_id = nil}
- local QueryByType = {videoType = nil, key = nil}
- function createCombatVideo(videoType, combatInfo, key,evolveCnt)
- if not combatInfo then return end
- if combatInfo.isVideo then return end
- if combatInfo.isVideoSave then return end
- -- 优化帧数据 降低
- CombatLogic.killFrames(combatInfo)
- local combatVideo = {}
- combatVideo.videoType = videoType
- combatVideo.key = key
- combatVideo.evolveCnt = evolveCnt
- combatVideo.combatInfo = Util.copyTable(combatInfo)
- LuaMongo.insert(DB.db_combat_video, combatVideo)
- return combatVideo
- end
- function updateCombatVideo(combatVideo)
- if not combatVideo._id then return end
- QueryByUuid._id = combatVideo._id
- LuaMongo.update(DB.db_combat_video, QueryByUuid, combatVideo)
- end
- function removeCombatVideo(videoUuid)
- if not videoUuid then return end
- QueryByUuid._id = videoUuid
- LuaMongo.remove(DB.db_combat_video, QueryByUuid)
- end
- function getCombatVideo(videoUuid)
- if not videoUuid then return end
- QueryByUuid._id = videoUuid
- local combatVideo = {}
- LuaMongo.find(DB.db_combat_video, QueryByUuid)
- if not LuaMongo.next(combatVideo) then
- return
- end
- return combatVideo
- end
- local COMBATVIDEO_LIST_CACHE = {}
- local FieldSimple = {["combatInfo.result"] = 0}
- function getCombatVideosByType(videoType, key)
- QueryByType.videoType = videoType
- if videoType == VIDEOTYPE_THRONE then
- FieldSimple = {}
- end
- QueryByType.key = key
- local len = 0
- Util.cleanTable(COMBATVIDEO_LIST_CACHE)
- LuaMongo.find(DB.db_combat_video, QueryByType, FieldSimple)
- while true do
- local combatVideo = {}
- if not LuaMongo.next(combatVideo) then
- break
- end
- len = len + 1
- COMBATVIDEO_LIST_CACHE[len] = combatVideo
- end
- return COMBATVIDEO_LIST_CACHE
- end
- ----------------------------------------------- msg -------------------------------------------------------
- -- 个人录像数目
- function getCombatVideoCnt(human)
- if not human.db.combatVideos then
- return 0
- end
- return #human.db.combatVideos
- end
- -- 获取录像索引
- function getCombatVideoIndex(human, videoUuid)
- if not human.db.combatVideos then
- return
- end
- for index, vuuid in ipairs(human.db.combatVideos) do
- if vuuid == videoUuid then
- return index
- end
- end
- end
- -- 保存个人录像
- function saveCombatVideo(human, isShare)
- local combatInfo = human.combat
- if not combatInfo then return end
- if combatInfo.isVideo then
- return Broadcast.sendErr(human, Lang.COMBAT_ERR_IS_VIDEO)
- end
- if combatInfo.videoUuid then
- if not isShare then
- Broadcast.sendErr(human, Lang.SAVE_SUCCESS)
- end
- return combatInfo.videoUuid
- end
- local saveNum = getCombatVideoCnt(human)
- if saveNum >= VIDEO_SINGLE_MAXCNT then
- local videoUuid = human.db.combatVideos[1]
- deleteCombatVideo(human, videoUuid)
- end
- local combatVideo = createCombatVideo(VIDEOTYPE_COMMON, combatInfo, human.db._id)
- if not combatVideo then return end
- if not combatVideo._id then return end
- human.db.combatVideos = human.db.combatVideos or {}
- local newIndex = #human.db.combatVideos + 1
- human.db.combatVideos[newIndex] = combatVideo._id
- combatInfo.videoUuid = combatVideo._id
- if not isShare then
- Broadcast.sendErr(human, Lang.SAVE_SUCCESS)
- end
- return combatVideo._id
- end
- -- 查看录像
- function sendCombatVideoQuery(human)
- local msgRet = Msg.gc.GC_COMBAT_VIDEO_QUERY
- local videoCnt = getCombatVideoCnt(human)
- msgRet.list[0] = 0
- for i = 1, videoCnt do
- local videoUuid = human.db.combatVideos[i]
- local combatVideo = getCombatVideo(videoUuid)
- local combatInfo = combatVideo and combatVideo.combatInfo
- if combatInfo then
- msgRet.list[0] = msgRet.list[0] + 1
- local net = msgRet.list[msgRet.list[0]]
- net.videoUuid = combatVideo._id
- net.combatTime = combatInfo.time
- net.isWin = combatInfo.isWin and CombatDefine.RESULT_WIN or CombatDefine.RESULT_FAIL
- net.type = combatInfo.type
- RoleLogic.makeRoleBase(combatInfo.attacker, net.atkRoleBase)
- RoleLogic.makeRoleBase(combatInfo.defender, net.defRoleBase)
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet, human.fd)
- end
- -- 删除战斗记录
- function deleteCombatVideo(human, videoUuid)
- if not videoUuid or videoUuid == "" then return end
- local videoIndex = getCombatVideoIndex(human, videoUuid)
- if not videoIndex then return end
- local combatVideo = getCombatVideo(videoUuid)
- if combatVideo then
- removeCombatVideo(combatVideo._id)
- end
- table.remove(human.db.combatVideos, videoIndex)
- ObjHuman.save(human)
- sendCombatVideoQuery(human)
- end
- -- 战斗回放
- function lookCombatVideo(human, videoUuid, lookType)
- if CombatLogic.isCombating(human) then
- return Broadcast.sendErr(human, Lang.COMBAT_VIDEO_LOOK_ERR_ING)
- end
- if not videoUuid or videoUuid == "" then return end
- local combatVideo = getCombatVideo(videoUuid)
- if not combatVideo then
- return Broadcast.sendErr(human, Lang.COMBAT_ERR_NOT_VIDEO)
- end
- local combatInfo = combatVideo.combatInfo
- combatInfo.isVideo = true
- combatInfo.videoUuid = videoUuid
- combatInfo.lookType = lookType
- human.combat = combatInfo
- CombatLogic.sendCombatData(human, combatInfo)
- CombatLogic.sendCombatFinish(human, combatInfo)
- end
- -- 保存通天塔记录
- function saveTowerVideo(towerId, combatInfo)
- if not towerId or not combatInfo then return end
- local list = getCombatVideosByType(VIDEOTYPE_TOWER, towerId)
- if #list < TOWER_PER_MAXCNT then
- createCombatVideo(VIDEOTYPE_TOWER, combatInfo, towerId)
- else
- local selectVideo = nil
- for _, combatVideo in ipairs(list) do
- local attacker = combatVideo.combatInfo.attacker
- local sattacker = selectVideo and selectVideo.combatInfo.attacker
- if sattacker == nil or attacker.lv > sattacker.lv then
- selectVideo = combatVideo
- end
- end
- selectVideo.combatInfo = combatInfo
- updateCombatVideo(selectVideo)
- end
- end
- -- 竞技计数减一
- function delJJCVideoCnt(videoUuid)
- local combatVideo = getCombatVideo(videoUuid)
- if not combatVideo then return end
- if combatVideo.videoType ~= VIDEOTYPE_JJC then
- return
- end
- combatVideo.key = (combatVideo.key or 0) - 1
- if combatVideo.key > 0 then
- updateCombatVideo(combatVideo)
- else
- removeCombatVideo(combatVideo._id)
- end
- end
- -- 清空竞技场记录
- function cleanJJCVideo()
- QueryByType.videoType = VIDEOTYPE_JJC
- LuaMongo.remove(DB.db_combat_video, QueryByType)
- end
- -- 王者争霸记录
- function saveThroneVideo(id, combatInfo,evolveCnt)
- local list = getCombatVideosByType(VIDEOTYPE_THRONE, id)
- if #list < THRONE_RECORD_MAX_CNT then
- createCombatVideo(VIDEOTYPE_THRONE, combatInfo, id,evolveCnt)
- else
- local selectVideo = {}
- for _, combatVideo in ipairs(list) do
- local time = combatVideo.combatInfo.time
- local stime = selectVideo.combatInfo and selectVideo.combatInfo.time
- if stime == nil or time < stime then
- selectVideo = combatVideo
- end
- end
- selectVideo.combatInfo = combatInfo
- selectVideo.evolveCnt = evolveCnt
- updateCombatVideo(selectVideo)
- end
- end
- -- 战役记录
- function saveBattleVideo(uuid, combatInfo)
- local list = getCombatVideosByType(VIDEOTYPE_BATTLE, uuid)
- if #list < BATTLE_RECORD_MAX_CNT then
- local selectVideo = nil
- selectVideo = createCombatVideo(VIDEOTYPE_BATTLE, combatInfo, uuid)
- return selectVideo._id
- else
- local selectVideo = nil
- for _, combatVideo in ipairs(list) do
- local humanUuid = combatVideo.uuid
- local sUuid = selectVideo and selectVideo.uuid
- if sUuid == nil or sUuid == humanUuid then
- selectVideo = combatVideo
- end
- end
- selectVideo.combatInfo = combatInfo
- updateCombatVideo(selectVideo)
- return selectVideo._id
- end
- end
|