| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- ----------------------------------
- -- 角色DB相关逻辑
- -- isNameExistInDB 角色名是否存在
- -- getDb 根据uuid取角色信息(优先取内存)
- -- getDbByName 根据名字取角色信息(优先取内存)
- -- getDbByAccount 根据账号取角色信息(优先取内存)
- -- loadRole 根据账号取db
- -- saveRole 保存角色整个db
- -- saveRoleSset 仅对角色db某些字段进行修改
- -- createDefaultRole 初始化角色db信息
- ----------------------------------
- local LuaMongo = _G.lua_mongo
- local Config = require("Config")
- local DB = require("common.DB")
- local ObjHuman = require("core.ObjHuman")
- local HeroDefine = require("hero.HeroDefine")
- local CreateRole = require("role.CreateRole")
- local CombatDefine = require("combat.CombatDefine")
- local RoleLogic = require("role.RoleLogic")
- local RoleHeadLogic = require("role.RoleHeadLogic")
- local Util = require("common.Util")
- local QueryByAccount = {} --按帐号查询
- local QueryByName = {} --按角色名查询
- local QueryByUuid = {} --按uuid查询
- local QueryByIdentity = {} --按identity查询
- local QueryUpdateChar = {}
- local FieldName = {name = 1}
- local FieldAccount = {account = 1}
- local tempData = {}
- local function generateuuid(account, serverTag)
- if not account or not serverTag then
- assert(false, string.format("data Error! account:%s,svrIndex:%s", account, serverTag))
- end
- return string.format("%s|%s", serverTag, account)
- end
- function isNameExistInDB(name)
- QueryByName.name = name
- tempData.name = nil
- LuaMongo.find(DB.db_char, QueryByName, FieldName)
- return LuaMongo.next(tempData) and tempData
- end
- function isAccountExistInDB(account)
- QueryByAccount.account = account
- tempData.account = nil
- LuaMongo.find(DB.db_char, QueryByAccount, FieldAccount)
- return LuaMongo.next(tempData) and tempData
- end
- function isUuidExistInDB(uuid)
- QueryByUuid._id = uuid
- tempData.account = nil
- LuaMongo.find(DB.db_char, QueryByUuid, FieldAccount)
- return LuaMongo.next(tempData) and tempData
- end
- local f = {}
- function getDb(uuid, fields)
- local t = ObjHuman.onlineUuid[uuid]
- if t then
- return t.db, t.fd ~= nil
- end
- QueryByUuid._id = uuid
- local data = {}
- if type(fields) == "string" then
- local k = next(f)
- if k then f[k] = nil end
- f[fields] = 1
- fields = f
- end
- LuaMongo.find(DB.db_char, QueryByUuid, fields)
- return LuaMongo.next(data) and data, nil
- end
- function getDbByName(name, fields)
- if not name then
- assert()
- end
- local t = ObjHuman.onlineHuman[name]
- if t then
- return t.db, t.fd ~= nil
- end
- QueryByName.name = name
- local data = {}
- if type(fields) == "string" then
- local k = next(f)
- if k then f[k] = nil end
- f[fields] = 1
- fields = f
- end
- LuaMongo.find(DB.db_char, QueryByName, fields)
- return LuaMongo.next(data) and data, nil
- end
- function getDbByNameRegex(name, fields)
- QueryByName.name = {["$regex"] = name}
- local data = {}
- if type(fields) == "string" then
- local k = next(f)
- if k then f[k] = nil end
- f[fields] = 1
- fields = f
- end
- RoleLogic.makeRoleBaseFields(fields)
- LuaMongo.find(DB.db_char, QueryByName, fields,50)
- local userList = {}
- local len = 0
- while true do
- local data = {}
- if not LuaMongo.next(data) then
- break
- end
- len = len + 1
- userList[len] = {}
- userList[len].name = data.name
- userList[len].uuid = data._id
- userList[len].account = data.account
- userList[len].identity = data.identity
- userList[len].lv = data.lv
- userList[len].head = data.head
- userList[len].headFrame = data.headFrame
- userList[len].unionUuid = data.unionUuid
- userList[len].blue = data.blue
- userList[len].yellow = data.yellow
- userList[len].zhandouli = data.zhandouli
- end
- return userList,#userList
- end
- function getDbByAccount(account, fields)
- local t = ObjHuman.onlineAccount[account]
- if t then
- return t.db, t.fd ~= nil
- end
- QueryByAccount.account = account
- local data = {}
- if type(fields) == "string" then
- local k = next(f)
- if k then f[k] = nil end
- f[fields] = 1
- fields = f
- end
- LuaMongo.find(DB.db_char, QueryByAccount, fields)
- return LuaMongo.next(data) and data, nil
- end
- function loadRole(account)
- QueryByAccount.account = account
- local data = {}
- LuaMongo.find(DB.db_char, QueryByAccount)
- if LuaMongo.next(data) then
- return data
- end
- end
- function getDbByIdentity(identity,fields)
- QueryByIdentity.identity = identity
- local data = {}
- if type(fields) == "string" then
- local k = next(f)
- if k then f[k] = nil end
- f[fields] = 1
- fields = f
- end
- LuaMongo.find(DB.db_char, QueryByIdentity, fields)
- return LuaMongo.next(data) and data, nil
- end
- function saveRole(db)
- QueryUpdateChar._id = db._id
- LuaMongo.update(DB.db_char, QueryUpdateChar, db)
- end
- local tempTb = {}
- function saveRoleSset(db, sunset)
- QueryUpdateChar._id = db._id
- db._id = nil
- tempTb["$set"] = db
- tempTb["$unset"] = sunset
- LuaMongo.update(DB.db_char, QueryUpdateChar, tempTb)
- db._id = QueryUpdateChar._id
- end
- -------------------- humandb 初始化 start ----------------------
- function createDefaultRole(account, serverTag)
- local db = {
- svrIndex = Config.SVR_INDEX,
- newUniqueTag = generateuuid(account, serverTag),
- identity = nil, -- 11位全局不重复的数字id
- account = account, -- 帐号名
- name = nil, -- 角色名
- changeNameCnt = nil, -- 修改名字次数
- changeBase = nil, -- 修改基础信息次数
- birthDay = nil, -- 生日
- signature = nil, -- 个性签名
- lv = 1, -- 等级
- exp = 0,
- zuanshi = 0, -- 钻石
- jinbi = 0, -- 金币
- createTime = nil, -- 角色创建时间
- lastLoginTime = nil, -- 上一次登录时间
- lastLogoutTime = nil, -- 最近登出时间
- update_daily_time = nil, -- 每天更新时间
- onlineTime = nil, -- 在线时长
- onlineTimeDay = nil, -- 本日在线时长
- onlineTimeDayReport = nil,
- heroBag = {[0] = HeroDefine.HERO_BAG_CNT}, -- 英雄背包[index] ={id,lv等级,quality品阶}
- heroLevelUpgrade = 0, -- 英雄手动升级最大值
- bag = {}, -- 道具背包 {itemID->itemCnt}
- fuwenBag = {}, -- 符文背包 [index] = {id, 属性, 技能}
- equipBag = {}, -- 装备背包 [index] = {id, 属性, 技能}
- combatHero = {}, -- 出战英雄[type] = {[pos] = uuid}
- buyCapCnt = nil, -- 购买背包容量次数
- heroBook = nil, -- 获得过的图鉴英雄[id]= true
- shop = nil, -- 商店购买物品次数记录 shop[shopType][itemID] = cnt
-
- battleGameTimes = nil, -- 普通闯关的获得的游戏次数
- eliteBattleGameTimes = nil, -- 精英闯关的获得的游戏次数
- hardBattleGameTimes = nil, -- 困难闯关的获得的游戏次数
- battleType = 1, -- 战役类型(1、普通,2、精英,3、困难)
- maxBattleTime = nil, -- 最新关卡通关时间
- guajiID = 0, -- 已通关关卡/挂机关卡
- guajiID_elite = 0, -- 精英- 已通关关卡/挂机关卡
- guajiID_hard = 0, -- 困难- 已通关关卡/挂机关卡
- battleID = 1, -- 战役即将战斗id
- battleID_elite = 1, -- 精英-战役即将战斗id
- battleID_hard = 1, -- 困难-战役即将战斗id
- battleHis = nil, -- 战役历史记录(用于新手任务第五关特殊处理)
- battleRewards = nil, -- 征战奖励领取记录
- battleRewards_elite = nil, -- 精英征战奖励领取记录
- battleRewards_hard = nil, -- 困难征战奖励领取记录
- battleOut = nil, -- 挂机收益{expTs1--经验开始产出时间戳,expTs2--经验产出结算时间戳,itemTs1--道具产出时间戳,itemTs2--道具产出结算时间戳,exp,jinbi,greenExp,items,itemsHalf}
- battleadopt = 0, -- 普通战役是否通关
- battleadopt_elite = 0, -- 精英战役是否通关
- battleadopt_haed = 0, -- 困难战役是否通关
- copy = nil, -- 活动副本 [1] ={cnt今日已挑战次数,buyCnt已购买次数}
- dailyTask = nil, -- 每日任务
- bar = nil, -- [taskID] = {isLock是否锁定, star任务星级, nameID阿辛多, actionID委托, itemID, itemCnt, ts开始做任务时间戳, hero={index}上阵英雄, camp = {1,2}任务要求, job = {1}任务要求}
- zhuanpan = nil, -- [type] = {ts1[强制刷新时间戳],ts2[免费刷新时间戳],[1] = {id抽奖id, itemID奖品ID,itemCnt奖品数量,getCnt = nil抽到次数[该抽奖有次数限制才记录]
- tower = nil, -- 幻境之塔{当前关卡lv, 恢复时间ts, 当前体力值tili}
- drawCard = {jifen=0,list={[1]={},[2]={},[3]={},[4]={},[8]={}}},--召唤法阵
- combatSpeed = nil, -- 战斗速度
- jinbiExchange = nil, -- {[1][2][3]对应档位是否领取 ts刷新时间戳}
- vipLv = nil, -- vip等级
- vipExp = nil, -- vip经验(注意这个经验是累计的 升级不会清0)
- vipLibao = nil, -- vip礼包标识
- vipYueka = nil, -- vip月卡额外奖励
- jjcBestRank = nil, -- 个人竞技场最佳排名
- jjcDailyFight = nil, -- 个人竞技场每日战斗次数
- chengjiu = {}, -- 成就
- onlineReward = nil, -- 在线奖励 {id, ts}
- combatQuick = {}, -- 快速战斗
- systemSet = nil, -- 系统设置 位与操作 第4位 不展示vip 第5位 屏蔽私聊
- chatBan = nil, -- 屏蔽聊天的玩家
- actMonthEndTime = nil, -- 月度活动结束时间
- actMonthTask = nil, -- 月度活动进度
- -- jifen hzz竞技积分 trial hzz皇家试炼积分 buyNum 破碎徽章购买 drunkery = {[id] = num} 酒馆活动 hecheng={[id] = num}
- fundFlag = nil, -- 钻石基金标志 nil未购买 1已购买未领完 2已购买已领完
-
- friendHeart = 0, -- 友情值
- sendHeart = nil, -- 每日赠送红心好友列表{uuid->1}
- getHeartCnt = nil, -- 每日领取红心次数
- sendHeartCnt = nil, -- 每日赠送红心次数
- friendBlack = nil, -- 黑名单
-
- buy = {}, -- 购买记录
- absAct = {}, -- 绝对时间活动数据
- loginGiveTime = nil, -- 登录赠送 (限时活动) 记录获得赠送时间
- signInCnt = nil, -- 登陆奖励次数
- signIn = nil, -- 登陆奖励状态,0 未登录,1,已登录未领取,2已登录已领取
- signInTime = nil, -- 登陆时间,用于判断是否是同一天登陆
- unionUuid = nil, -- 工会标志 如果玩家不属于任何工会,unionUuid为nil,否则unionUuid为工会唯一id
- ectypeCnt = nil, -- 公会副本每日通关次数
- ectypeLike = nil , -- 公会副本点赞次数
- ectypLikeUuid = nil, -- 公会副本点赞人
- ectypHurt = nil, -- 公会副本每日伤害记录
- combatVideos = nil, -- 战斗记录列表
- technology = nil, -- 公会科技信息
- ip = nil, -- 登录IP
- killEctype = nil, -- 参与击杀Boss等级
- phpChanelID = nil, -- 渠道导入id
- dailyShareTask = nil, -- 每日公共任务
- openServerGift = nil, -- 开服有礼
- mopupDoCnt = nil, -- 战役已扫荡次数
- mopupFreeCnt = nil, -- 战役已免费扫荡次数
- mopupAddFreeCnt = nil, -- 战役额外增加扫荡次数
- topupAcount = nil, -- 玩家充值总额
- topupAcountDaily = nil, -- 玩家每日充值总额
- topupAccountMonth = nil, -- 玩家每月充值总额
- firstCharge = nil, -- 超值首充 6元 100元
- newFirstCharge = nil, -- 新首充
- godDailyTopup = nil, -- 成神之路每日礼包
- kingworld = nil, -- 国王君临
- superFund = nil, -- 超值基金 大小基金 [type] = {}
-
- sex = 1, -- 性别 1男2女
- head = RoleHeadLogic.DEFAULT_HEAD_MALE_ID, -- 头像
- headList = nil, -- 已激活头像列表(除默认赠送外)
- headFrame = RoleHeadLogic.DEFAULT_HEADFREAM_ID, -- 头像框
- headFrameList = nil, -- 已激活头像框列表(除默认赠送外)
- body = nil, -- 形象
- bodyList = nil, -- 已激活形象
- chenghao = nil, -- 称号
- chenghaoList = nil, -- 已激活称号
- headHasNewFlag = nil, -- 头像1/头像框2/形象4/称号8有新的flag
- animation = nil, -- 立绘
- animationList = nil, -- 已激活的立绘列表
- background = RoleHeadLogic.DEFAULT_BACKGROUND_ID, -- 背景
- backgroundList = nil, -- 已激活的背景列表
- throneTime = nil, -- 挑战失败记录时间
- banSay = nil, -- 被举报
- yellow = nil, -- 黄钻贵族
- blue = nil, -- 蓝钻贵族
- txHall = nil, -- 腾讯大厅
- qqZone = nil, -- QQ空间
- fuwenRefreshCnt = nil, -- 符文刷新次数
- helpCnt = nil, -- 公会秘境助战次数
- personMail = nil, -- 私人郵件次數
- skinBag = {[0] = HeroDefine.HERO_SKIN_CNT},
- mailtips = {}, -- 邮件提醒
- skinLog = {}, --皮肤获取记录
- lookGl = nil, -- 是否看过攻略
- tujianCP = nil, -- 图鉴CP
-
- personalrecord = nil, -- 炼狱个人记录
-
- middleFlag = nil, -- 跨服游戏中
- middleOptions = nil, -- 跨服操作事件
-
- leichongHaoli = nil, -- 累充好礼
- dailyLeiChong = nil, -- 每日累充 奖励发放 dailyLeiChong[1] = true
- battleExtraReward = nil, -- 征战关卡额外奖励
- plShare = nil, -- 微信小程序分享
- tuiSongLiBao = nil, -- 推送礼包
- heroResetCnt = nil, -- 英雄每日重置次数
- moshou = nil, -- 魔兽
- equipLogs = nil, -- 装备合成日志
- jjcGodWar = nil, -- 众神之战
- unionLive = nil, -- 公会活跃
- moShouPingFen = nil, -- 魔兽评分
- unionDonate = nil, -- 公会捐献
- dailyBanggong = nil, -- 每日帮贡
- totalBanggong = nil, -- 总帮贡
- donateReward = nil, -- 公会捐献达标奖励
- combatBackup = nil, -- 援军激活条件
- liLian = nil, -- 历练
- billboard = nil, -- 排行榜-上榜时间
- billboardAim = nil, -- 排行榜-进度奖励
- lianyu = nil, -- 绝望深渊
- lianyuCache = nil, -- 绝望深渊战斗信息
- battleVideoUuid = nil, -- 战役挂机Uuid
- chatRead = nil, -- 聊天记录阅读到第几条
- dailyLibao = nil, -- 充值-每日礼包
- richangLibao = nil, -- 充值-每周/每月礼包
- tequanShop = nil, -- 充值-特权商店
- tequanMopup = nil, -- 扫荡特权 截止时间
- weekendFuli = nil, -- 周末福利
- unionWar = nil, -- 玩家 公会战 相关数据
- jjcLadder = nil, -- 天梯争霸 相关数据
- valleyTask = nil, -- 荣耀峡谷(龙族战场)目标
- jjcNewestRecord = nil, -- 个人竞技场最新战斗记录时间
- jjcWorship = nil, -- 个人竞技场每日膜拜
- jjcBeWorship = nil, -- 个人竞技场总被膜拜次数
- relationKey = nil, -- 推广码
- relationBind= {}, -- 推广关系
- relationId = nil, -- 推广人
- relationRew = {}, -- 奖励领取状态
- warReport = {}, -- 战报收藏列表
- warAdmire = nil, -- 战报点赞
- drill = nil, -- 勇者试炼
- welfareGift = {}, -- 超值礼包
- redBagCnt = nil, -- 公会红包次数
- monthCard = nil, -- 贵族月卡,王者月卡
- limitBuy = nil, -- 限时抢购
- leijiChongzhi = nil, -- 累计充值
- giftPack = nil, -- 成长礼包
- heroRise = nil, -- 英雄崛起
- leaveUnionLimit = nil, -- 离开公会后,加入或创建公会时间限制
- roleDot = nil, -- 红点
- chongJi = nil, -- 创角冲级活动
- cdkFix = nil, -- 固定兑换码
- cdk = {},
- roleSys = nil, -- 系统开放标识
- roleSysOpen = nil, -- 系统点击标识
-
- xingYaoGongMing = nil, -- 星耀之门-星耀共鸣
- guide = nil, -- 指引
- lvGuide = nil, -- 等级指引
- sendPfEmail = nil, --开服邮件
-
- limitMangHe = nil, -- 开服 -限时幸运盲盒
- fpsTb = nil, -- fps信息
-
- systemSound = nil, -- 系统设置
- relic = {}, -- 圣器
- adRewardCnt = nil , --每日广告观看次数
- adHatchRewardCnt = nil , --每日广告观看加速孵化次数
- isTip = nil , --钻石加速孵化今日是否提示
- nWeekLoopEndTime = nil, -- 周循环活动结束时间戳
- nWeekLoopEndMail = nil, -- 周循环活动结束处理奖励标识
- nWeekHeroID = nil, -- 周活动-升星英雄ID
- tWeekHeroPrize = nil, -- 周活动-升星奖励信息
- nWeekUseGuYu = nil, -- 周活动消耗古玉数量
- tWeekGuYuPrize = nil, -- 周活动-古玉奖励信息
- nWeekCardType = nil, -- 周活动-抽卡当前类型
- nWeekCardNum = nil, -- 周活动-抽卡数量
- tWeekCardPrize = nil, -- 周活动-抽卡奖励信息
- realmLv = nil, --境界
- RacialTrial = nil, --种族试炼
- nFirstBuy = nil, --第一次购买
- talismanData = nil, --秘宝
- OnlineRewardData = nil, --在线奖励
- nSpeed = nil, -- 特权战斗速度
- tBuyVoucherInflate = nil, -- 代金券 - 膨胀记录(nStatus = 0,nil 未购买,1已购买, nTime = 购买时间)
-
- mergeInfo = {}, --融合信息 {mergeStartTime: 0 , mergeTime: 0, mergeEndTime: 0, heroId: 0}
- gift = {
- unlock = {},
- online = {}
- }, -- 弹窗礼包
- warOrder = { -- 战令相关
- battleOrder = {
- exp = 0,
- finish = {},
- unlock = 0,
- upgradeFinish = {}
- },
- devilOrder = {
- exp = 0,
- finish = {},
- unlock = 0,
- upgradeFinish = {}
- },
- clanOrder = {
- exp = 0,
- finish = {},
- unlock = 0,
- upgradeFinish = {}
- },
- arenaOrder = {
- exp = 0,
- finish = {},
- unlock = 0,
- upgradeFinish = {}
- },
- },
-
- -- 注意 以后再加字段如初始化为非nil 要在下面的newAddDBData同步加,否则老号会报错。
- }
- db.createTime = os.time()
- LuaMongo.insert(DB.db_char, db)
- return db
- end
- local newAddDBData = {
- heroLevelUpgrade = 0, -- 英雄手动升级最大值
- gift = {
- unlock = {},
- online = {}
- }, -- 弹窗礼包
- warOrder = {
- battleOrder = {
- exp = 0,
- finish = {},
- unlock = 0,
- upgradeFinish = {}
- },
- devilOrder = {
- exp = 0,
- finish = {},
- unlock = 0,
- upgradeFinish = {}
- },
- clanOrder = {
- exp = 0,
- finish = {},
- unlock = 0,
- upgradeFinish = {}
- },
- arenaOrder = {
- exp = 0,
- finish = {},
- unlock = 0,
- upgradeFinish = {}
- },
- }, -- 战令相关
- adRewardCnt = nil,
- adHatchRewardCnt = nil,
- mergeInfo = {},
- cdk = {},
- isTip = nil,
- battleType = 1, -- 战役类型(1、普通,2、精英,3、困难)
- guajiID_elite = 0, -- 精英- 已通关关卡/挂机关卡
- guajiID_hard = 0, -- 困难- 已通关关卡/挂机关卡
- battleID_elite = 1, -- 精英-战役即将战斗id
- battleID_hard = 1, -- 困难-战役即将战斗id
- battleRewards_elite = nil, -- 精英征战奖励领取记录
- battleRewards_hard = nil, -- 困难征战奖励领取记录
- battleadopt = 0, -- 普通战役是否通关
- battleadopt_elite = 0, -- 精英战役是否通关
- battleadopt_haed = 0, -- 困难战役是否通关
- }
- local roleDBchanged
- local function handleNew(orgDB, newTable)
- for k, v in pairs(newTable) do
- if not orgDB[k] then
- orgDB[k] = v
- roleDBchanged = true
- elseif type(v) == "table" then
- handleNew(orgDB[k],v)
- end
- end
- end
- function roleDBInit()
- _G.collectgarbage("step", 1000000)
- LuaMongo.find(DB.db_char)
- local list = {}
- local all = 0
- while true do
- local data = {}
- if not LuaMongo.next(data) then
- break
- end
- all = all + 1
- roleDBchanged = nil
- handleNew(data, newAddDBData)
- --暂时特殊处理下
- if not data.newUniqueTag then
- data.newUniqueTag = generateuuid(data.account, Config.NEW_SVR_INDEX)
- LuaMongo.update(DB.db_char, {_id = data._id}, data)
- end
- if roleDBchanged then
- list[#list + 1] = data._id
- end
- end
- print(#list, "/", all)
-
- _G.collectgarbage("step", 1000000)
-
- local query = {}
- for _, v in ipairs(list) do
- query._id = v
- LuaMongo.find(DB.db_char, query)
- local data = {}
- if not LuaMongo.next(data) then
- assert()
- end
- roleDBchanged = nil
- handleNew(data, newAddDBData)
- if not roleDBchanged then
- assert()
- end
- LuaMongo.update(DB.db_char, query, data)
- end
- end
- -------------------- humandb 初始化 end ----------------------
|