RoleCross.lua 9.05 KB

-- 跨越 agent 获取数据使用
local RoleCross = {}

--*********************************** agent 存在时调用  ****************************************--
RoleCross.bind = function (Role)
	-- 好友列表简约信息
	function Role:friendSInfo()
		local info = {
			name = self:getProperty("name"),
			level = self:getProperty("level"),
			headId = self:getProperty("headId"),
			ltime = self:getProperty("ltime"),
			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
		return info
	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

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 value = packRoleField(field, value) 
	if not value then return end
	return redisproxy:hset(getRoleKey(roleId), field, value)
end


function CMD.setProperties(roleId, fields)
	local result = {}
	for k,v in pairs(fields) do
		local value = packRoleField(k, v)
		if value then
			result[#result + 1] = k
			result[#result + 1] = value
		end
	end
	return redisproxy:hmset(getRoleKey(roleId), table.unpack(result))
end

function CMD.getProperty(roleId, field)
	return unpackRoleField(field ,redisproxy:hget(getRoleKey(roleId), field))
end

function CMD.getProperties(roleId, fields)
	local returnValue = redisproxy:hmget(getRoleKey(roleId), table.unpack(fields))
	local ret = {}
	for index, key in ipairs(fields) do
		ret[key] = unpackRoleField(key, returnValue[index])
	end
	return ret
end

function CMD.friendSInfo(roleId)
	local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "pvpTBVC", "hangTBV"})
	return {
		name = info.name,
		level = info.level,
		headId = info.headId,
		ltime = info.ltime,
		battleV = info.pvpTBVC ~= 0 and info.pvpTBVC or info.hangTBV,
	}
end

function CMD.friendInfo(roleId)
	local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "pvpTBVC", "hangTBV", "pvpTSC", "hangTS"})
	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
	}
end

function CMD.friendBattleInfo(roleId)
	local info = CMD.getProperties(roleId, {"pvpTBC", "hangTB"})
	return (next(info.pvpTBC) and next(info.pvpTBC.heros)) and info.pvpTBC or info.hangTB
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

RoleCross.handle = function(cmd, roleId, ...)
	SRole = SRole or require("models.Role")
	if CMD[cmd] then
		return CMD[cmd](roleId, ...)
	end
end

return RoleCross