XCharacterManagerCreator = function() local type = type local pairs = pairs local table = table local tableSort = table.sort local tableInsert = table.insert local mathMin = math.min local mathMax = math.max local stringFormat = string.format local CsXTextManagerGetText = CsXTextManagerGetText local XCharacterManager = {} -- service config begin -- local METHOD_NAME = { LevelUp = "CharacterLevelUpRequest", ActivateStar = "CharacterActivateStarRequest", PromoteQuality = "CharacterPromoteQualityRequest", PromoteGrade = "CharacterPromoteGradeRequest", ExchangeCharacter = "CharacterExchangeRequest", UnlockSubSkill = "CharacterUnlockSkillGroupRequest", UpgradeSubSkill = "CharacterUpgradeSkillGroupRequest", SwitchSkill = "CharacterSwitchSkillRequest", UnlockEnhanceSkill = "CharacterUnlockEnhanceSkillRequest", UpgradeEnhanceSkill = "CharacterUpgradeEnhanceSkillRequest", } -- service config end -- local OwnCharacters = {} -- 已拥有角色数据 setmetatable(OwnCharacters, { __index = function(_, k, v) if XCharacterConfigs.IsCharacterCanShow(k) then return v end end, __pairs = function(t) return function(t, k) local nk, nv = next(t, k) if nk then if XCharacterConfigs.IsCharacterCanShow(nk) then return nk, nv else return nk, nil end end end, t, nil end }) function XCharacterManager.NewCharacter(character) if character == nil or character.Id == nil then XLog.Error("XCharacterManager.NewCharacter函数参数不能为空或者参数的Id字段不能为空") return end return XCharacter.New(character) end function XCharacterManager.InitCharacters(characters) for _, character in pairs(characters) do OwnCharacters[character.Id] = XCharacterManager.NewCharacter(character) end end function XCharacterManager.GetCharacter(id) return OwnCharacters[id] end function XCharacterManager.IsOwnCharacter(characterId) return OwnCharacters[characterId] ~= nil end local DefaultSort = function(a, b) if a.Level ~= b.Level then return a.Level > b.Level end if a.Quality ~= b.Quality then return a.Quality > b.Quality end local priorityA = XCharacterConfigs.GetCharacterPriority(a.Id) local priorityB = XCharacterConfigs.GetCharacterPriority(b.Id) if priorityA ~= priorityB then return priorityA < priorityB end return a.Id > b.Id end --==============================-- --desc: 获取卡牌列表(获得) --@return 卡牌列表 --==============================-- function XCharacterManager.GetCharacterList(characterType, isUseTempSelectTag, isAscendOrder, isUseNewSort) local characterList = {} local isNeedIsomer if characterType then if characterType == XCharacterConfigs.CharacterType.Normal then isNeedIsomer = false elseif characterType == XCharacterConfigs.CharacterType.Isomer then isNeedIsomer = true end end local unOwnCharList = {} for k, v in pairs(XCharacterConfigs.GetCharacterTemplates()) do if not isUseNewSort or XDataCenter.RoomCharFilterTipsManager.IsFilterSelectTag(k, characterType, isUseTempSelectTag) then if OwnCharacters[k] then if isNeedIsomer == nil then tableInsert(characterList, OwnCharacters[k]) elseif isNeedIsomer and XCharacterConfigs.IsIsomer(k) then tableInsert(characterList, OwnCharacters[k]) elseif isNeedIsomer == false and not XCharacterConfigs.IsIsomer(k) then tableInsert(characterList, OwnCharacters[k]) end else if isNeedIsomer == nil then tableInsert(unOwnCharList, v) elseif isNeedIsomer and XCharacterConfigs.IsIsomer(k) then tableInsert(unOwnCharList, v) elseif isNeedIsomer == false and not XCharacterConfigs.IsIsomer(k) then tableInsert(unOwnCharList, v) end end end end tableSort(characterList, function(a, b) local isInteamA = XDataCenter.TeamManager.CheckInTeam(a.Id) local isInteamB = XDataCenter.TeamManager.CheckInTeam(b.Id) if isInteamA ~= isInteamB then return isInteamA end if isUseNewSort then return XDataCenter.RoomCharFilterTipsManager.GetSort(a.Id, b.Id, characterType, isAscendOrder) end return DefaultSort(a, b) end) tableSort(unOwnCharList, function(a, b) if isUseNewSort then return XDataCenter.RoomCharFilterTipsManager.GetSort(a.Id, b.Id, characterType, isAscendOrder) end return DefaultSort(a, b) end) -- 合并列表 for _, char in pairs(unOwnCharList) do tableInsert(characterList, char) end return characterList end function XCharacterManager.GetOwnCharacterList(characterType, isUseNewSort) local characterList = {} local isNeedIsomer if characterType then if characterType == XCharacterConfigs.CharacterType.Normal then isNeedIsomer = false elseif characterType == XCharacterConfigs.CharacterType.Isomer then isNeedIsomer = true end end for characterId, v in pairs(OwnCharacters) do if not isUseNewSort or XDataCenter.RoomCharFilterTipsManager.IsFilterSelectTag(characterId, characterType) then if isNeedIsomer == nil then tableInsert(characterList, v) elseif isNeedIsomer and XCharacterConfigs.IsIsomer(characterId) then tableInsert(characterList, v) elseif isNeedIsomer == false and not XCharacterConfigs.IsIsomer(characterId) then tableInsert(characterList, v) end end end tableSort(characterList, function(a, b) if isUseNewSort then return XDataCenter.RoomCharFilterTipsManager.GetSort(a.Id, b.Id, characterType) end return DefaultSort(a, b) end) return characterList end function XCharacterManager.GetCharacterCountByAbility(ability) local count = 0 for _, v in pairs(OwnCharacters) do local curAbility = XCharacterManager.GetCharacterAbility(v) if curAbility and curAbility >= ability then count = count + 1 end end return count end --队伍预设列表排序特殊处理 function XCharacterManager.GetSpecilOwnCharacterList() local characterList = {} for _, v in pairs(OwnCharacters) do tableInsert(characterList, v) end tableSort(characterList, function(a, b) return DefaultSort(a, b) end) local specilList = {} for k, v in pairs(characterList) do if k % 2 ~= 0 then tableInsert(specilList, v) end end for k, v in pairs(characterList) do if k % 2 == 0 then tableInsert(specilList, v) end end return specilList end function XCharacterManager.GetCharacterListInTeam(characterType) local characterList = XCharacterManager.GetOwnCharacterList(characterType) tableSort(characterList, function(a, b) local isInteamA = XDataCenter.TeamManager.CheckInTeam(a.Id) local isInteamB = XDataCenter.TeamManager.CheckInTeam(b.Id) if isInteamA ~= isInteamB then return isInteamA end return DefaultSort(a, b) end) return characterList end function XCharacterManager.GetCharacterIdListInTeam(characterType) local characterList = XCharacterManager.GetOwnCharacterList(characterType) local idList = {} tableSort(characterList, function(a, b) local isInteamA = XDataCenter.TeamManager.CheckInTeam(a.Id) local isInteamB = XDataCenter.TeamManager.CheckInTeam(b.Id) if isInteamA ~= isInteamB then return isInteamA end return DefaultSort(a, b) end) for _, char in pairs(characterList) do table.insert(idList, char.Id) end return idList end function XCharacterManager.GetAssignCharacterListInTeam(characterType, tmpTeamIdDic) local characterList = XCharacterManager.GetOwnCharacterList(characterType) tableSort(characterList, function(a, b) local isInteamA = tmpTeamIdDic[a.Id] local isInteamB = tmpTeamIdDic[b.Id] if isInteamA ~= isInteamB then return isInteamB end return DefaultSort(a, b) end) return characterList end function XCharacterManager.GetRobotAndCharacterIdList(robotIdList, characterType) local characterList = XCharacterManager.GetOwnCharacterList(characterType) local idList = XRobotManager.GetRobotIdFilterListByCharacterType(robotIdList, characterType) for _, char in pairs(characterList) do table.insert(idList, char.Id) end return idList end --根据robotIdList返回已拥有的角色列表 function XCharacterManager.GetRobotCorrespondCharacterIdList(robotIdList, characterType) if XTool.IsNumberValid(characterType) then robotIdList = XRobotManager.GetRobotIdFilterListByCharacterType(robotIdList, characterType) end local ownCharacterIdList = {} local charId for _, robotId in ipairs(robotIdList) do charId = XRobotManager.GetCharacterId(robotId) if XCharacterManager.IsOwnCharacter(charId) then table.insert(ownCharacterIdList, charId) end end return ownCharacterIdList end --根据robotIdList返回试玩和已拥有的角色列表 function XCharacterManager.GetRobotAndCorrespondCharacterIdList(robotIdList, characterType) robotIdList = XRobotManager.GetRobotIdFilterListByCharacterType(robotIdList, characterType) local characterList = XCharacterManager.GetRobotCorrespondCharacterIdList(robotIdList) local idList = XRobotManager.GetRobotIdFilterListByCharacterType(robotIdList, characterType) for _, charId in pairs(characterList) do table.insert(idList, charId) end return idList end function XCharacterManager.IsUseItemEnough(itemIds, itemCounts) if not itemIds then return true end if type(itemIds) == "number" then if type(itemCounts) == "table" then itemCounts = itemCounts[1] end return XDataCenter.ItemManager.CheckItemCountById(itemIds, itemCounts) end itemCounts = itemCounts or {} for i = 1, #itemIds do local key = itemIds[i] local count = itemCounts[i] or 0 if not XDataCenter.ItemManager.CheckItemCountById(key, count) then return false end end return true end function XCharacterManager.AddCharacter(charData) local character = XCharacterManager.NewCharacter(charData) OwnCharacters[character.Id] = character XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_ADD_SYNC, character) return character end local function GetAttribGroupIdList(character) local npcTemplate = XCharacterConfigs.GetNpcTemplate(character.NpcId) if not npcTemplate then return end return XDataCenter.BaseEquipManager.GetAttribGroupIdListByType(npcTemplate.Type) end function XCharacterManager.GetSkillPlus(character) local list = XDataCenter.FubenAssignManager.GetSkillPlusIdList() if not list then return end local skillPlus = {} for _, plusId in pairs(list) do local plusList = XCharacterConfigs.GetSkillPlusList(character.Id, character.Type, plusId) if plusList then for _, skillId in pairs(plusList) do local level = character:GetSkillLevelBySkillId(skillId) if level and level > 0 then if skillPlus[skillId] then skillPlus[skillId] = skillPlus[skillId] + 1 else skillPlus[skillId] = 1 end end end end end return skillPlus end function XCharacterManager.GetSkillPlusOther(character, assignChapterRecords) local list = XDataCenter.FubenAssignManager.GetSkillPlusIdListOther(assignChapterRecords) if not list then return end local skillPlus = {} for _, plusId in pairs(list) do local plusList = XCharacterConfigs.GetSkillPlusList(character.Id, character.Type, plusId) if plusList then for _, skillId in pairs(plusList) do local level = character:GetSkillLevelBySkillId(skillId) if level and level > 0 then if skillPlus[skillId] then skillPlus[skillId] = skillPlus[skillId] + 1 else skillPlus[skillId] = 1 end end end end end return skillPlus end function XCharacterManager.GetFightNpcData(characterId) local character = characterId if type(characterId) == "number" then character = XCharacterManager.GetCharacter(characterId) if not character then return end end local equipDataList = XDataCenter.EquipManager.GetCharacterWearingEquips(character.Id) if not equipDataList then return end local groupIdList = GetAttribGroupIdList(character) if not groupIdList then return end return { Character = character, Equips = equipDataList, AttribGroupList = groupIdList, --基地装备用(已废弃) CharacterSkillPlus = XCharacterManager.GetSkillPlus(character) } end function XCharacterManager.GetFightNpcDataOther(character, equipList, assignChapterRecords) local equipDataList = equipList if not equipDataList then return end local groupIdList = GetAttribGroupIdList(character) if not groupIdList then return end return { Character = character, Equips = equipDataList, AttribGroupList = groupIdList, CharacterSkillPlus = XCharacterManager.GetSkillPlusOther(character, assignChapterRecords) } end function XCharacterManager.GetCharacterAttribs(character) local npcData = XCharacterManager.GetFightNpcData(character) if not npcData then return end return XAttribManager.GetNpcAttribs(npcData) end function XCharacterManager.GetCharacterAttribsOther(character, equipList, assignChapterRecords) local npcData = XCharacterManager.GetFightNpcDataOther(character, equipList, assignChapterRecords) if not npcData then return end return XAttribManager.GetNpcAttribs(npcData) end local function GetSkillAbility(skillList) local ability = 0 for id, level in pairs(skillList) do ability = ability + XCharacterConfigs.GetSubSkillAbility(id, level) end return ability end local function GetResonanceSkillAbility(skillList, useSkillMap) if not skillList then return 0 end if not useSkillMap then return 0 end local ability = 0 for id, level in pairs(skillList) do if useSkillMap[id] then ability = ability + XCharacterConfigs.GetResonanceSkillAbility(id, level) end end return ability end XCharacterManager.GetResonanceSkillAbility = GetResonanceSkillAbility local function GetPlusSkillAbility(skillList, useSkillMap) if not skillList then return 0 end if not useSkillMap then return 0 end local ability = 0 for id, level in pairs(skillList) do if useSkillMap[id] then ability = ability + XCharacterConfigs.GetPlusSkillAbility(id, level) end end return ability end function XCharacterManager.GetCharacterAbility(character) local npcData = XCharacterManager.GetFightNpcData(character) if not npcData then return 0 end --属性战力 local baseAbility = XAttribManager.GetAttribAbility(character.Attribs) or 0 --技能战力 local skillLevel = XFightCharacterManager.GetCharSkillLevelMap(npcData) local skillAbility = GetSkillAbility(skillLevel) --补强技能战力 local enhanceSkillAbility = 0 if character.GetEnhanceSkillAbility then enhanceSkillAbility = character:GetEnhanceSkillAbility() end --装备共鸣战力 local resonanceSkillLevel = XFightCharacterManager.GetResonanceSkillLevelMap(npcData) local resonanceSkillAbility = GetResonanceSkillAbility(resonanceSkillLevel, skillLevel) --边界公约驻守增加技能等级战力 local plusSkillAbility = GetPlusSkillAbility(npcData.CharacterSkillPlus, skillLevel) --装备技能战力 local equipAbility = XDataCenter.EquipManager.GetEquipSkillAbility(character.Id) or 0 --伙伴战力 local partnerAbility = XDataCenter.PartnerManager.GetCarryPartnerAbilityByCarrierId(character.Id) return baseAbility + skillAbility + resonanceSkillAbility + plusSkillAbility + equipAbility + partnerAbility + enhanceSkillAbility end -- partner : XPartner function XCharacterManager.GetCharacterAbilityOther(character, equipList, assignChapterRecords, partner) local npcData = XCharacterManager.GetFightNpcDataOther(character, equipList, assignChapterRecords) if not npcData then return end local attribs = XCharacterManager.GetCharacterAttribsOther(character, equipList, assignChapterRecords) local baseAbility = XAttribManager.GetAttribAbility(attribs) if not baseAbility then return end local skillLevel = XFightCharacterManager.GetCharSkillLevelMap(npcData) local skillAbility = GetSkillAbility(skillLevel) --补强技能战力 local enhanceSkillAbility = 0 if character.GetEnhanceSkillAbility then enhanceSkillAbility = character:GetEnhanceSkillAbility() end local resonanceSkillLevel = XFightCharacterManager.GetResonanceSkillLevelMap(npcData) local resonanceSkillAbility = GetResonanceSkillAbility(resonanceSkillLevel, skillLevel) local plusSkillAbility = GetPlusSkillAbility(npcData.CharacterSkillPlus, skillLevel) local equipAbility = XDataCenter.EquipManager.GetEquipSkillAbilityOther(character, equipList) if not equipAbility then return end -- 宠物战力 local partnerAbility = XDataCenter.PartnerManager.GetCarryPartnerAbility(partner) return baseAbility + skillAbility + resonanceSkillAbility + plusSkillAbility + equipAbility + partnerAbility + enhanceSkillAbility end -- 根据id获得身上角色战力 function XCharacterManager.GetCharacterAbilityById(characterId) local character = OwnCharacters[characterId] return character and XCharacterManager.GetCharacterAbility(character) or 0 end function XCharacterManager.GetMaxOwnCharacterAbility() local maxAbility = 0 for _, character in pairs(OwnCharacters) do local ability = XCharacterManager.GetCharacterAbility(character) maxAbility = mathMax(ability, maxAbility) end return maxAbility end function XCharacterManager.GetNpcBaseAttrib(npcId) local npcTemplate = CS.XNpcManager.GetNpcTemplate(npcId) if not npcTemplate then XLog.ErrorTableDataNotFound("XCharacterManager.GetNpcBaseAttrib", "npcTemplate", "Client/Fight/Npc/Npc.tab", "npcId", tostring(npcId)) return end return XAttribManager.GetBaseAttribs(npcTemplate.AttribId) end -- 升级相关begin -- function XCharacterManager.IsOverLevel(templateId) local curLevel = XPlayer.Level local char = XCharacterManager.GetCharacter(templateId) return char and char.Level >= curLevel end function XCharacterManager.IsMaxLevel(templateId) local char = XCharacterManager.GetCharacter(templateId) local maxLevel = XCharacterConfigs.GetCharMaxLevel(templateId) return char and char.Level >= maxLevel end function XCharacterManager.CalLevelAndExp(character, exp) local teamLevel = XPlayer.Level local id = character.Id local curExp = character.Exp + exp local curLevel = character.Level local maxLevel = XCharacterConfigs.GetCharMaxLevel(id) while curLevel do local nextLevelExp = XCharacterConfigs.GetNextLevelExp(id, curLevel) if ((curExp >= nextLevelExp) and (curLevel < teamLevel)) then if curLevel == maxLevel then curExp = nextLevelExp break else curExp = curExp - nextLevelExp curLevel = curLevel + 1 if (curLevel >= teamLevel) then break end end else break end end return curLevel, curExp end function XCharacterManager.GetMaxAvailableLevel(templateId) if not templateId then return end local charMaxLevel = XCharacterConfigs.GetCharMaxLevel(templateId) local playerMaxLevel = XPlayer.Level return mathMin(charMaxLevel, playerMaxLevel) end function XCharacterManager.GetMaxLevelNeedExp(character) local id = character.Id local levelUpTemplateId = XCharacterConfigs.GetCharacterTemplate(id).LevelUpTemplateId local levelUpTemplate = XCharacterConfigs.GetLevelUpTemplate(levelUpTemplateId) local maxLevel = XCharacterConfigs.GetCharMaxLevel(id) local totalExp = 0 for i = character.Level, maxLevel - 1 do totalExp = totalExp + levelUpTemplate[i].Exp end return totalExp - character.Exp end -- 升级相关end -- -- 品质相关begin -- function XCharacterManager.IsMaxQuality(character) if not character then XLog.Error("XCharacterManager.IsMaxQuality函数参数character不能为空") return end return character.Quality >= XCharacterConfigs.GetCharMaxQuality(character.Id) end function XCharacterManager.IsMaxQualityById(characterId) if not characterId then return end local character = XCharacterManager.GetCharacter(characterId) return character and character.Quality >= XCharacterConfigs.GetCharMaxQuality(character.Id) end function XCharacterManager.IsCanActivateStar(character) if not character then XLog.Error("XCharacterManager.IsCanActivateStar函数参数character不能为空") return end if character.Quality >= XCharacterConfigs.GetCharMaxQuality(character.Id) then return false end if character.Star >= XCharacterConfigs.MAX_QUALITY_STAR then return false end return true end function XCharacterManager.IsActivateStarUseItemEnough(templateId, quality, star) if not templateId or not quality or not star then local tmpStr = "XCharacterManager.IsCharQualityStarUseItemEnough函数参数错误:, 参数templateId是" XLog.Error(tmpStr .. templateId .. " 参数quality是" .. quality .. " 参数star是" .. star) return end local template = XCharacterConfigs.GetCharacterTemplate(templateId) if not template then XLog.ErrorTableDataNotFound("XCharacterManager.IsCharQualityStarUseItemEnough", "template", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end if quality < 1 then XLog.Error("XCharacterManager.IsCharQualityStarUseItemEnough错误: 参数quality不能小于1, 参数quality是: " .. quality) return end if star < 1 or star > XCharacterConfigs.MAX_QUALITY_STAR then local tmpStr = "XCharacterManager.IsCharQualityStarUseItemEnough函数错误: 参数star不能小于1或者大于" XLog.Error(tmpStr .. XCharacterConfigs.MAX_QUALITY_STAR .. ", 参数star是: " .. star) return end local itemKey = template.ItemId local characterType = XCharacterConfigs.GetCharacterType(templateId) local itemCount = XCharacterConfigs.GetStarUseCount(characterType, quality, star) return XCharacterManager.IsUseItemEnough(itemKey, itemCount) end function XCharacterManager.IsCanPromoted(characterId) local character = XCharacterManager.GetCharacter(characterId) local hasCoin = XDataCenter.ItemManager.GetCoinsNum() local characterType = XCharacterConfigs.GetCharacterType(characterId) local useCoin = XCharacterConfigs.GetPromoteUseCoin(characterType, character.Quality) return hasCoin >= useCoin end --得到角色需要展示的 fashionId function XCharacterManager.GetShowFashionId(templateId, isNotSelf) -- 默认优先拿自己的数据 if isNotSelf == nil then isNotSelf = false end -- 不属于自身数据的直接获取本地即可 if isNotSelf then return XCharacterConfigs.GetCharacterTemplate(templateId).DefaultNpcFashtionId end if XCharacterManager.IsOwnCharacter(templateId) == true then return OwnCharacters[templateId].FashionId else return XCharacterConfigs.GetCharacterTemplate(templateId).DefaultNpcFashtionId end end --得到角色需要展示的时装头像信息 function XCharacterManager.GetCharacterFashionHeadInfo(templateId, isNotSelf) local headFashionId, headFashionType = XCharacterManager.GetShowFashionId(templateId, isNotSelf), XFashionConfigs.HeadPortraitType.Default --不是自己拥有的角色,返回默认头像类型,默认涂装Id if isNotSelf then return headFashionId, headFashionType end local character = OwnCharacters[templateId] if not XTool.IsTableEmpty(character) then local headInfo = character.CharacterHeadInfo or {} if XTool.IsNumberValid(headInfo.HeadFashionId) then headFashionId = headInfo.HeadFashionId end if headInfo.HeadFashionType then headFashionType = headInfo.HeadFashionType end end return headFashionId, headFashionType end function XCharacterManager.CharacterSetHeadInfoRequest(characterId, headFashionId, headFashionType, cb) local req = { TemplateId = characterId, CharacterHeadInfo = { HeadFashionId = headFashionId or XCharacterManager.GetShowFashionId(characterId), HeadFashionType = headFashionType or XFashionConfigs.HeadPortraitType.Default, } } XNetwork.Call("CharacterSetHeadInfoRequest", req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end function XCharacterManager.GetCharHalfBodyBigImage(templateId) --获得角色半身像(剧情用) local fashionId = XCharacterManager.GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharHalfBodyBigImage", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end return XDataCenter.FashionManager.GetFashionHalfBodyImage(fashionId) end function XCharacterManager.GetCharHalfBodyImage(templateId) --获得角色半身像(通用) local fashionId = XCharacterManager.GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharHalfBodyImage", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end return XDataCenter.FashionManager.GetRoleCharacterBigImage(fashionId) end function XCharacterManager.GetCharSmallHeadIcon(templateId, isNotSelf, headFashionId, headFashionType) --获得角色小头像 local characterId = XFubenSpecialTrainConfig.GetCharacterIdByNpcId(templateId) if characterId then local stageType = XDataCenter.FubenManager.GetCurrentStageType() if XDataCenter.FubenSpecialTrainManager.IsStageTypeCute(stageType) then return XFubenSpecialTrainConfig.GetCuteModelSmallHeadIcon(characterId) end templateId = characterId end if not XTool.IsNumberValid(headFashionId) or not headFashionType then headFashionId, headFashionType = XCharacterManager.GetCharacterFashionHeadInfo(templateId, isNotSelf) end return XDataCenter.FashionManager.GetFashionSmallHeadIcon(headFashionId, headFashionType) end function XCharacterManager.GetCharSmallHeadIconByCharacter(character) --获得角色小头像(战斗用) local headInfo = character.CharacterHeadInfo or {} return XCharacterManager.GetCharSmallHeadIcon(character.Id, true, headInfo.HeadFashionId, headInfo.HeadFashionType) end function XCharacterManager.GetCharBigHeadIcon(templateId, isNotSelf, headFashionId, headFashionType) --获得角色大头像 if not XTool.IsNumberValid(headFashionId) or not headFashionType then headFashionId, headFashionType = XCharacterManager.GetCharacterFashionHeadInfo(templateId, isNotSelf) end return XDataCenter.FashionManager.GetFashionBigHeadIcon(headFashionId, headFashionType) end function XCharacterManager.GetCharRoundnessHeadIcon(templateId) --获得角色圆头像 local fashionId = XCharacterManager.GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharRoundnessHeadIcon", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end return XDataCenter.FashionManager.GetFashionRoundnessHeadIcon(fashionId) end function XCharacterManager.GetCharBigRoundnessHeadIcon(templateId) --获得角色大圆头像 local fashionId = XCharacterManager.GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharBigRoundnessHeadIcon", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end return XDataCenter.FashionManager.GetFashionBigRoundnessHeadIcon(fashionId) end function XCharacterManager.GetCharBigRoundnessNotItemHeadIcon(templateId, liberateLv) --获得角色圆头像(非物品使用) local fashionId = XCharacterManager.GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharBigRoundnessNotItemHeadIcon", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end local isAchieveMaxLiberation = not liberateLv and XDataCenter.ExhibitionManager.IsAchieveMaxLiberation(templateId) or XDataCenter.ExhibitionManager.IsMaxLiberationLevel(liberateLv) local result = isAchieveMaxLiberation and XDataCenter.FashionManager.GetFashionRoundnessNotItemHeadIconLiberation(fashionId) or XDataCenter.FashionManager.GetFashionRoundnessNotItemHeadIcon(fashionId) return result end function XCharacterManager.GetFightCharHeadIcon(character) --获得战斗角色头像 local fashionId = character.FashionId local isAchieveMaxLiberation = XDataCenter.ExhibitionManager.IsMaxLiberationLevel(character.LiberateLv) if isAchieveMaxLiberation then return XDataCenter.FashionManager.GetFashionRoundnessNotItemHeadIconLiberation(fashionId) else return XDataCenter.FashionManager.GetFashionRoundnessNotItemHeadIcon(fashionId) end end function XCharacterManager.GetCharUnlockFragment(templateId) if not templateId then XLog.Error("XCharacterManager.GetCharUnlockFragment函数参数错误, 参数templateId不能为空") return end local curCharItemId = XCharacterConfigs.GetCharacterTemplate(templateId).ItemId if not curCharItemId then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharUnlockFragment", "curCharItemId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end local item = XDataCenter.ItemManager.GetItem(curCharItemId) if not item then return 0 end return item.Count end function XCharacterManager.GetCharShowFashionSceneUrl(templateId) --获取角色需要显示时装所关联的场景路径 if not templateId then XLog.Error("XCharacterManager.GetCharShowFashionSceneUrl函数参数错误, 参数templateId不能为空") return end local fashionId = XCharacterManager.GetShowFashionId(templateId) if not fashionId then XLog.Error("XCharacterManager.GetCharShowFashionSceneUrl函数参数错误, 获取fashionId失败") return end local sceneUrl = XDataCenter.FashionManager.GetFashionSceneUrl(fashionId) return sceneUrl end --v1.28-升阶拆分-获取角色所有品质升阶信息 function XCharacterManager.GetCharQualitySkillInfo(characterId) local character = XCharacterManager.GetCharacter(characterId) local skillList = character.SkillList local data = XCharacterConfigs.GetCharSkillQualityApartDicByCharacterId(characterId) local result = {} for _, template in pairs(data) do for _, templateId in pairs(template) do for _, id in pairs(templateId) do local skillId = XCharacterConfigs.GetCharSkillQualityApartSkillId(id) local _, index = XCharacterConfigs.GetSkillGroupIdAndIndex(skillId) if character:IsSkillUsing(skillId) then table.insert(result, id) elseif not skillList[index] then table.insert(result, templateId[1]) end end end end table.sort(result, function (a, b) if XCharacterConfigs.GetCharSkillQualityApartQuality(a) == XCharacterConfigs.GetCharSkillQualityApartQuality(b) then return XCharacterConfigs.GetCharSkillQualityApartPhase(a) < XCharacterConfigs.GetCharSkillQualityApartPhase(b) else return XCharacterConfigs.GetCharSkillQualityApartQuality(a) < XCharacterConfigs.GetCharSkillQualityApartQuality(b) end end) return result end --v1.28-升阶拆分-获取角色升阶技能文本 function XCharacterManager.GetCharQualitySkillName(characterId, quality, star) local character = XCharacterManager.GetCharacter(characterId) local skillList = character.SkillList local data = XCharacterConfigs.GetCharSkillQualityApartDicByStar(characterId, quality, star) for _, templateId in pairs(data) do local skillId = XCharacterConfigs.GetCharSkillQualityApartSkillId(templateId) local _, index = XCharacterConfigs.GetSkillGroupIdAndIndex(skillId) if character:IsSkillUsing(skillId) then local skillName = XCharacterConfigs.GetCharSkillQualityApartName(templateId) local skillLevel = XCharacterConfigs.GetCharSkillQualityApartLevel(templateId) return XUiHelper.GetText("CharacterQualitySkillTipText", skillName, skillLevel) elseif not skillList[index] then local skillName = XCharacterConfigs.GetCharSkillQualityApartName(data[1]) local skillLevel = XCharacterConfigs.GetCharSkillQualityApartLevel(data[1]) return XUiHelper.GetText("CharacterQualitySkillTipText", skillName, skillLevel) end end return "" end -- 品质相关end -- -- 改造相关begin -- function XCharacterManager.IsMaxCharGrade(character) return character.Grade >= XCharacterConfigs.GetCharMaxGrade(character.Id) end function XCharacterManager.IsPromoteGradeUseItemEnough(templateId, grade) if not templateId or not grade then XLog.Error("XCharacterManager.IsPromoteGradeUseItemEnough参数不能为空: 参数templateId是 " .. templateId .. " 参数grade是" .. grade) return end local gradeConfig = XCharacterConfigs.GetGradeTemplates(templateId, grade) if not gradeConfig then XLog.ErrorTableDataNotFound("XCharacterManager.IsPromoteGradeUseItemEnough", "gradeConfig", "Share/Character/Grade/CharacterGrade.tab", "grade", tostring(grade)) return end local itemKey, itemCount = gradeConfig.UseItemKey, gradeConfig.UseItemCount if not itemKey then return true end return XCharacterManager.IsUseItemEnough(itemKey, itemCount) end function XCharacterManager.CheckCanUpdateSkill(charId, subSkillId, subSkillLevel) local char = XCharacterManager.GetCharacter(charId) if (char == nil) then return false end local min_max = XCharacterConfigs.GetSubSkillMinMaxLevel(subSkillId) if (subSkillLevel >= min_max.Max) then return false end local gradeConfig = XCharacterConfigs.GetSkillGradeConfig(subSkillId, subSkillLevel) if not gradeConfig then return false end if gradeConfig.ConditionId then for _, v in pairs(gradeConfig.ConditionId) do if not XConditionManager.CheckCondition(v, charId) then return false end end end if (not XCharacterManager.IsUseItemEnough(XDataCenter.ItemManager.ItemId.SkillPoint, gradeConfig.UseSkillPoint)) then return false end if (not XCharacterManager.IsUseItemEnough(XDataCenter.ItemManager.ItemId.Coin, gradeConfig.UseCoin)) then return false end return true end --处理一次多级的请求升级是否满足条件 function XCharacterManager.CheckCanUpdateSkillMultiLevel(charId, subSkillId, subSkillLevel, subSkillLevelUp) local char = XCharacterManager.GetCharacter(charId) if (char == nil) then return false end local min_max = XCharacterConfigs.GetSubSkillMinMaxLevel(subSkillId) if (subSkillLevelUp >= min_max.Max) then return false end local useCoin = 0 local useSkillPoint = 0 for i = subSkillLevel, subSkillLevelUp do local tempGradeConfig = XCharacterConfigs.GetSkillGradeConfig(subSkillId, i) if not tempGradeConfig then return false end for _, v in pairs(tempGradeConfig.ConditionId) do if not XConditionManager.CheckCondition(v, charId) then return false end end useCoin = useCoin + tempGradeConfig.UseCoin useSkillPoint = useSkillPoint + tempGradeConfig.UseSkillPoint end if (not XCharacterManager.IsUseItemEnough(XDataCenter.ItemManager.ItemId.SkillPoint, useSkillPoint)) then return false end if (not XCharacterManager.IsUseItemEnough(XDataCenter.ItemManager.ItemId.Coin, useCoin)) then return false end return true end --得到人物技能共鸣等级 function XCharacterManager.GetResonanceSkillLevel(characterId, skillId) if not characterId or characterId == 0 then return 0 end if not XCharacterManager.IsOwnCharacter(characterId) then return 0 end local npcData = {} npcData.Character = XCharacterManager.GetCharacter(characterId) npcData.Equips = XDataCenter.EquipManager.GetCharacterWearingEquips(characterId) local resonanceSkillLevelMap = XMagicSkillManager.GetResonanceSkillLevelMap(npcData) return resonanceSkillLevelMap[skillId] or 0 end --得到人物技能驻守等级 function XCharacterManager.GetAssignSkillLevel(characterId, skillId) if not characterId or characterId == 0 then return 0 end if not XCharacterManager.IsOwnCharacter(characterId) then return 0 end return XDataCenter.FubenAssignManager.GetSkillLevel(characterId, skillId) end --得到人物技能总加成等级 function XCharacterManager.GetSkillPlusLevel(characterId, skillId) return XCharacterManager.GetResonanceSkillLevel(characterId, skillId) + XCharacterManager.GetAssignSkillLevel(characterId, skillId) end --==============================-- --desc: 获取队长技能描述 --@characterId: 卡牌数据 --@return 技能Data --==============================-- function XCharacterManager.GetCaptainSkillInfo(characterId) local captianSkillId = XCharacterConfigs.GetCharacterCaptainSkill(characterId) local skillLevel = XCharacterManager.GetSkillLevel(captianSkillId) return XCharacterConfigs.GetCaptainSkillInfo(characterId, skillLevel) end --==============================-- --desc: 获取队长技能描述 --@characterId: 卡牌数据 --@isOnlyShowIntro: 是否只显示技能描述 --==============================-- function XCharacterManager.GetCaptainSkillDesc(characterId, isOnlyShowIntro) local captianSkillInfo = XCharacterManager.GetCaptainSkillInfo(characterId) return (captianSkillInfo and captianSkillInfo.Level > 0 or isOnlyShowIntro) and captianSkillInfo.Intro or stringFormat("%s%s", captianSkillInfo.Intro, CsXTextManagerGetText("CaptainSkillLock")) end function XCharacterManager.GetSkillLevel(skillId) local characterId = XCharacterConfigs.GetCharacterIdBySkillId(skillId) local character = XCharacterManager.GetCharacter(characterId) return character and character:GetSkillLevelBySkillId(skillId) or 0 end function XCharacterManager.GetSpecialWeaponSkillDes(skillId) local skillLevel = XCharacterManager.GetSkillLevel(skillId) local characterId = XCharacterConfigs.GetCharacterIdBySkillId(skillId) local addLevel = XCharacterManager.GetSkillPlusLevel(characterId, skillId) skillLevel = skillLevel + addLevel skillLevel = skillLevel == 0 and 1 or skillLevel return XCharacterConfigs.GetSkillGradeDesConfigWeaponSkillDes(skillId, skillLevel) end --解锁角色终阶解放技能 function XCharacterManager.UnlockMaxLiberationSkill(characterId) local skillGroupId = XCharacterConfigs.GetCharMaxLiberationSkillGroupId(characterId) local character = OwnCharacters[characterId] if character then local skillLevel = character:GetSkillLevel(skillGroupId) if not skillLevel or skillLevel <= 0 then XCharacterManager.UnlockSubSkill(nil, characterId, nil, skillGroupId) end end end -- 技能相关end -- -- 服务端相关begin-- function XCharacterManager.ExchangeCharacter(templateId, cb) if XCharacterManager.IsOwnCharacter(templateId) then XUiManager.TipCode(XCode.CharacterManagerExchangeCharacterAlreadyOwn) return end local char = XCharacterConfigs.GetCharacterTemplate(templateId) if not char then XUiManager.TipCode(XCode.CharacterManagerGetCharacterTemplateNotFound) return end local itemId = char.ItemId local bornQulity = XCharacterConfigs.GetCharMinQuality(templateId) local characterType = XCharacterConfigs.GetCharacterType(templateId) local itemCount = XCharacterConfigs.GetComposeCount(characterType, bornQulity) if not XCharacterManager.IsUseItemEnough(itemId, itemCount) then XUiManager.TipText("CharacterManagerItemNotEnough") return end XNetwork.Call(METHOD_NAME.ExchangeCharacter, { TemplateId = templateId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHARACTER_SYN, templateId) if cb then cb() end end) end function XCharacterManager.OnSyncCharacter(protoData) if not OwnCharacters[protoData.Id] then XCharacterManager.AddCharacter(protoData) local templateId = protoData.Id if XCharacterConfigs.GetCharacterNeedFirstShow(templateId) ~= 0 then XUiHelper.PushInFirstGetIdList(templateId, XArrangeConfigs.Types.Character) end XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_FIRST_GET, templateId) return end OwnCharacters[protoData.Id]:Sync(protoData) end function XCharacterManager.OnSyncCharacterVitality(characterId, vitality) local character = OwnCharacters[characterId] if not character then return end character.Vitality = vitality end function XCharacterManager.AddExp(character, itemDict, cb) if type(character) == "number" then character = OwnCharacters[character] end cb = cb and cb or function() end XMessagePack.MarkAsTable(itemDict) local oldLevel = character.Level XNetwork.Call(METHOD_NAME.LevelUp, { TemplateId = character.Id, UseItems = itemDict }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local exp = 0 for k, v in pairs(itemDict) do exp = exp + XDataCenter.ItemManager.GetCharExp(k, character.Type) * v end local useStr = CS.XTextManager.GetText("CharacterExpItemsUse") local addStr = CS.XTextManager.GetText("ExpAdd", exp) XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_INCREASE_TIP, useStr, addStr, oldLevel) XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_LEVEL_UP, character.Id) cb() end) end function XCharacterManager.ActivateStar(character, cb) if type(character) == "number" then character = OwnCharacters[character] end cb = cb or function() end if XCharacterManager.IsMaxQuality(character) then XUiManager.TipCode(XCode.CharacterManagerMaxQuality) return end if character.Star >= XCharacterConfigs.MAX_QUALITY_STAR then XUiManager.TipCode(XCode.CharacterManagerActivateStarMaxStar) return end local star = character.Star + 1 if not XCharacterManager.IsActivateStarUseItemEnough(character.Id, character.Quality, star) then XUiManager.TipText("CharacterManagerItemNotEnough") return end local oldAttribs = XCharacterConfigs.GetCharStarAttribs(character.Id, character.Quality, character.Star) XNetwork.Call(METHOD_NAME.ActivateStar, { TemplateId = character.Id }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end -- v1.28 升阶拆分 属性加成文本 local attrText = "" for k, v in pairs(oldAttribs) do local value = FixToDouble(v) if value > 0 then attrText = XAttribManager.GetAttribNameByIndex(k) .. "+" .. stringFormat("%.2f", value) break end end -- v1.28 升阶拆分 技能加成文本 local skillText = XCharacterManager.GetCharQualitySkillName(character.Id, character.Quality, character.Star) XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_QUALITY_STAR_PROMOTE, character.Id) XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_INCREASE_TIP, CS.XTextManager.GetText("CharacterActivation"), XUiHelper.GetText("CharacterQualityTip", attrText, skillText)) if cb then cb() end end) end function XCharacterManager.PromoteQuality(character, cb) if type(character) == "number" then character = OwnCharacters[character] end if XCharacterManager.IsMaxQuality(character) then XUiManager.TipCode(XCode.CharacterManagerMaxQuality) return end if character.Star < XCharacterConfigs.MAX_QUALITY_STAR then XUiManager.TipCode(XCode.CharacterManagerPromoteQualityStarNotEnough) return end local characterType = XCharacterConfigs.GetCharacterType(character.Id) if not XDataCenter.ItemManager.DoNotEnoughBuyAsset(XDataCenter.ItemManager.ItemId.Coin, XCharacterConfigs.GetPromoteUseCoin(characterType, character.Quality), 1, function() XCharacterManager.PromoteQuality(character, cb) end, "CharacterManagerItemNotEnough") then return end XNetwork.Call(METHOD_NAME.PromoteQuality, { TemplateId = character.Id }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_QUALITY_PROMOTE, character.Id) if cb then cb() end end) end -------------------------------------------------------------------------- function XCharacterManager.PromoteGrade(character, cb) if type(character) == "number" then character = OwnCharacters[character] end if XCharacterManager.IsMaxCharGrade(character) then XUiManager.TipCode(XCode.CharacterManagerMaxGrade) return end if not XCharacterManager.IsPromoteGradeUseItemEnough(character.Id, character.Grade) then XUiManager.TipText("CharacterManagerCoinNotEnough") return end cb = cb or function() end local oldGrade = character.Grade XNetwork.Call(METHOD_NAME.PromoteGrade, { TemplateId = character.Id }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_GRADE, character.Id) cb(oldGrade) end) end function XCharacterManager.UnlockSubSkill(skillId, characterId, cb, skillGroupId) skillGroupId = skillGroupId or XCharacterConfigs.GetSkillGroupIdAndIndex(skillId) local req = { SkillGroupId = skillGroupId } XNetwork.Call(METHOD_NAME.UnlockSubSkill, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_SKILL_UNLOCK, characterId) if cb then cb() end end) end function XCharacterManager.UpgradeSubSkillLevel(characterId, skillId, cb, countLevel) local skillGroupId = XCharacterConfigs.GetSkillGroupIdAndIndex(skillId) local count = countLevel or 1 local req = { SkillGroupId = skillGroupId, Count = count } XNetwork.Call(METHOD_NAME.UpgradeSubSkill, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_SKILL_UP, characterId) if cb then cb() end end) end function XCharacterManager.IsSkillUsing(skillId) local characterId = XCharacterConfigs.GetCharacterIdBySkillId(skillId) local character = XCharacterManager.GetCharacter(characterId) return character and character:IsSkillUsing(skillId) or false end function XCharacterManager.ReqSwitchSkill(skillId, cb) local req = { SkillId = skillId } XNetwork.Call(METHOD_NAME.SwitchSkill, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local characterId = XCharacterConfigs.GetCharacterIdBySkillId(skillId) local character = XCharacterManager.GetCharacter(characterId) character:SwithSkill(skillId) if cb then cb() end end) end -- 服务端相关end-- function XCharacterManager.GetCharModel(templateId, quality) if not templateId then XLog.Error("XCharacterManager.GetCharModel函数参数错误: 参数templateId不能为空") return end if not quality then quality = XCharacterConfigs.GetCharMinQuality(templateId) end local npcId = XCharacterConfigs.GetCharNpcId(templateId, quality) if npcId == nil then return end local npcTemplate = CS.XNpcManager.GetNpcTemplate(npcId) if npcTemplate == nil then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharModel", "npcTemplate", " Client/Fight/Npc/Npc.tab", "npcId", tostring(npcId)) return end return npcTemplate.ModelId end function XCharacterManager.GetCharResModel(resId) if not resId then XLog.Error("XCharacterManager.GetCharResModel函数参数错误: 参数resId不能为空") return end local npcTemplate = CS.XNpcManager.GetNpcResTemplate(resId) if npcTemplate == nil then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharResModel", "npcTemplate", "Share/Fight/Npc/NpcRes.tab", "resId", tostring(resId)) return end return npcTemplate.ModelId end --获取角色解放等级到对应的ModelId function XCharacterManager.GetCharLiberationLevelModelId(characterId, growUpLevel) if not characterId then XLog.Error("XCharacterManager.GetCharLiberationLevelModel函数参数错误: 参数characterId不能为空") return end growUpLevel = growUpLevel or XCharacterConfigs.GrowUpLevel.New local modelId = XCharacterConfigs.GetCharLiberationLevelModelId(characterId, growUpLevel) if not modelId then local character = XDataCenter.CharacterManager.GetCharacter(characterId) return XCharacterManager.GetCharModel(characterId, character.Quality) end return modelId end --获取角色解放等级到对应的解放特效名称和模型挂点名 function XCharacterManager.GetCharLiberationLevelEffectRootAndPath(characterId, growUpLevel) if not characterId then XLog.Error("XCharacterManager.GetCharLiberationLevelModel函数参数错误: 参数characterId不能为空") return end growUpLevel = growUpLevel or XDataCenter.ExhibitionManager.GetCharacterGrowUpLevel(characterId) return XCharacterConfigs.GetCharLiberationLevelEffectRootAndPath(characterId, growUpLevel) end --获取已解放角色时装到对应的解放特效名称和模型挂点名(传入growUpLevel为预览,否则为自己的角色) function XCharacterManager.GetCharFashionLiberationEffectRootAndPath(characterId, growUpLevel, fashionId) if not characterId then XLog.Error("XCharacterManager.GetCharLiberationLevelModel函数参数错误: 参数characterId不能为空") return end --自己的角色 if not growUpLevel then --拥有该角色 if not XCharacterManager.IsOwnCharacter(characterId) then return end growUpLevel = XDataCenter.ExhibitionManager.GetCharacterGrowUpLevel(characterId) end --解放等级达到满级 local isAchieveMaxLiberation = XDataCenter.ExhibitionManager.IsMaxLiberationLevel(growUpLevel) if not isAchieveMaxLiberation then return end fashionId = fashionId or XDataCenter.FashionManager.GetFashionIdByCharId(characterId) return XDataCenter.FashionManager.GetFashionLiberationEffectRootAndPath(fashionId) end function XCharacterManager.GetCharResIcon(resId) if not resId then XLog.Error("XCharacterManager.GetCharResModel函数参数错误: 参数resId不能为空") return end local npcTemplate = CS.XNpcManager.GetNpcResTemplate(resId) if npcTemplate == nil then XLog.ErrorTableDataNotFound("XCharacterManager.GetCharResIcon", "npcTemplate", "Share/Fight/Npc/NpcRes.tab", "resId", tostring(resId)) return end return npcTemplate.HeadImageName end --角色类型描述,根据类型字段判断职业预览类型说明 function XCharacterManager.GetCareerIdsByCharacterType(characterType) local careerIds = XCharacterConfigs.GetAllCharacterCareerIds() local showId = 0 local typeIds = {} for id, v in ipairs(careerIds) do showId = XCharacterConfigs.GetNpcTypeShowId(v) if showId == characterType or showId == 0 then tableInsert(typeIds, id) end end table.sort(typeIds,function(id1,id2) return XCharacterConfigs.GetNpcTypeSortId(id1) > XCharacterConfigs.GetNpcTypeSortId(id2) end) return typeIds end --红点相关----------------------------- function XCharacterManager.CanLevelUp(characterId) if not characterId then return false end if not XCharacterManager.IsOwnCharacter(characterId) then return false end local character = XCharacterManager.GetCharacter(characterId) if not character then return false end if XCharacterManager.IsOverLevel(characterId) or XCharacterManager.IsMaxLevel(characterId) then return false end local expItemsInfo = XDataCenter.ItemManager.GetCardExpItems() return next(expItemsInfo) end --检测是否可以提升品质 function XCharacterManager.CanPromoteQuality(characterId) if not characterId then return false end if not XCharacterManager.IsOwnCharacter(characterId) then return false end local character = XCharacterManager.GetCharacter(characterId) if XCharacterManager.IsMaxQuality(character) then return false end --最大星级时可以进化到下一阶 if character.Star == XCharacterConfigs.MAX_QUALITY_STAR then return XCharacterManager.IsCanPromoted(character.Id) end local star = character.Star + 1 if not XCharacterManager.IsActivateStarUseItemEnough(character.Id, character.Quality, star) then return false end return true end --检测是否可以晋升 function XCharacterManager.CanPromoteGrade(characterId) if not characterId then return false end if not XCharacterManager.IsOwnCharacter(characterId) then return false end local character = XCharacterManager.GetCharacter(characterId) if XCharacterManager.IsMaxCharGrade(character) then return false end if not XCharacterManager.CheckCanPromoteGradePrecondition(characterId, character.Id, character.Grade) then return false end if not XCharacterManager.IsPromoteGradeUseItemEnough(character.Id, character.Grade) then return false end return true end function XCharacterManager.CheckCanPromoteGradePrecondition(characterId, templateId, grade) local gradeTemplate = XCharacterConfigs.GetGradeTemplates(templateId, grade) if not gradeTemplate then return end if #gradeTemplate.ConditionId > 0 then for i = 1, #gradeTemplate.ConditionId do local coditionId = gradeTemplate.ConditionId[i] if not XConditionManager.CheckCondition(coditionId, characterId) then return false end end return true else return true end end --是否有技能红点 function XCharacterManager.CanPromoteSkill(characterId) if not characterId then return false end local character = OwnCharacters[characterId] if not character then return false end local canUpdate = false local skills = XCharacterConfigs.GetCharacterSkills(characterId) for _, skill in pairs(skills) do for _, subSkill in ipairs(skill.subSkills) do if (XCharacterManager.CheckCanUpdateSkill(characterId, subSkill.SubSkillId, subSkill.Level)) then canUpdate = true break end end end return canUpdate end --判断是否能解锁 function XCharacterManager:CanCharacterUnlock(characterId) if not characterId then return false end if XCharacterManager.IsOwnCharacter(characterId) then return false end local character = XCharacterConfigs.GetCharacterTemplate(characterId) local itemId = character.ItemId local bornQulity = XCharacterConfigs.GetCharMinQuality(characterId) local characterType = XCharacterConfigs.GetCharacterType(characterId) local itemCount = XCharacterConfigs.GetComposeCount(characterType, bornQulity) if not XCharacterManager.IsUseItemEnough(itemId, itemCount) then return false end return true end function XCharacterManager.NotifyCharacterDataList(data) local characterList = data.CharacterDataList if not characterList then return end for _, character in pairs(characterList) do XCharacterManager.OnSyncCharacter(character) end end function XCharacterManager.GetCharacterLevel(characterId) if XRobotManager.CheckIsRobotId(characterId) then return XRobotManager.GetRobotCharacterLevel(characterId) end local ownCharacter = XCharacterManager.GetCharacter(characterId) return ownCharacter and ownCharacter.Level or 0 end function XCharacterManager.GetCharacterQuality(characterId) if XRobotManager.CheckIsRobotId(characterId) then return XRobotManager.GetRobotCharacterQuality(characterId) end local ownCharacter = XCharacterManager.GetCharacter(characterId) if ownCharacter then return ownCharacter.Quality or 0 end return XCharacterConfigs.GetCharacterQualityCfg(characterId) end function XCharacterManager.GetCharacterHaveRobotAbilityById(characterId) if XRobotManager.CheckIsRobotId(characterId) then return XRobotManager.GetRobotAbility(characterId) end local ownCharacter = XCharacterManager.GetCharacter(characterId) return ownCharacter and ownCharacter.Ability or 0 end -----------------------------------------------补强技能相关--------------------------------------------- function XCharacterManager.CheckCharacterShowRed(characterId) local character = OwnCharacters[characterId] if not character then return false end local groupDic = character:GetEnhanceSkillGroupDataDic() for _,group in pairs(groupDic) do local IsPassCondition,_ = XCharacterManager.GetEnhanceSkillIsPassCondition(group, characterId) if XCharacterManager.CheckEnhanceSkillIsCanUnlockOrLevelUp(group) and IsPassCondition then return true end end return false end function XCharacterManager.GetEnhanceSkillIsPassCondition(enhanceSkillGroup, characterId) local passCondition = true local conditionDes = "" local conditions = enhanceSkillGroup:GetConditionList() if conditions then for _, conditionId in pairs(conditions) do if conditionId ~= 0 then passCondition, conditionDes = XConditionManager.CheckCondition(conditionId, characterId) if not passCondition then break end end end end return passCondition, conditionDes end function XCharacterManager.CheckEnhanceSkillIsCanUnlockOrLevelUp(enhanceSkillGroup) local useItemList = enhanceSkillGroup:GetCostItemList() for _,useItem in pairs(useItemList or {}) do local curCount = XDataCenter.ItemManager.GetCount(useItem.Id) if curCount < useItem.Count then return false end end return true and not enhanceSkillGroup:GetIsMaxLevel() end function XCharacterManager.UnlockEnhanceSkillRequest(skillGroupId, characterId, cb) local req = { SkillGroupId = skillGroupId } XNetwork.Call(METHOD_NAME.UnlockEnhanceSkill, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_ENHANCESKILL_UNLOCK, characterId) if cb then cb() end end) end function XCharacterManager.UpgradeEnhanceSkillRequest(skillGroupId, count, characterId, cb) local req = { SkillGroupId = skillGroupId, Count = count } XNetwork.Call(METHOD_NAME.UpgradeEnhanceSkill, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_ENHANCESKILL_UP, characterId) if cb then cb() end end) end XCharacterManager.GetSkillAbility = GetSkillAbility return XCharacterManager end XRpc.NotifyCharacterDataList = function(data) XDataCenter.CharacterManager.NotifyCharacterDataList(data) end