-------------------------------------------------------
-- 头像&头像框

-- head = nil,    							-- 头像
-- headList = nil, 							-- 已激活头像列表（除默认赠送外）
-- headFrame = nil,                     	-- 头像框
-- headFrameList = nil,                  	-- 已激活头像框列表（除默认赠送外）
-- body = nil,								-- 形象
-- bodyList = nil,							-- 已激活形象
-- chenghao = nil,							-- 称号
-- chenghaoList = nil,						-- 已激活称号
-- headHasNewFlag = nil,					-- 头像1/头像框2/形象4/称号8有新的flag

--------------------------------------------------------
local Util = require("common.Util")
local Lang = require("common.Lang")
local Log = require("common.Log")
local LogDefine = require("common.LogDefine")
local RoleExcel = require("excel.role")
local HeroExcel = require("excel.hero")
local Msg = require("core.Msg")
local ObjHuman = require("core.ObjHuman")
local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
local Broadcast = require("broadcast.Broadcast")
local CombatPosLogic = require("combat.CombatPosLogic")
local CombatDefine = require("combat.CombatDefine")
local ChenghaoImp = require("role.ChenghaoImp")
local RoleDBLogic = require("role.RoleDBLogic")
local RoleDefine = require("role.RoleDefine")
local RoleAttr = require("role.RoleAttr")
local RoleLogic = require("role.RoleLogic")
local ObjHumam = require("core.ObjHuman")
local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
local HeroLogic = require("hero.HeroLogic")
local TheStarsDBLogic = require("theStars.TheStarsDBLogic")
local Timer = require("core.Timer")
local TriggerLogic = require("trigger.TriggerLogic")
local TriggerDefine = require("trigger.TriggerDefine")
local Config = require("Config")
local SkinConfig = require("excel.skin").skin
local CommonDefine = require("common.CommonDefine")

HEAD_TYPE_1 = 1 -- 头像
HEAD_TYPE_2 = 2 -- 头像框
HEAD_TYPE_3 = 3 -- 形象
HEAD_TYPE_4 = 4 -- 称号
HEAD_TYPE_5 = 5 -- 立绘
HEAD_TYPE_6 = 6 -- 背景

DEFAULT_FREE_ACTIVE_TYPE = 2	-- 默认激活类型

DEFAULT_HEAD_MALE_ID = 1	-- 默认男性头像id
DEFAULT_HEAD_FEMALE_ID = 2  -- 默认女性头像id

DEFAULT_HEADFREAM_ID = 6000 -- 默认头像框id
DEFAULT_BACKGROUND_ID = 1010 -- 默认背景id

DEFAULT_DEL_TYPE = 99

-- 背景解锁 类型
BACKGROUND_TYPE_4 =  4      -- 战役通关X关

local function getConfig(headType, id)
	if headType == HEAD_TYPE_1 then
		return RoleExcel.head[id]
	elseif 	headType == HEAD_TYPE_2 then
		return RoleExcel.headFrame[id] 
	elseif 	headType == HEAD_TYPE_3 then
		return RoleExcel.body[id] 
	elseif 	headType == HEAD_TYPE_4 then
		return RoleExcel.chenghao[id]
	elseif 	headType == HEAD_TYPE_5 then
		return RoleExcel.body[id]
	elseif 	headType == HEAD_TYPE_6 then
		return RoleExcel.background[id]
	end
end

--定时函数,用来检查称号过期
local function timeFunc(human)
    -- if not IsOnline then
    --     return
    -- end

	if not ObjHuman.onlineNewUniqueTag[human.db.newUniqueTag] then
        return
    end

	if human and human.db.chenghaoList then
		local isContinue = false
		for id, data in pairs(human.db.chenghaoList) do
			if type(data) == "table" and data.keepTime then
				isActive(human, HEAD_TYPE_4, id)
				isContinue = true
			end
		end
		if isContinue then
			local tag = human.db.newUniqueTag
			Timer.addLater(60, function()
                local h = ObjHuman.onlineNewUniqueTag[tag]
                if not h then return end
                timeFunc(h)
            end)
		end
	end
end

function onLogin(human)
	timeFunc(human)
	RoleLogic.onLogin(human)
end

function isActive(human, headType, id)
    local config = nil
	local checkDB = nil
	if headType == HEAD_TYPE_1 then -- 头像
        config = RoleExcel.head[id]
		if id == DEFAULT_HEAD_MALE_ID or 
			id == DEFAULT_HEAD_FEMALE_ID or
            config.type == DEFAULT_FREE_ACTIVE_TYPE then
			return true
		end
		if not human.db.headList then
			return
		end	
		checkDB = human.db.headList[id]
	elseif headType == HEAD_TYPE_2 then -- 头像框
        config = RoleExcel.headFrame[id]
		if id == DEFAULT_HEADFREAM_ID or
           config.type == DEFAULT_FREE_ACTIVE_TYPE then
			return true
		end
		if not human.db.headFrameList then
			return
		end	
		checkDB = human.db.headFrameList[id]
	elseif headType == HEAD_TYPE_3 then -- 形象
        config = RoleExcel.body[id]
        if config.type == DEFAULT_FREE_ACTIVE_TYPE then
			return true
		end

		if not human.db.bodyList then
			return
		end	
		checkDB = human.db.bodyList[id]
	elseif headType == HEAD_TYPE_4 then -- 称号
        config = RoleExcel.chenghao[id]
        if config.type == DEFAULT_FREE_ACTIVE_TYPE then
			return true
		end

		if not human.db.chenghaoList then
			return
		end
		checkDB = human.db.chenghaoList[id]
	elseif headType == HEAD_TYPE_5 then -- 立绘
        config = RoleExcel.body[id]
        if config.type == DEFAULT_FREE_ACTIVE_TYPE then
			return true
		end

		if not human.db.animationList then
			return
		end	
		checkDB = human.db.animationList[id]
	elseif headType == HEAD_TYPE_6 then -- 背景
        config = RoleExcel.background[id]
        if config.type == DEFAULT_FREE_ACTIVE_TYPE or
            id == DEFAULT_BACKGROUND_ID then
			return true
		elseif config.type == BACKGROUND_TYPE_4 then
			if human.db.battleID >= config.need then
				return true
			end
		end

		if not human.db.backgroundList then
			return
		end
		checkDB = human.db.backgroundList[id]
	end
	
	if checkDB == nil then
		return
	end
	
	if checkDB == true then
		return true
	end
	
	if checkDB.keepTime < 0 or (checkDB.ts + checkDB.keepTime > os.time()) then
		return true
	else
		-- 过期了
		unActive(human.db._id, headType, id)
	end
end

function active(human, headType, id)
	local conf = getConfig(headType, id)
	if conf == nil then
		return
	end

    local keepTime = conf.keepTime * 60*60        -- conf.keepTime  为小时数
	if isActive(human, headType, id) then
		if headType == HEAD_TYPE_4 and keepTime > 0 then
		else
			return
		end		
	end

	if headType == HEAD_TYPE_1 then -- 头像
		human.db.headList = human.db.headList or {}
		if keepTime == nil then
			human.db.headList[id] = true
		else
			human.db.headList[id] = {ts = os.time(), keepTime = keepTime}
		end
	elseif headType == HEAD_TYPE_2 then -- 头像框
		human.db.headFrameList = human.db.headFrameList or {}
		if keepTime == nil then
			human.db.headFrameList[id] = true
		else
			human.db.headFrameList[id] = {ts = os.time(), keepTime = keepTime}
		end
	elseif headType == HEAD_TYPE_3 then -- 形象
		human.db.bodyList = human.db.bodyList or {}
		if keepTime == nil then
			human.db.bodyList[id] = true
		else
			human.db.bodyList[id] = {ts = os.time(), keepTime = keepTime}
		end
        if human.db.body == nil then
            human.db.body = id
            -- 通知客户端
		    local msgRet = Msg.gc.GC_ROLE_HEAD_SET
		    msgRet.headID = id
		    msgRet.headType = headType
		    Msg.send(msgRet, human.fd)
        end
	elseif headType == HEAD_TYPE_4 then -- 称号
		if conf.group ~= 0 then
			for k, v in pairs(RoleExcel.chenghao) do
				if k ~= id and v.group == conf.group then
					unActive(human.db._id, HEAD_TYPE_4, k)
				end
			end
		end
		
		human.db.chenghaoList = human.db.chenghaoList or {}
		if keepTime == nil then
			human.db.chenghaoList[id] = true
		else
			human.db.chenghaoList[id] = {ts = os.time(), keepTime = keepTime}
			timeFunc(human)
		end
    elseif headType == HEAD_TYPE_5 then -- 立绘
		human.db.animationList = human.db.animationList or {}
		if keepTime == nil then
			human.db.animationList[id] = true
		else
			human.db.animationList[id] = {ts = os.time(), keepTime = keepTime}
		end
        if human.db.animation == nil then
            human.db.animation = id
            -- 通知客户端
		    local msgRet = Msg.gc.GC_ROLE_HEAD_SET
		    msgRet.headID = id
		    msgRet.headType = headType
			msgRet.headID = GetCorrectBodyId(human)

		    Msg.send(msgRet, human.fd)
        end
	elseif headType == HEAD_TYPE_6 then -- 背景
		human.db.backgroundList = human.db.backgroundList or {}
		if keepTime == nil then
			human.db.backgroundList[id] = true
		else
			human.db.backgroundList[id] = {ts = os.time(), keepTime = keepTime}
		end
	end
	
	setNewFlag(human, headType, true)

	if #conf.attrs > 0 then
		RoleAttr.cleanHeroAttrCache(human)
		ObjHuman.doCalcHero(human)
		ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
	end

	RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_101)
end

function unActive(uuid, headType, id)
	local changed = nil
    local human = ObjHumam.onlineUuid[uuid]
	if headType == HEAD_TYPE_1 then -- 头像
		local db = RoleDBLogic.getDb(uuid,{head = 1, headList = 1})
		if db.headList and db.headList[id] then
			db.headList[id] = nil
			if db.head == id then
				db.head = DEFAULT_HEAD_MALE_ID
                if human then
                    human.db.head = DEFAULT_HEAD_MALE_ID
                end
			end
			RoleDBLogic.saveRoleSset(db)
			changed = true
		end
	elseif headType == HEAD_TYPE_2 then -- 头像框
		local db = RoleDBLogic.getDb(uuid,{headFrame = 1, headFrameList = 1})
		if db.headFrameList and db.headFrameList[id] then
			db.headFrameList[id] = nil
			if db.headFrame == id then
				db.headFrame = DEFAULT_HEADFREAM_ID
                if human then
                    human.db.headFrame = DEFAULT_HEADFREAM_ID
                end
			end
			RoleDBLogic.saveRoleSset(db)
			changed = true
		end
	elseif headType == HEAD_TYPE_3 then -- 形象
		local db = RoleDBLogic.getDb(uuid,{body = 1, bodyList = 1})
		if db.bodyList and db.bodyList[id] then
			db.bodyList[id] = nil
			if db.body == id then
				db.body = nil
                if human then
                    human.db.body = nil
                end
			end
			RoleDBLogic.saveRoleSset(db)
			changed = true
		end
	elseif headType == HEAD_TYPE_4 then -- 称号
		local db = RoleDBLogic.getDb(uuid,{chenghao = 1, chenghaoList = 1})
		if db.chenghaoList and db.chenghaoList[id] then
			db.chenghaoList[id] = nil
			if db.chenghao == id then
				db.chenghao = nil
                if human then
                    human.db.chenghao = nil
                end
			end
			RoleDBLogic.saveRoleSset(db)
			changed = true
		end
    elseif headType == HEAD_TYPE_5 then -- 立绘
		local db = RoleDBLogic.getDb(uuid,{body = 1, animationList = 1})
		if db.animationList and db.animationList[id] then
			db.animationList[id] = nil
			if db.animation == id then
				db.animation = nil
                if human then
                    human.db.animation = nil
                end
			end
			RoleDBLogic.saveRoleSset(db)
			changed = true
		end
	elseif headType == HEAD_TYPE_6 then -- 背景
		local db = RoleDBLogic.getDb(uuid,{chenghao = 1, backgroundList = 1})
		if db.backgroundList and db.backgroundList[id] then
			db.backgroundList[id] = nil
			if db.background == id then
				db.background = nil
                if human then
                    human.db.background = nil
                end
			end
			RoleDBLogic.saveRoleSset(db)
			changed = true
		end
	end
	
	if changed then
		if human then
            RoleAttr.cleanHeroAttrCache(human)
			local config = getConfig(headType, id)
			if config and #config.attrs > 0 then
				ObjHuman.doCalcHero(human)
			end
            ObjHuman.sendHumanInfo(human)
			ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
		end
	end
end

-- 是否有红点
function isDotByType(human, headType)
	if human.db.headHasNewFlag == nil then
		return
	end
	
	local val = human.db.headHasNewFlag or 0
	local bit = Util.getBit(val, headType) 
	if bit ~= 0 then
		return true
	end
end

function setNewFlag(human, type, flag)
	local val = human.db.headHasNewFlag or 0
	if (Util.getBit(val, type) > 0) == flag then
		return 
	end
	
	if flag == true then
		val = Util.setBit(val, type)
	else
		local bit = Util.getBit(val, type) 
		if bit ~= 0 then
			val = val - 2 ^ type
		end
	end
	
	if val == 0 then
		val = nil
	end
	human.db.headHasNewFlag = val
end

function query(human, headType)
	if headType < HEAD_TYPE_1 or headType > HEAD_TYPE_6 then
		return
	end

	local msgRet = Msg.gc.GC_ROLE_HEAD_QUERY
	msgRet.type = headType
	msgRet.headList[0] = 0

	msgRet.isDot[0] = 4
	msgRet.isDot[1] = isDotByType(human, HEAD_TYPE_1) and 1 or 0
	msgRet.isDot[2] = isDotByType(human, HEAD_TYPE_2) and 1 or 0
	msgRet.isDot[3] = isDotByType(human, HEAD_TYPE_3) and 1 or 0
	msgRet.isDot[4] = isDotByType(human, HEAD_TYPE_4) and 1 or 0
	
	if headType == HEAD_TYPE_1 then -- 头像
		for id, cf in pairs(RoleExcel.head) do
            if cf.type ~= DEFAULT_DEL_TYPE then
			   msgRet.headList[0] = msgRet.headList[0] + 1
			   local headNet = msgRet.headList[msgRet.headList[0]]
			   headNet.headID = id 
			   headNet.isActive = isActive(human, HEAD_TYPE_1, id) and 1 or 0	
			   headNet.desc = cf.desc or ""
			   headNet.keepTime = getKeepTime(human, HEAD_TYPE_1, id)
			   headNet.name = cf.name or ""
			   headNet.camp = cf.camp or 0
               local len = #cf.attrs 
               for i = 1,len do
                   headNet.attr[i].key = cf.attrs[i][1]
                   headNet.attr[i].value = cf.attrs[i][2]
               end
               headNet.attr[0] = len
            end
		end
		msgRet.useID = human.db.head or 0
	elseif headType == HEAD_TYPE_2 then -- 头像框
		for id, cf in pairs(RoleExcel.headFrame) do
            if cf.type ~= DEFAULT_DEL_TYPE then
			   msgRet.headList[0] = msgRet.headList[0] + 1
			   local headNet = msgRet.headList[msgRet.headList[0]]
			   headNet.headID = id 
			   headNet.isActive = isActive(human, HEAD_TYPE_2, id) and 1 or 0	
			   headNet.desc = cf.desc or ""
			   headNet.keepTime = getKeepTime(human, HEAD_TYPE_2, id)
			   headNet.name = cf.name or ""
			   headNet.camp = cf.camp or 0
               local len = #cf.attrs 
               for i = 1,len do
                   headNet.attr[i].key = cf.attrs[i][1]
                   headNet.attr[i].value = cf.attrs[i][2]
               end
               headNet.attr[0] = len
            end
		end
		msgRet.useID = human.db.headFrame or 0
	elseif headType == HEAD_TYPE_3 then -- 形象
		for id, cf in pairs(RoleExcel.body) do
            if cf.type ~= DEFAULT_DEL_TYPE then
			   msgRet.headList[0] = msgRet.headList[0] + 1
			   local headNet = msgRet.headList[msgRet.headList[0]]
			   headNet.headID = id 
			   headNet.isActive = isActive(human, HEAD_TYPE_3, id) and 1 or 0	
			   headNet.desc = cf.desc or ""
			   headNet.keepTime = getKeepTime(human, HEAD_TYPE_3, id)
			   headNet.name = cf.name or ""
			   headNet.camp = 0
               local len = #cf.attrs 
               for i = 1,len do
                   headNet.attr[i].key = cf.attrs[i][1]
                   headNet.attr[i].value = cf.attrs[i][2]
               end
               headNet.attr[0] = len
            end
		end
		msgRet.useID = human.db.body or 0
	elseif headType == HEAD_TYPE_4 then -- 称号
		msgRet.headList[0] = 0
		msgRet.useID = 0
		
		ChenghaoImp.query(human)
    elseif headType == HEAD_TYPE_5 then -- 立绘
		for id, cf in pairs(RoleExcel.body) do
            if cf.type ~= DEFAULT_DEL_TYPE then
			   msgRet.headList[0] = msgRet.headList[0] + 1
			   local headNet = msgRet.headList[msgRet.headList[0]]
			   headNet.headID = id 
			   headNet.isActive = isActive(human, HEAD_TYPE_5, id) and 1 or 0	
			   headNet.desc = cf.desc or ""
			   headNet.keepTime = getKeepTime(human, HEAD_TYPE_5, id)
			   headNet.name = cf.name or ""
			   headNet.camp = cf.camp or 0
               headNet.attr[0] = 0
            end
		end
		msgRet.useID = GetCorrectBodyId(human)
	elseif headType == HEAD_TYPE_6 then -- 背景
		for id, cf in pairs(RoleExcel.background) do
            if cf.type ~= DEFAULT_DEL_TYPE then
			   msgRet.headList[0] = msgRet.headList[0] + 1
			   local headNet = msgRet.headList[msgRet.headList[0]]
			   headNet.headID = id 
			   headNet.isActive = isActive(human, HEAD_TYPE_6, id) and 1 or 0	
			   headNet.desc = cf.desc or ""
			   headNet.keepTime = getKeepTime(human, HEAD_TYPE_6, id)
			   headNet.name = cf.name or ""
			   headNet.camp = cf.camp or 0
               headNet.attr[0] = 0
            end
		end
		msgRet.useID = human.db.background or 0
	end
	
	setNewFlag(human, headType, nil)
	
	--Msg.trace(msgRet)
	Msg.send(msgRet, human.fd)

	RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_101)
end

-- 背景立绘查询
function bgAndLhQuery(human)
	local msgRet = Msg.gc.GC_ROLE_BG_LH_QUERY
    msgRet.data[0] = 2
    local dataNet = msgRet.data[1]
	dataNet.headList[0] = 0
	for id, cf in pairs(RoleExcel.body) do
		dataNet.headList[0] = dataNet.headList[0] + 1
        dataNet.type = HEAD_TYPE_5
		local headNet = dataNet.headList[dataNet.headList[0]]
		headNet.headID = id 
		headNet.isActive = isActive(human, HEAD_TYPE_5, id) and 1 or 0	
		headNet.desc = cf.desc or ""
		headNet.keepTime = getKeepTime(human, HEAD_TYPE_5, id)
		headNet.name = cf.name or ""
		headNet.camp = cf.camp or 0
        headNet.attr[0] = 0
	    dataNet.useID = GetCorrectBodyId(human)
	end
    setNewFlag(human, HEAD_TYPE_5, nil)
    dataNet = msgRet.data[2]
	dataNet.headList[0] = 0
	local bl = true
	for id, cf in pairs(RoleExcel.background) do
		bl = true
		if cf.type == 5 and not isActive(human, HEAD_TYPE_3, id) then -- 皮肤新增的背景图，只发已经激活的
			bl = false
		end

		if bl then
			dataNet.headList[0] = dataNet.headList[0] + 1
			local headNet = dataNet.headList[dataNet.headList[0]]
			dataNet.type = HEAD_TYPE_6
			headNet.headID = id 
			-- headNet.isActive = isActive(human, HEAD_TYPE_6, id) and 1 or 0
			headNet.desc = cf.desc or ""
			-- headNet.keepTime = getKeepTime(human, HEAD_TYPE_6, id)
			headNet.name = cf.name or ""
			headNet.camp = cf.camp or 0
			headNet.attr[0] = 0
			if cf.type == 5 then -- 皮肤新增的背景图
				-- 根据皮肤的body值来判断
				headNet.isActive = 1
				headNet.keepTime = getKeepTime(human, HEAD_TYPE_3, id)
			else
				headNet.isActive = isActive(human, HEAD_TYPE_6, id) and 1 or 0
				headNet.keepTime = getKeepTime(human, HEAD_TYPE_6, id)
			end
			dataNet.useID = human.db.background or 0
		end

	end
    setNewFlag(human, HEAD_TYPE_6, nil)
	
	Msg.send(msgRet, human.fd)

	RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_101)
end

--获取角色当前形象数据，如:头像,形象。。。
function getRoleAppearance(human, type)
	if not type or type < HEAD_TYPE_1 or type > HEAD_TYPE_6 then
		return
	end

	local adornId = 0
	if type == HEAD_TYPE_1 then
		adornId = human.db.head or 0
	elseif type == HEAD_TYPE_2 then
		adornId = human.db.headFrame or 0
	elseif type == HEAD_TYPE_3 then
		adornId = human.db.body or 0
	elseif type == HEAD_TYPE_5 then
		adornId = GetCorrectBodyId(human)
	elseif type == HEAD_TYPE_6 then
		adornId = human.db.background or 0
	end
	return adornId
end

-- 获取当前角色已获得的某类装饰的所有数据
function GetRoleAdornInfo(human, adornType)
	if not adornType or adornType < HEAD_TYPE_1 or adornType > HEAD_TYPE_6 then
		return
	end

	if adornType == HEAD_TYPE_1 then
		return human.db.headList
	elseif adornType == HEAD_TYPE_2 then
		return human.db.headFrameList
	elseif adornType == HEAD_TYPE_3 then
		return human.db.bodyList
	elseif adornType == HEAD_TYPE_4 then
		return human.db.chenghaoList
	elseif adornType == HEAD_TYPE_5 then
		return human.db.animationList
	elseif adornType == HEAD_TYPE_6 then
		return human.db.backgroundList
	end
end




-- 设置头像/头像框/形象
function setHead(human, headID, headType)
	if headType < HEAD_TYPE_1 or headType > HEAD_TYPE_6 then
		return
	end

	local finalType = headType
	if headType == HEAD_TYPE_6 then
		local backgroundCfg = RoleExcel.background[headID]
		if backgroundCfg and backgroundCfg.type == 5 then
			finalType = HEAD_TYPE_3
		end
	end

	if isActive(human, finalType, headID) ~= true then
		return
	end

	local changed = nil
	local useID = nil
	if headType == HEAD_TYPE_1 then -- 头像
		useID = human.db.head or 0
		if useID == headID then
			return
		end
		human.db.head = headID
		changed = true
		TriggerLogic.PublishEvent(TriggerDefine.SET_HEAD, human.db._id, 1)
	elseif headType == HEAD_TYPE_2 then -- 头像框
		useID = human.db.headFrame or 0
		if useID == headID then
			return
		end
		human.db.headFrame = headID
		changed = true
		TriggerLogic.PublishEvent(TriggerDefine.SET_HEAD_FRAME, human.db._id, 1)
	elseif headType == HEAD_TYPE_3 then -- 形象
		useID = human.db.body or 0
		if useID == headID then
			return
		end
		human.db.body = headID
		changed = true
		TriggerLogic.PublishEvent(TriggerDefine.SET_MODELING, human.db._id, 1)

        -- 查询是否有占领王座，如有占领，更改形象
        local list = TheStarsDBLogic.getThroneList()
        for i, v in ipairs(list) do
            if v.uuid ~= nil and v.uuid == human.db._id then
                v.body = headID
                TheStarsDBLogic.updateThroneDB(v)
                break
            end
        end
	elseif headType == HEAD_TYPE_4 then -- 称号
		useID = human.db.chenghao or 0
		if useID == headID then
			return
		end
		human.db.chenghao = headID
		changed = true
		TriggerLogic.PublishEvent(TriggerDefine.SET_TITLE, human.db._id, 1)
    elseif headType == HEAD_TYPE_5 then -- 立绘
		useID = human.db.animation or 0
		if useID == headID then
			return
		end
		human.db.animation = headID
		changed = true
	elseif headType == HEAD_TYPE_6 then -- 背景
		useID = human.db.background or 0
		if useID == headID then
			return
		end
		human.db.background = headID
		changed = true
	end
	
    RoleAttr.cleanHeroAttrCache(human)

	if changed == true then
		-- 通知客户端
		local msgRet = Msg.gc.GC_ROLE_HEAD_SET
		msgRet.headID = headID
		msgRet.headType = headType
		if headType == HEAD_TYPE_5 then
			msgRet.headID = GetCorrectBodyId(human)
		end
		Msg.send(msgRet, human.fd)

		--同步头像设置
        if headType == HEAD_TYPE_5 or headType == HEAD_TYPE_6 then -- 立绘
            bgAndLhQuery(human)
        else
		    query(human, headType)
        end

		if headType == HEAD_TYPE_1 then -- 头像
			HuanJingTowerLogic.changeHeadAfter(human)	
		end

		if headType == HEAD_TYPE_1 or headType == HEAD_TYPE_2 or headType == HEAD_TYPE_3 then
			local showType = 3
			if headType == HEAD_TYPE_2 then
				showType = 4
			elseif headType == HEAD_TYPE_3 then
				showType = 5
			end
			local GodsAreaNS = require("godsArea.GodsAreaNS")
			GodsAreaNS.UpdateShowData(human, showType)

			local BaiZhanChengShenNS = require("baiZhanChengShen.BaiZhanChengShenNS")
			local BaiZhanChengShenDefine = require("baiZhanChengShen.BaiZhanChengShenDefine")
			if headType == HEAD_TYPE_1 then
				BaiZhanChengShenNS.UpdateShowInfo(human, BaiZhanChengShenDefine.BZCS_UPDATE_SHOW_HEAD)
			elseif headType == HEAD_TYPE_2 then
				BaiZhanChengShenNS.UpdateShowInfo(human, BaiZhanChengShenDefine.BZCS_UPDATE_SHOW_HEAD_FRAME)
			elseif headType == HEAD_TYPE_3 then
				BaiZhanChengShenNS.UpdateShowInfo(human, BaiZhanChengShenDefine.BZCS_UPDATE_SHOW_BODY)
			end
		end
	end
end

function getKeepTime(human, headType, id)
    local config = nil
	local checkDB = nil
	if headType == HEAD_TYPE_1 then -- 头像
        if id == DEFAULT_HEAD_MALE_ID or 
			id == DEFAULT_HEAD_FEMALE_ID then
			return -1
		end

        config = RoleExcel.head[id]
        if config == nil then
            return 0
        end

		if not human.db.headList then
		    return config.keepTime == -1 and config.keepTime or config.keepTime*60*60
        end	

		checkDB = human.db.headList[id]
	elseif headType == HEAD_TYPE_2 then -- 头像框
        if id == DEFAULT_HEADFREAM_ID then
			return -1
		end
        
        config = RoleExcel.headFrame[id]
        if config == nil then
            return 0
        end

		if not human.db.headFrameList then
			return config.keepTime == -1 and config.keepTime or config.keepTime*60*60
		end	
		checkDB = human.db.headFrameList[id]
	elseif headType == HEAD_TYPE_3 then -- 形象
        
        config = RoleExcel.body[id]
        if config == nil then
            return 0
        end

        if not human.db.bodyList then
			return config.keepTime == -1 and config.keepTime or config.keepTime*60*60
		end	
		checkDB = human.db.bodyList[id]
	elseif headType == HEAD_TYPE_4 then -- 称号

        config = RoleExcel.chenghao[id]
        if config == nil then
            return 0
        end

        if not human.db.chenghaoList then
			return config.keepTime == -1 and config.keepTime or config.keepTime*60*60
		end	

		checkDB = human.db.chenghaoList[id]
    elseif headType == HEAD_TYPE_5 then -- 立绘
        
        config = RoleExcel.body[id]
        if config == nil then
            return 0
        end

        if not human.db.animationList then
			return config.keepTime == -1 and config.keepTime or config.keepTime*60*60
		end	
		checkDB = human.db.animationList[id]
	elseif headType == HEAD_TYPE_6 then -- 背景

        config = RoleExcel.background[id]
        if config == nil then
            return 0
        end

        if not human.db.backgroundList then
			return config.keepTime == -1 and config.keepTime or config.keepTime*60*60
		end	

		checkDB = human.db.backgroundList[id]
	end
	
	if checkDB == nil then
		return 0
	end
	
	if checkDB == true then
		return -1
	end
	
    if checkDB.keepTime < 0 then
        return -1
    end

    local now = os.time()
	if checkDB.ts + checkDB.keepTime <= now then
		return 0
	else
        return checkDB.ts + checkDB.keepTime  - now
	end
end

-- 获得英雄回调
function onAddHero(human, heroID)
	local heroConfig = HeroExcel.hero[heroID] 
	active(human, HEAD_TYPE_1, heroConfig.head)
	active(human, HEAD_TYPE_3, heroConfig.body)
	active(human, HEAD_TYPE_5, heroConfig.body)
end

function isDot(human)
	if human.db.headHasNewFlag then
		return true
	end
end

function CG_ROLE_COMBATHERO_QUERY(human, type)
	local combatType = type
	local combatHero,helpList = CombatPosLogic.getCombatHeros(human, combatType, nil, true)
    if not combatHero then return end

	local msgRet = Msg.gc.GC_ROLE_COMBATHERO_QUERY
	msgRet.combatType = combatType
	msgRet.titleId = human.db.chenghao or 0
	msgRet.totalcombat = CombatPosLogic.getCombatHeroZDL(human, combatType, true)
	--msgRet.bagIndex[0] = CombatDefine.COMBAT_HERO_CNT
    local len = 0
    for k,v in pairs(combatHero) do
        local heroGrid = HeroLogic.getHeroGridByUuid(human, v)
		if heroGrid then
			len = len + 1
			msgRet.bagIndex[len] = heroGrid.bagIndex
		end
    end
	for k,v in pairs(helpList) do
        local heroGrid = HeroLogic.getHeroGridByUuid(human, v)
		if heroGrid then
			len = len + 1
			msgRet.bagIndex[len] = heroGrid.bagIndex
		end
    end
    msgRet.bagIndex[0] = len
    --Msg.trace(msgRet)
    Msg.send(msgRet, human.fd)    
end

function doCalcHero(human, attrs)
	if not human then return end
	
	if human.db.headList then
		for k, v in pairs(human.db.headList) do
			if isActive(human, HEAD_TYPE_1, k) and human.db.head == k then
				local config = getConfig(HEAD_TYPE_1, k)
				for k1,v1 in ipairs(config.attrs) do
					RoleAttr.updateValue(v1[1], v1[2], attrs)
				end
			end
		end
	end	
	
	if human.db.headFrameList then
		for k, v in pairs(human.db.headFrameList) do
			-- if isActive(human, HEAD_TYPE_2, k) and human.db.headFrame == k then
			-- 	local config = getConfig(HEAD_TYPE_2, k)
			-- 	for k1,v1 in ipairs(config.attrs) do
			-- 		RoleAttr.updateValue(v1[1], v1[2], attrs)
			-- 	end
			-- end
			-- 改为所有头像框加成属性叠加
			if isActive(human, HEAD_TYPE_2, k) then
				local config = getConfig(HEAD_TYPE_2, k)
				for k1,v1 in ipairs(config.attrs) do
					RoleAttr.updateValue(v1[1], v1[2], attrs)
				end
			end
		end
	end	
	
	if human.db.bodyList then
		for k, v in pairs(human.db.bodyList) do
			if isActive(human, HEAD_TYPE_3, k) and human.db.body == k then
				local config = getConfig(HEAD_TYPE_3, k)
				for k1,v1 in ipairs(config.attrs) do
					RoleAttr.updateValue(v1[1], v1[2], attrs)
				end
			end
		end
	end	
	
	if human.db.chenghaoList then
		for k, v in pairs(human.db.chenghaoList)  do
			if isActive(human, HEAD_TYPE_4, k) then
				local config = getConfig(HEAD_TYPE_4, k)
				for k1,v1 in ipairs(config.attrs) do
					RoleAttr.updateValue(v1[1], v1[2], attrs)
				end
			end
		end
	end	

    if human.db.animationList then
		for k, v in pairs(human.db.animationList) do
			if isActive(human, HEAD_TYPE_5, k) and human.db.animation == k then
				local config = getConfig(HEAD_TYPE_5, k)
				for k1,v1 in ipairs(config.attrs) do
					RoleAttr.updateValue(v1[1], v1[2], attrs)
				end
			end
		end
	end

    if human.db.backgroundList then
		for k, v in pairs(human.db.backgroundList) do
			if isActive(human, HEAD_TYPE_6, k) then
				local config = getConfig(HEAD_TYPE_6, k)
				for k1,v1 in ipairs(config.attrs) do
					RoleAttr.updateValue(v1[1], v1[2], attrs)
				end
			end
		end
	end
end



function GetCorrectBodyId(human)
	local nowBodyId = human.db.animation or 0
	if nowBodyId <= 0 then
		return nowBodyId
	end

	local bl = false
	for _, channelId in ipairs(Config.SVR_CHANEL or {}) do
		if channelId == CommonDefine.CHANNEL_TAG_WX then
			bl = true
			break
		end
	end

	if not bl then
		return nowBodyId
	end

	local skinCfg = SkinConfig[nowBodyId]
	if skinCfg and (skinCfg.body1 or 0) > 0 then
		nowBodyId = skinCfg.body1
	end

	return nowBodyId
end

function GM_Active(human, headType, id)
	active(human, headType, id)
end

function GM_UnActive(human, headType, id)
	unActive(human.db._id, headType, id)
end

