local dataMode = require "dataMode" local timeUtil = require("utils.timeUtil") local serverLogUtil = require("utils.serverLogUtil") local sessionData = require("data.session") local moduleData = require("data.module") local root = class("role") -- 角色构造 function root:ctor(uid, gSession) local mapClass = dataMode.get_module_class_map() self.uid = uid self.gateNode = nil self.gateAgent = nil self.moduleList = {} -- self.createTime = timeUtil.currentTime() for _, moduleClass in pairs(mapClass) do local cname = moduleClass.__cname assert(self[cname] == nil) local moduleObj = moduleClass.new(uid) if moduleObj.isPersonal then self[cname] = moduleObj table.insert(self.moduleList, cname) end end end -- 登陆各个模块 function root:login(session) -- 模块载入热数据 self:load_modules() -- 初始化session 信息 local nodeInfo = {nodeName = session.gateNode, agent = session.gateAgent} sessionData:user_update_cluster_info(self.uid, "gate", nodeInfo) nodeInfo.nodeName = session.gameNode nodeInfo.agent = session.gameAgent sessionData:user_update_cluster_info(self.uid, "game", nodeInfo) -- 记录网关节点信息 self.gateNode = session.gateNode self.gateAgent = session.gateAgent for _, cname in pairs(self.moduleList) do self[cname]:do_login() end end -- 加载模块 function root:load_modules() for _, cname in ipairs(self.moduleList) do self[cname]:get_data_from_db() end end -- 登出各个模块 function root:logout_modules() for _, cname in pairs(self.moduleList) do self[cname]:do_logout() self[cname]:backup_to_db() end -- 埋点 local currTime = timeUtil.now(self.uid) local loginTime = moduleData:hget_int(self.uid, "player", "loginTime") loginTime = (not loginTime or loginTime == 0) and currTime or loginTime local mins = currTime - loginTime local bandShareCode = moduleData:hget(self.uid, "user", "bandShareCode") local channel = moduleData:get_channel(self.uid) local version = moduleData:get_version(self.uid) serverLogUtil.logLogout(self.uid, bandShareCode or "", channel, version, mins) -- 删除玩家session信息 sessionData:user_update_cluster_info(self.uid, "gate") sessionData:user_update_cluster_info(self.uid, "game") end -- 初始化游戏事件 function root:init_game_event() self.eventIdMap = nil for _, cname in pairs(self.moduleList) do if self[cname].get_listen_event_list then local eventIdList = self[cname]:get_listen_event_list() for _, eventId in ipairs(eventIdList or {}) do self.eventIdMap = self.eventIdMap or {} self.eventIdMap[eventId] = self.eventIdMap[eventId] or {} table.insert(self.eventIdMap[eventId], cname) end end end end -- 分派玩家事件 function root:dispath_game_event(id, params) if not self.eventIdMap then self:init_game_event() end if self.eventIdMap == nil or not self.eventIdMap[id] then return end for _, cname in pairs(self.eventIdMap[id]) do self[cname]:user_game_event(id, params) end end return root