-- 跨越 agent 获取数据使用 local RoleCross = {} --*********************************** agent 存在时调用 ****************************************-- RoleCross.bind = function (Role) -- 好友列表简约信息 function Role:friendSInfo() local fteam = self.getProperty("friendTeam") or {} local info = { name = self:getProperty("name"), level = self:getProperty("level"), headId = self:getProperty("headId"), ltime = self:getProperty("ltime"), battleV = fteam.v or 0, --battleV = self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTBVC") or self:getProperty("hangTBV") } return info end -- 好友详细队伍信息 function Role:friendInfo() local info = self:friendSInfo() --local team = self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTSC") or self:getProperty("hangTS") --info.team = team local fteam = self.getProperty("friendTeam") or {} info.team = fteam.team or {} info.heroCnt = self:getProperty("heroCnt") info.achieveCnt = table.numbers(self:getProperty("achiveV")) info.bgId = self:getProperty("bgId") info.hangPass = self:getProperty("hangPass") return info end function Role:addFriend(friendId) local res = mysqlproxy:query(string.format("SELECT * FROM `Friend` WHERE `roleid` = %s AND `fid` = %s;", self:getProperty("id"), friendId)) for _, data in ipairs(res) do local friend = require("models.Friend").new({key = string.format("%d",data.id), id = data.id}) if friend:load(data) then self.friends[friend:getProperty("fid")] = friend end end end function Role:delFriend(friendId) self.friends[friendId] = nil end -- 好友队伍战斗信息 function Role:friendBattleInfo() return self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTBC") or self:getProperty("hangTB") end -- pvp 数据 function Role:pvpCInfo() local info = { name = self:getProperty("name"), level = self:getProperty("level"), headId = self:getProperty("headId"), battleV = self:getProperty("pvpTBVC"), team = self:getProperty("pvpTSC"), battleInfo = self:getProperty("pvpTBC") } return info end -- pvp 数据 function Role:pvpHInfo() local info = { name = self:getProperty("name"), level = self:getProperty("level"), headId = self:getProperty("headId"), battleV = self:getProperty("pvpTBVH"), team = self:getProperty("pvpTSH"), battleInfo = self:getProperty("pvpTBH") } return info end -- 高级pvp 排行榜 function Role:pvpHRankInfo() local info = { name = self:getProperty("name"), level = self:getProperty("level"), headId = self:getProperty("headId"), ltime = self:getProperty("ltime"), battleV = self:getProperty("pvpTBVH"), } return info end function Role:redPTag(tag, pms) pms = pms or 1 local redp = self:getProperty("redp") if not redp[tag] or redp[tag] ~= pms then redp[tag] = pms self:updateProperty({field = "redp", value = redp}) end end function Role:accountInit(initData) -- 道具 local reward = {} for k , v in pairs(initData.items or {}) do reward[tonumber(k)] = v end self:award(reward, {log = {desc = "gm"}}) -- 英雄 local breakL = 0 for i = 0, #csvdb["unit_breakCsv"] do if initData.heros.level >= csvdb["unit_breakCsv"][i].levelLimit then breakL = i else break end end local equip = "" for slot, equipId in pairs(initData.heros.equip) do equip = equip:setv(slot, equipId) end for _, heroId in ipairs(initData.heros.ids) do local hero = self:isHaveHero(heroId) local status if not hero then status, hero = self:addHero({type = heroId, log = {desc = "gm"}}) else status = true end if status then local rune = "" for slot , runeId in pairs(initData.heros.rune) do slot = tonumber(slot) local status, rune_ = self:addRune({type = slot, id = runeId, log = {desc = "gm"}}) if status == 0 then rune = rune:setv(slot, rune_:getProperty("uid")) if initData.heros.runeL and initData.heros.runeL > 0 then rune_:updateProperty({field = "level",value = initData.heros.runeL}) end rune_:updateProperty({field = "refer",value = hero:getProperty("id")}) end end local talent = "" if initData.heros.talent and initData.heros.talent > 0 then talent = talent:setv(0, initData.heros.talent) local talentData = csvdb["unit_talentCsv"][initData.heros.talent] for i = 1, 4 do talent = talent:setv(i, #talentData) end end local aheadLevel = 0 for i = 1, initData.heros.talent - 1 do aheadLevel = aheadLevel + #csvdb["unit_talentCsv"][i] end aheadLevel = aheadLevel + talent:getv(1, 0) hero:updateProperties({ level = initData.heros.level, breakL = breakL, wakeL = initData.heros.wakeL, talent = talent, equip = equip, rune = rune, }) self:checkTaskEnter("Wake", {heroType = heroId, wakeL = initData.heros.wakeL}) self:checkTaskEnter("WakeCG", {heroType = heroId}) self:checkTaskEnter("HeroTalent", {heroType = heroId, alv = aheadLevel}) end end self:checkTaskEnter("HeroLevelUp", {level = initData.heros.level}) -- fb local carbonId = initData.fb local addPre addPre = function(carbonId) local carbonData = csvdb["idle_battleCsv"][carbonId] for _, pre in ipairs(carbonData.prepose:toArray(true, "=")) do self:checkHangPass(pre) self:checkTaskEnter("HangPass", {id = pre}) addPre(pre) end end self:checkHangPass(carbonId) addPre(carbonId) self:checkTaskEnter("HangPass", {id = carbonId}) -- talent if initData.talent and initData.talent > 0 then local dishTree = self.dinerData:getProperty("dishTree") for _, v in pairs(csvdb["diner_treeCsv"]) do for id, _ in pairs(v) do dishTree = dishTree:setv(id, initData.talent) end end self.dinerData:updateProperty({field = "dishTree", value = dishTree}) end -- diner if initData.diner and initData.diner > 0 then local buildL = self.dinerData:getProperty("buildL") for typ, _ in pairs(csvdb["diner_buildingCsv"]) do buildL = buildL:setv(typ, initData.diner) end self.dinerData:updateProperty({field = "buildL", value = buildL}) end return "成功" end function Role:paySpecialReward(roleId, notify) if notify and next(notify) then local reward = {} for key, val in pairs(notify) do for id, count in pairs(val.award:toNumMap()) do reward[id] = (reward[id] or 0) + count end end self:award(reward, {log = {desc = "CapsuleReward", int1=roleId}}) SendPacket(actionCodes.Capsule_notifyChange, MsgPack.pack({special = notify})) end end end --*********************************** agent 不存在时调用 ***************************************-- local CMD = {} local SRole local function unpackRoleField(field, value) if not SRole.schema[field] then return nil end local typ, def = table.unpack(SRole.schema[field]) if typ == "number" then value = tonumber(value or def) elseif typ == "table" then if type(value) == "string" then value = MsgPack.unpack(value) else value = def end end return value end local function packRoleField(field, value) if not SRole.schema[field] then return nil end local typ, def = table.unpack(SRole.schema[field]) if typ == "table" then if type(value) == "table" then value = MsgPack.pack(value) end end return value end local function getRoleKey(roleId) return string.format("role:%d", roleId) end function CMD.setProperty(roleId, field, value) local tb = {} tb[field] = value return CMD.setProperties(roleId, tb) end function CMD.setProperties(roleId, fields) local role = require("models.Role").new({key = string.format("%s",roleId), id = roleId}) return role:updateFields(fields) end function CMD.getProperty(roleId, field) local ret = CMD.getProperties(roleId, {field}) return ret[field] end function CMD.getProperties(roleId, fields) local role = require("models.Role").new({key = string.format("%s",roleId), id = roleId}) local ret = {} local datas = role:loadFields(fields) if datas then for index, key in ipairs(fields) do ret[key] = unpackRoleField(key, datas[key]) end end return ret end function CMD.friendSInfo(roleId) --local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "pvpTBVC", "hangTBV"}) local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "friendTeam"}) local fteam = info.friendTeam or {} return { name = info.name, level = info.level, headId = info.headId, ltime = info.ltime, --battleV = info.pvpTBVC ~= 0 and info.pvpTBVC or info.hangTBV, battleV = fteam.v or 0, } end function CMD.friendInfo(roleId) --local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "pvpTBVC", "hangTBV", "pvpTSC", "hangTS"}) local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "friendTeam", "heroCnt", "achiveV", "bgId", "hangPass"}) local fteam = info.friendTeam or {} return { name = info.name, level = info.level, headId = info.headId, ltime = info.ltime, --battleV = info.pvpTBVC ~= 0 and info.pvpTBVC or info.hangTBV, --team = info.pvpTBVC ~= 0 and info.pvpTSC or info.hangTS battleV = fteam.v or 0, team = fteam.team or {}, heroCnt = info.heroCnt, achieveCnt = table.numbers(info.achiveV), bgId = info.bgId, hangPass = info.hangPass, } end function CMD.friendBattleInfo(roleId) --local info = CMD.getProperties(roleId, {"pvpTBC", "hangTB"}) local info = CMD.getProperties(roleId, {"friendTeam"}) --return (next(info.pvpTBC) and next(info.pvpTBC.heros)) and info.pvpTBC or info.hangTB local fteam = info.friendTeam or {} return fteam.bInfo or {} end function CMD.pvpCInfo(roleId) local info = CMD.getProperties(roleId, {"name", "level", "headId", "pvpTBVC", "pvpTSC", "pvpTBC"}) return { name = info.name, level = info.level, headId = info.headId, battleV = info.pvpTBVC, team = info.pvpTSC, battleInfo = info.pvpTBC } end function CMD.pvpHInfo(roleId) local info = CMD.getProperties(roleId, {"name", "level", "headId", "pvpTBVH", "pvpTSH", "pvpTBH"}) return { name = info.name, level = info.level, headId = info.headId, battleV = info.pvpTBVH, team = info.pvpTSH, battleInfo = info.pvpTBH } end -- 高级pvp 排行榜 function CMD.pvpHRankInfo(roleId) local info = CMD.getProperties(roleId, {"name", "level", "headId", "pvpTBVH", "ltime"}) local info = { name = info.name, level = info.level, headId = info.headId, ltime = info.ltime, battleV = info.pvpTBVH, } return info end -- 记录红点 function CMD.redPTag(roleId, tag, pms) pms = pms or 1 local redp = CMD.getProperty(roleId, "redp") if not redp[tag] or redp[tag] ~= pms then redp[tag] = pms CMD.setProperty(roleId, "redp", redp) end end function CMD.paySpecialReward(roleId, notify) if notify and next(notify) then local reward = {} for key, val in pairs(notify) do for id, count in pairs(val.award:toNumMap()) do reward[id] = (reward[id] or 0) + count end end local role = require("models.Role").new({key = string.format("%s",roleId), id = roleId}) role:award(reward, {log = {desc = "CapsuleReward", int1=roleId}}) end end RoleCross.handle = function(cmd, roleId, ...) SRole = SRole or require("models.Role") if CMD[cmd] then return CMD[cmd](roleId, ...) end end return RoleCross