---@class XCharacterAgency : XAgency ---@field _Model XCharacterModel local XCharacterAgency = XClass(XAgency, "XCharacterAgency") 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 -- 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", } function XCharacterAgency:OnInit() --初始化一些变量 end function XCharacterAgency:InitRpc() --实现服务器事件注册 --XRpc.XXX XRpc.NotifyCharacterDataList = handler(self, self.NotifyCharacterDataListV2P6) end function XCharacterAgency:InitEvent() --实现跨Agency事件注册 --self:AddAgencyEvent() end ----------public start---------- -- 检查该角色是否是碎片 ---********************************************************************************************************************************** -- service config end -- -- 是否展示独域/跃升技能 function XCharacterAgency:CheckIsShowEnhanceSkill(charId) local characterType = XCharacterConfigs.GetCharacterType(charId) local character = self:GetCharacter(charId) local functionId = characterType == XCharacterConfigs.CharacterType.Normal and XFunctionManager.FunctionName.CharacterEnhanceSkill or XFunctionManager.FunctionName.SpCharacterEnhanceSkill local IsShowEnhanceSkill = character:GetIsHasEnhanceSkill() and not XFunctionManager.CheckFunctionFitter(functionId) return IsShowEnhanceSkill end function XCharacterAgency:CheckIsCharOrRobot(id) if XRobotManager.CheckIsRobotId(id) then return true end if XCharacterConfigs.GetCharacterTemplate(id) then return true end return false end function XCharacterAgency:CheckIsFragment(id) if self:IsOwnCharacter(id) then return false end if XRobotManager.CheckIsRobotId(id) then return false end return true end function XCharacterAgency:GetCharUnlockFragment(templateId) if not templateId then XLog.Error("self:GetCharUnlockFragment函数参数错误, 参数templateId不能为空") return end local curCharItemId = XCharacterConfigs.GetCharacterTemplate(templateId).ItemId if not curCharItemId then XLog.ErrorTableDataNotFound("self: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 XCharacterAgency:NewCharacter(character) if character == nil or character.Id == nil then XLog.Error("self:NewCharacter函数参数不能为空或者参数的Id字段不能为空") return end return XCharacter.New(character) end function XCharacterAgency:InitCharacters(characters) for _, character in pairs(characters) do self._Model.OwnCharacters[character.Id] = self:NewCharacter(character) end end ---@return XCharacter function XCharacterAgency:GetCharacter(id) return self._Model.OwnCharacters[id] end function XCharacterAgency:IsOwnCharacter(characterId) return self._Model.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 function XCharacterAgency:GetDefaultSortFunc() return DefaultSort end --==============================-- --desc: 获取卡牌列表(获得) --@return 卡牌列表 --==============================-- function XCharacterAgency: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 self._Model.OwnCharacters[k] then if isNeedIsomer == nil then tableInsert(characterList, self._Model.OwnCharacters[k]) elseif isNeedIsomer and XCharacterConfigs.IsIsomer(k) then tableInsert(characterList, self._Model.OwnCharacters[k]) elseif isNeedIsomer == false and not XCharacterConfigs.IsIsomer(k) then tableInsert(characterList, self._Model.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 -- 合并列表 for _, char in pairs(unOwnCharList) do tableInsert(characterList, char) end -- v2.6 使用筛选器拍戏了不需要再在这排序 -- characterList = XDataCenter.CommonCharacterFiltManager.DoSort(characterList) return characterList end function XCharacterAgency: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(self._Model.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 XCharacterAgency:GetCharacterCountByAbility(ability) local count = 0 for _, v in pairs(self._Model.OwnCharacters) do local curAbility = self:GetCharacterAbility(v) if curAbility and curAbility >= ability then count = count + 1 end end return count end --队伍预设列表排序特殊处理 function XCharacterAgency:GetSpecilOwnCharacterList() local characterList = {} for _, v in pairs(self._Model.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 XCharacterAgency:GetCharacterListInTeam(characterType) local characterList = self: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 XCharacterAgency:GetCharacterIdListInTeam(characterType) local characterList = self: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 XCharacterAgency:GetAssignCharacterListInTeam(characterType, tmpTeamIdDic) local characterList = self: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 XCharacterAgency:GetRobotAndCharacterIdList(robotIdList, characterType) local characterList = self:GetOwnCharacterList(characterType) local idList = XRobotManager.GetRobotIdFilterListByCharacterType(robotIdList, characterType) for _, char in pairs(characterList) do table.insert(idList, char.Id) end return idList end --根据robotIdList返回已拥有的角色Id列表 function XCharacterAgency: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 self:IsOwnCharacter(charId) then table.insert(ownCharacterIdList, charId) end end return ownCharacterIdList end --根据robotIdList返回已拥有的角色列表 function XCharacterAgency:GetRobotCorrespondCharacterList(robotIdList, characterType) if XTool.IsNumberValid(characterType) then robotIdList = XRobotManager.GetRobotIdFilterListByCharacterType(robotIdList, characterType) end local ownCharacterList = {} for _, robotId in ipairs(robotIdList) do local charId = XRobotManager.GetCharacterId(robotId) local char = self:GetCharacter(charId) if char then table.insert(ownCharacterList, char) end end return ownCharacterList end --根据robotIdList返回试玩和已拥有的角色列表 function XCharacterAgency:GetRobotAndCorrespondCharacterIdList(robotIdList, characterType) robotIdList = XRobotManager.GetRobotIdFilterListByCharacterType(robotIdList, characterType) local characterList = self:GetRobotCorrespondCharacterIdList(robotIdList) local idList = XRobotManager.GetRobotIdFilterListByCharacterType(robotIdList, characterType) for _, charId in pairs(characterList) do table.insert(idList, charId) end return idList end function XCharacterAgency: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 XCharacterAgency:AddCharacter(charData) local character = self:NewCharacter(charData) self._Model.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 XCharacterAgency: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 XCharacterAgency: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 XCharacterAgency:GetFightNpcData(characterId) local character = characterId if type(characterId) == "number" then character = self: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 = self:GetSkillPlus(character) } end function XCharacterAgency: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 = self:GetSkillPlusOther(character, assignChapterRecords) } end function XCharacterAgency:GetCharacterAttribs(character) local npcData = self:GetFightNpcData(character) if not npcData then return end return XAttribManager.GetNpcAttribs(npcData) end function XCharacterAgency:GetCharacterAttribsOther(character, equipList, assignChapterRecords) local npcData = self: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 XCharacterAgency.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 XCharacterAgency:GetCharacterAbility(character) local npcData = self: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) --武器超限战力 local equip = XDataCenter.EquipManager.GetCharacterWearingWeapon(character.Id) local overrunAbility = equip and equip:GetOverrunAbility() or 0 return baseAbility + skillAbility + resonanceSkillAbility + plusSkillAbility + equipAbility + partnerAbility + enhanceSkillAbility + overrunAbility end -- partner : XPartner function XCharacterAgency:GetCharacterAbilityOther(character, equipList, assignChapterRecords, partner) local npcData = self:GetFightNpcDataOther(character, equipList, assignChapterRecords) if not npcData then return end local attribs = self: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) --武器超限战力 local overrunAbility = 0 for _, equip in pairs(equipList) do if equip and equip:IsWeapon() then overrunAbility = equip:GetOverrunAbility() end end return baseAbility + skillAbility + resonanceSkillAbility + plusSkillAbility + equipAbility + partnerAbility + enhanceSkillAbility + overrunAbility end -- 根据id获得身上角色战力 function XCharacterAgency:GetCharacterAbilityById(characterId) local character = self._Model.OwnCharacters[characterId] return character and self:GetCharacterAbility(character) or 0 end function XCharacterAgency:GetMaxOwnCharacterAbility() local maxAbility = 0 for _, character in pairs(self._Model.OwnCharacters) do local ability = self:GetCharacterAbility(character) maxAbility = mathMax(ability, maxAbility) end return maxAbility end function XCharacterAgency:GetNpcBaseAttrib(npcId) local npcTemplate = CS.XNpcManager.GetNpcTemplate(npcId) if not npcTemplate then XLog.ErrorTableDataNotFound("self:GetNpcBaseAttrib", "npcTemplate", "Client/Fight/Npc/Npc.tab", "npcId", tostring(npcId)) return end return XAttribManager.GetBaseAttribs(npcTemplate.AttribId) end -- 升级相关begin -- function XCharacterAgency:IsOverLevel(templateId) local curLevel = XPlayer.Level local char = self:GetCharacter(templateId) return char and char.Level >= curLevel end function XCharacterAgency:IsMaxLevel(templateId) local char = self:GetCharacter(templateId) local maxLevel = XCharacterConfigs.GetCharMaxLevel(templateId) return char and char.Level >= maxLevel end function XCharacterAgency: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 XCharacterAgency:GetMaxAvailableLevel(templateId) if not templateId then return end local charMaxLevel = XCharacterConfigs.GetCharMaxLevel(templateId) local playerMaxLevel = XPlayer.Level return mathMin(charMaxLevel, playerMaxLevel) end function XCharacterAgency: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 XCharacterAgency:IsMaxQuality(character) if not character then XLog.Error("self:IsMaxQuality函数参数character不能为空") return end return character.Quality >= XCharacterConfigs.GetCharMaxQuality(character.Id) end function XCharacterAgency:IsMaxQualityById(characterId) if not characterId then return end local character = self:GetCharacter(characterId) return character and character.Quality >= XCharacterConfigs.GetCharMaxQuality(character.Id) end function XCharacterAgency:IsCanActivateStar(character) if not character then XLog.Error("self:IsCanActivateStar函数参数character不能为空") return end if character.Quality >= XCharacterConfigs.GetCharMaxQuality(character.Id) then return false end if character.Star >= XEnumConst.CHARACTER.MAX_QUALITY_STAR then return false end return true end function XCharacterAgency:IsActivateStarUseItemEnough(templateId, quality, star) if not templateId or not quality or not star then local tmpStr = "self:IsCharQualityStarUseItemEnough函数参数错误:, 参数templateId是" XLog.Error(tmpStr .. templateId .. " 参数quality是" .. quality .. " 参数star是" .. star) return end local template = XCharacterConfigs.GetCharacterTemplate(templateId) if not template then XLog.ErrorTableDataNotFound("self:IsCharQualityStarUseItemEnough", "template", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end if quality < 1 then XLog.Error("self:IsCharQualityStarUseItemEnough错误: 参数quality不能小于1, 参数quality是: " .. quality) return end if star < 1 or star > XEnumConst.CHARACTER.MAX_QUALITY_STAR then local tmpStr = "self:IsCharQualityStarUseItemEnough函数错误: 参数star不能小于1或者大于" XLog.Error(tmpStr .. XEnumConst.CHARACTER.MAX_QUALITY_STAR .. ", 参数star是: " .. star) return end local itemKey = template.ItemId local characterType = XCharacterConfigs.GetCharacterType(templateId) local itemCount = XCharacterConfigs.GetStarUseCount(characterType, quality, star) return self:IsUseItemEnough(itemKey, itemCount) end function XCharacterAgency:IsCanPromoted(characterId) local character = self: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 XCharacterAgency:GetShowFashionId(templateId, isNotSelf) -- 默认优先拿自己的数据 if isNotSelf == nil then isNotSelf = false end -- 不属于自身数据的直接获取本地即可 if isNotSelf then return XCharacterConfigs.GetCharacterTemplate(templateId).DefaultNpcFashtionId end if self:IsOwnCharacter(templateId) == true then return self._Model.OwnCharacters[templateId].FashionId else return XCharacterConfigs.GetCharacterTemplate(templateId).DefaultNpcFashtionId end end --得到角色需要展示的时装头像信息 function XCharacterAgency:GetCharacterFashionHeadInfo(templateId, isNotSelf) local headFashionId, headFashionType = self:GetShowFashionId(templateId, isNotSelf), XFashionConfigs.HeadPortraitType.Default --不是自己拥有的角色,返回默认头像类型,默认涂装Id if isNotSelf then return headFashionId, headFashionType end local character = self._Model.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 XCharacterAgency:CharacterSetHeadInfoRequest(characterId, headFashionId, headFashionType, cb) local req = { TemplateId = characterId, CharacterHeadInfo = { HeadFashionId = headFashionId or self: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 XCharacterAgency:GetCharHalfBodyBigImage(templateId) --获得角色半身像(剧情用) local fashionId = self:GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("self:GetCharHalfBodyBigImage", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end return XDataCenter.FashionManager.GetFashionHalfBodyImage(fashionId) end function XCharacterAgency:GetCharHalfBodyImage(templateId) --获得角色半身像(通用) local fashionId = self:GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("self:GetCharHalfBodyImage", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end return XDataCenter.FashionManager.GetRoleCharacterBigImage(fashionId) end function XCharacterAgency:GetCharSmallHeadIcon(templateId, isNotSelf, headFashionId, headFashionType) --获得角色小头像 local characterId = XCharacterCuteConfig.GetCharacterIdByNpcId(templateId) if characterId then local stageId = XDataCenter.FubenManager.GetCurrentStageId() if XDataCenter.FubenSpecialTrainManager.IsStageCute(stageId) then return XCharacterCuteConfig.GetCuteModelSmallHeadIcon(characterId) end templateId = characterId end if not XTool.IsNumberValid(headFashionId) or not headFashionType then headFashionId, headFashionType = self:GetCharacterFashionHeadInfo(templateId, isNotSelf) end return XDataCenter.FashionManager.GetFashionSmallHeadIcon(headFashionId, headFashionType) end function XCharacterAgency:GetCharSmallHeadIconByCharacter(character) --获得角色小头像(战斗用) local headInfo = character.CharacterHeadInfo or {} return self:GetCharSmallHeadIcon(character.Id, true, headInfo.HeadFashionId, headInfo.HeadFashionType) end function XCharacterAgency:GetCharBigHeadIcon(templateId, isNotSelf, headFashionId, headFashionType) --获得角色大头像 if not XTool.IsNumberValid(headFashionId) or not headFashionType then headFashionId, headFashionType = self:GetCharacterFashionHeadInfo(templateId, isNotSelf) end return XDataCenter.FashionManager.GetFashionBigHeadIcon(headFashionId, headFashionType) end function XCharacterAgency:GetCharRoundnessHeadIcon(templateId) --获得角色圆头像 local fashionId = self:GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("self:GetCharRoundnessHeadIcon", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end return XDataCenter.FashionManager.GetFashionRoundnessHeadIcon(fashionId) end function XCharacterAgency:GetCharBigRoundnessHeadIcon(templateId) --获得角色大圆头像 local fashionId = self:GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("self:GetCharBigRoundnessHeadIcon", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end return XDataCenter.FashionManager.GetFashionBigRoundnessHeadIcon(fashionId) end function XCharacterAgency:GetCharBigRoundnessNotItemHeadIcon(templateId, liberateLv) --获得角色圆头像(非物品使用) local fashionId = self:GetShowFashionId(templateId) if fashionId == nil then XLog.ErrorTableDataNotFound("self:GetCharBigRoundnessNotItemHeadIcon", "DefaultNpcFashtionId", "Share/Character/Character.tab", "templateId", tostring(templateId)) return end -- local isAchieveMaxLiberation = not liberateLv and XDataCenter.ExhibitionManager.IsAchieveLiberation(templateId, XCharacterConfigs.GrowUpLevel.Higher) -- or (liberateLv > XCharacterConfigs.GrowUpLevel.Higher) local isAchieveMaxLiberation = nil if liberateLv then isAchieveMaxLiberation = liberateLv >= XCharacterConfigs.GrowUpLevel.Higher else isAchieveMaxLiberation = XDataCenter.ExhibitionManager.IsAchieveLiberation(templateId, XCharacterConfigs.GrowUpLevel.Higher) end local result = isAchieveMaxLiberation and XDataCenter.FashionManager.GetFashionRoundnessNotItemHeadIconLiberation(fashionId) or XDataCenter.FashionManager.GetFashionRoundnessNotItemHeadIcon(fashionId) return result end function XCharacterAgency:GetFightCharHeadIcon(character, characterId) --获得战斗角色头像 local fashionId = character.FashionId local isAchieveMaxLiberation = XDataCenter.ExhibitionManager.IsAchieveLiberation(characterId or character.Id, XCharacterConfigs.GrowUpLevel.Higher) if isAchieveMaxLiberation then return XDataCenter.FashionManager.GetFashionRoundnessNotItemHeadIconLiberation(fashionId) else return XDataCenter.FashionManager.GetFashionRoundnessNotItemHeadIcon(fashionId) end end function XCharacterAgency:GetCharShowFashionSceneUrl(templateId) --获取角色需要显示时装所关联的场景路径 if not templateId then XLog.Error("self:GetCharShowFashionSceneUrl函数参数错误, 参数templateId不能为空") return end local fashionId = self:GetShowFashionId(templateId) if not fashionId then XLog.Error("self:GetCharShowFashionSceneUrl函数参数错误, 获取fashionId失败") return end local sceneUrl = XDataCenter.FashionManager.GetFashionSceneUrl(fashionId) return sceneUrl end --v1.28-升阶拆分-获取角色所有品质升阶信息 function XCharacterAgency:GetCharQualitySkillInfo(characterId) local character = self: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 XCharacterAgency:GetCharQualitySkillName(characterId, quality, star) local character = self: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 function XCharacterAgency:GetCharQualityAttributeInfo(characterId) local attributeData = {} local characterMinQuality = XCharacterConfigs.GetCharMinQuality(characterId) local characterMaxQuality = XCharacterConfigs.GetCharMaxQuality(characterId) local attritubues = {} for i = characterMinQuality, characterMaxQuality do local attrbis = XCharacterConfigs.GetNpcPromotedAttribByQuality(characterId, i) local temp = {} table.insert(temp, stringFormat("%.2f", FixToDouble(attrbis[XNpcAttribType.Life]))) table.insert(temp, stringFormat("%.2f", FixToDouble(attrbis[XNpcAttribType.AttackNormal]))) table.insert(temp, stringFormat("%.2f", FixToDouble(attrbis[XNpcAttribType.DefenseNormal]))) table.insert(temp, stringFormat("%.2f", FixToDouble(attrbis[XNpcAttribType.Crit]))) table.insert(temp, i) table.insert(attritubues, temp) end --处理品质前后数值变化 for i = 1, #attritubues - 1 do local result = {} table.insert(result, attritubues[i]) table.insert(result, attritubues[i + 1]) table.insert(attributeData, result) end return attributeData end function XCharacterAgency:GetCharQualityAttributeInfoV2P6(characterId) local characterMinQuality = XCharacterConfigs.GetCharMinQuality(characterId) local characterMaxQuality = XCharacterConfigs.GetCharMaxQuality(characterId) local attritubues = {} for i = characterMinQuality, characterMaxQuality do local attrbis = XCharacterConfigs.GetNpcPromotedAttribByQuality(characterId, i) local temp = {} table.insert(temp, stringFormat("%.2f", FixToDouble(attrbis[XNpcAttribType.Life]))) table.insert(temp, stringFormat("%.2f", FixToDouble(attrbis[XNpcAttribType.AttackNormal]))) table.insert(temp, stringFormat("%.2f", FixToDouble(attrbis[XNpcAttribType.DefenseNormal]))) table.insert(temp, stringFormat("%.2f", FixToDouble(attrbis[XNpcAttribType.Crit]))) table.insert(temp, i) table.insert(attritubues, temp) end return attritubues end function XCharacterAgency:GetCharQualityAddAttributeTotalInfoV2P6(characterId, targetQuality, targetStarIndex) local char = self:GetCharacter(characterId) local addAttrRes = {} for starIndex = 1, (targetStarIndex or char.Star) do local attribs = XCharacterConfigs.GetCharCurStarAttribsV2P6(characterId, targetQuality or char.Quality, starIndex) for k, v in pairs(attribs or {}) do local value = FixToDouble(v) if value > 0 then if not addAttrRes[k] then addAttrRes[k] = 0 end addAttrRes[k] = addAttrRes[k] + value break -- 只取第一个有效值 end end end return addAttrRes end -- 品质相关end -- -- 改造相关begin -- function XCharacterAgency:IsMaxCharGrade(character) return character.Grade >= XCharacterConfigs.GetCharMaxGrade(character.Id) end function XCharacterAgency:IsPromoteGradeUseItemEnough(templateId, grade) if not templateId or not grade then XLog.Error("self:IsPromoteGradeUseItemEnough参数不能为空: 参数templateId是 " .. templateId .. " 参数grade是" .. grade) return end local gradeConfig = XCharacterConfigs.GetGradeTemplates(templateId, grade) if not gradeConfig then XLog.ErrorTableDataNotFound("self: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 self:IsUseItemEnough(itemKey, itemCount) end -- 查看有没有设置过超解球颜色,并返回球的颜色 function XCharacterAgency:CheckHasSuperExhibitionBallColor(charId) local character = self:GetCharacter(charId) if not character then return nil end local magicIdColorBallList = CS.XGame.Config:GetString("HigherLiberateLvMagicId") magicIdColorBallList = string.Split(magicIdColorBallList, "|") local magicList = character.MagicList for k, v in pairs(magicList or {}) do for k2, magicId in pairs(magicIdColorBallList) do if v.Id == tonumber(magicId) then return k2 -- 球的颜色 具体看枚举 XCharacterConfigs.CharacterLiberateBallColorType end end end return nil end -- 检测角色是否所有技能满级 function XCharacterAgency:CheckCharacterAllSkillMax(charId) if not self:IsOwnCharacter(charId) then return false end -- 普通技能 local skills = XCharacterConfigs.GetCharacterSkills(charId) for k, skill in pairs(skills) do for k, subSkill in pairs(skill.subSkills) do local min_max = XCharacterConfigs.GetSubSkillMinMaxLevel(subSkill.SubSkillId) if (subSkill.Level < min_max.Max) then return false end end end if not self:CheckIsShowEnhanceSkill(charId) then return true end -- 独域/跃升技能 local char = self:GetCharacter(charId) local skillGroupIdList = char:GetEnhanceSkillGroupIdList() or {} for index, skillGroupId in pairs(skillGroupIdList) do local skillGroup = char:GetEnhanceSkillGroupData(skillGroupId) if not skillGroup:GetIsMaxLevel() then return false end end return true end function XCharacterAgency:CheckCanUpdateSkill(charId, subSkillId, subSkillLevel) local char = self: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 self:IsUseItemEnough(XDataCenter.ItemManager.ItemId.SkillPoint, gradeConfig.UseSkillPoint)) then return false end if (not self:IsUseItemEnough(XDataCenter.ItemManager.ItemId.Coin, gradeConfig.UseCoin)) then return false end return true end --处理一次多级的请求升级是否满足条件 function XCharacterAgency:CheckCanUpdateSkillMultiLevel(charId, subSkillId, subSkillLevel, subSkillLevelUp) local char = self: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 self:IsUseItemEnough(XDataCenter.ItemManager.ItemId.SkillPoint, useSkillPoint)) then return false end if (not self:IsUseItemEnough(XDataCenter.ItemManager.ItemId.Coin, useCoin)) then return false end return true end --得到人物技能共鸣等级 function XCharacterAgency:GetResonanceSkillLevel(characterId, skillId) if not characterId or characterId == 0 then return 0 end if not self:IsOwnCharacter(characterId) then return 0 end local npcData = {} npcData.Character = self:GetCharacter(characterId) npcData.Equips = XDataCenter.EquipManager.GetCharacterWearingEquips(characterId) local resonanceSkillLevelMap = XMagicSkillManager.GetResonanceSkillLevelMap(npcData) return resonanceSkillLevelMap[skillId] or 0 end --得到人物技能驻守等级 function XCharacterAgency:GetAssignSkillLevel(characterId, skillId) if not characterId or characterId == 0 then return 0 end if not self:IsOwnCharacter(characterId) then return 0 end return XDataCenter.FubenAssignManager.GetSkillLevel(characterId, skillId) end --得到人物技能总加成等级 function XCharacterAgency:GetSkillPlusLevel(characterId, skillId) return self:GetResonanceSkillLevel(characterId, skillId) + self:GetAssignSkillLevel(characterId, skillId) end --==============================-- --desc: 获取队长技能描述 --@characterId: 卡牌数据 --@return 技能Data --==============================-- function XCharacterAgency:GetCaptainSkillInfo(characterId) local captianSkillId = XCharacterConfigs.GetCharacterCaptainSkill(characterId) local skillLevel = self:GetSkillLevel(captianSkillId) return XCharacterConfigs.GetCaptainSkillInfo(characterId, skillLevel) end --==============================-- --desc: 获取队长技能描述 --@characterId: 卡牌数据 --@isOnlyShowIntro: 是否只显示技能描述 --==============================-- function XCharacterAgency:GetCaptainSkillDesc(characterId, isOnlyShowIntro) local captianSkillInfo = self:GetCaptainSkillInfo(characterId) return (captianSkillInfo and captianSkillInfo.Level > 0 or isOnlyShowIntro) and captianSkillInfo.Intro or stringFormat("%s%s", captianSkillInfo.Intro, CsXTextManagerGetText("CaptainSkillLock")) end function XCharacterAgency:GetSkillLevel(skillId) local characterId = XCharacterConfigs.GetCharacterIdBySkillId(skillId) local character = self:GetCharacter(characterId) return character and character:GetSkillLevelBySkillId(skillId) or 0 end function XCharacterAgency:GetSpecialWeaponSkillDes(skillId) local skillLevel = self:GetSkillLevel(skillId) local characterId = XCharacterConfigs.GetCharacterIdBySkillId(skillId) local addLevel = self:GetSkillPlusLevel(characterId, skillId) skillLevel = skillLevel + addLevel skillLevel = skillLevel == 0 and 1 or skillLevel return XCharacterConfigs.GetSkillGradeDesConfigWeaponSkillDes(skillId, skillLevel) end --解锁角色终阶解放技能 function XCharacterAgency:UnlockMaxLiberationSkill(characterId) local skillGroupId = XCharacterConfigs.GetCharMaxLiberationSkillGroupId(characterId) local character = self._Model.OwnCharacters[characterId] if character then local skillLevel = character:GetSkillLevel(skillGroupId) if not skillLevel or skillLevel <= 0 then self:UnlockSubSkill(nil, characterId, nil, skillGroupId) end end end -- 技能相关end -- -- 服务端相关begin-- function XCharacterAgency:ExchangeCharacter(templateId, cb) if self: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 self: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 XCharacterAgency:OnSyncCharacter(protoData) if not self._Model.OwnCharacters[protoData.Id] then self: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 self._Model.OwnCharacters[protoData.Id]:Sync(protoData) end function XCharacterAgency:OnSyncCharacterEquipChange(charIdDic) if not next(charIdDic) then return end for charId, _ in pairs(charIdDic) do local character = self._Model.OwnCharacters[charId] character:RefreshAttribs() end XEventManager.DispatchEvent(XEventId.EVENT_EQUIP_CHARACTER_EQUIP_CHANGE, charIdDic) end function XCharacterAgency:OnSyncCharacterVitality(characterId, vitality) local character = self._Model.OwnCharacters[characterId] if not character then return end character.Vitality = vitality end function XCharacterAgency:AddExp(character, itemDict, cb) if type(character) == "number" then character = self._Model.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 -- 不升级用小弹窗,升级用大窗 if character.Level <= oldLevel then local useStr = CS.XTextManager.GetText("CharacterExpItemsUse") local addStr = CS.XTextManager.GetText("ExpAdd", exp) XUiManager.PopupLeftTip(useStr, addStr) end XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_LEVEL_UP, character.Id) cb() end) end function XCharacterAgency:ActivateStar(character, cb) if type(character) == "number" then character = self._Model.OwnCharacters[character] end cb = cb or function() end if self:IsMaxQuality(character) then XUiManager.TipCode(XCode.CharacterManagerMaxQuality) return end if character.Star >= XEnumConst.CHARACTER.MAX_QUALITY_STAR then XUiManager.TipCode(XCode.CharacterManagerActivateStarMaxStar) return end local star = character.Star + 1 if not self: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 = self: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)) XUiManager.PopupLeftTip(CS.XTextManager.GetText("CharacterActivation"), XUiHelper.GetText("CharacterQualityTip", attrText, skillText)) if cb then cb() end end) end function XCharacterAgency:PromoteQuality(character, cb) if type(character) == "number" then character = self._Model.OwnCharacters[character] end if self:IsMaxQuality(character) then XUiManager.TipCode(XCode.CharacterManagerMaxQuality) return end if character.Star < XEnumConst.CHARACTER.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() self: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 XCharacterAgency:PromoteGrade(character, cb) if type(character) == "number" then character = self._Model.OwnCharacters[character] end if self:IsMaxCharGrade(character) then XUiManager.TipCode(XCode.CharacterManagerMaxGrade) return end if not self: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 XCharacterAgency: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 XCharacterAgency: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 XCharacterAgency:IsSkillUsing(skillId) local characterId = XCharacterConfigs.GetCharacterIdBySkillId(skillId) local character = self:GetCharacter(characterId) return character and character:IsSkillUsing(skillId) or false end function XCharacterAgency: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 = self:GetCharacter(characterId) character:SwithSkill(skillId) if cb then cb() end end) end -- 服务端相关end-- function XCharacterAgency:GetCharModel(templateId, quality) if not templateId then XLog.Error("self: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("self:GetCharModel", "npcTemplate", " Client/Fight/Npc/Npc.tab", "npcId", tostring(npcId)) return end return npcTemplate.ModelId end function XCharacterAgency:GetCharResModel(resId) if not resId then XLog.Error("self:GetCharResModel函数参数错误: 参数resId不能为空") return end local npcTemplate = CS.XNpcManager.GetNpcResTemplate(resId) if npcTemplate == nil then XLog.ErrorTableDataNotFound("self:GetCharResModel", "npcTemplate", "Share/Fight/Npc/NpcRes.tab", "resId", tostring(resId)) return end return npcTemplate.ModelId end --获取角色解放等级到对应的ModelId function XCharacterAgency:GetCharLiberationLevelModelId(characterId, growUpLevel) if not characterId then XLog.Error("self:GetCharLiberationLevelModel函数参数错误: 参数characterId不能为空") return end growUpLevel = growUpLevel or XCharacterConfigs.GrowUpLevel.New local modelId = XCharacterConfigs.GetCharLiberationLevelModelId(characterId, growUpLevel) if not modelId then local character = self:GetCharacter(characterId) return self:GetCharModel(characterId, character.Quality) end return modelId end --获取角色解放等级到对应的解放特效名称和模型挂点名 function XCharacterAgency:GetCharLiberationLevelEffectRootAndPath(characterId, growUpLevel) if not characterId then XLog.Error("self:GetCharLiberationLevelModel函数参数错误: 参数characterId不能为空") return end growUpLevel = growUpLevel or XDataCenter.ExhibitionManager.GetCharacterGrowUpLevel(characterId) return XCharacterConfigs.GetCharLiberationLevelEffectRootAndPath(characterId, growUpLevel) end --获取已解放角色时装到对应的解放特效名称和模型挂点名(传入growUpLevel为预览,否则为自己的角色) function XCharacterAgency:GetCharFashionLiberationEffectRootAndPath(characterId, growUpLevel, fashionId) if not characterId then XLog.Error("self:GetCharLiberationLevelModel函数参数错误: 参数characterId不能为空") return end --自己的角色 if not growUpLevel then --拥有该角色 if not self:IsOwnCharacter(characterId) then return end growUpLevel = XDataCenter.ExhibitionManager.GetCharacterGrowUpLevel(characterId) end --解放等级达到终解 local isAchieveMaxLiberation = growUpLevel >= XCharacterConfigs.GrowUpLevel.Higher if not isAchieveMaxLiberation then return end fashionId = fashionId or XDataCenter.FashionManager.GetFashionIdByCharId(characterId) return XDataCenter.FashionManager.GetFashionLiberationEffectRootAndPath(fashionId) end function XCharacterAgency:GetCharResIcon(resId) if not resId then XLog.Error("self:GetCharResModel函数参数错误: 参数resId不能为空") return end local npcTemplate = CS.XNpcManager.GetNpcResTemplate(resId) if npcTemplate == nil then XLog.ErrorTableDataNotFound("self:GetCharResIcon", "npcTemplate", "Share/Fight/Npc/NpcRes.tab", "resId", tostring(resId)) return end return npcTemplate.HeadImageName end --角色类型描述,根据类型字段判断职业预览类型说明 function XCharacterAgency: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 XCharacterAgency:CanLevelUp(characterId) if not characterId then return false end if not self:IsOwnCharacter(characterId) then return false end local character = self:GetCharacter(characterId) if not character then return false end if self:IsOverLevel(characterId) or self:IsMaxLevel(characterId) then return false end local expItemsInfo = XDataCenter.ItemManager.GetCardExpItems() return next(expItemsInfo) end --检测是否可以提升品质 function XCharacterAgency:CanPromoteQuality(characterId) if not characterId then return false end if not self:IsOwnCharacter(characterId) then return false end local character = self:GetCharacter(characterId) if self:IsMaxQuality(character) then return false end --最大星级时可以进化到下一阶 if character.Star == XEnumConst.CHARACTER.MAX_QUALITY_STAR then return self:IsCanPromoted(character.Id) end local star = character.Star + 1 if not self:IsActivateStarUseItemEnough(character.Id, character.Quality, star) then return false end return true end --检测是否可以晋升 function XCharacterAgency:CanPromoteGrade(characterId) if not characterId then return false end if not self:IsOwnCharacter(characterId) then return false end local character = self:GetCharacter(characterId) if self:IsMaxCharGrade(character) then return false end if not self:CheckCanPromoteGradePrecondition(characterId, character.Id, character.Grade) then return false end if not self:IsPromoteGradeUseItemEnough(character.Id, character.Grade) then return false end return true end function XCharacterAgency: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 XCharacterAgency:CanPromoteSkill(characterId) if not characterId then return false end local character = self._Model.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 (self:CheckCanUpdateSkill(characterId, subSkill.SubSkillId, subSkill.Level)) then canUpdate = true break end end end return canUpdate end --判断是否能解锁 function XCharacterAgency:CanCharacterUnlock(characterId) if not characterId then return false end if self:IsOwnCharacter(characterId) then return false end if XRobotManager.CheckIsRobotId(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 self:IsUseItemEnough(itemId, itemCount) then return false end return true end function XCharacterAgency:NotifyCharacterDataList(data) local characterList = data.CharacterDataList if not characterList then return end for _, character in pairs(characterList) do self:OnSyncCharacter(character) end end function XCharacterAgency:GetCharacterLevel(characterId) if XRobotManager.CheckIsRobotId(characterId) then return XRobotManager.GetRobotCharacterLevel(characterId) end local ownCharacter = self:GetCharacter(characterId) return ownCharacter and ownCharacter.Level or 0 end function XCharacterAgency:GetCharacterType(characterId) return XCharacterConfigs.GetCharacterType(characterId) end -- 角色当前阶级 function XCharacterAgency:GetCharacterGrade(characterId) local ownCharacter = self:GetCharacter(characterId) if ownCharacter then return ownCharacter.Grade or 1 end end -- 角色当前品质 function XCharacterAgency:GetCharacterQuality(characterId) if XRobotManager.CheckIsRobotId(characterId) then return XRobotManager.GetRobotCharacterQuality(characterId) end local ownCharacter = self:GetCharacter(characterId) if ownCharacter then return ownCharacter.Quality or 0 end return XCharacterConfigs.GetCharMinQuality(characterId) end -- 角色初始品质(不是自己的角色也可以用) function XCharacterAgency:GetCharacterInitialQuality(characterId) if XRobotManager.CheckIsRobotId(characterId) then characterId = XRobotManager.GetCharacterId(characterId) end return XCharacterConfigs.GetCharMinQuality(characterId) end -- 职业类型(不是自己的角色也可以用) function XCharacterAgency:GetCharacterCareer(characterId) if XRobotManager.CheckIsRobotId(characterId) then characterId = XRobotManager.GetCharacterId(characterId) end local detailConfig = XCharacterConfigs.GetCharDetailTemplate(characterId) if not detailConfig then return end local careerConfig = XCharacterConfigs.GetNpcTypeTemplate(detailConfig.Career) if not careerConfig then return end return careerConfig.Type end -- 元素类型(物理为纯物,不读elementList)(不是自己的角色也可以用) function XCharacterAgency:GetCharacterElement(characterId) if XRobotManager.CheckIsRobotId(characterId) then characterId = XRobotManager.GetCharacterId(characterId) end return XCharacterConfigs.GetCharacterElement(characterId) end function XCharacterAgency:GetCharacterElementIcon(characterId) local elementId = self:GetCharacterElement(characterId) return XCharacterConfigs.GetCharElement(elementId).Icon2 end function XCharacterAgency:GetCharacterHaveRobotAbilityById(characterId) if XRobotManager.CheckIsRobotId(characterId) then return XRobotManager.GetRobotAbility(characterId) end local ownCharacter = self:GetCharacter(characterId) return ownCharacter and ownCharacter.Ability or 0 end -- 兼容robotId function XCharacterAgency:GetIsIsomer(characterId) if XRobotManager.CheckIsRobotId(characterId) then characterId = XRobotManager.GetCharacterId(characterId) end return XCharacterConfigs.IsIsomer(characterId) end -- 根据品质id和角色id获取当前品质处于什么状态 function XCharacterAgency:GetQualityState(characterId, quality) local character = self:GetCharacter(characterId) local charQuality = character.Quality local isMaxQuality = self:GetCharMaxQuality(character.Id) == character.Quality local isMaxStars = character.Star == XEnumConst.CHARACTER.MAX_QUALITY_STAR -- 必须先判断最大品质 因为和非最大star冲突 if charQuality == quality and isMaxQuality then return XEnumConst.CHARACTER.QualityState.ActiveFinish elseif charQuality == quality and not isMaxStars then return XEnumConst.CHARACTER.QualityState.Activing elseif charQuality == quality and not isMaxQuality and isMaxStars then return XEnumConst.CHARACTER.QualityState.EvoEnable elseif charQuality > quality then return XEnumConst.CHARACTER.QualityState.ActiveFinish elseif charQuality < quality then return XEnumConst.CHARACTER.QualityState.Lock end end -----------------------------------------------补强技能相关--------------------------------------------- function XCharacterAgency:CheckCharacterEnhanceSkillShowRed(characterId) local character = self._Model.OwnCharacters[characterId] if not character then return false end local groupDic = character:GetEnhanceSkillGroupDataDic() for _,group in pairs(groupDic) do local IsPassCondition,_ = self:GetEnhanceSkillIsPassCondition(group, characterId) if self:CheckEnhanceSkillIsCanUnlockOrLevelUp(group) and IsPassCondition then return true end end return false end function XCharacterAgency: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 XCharacterAgency: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 XCharacterAgency: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 XCharacterAgency: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 XCharacterAgency.GetSkillAbility = GetSkillAbility ----------public end---------- ----------private start---------- ----------private end---------- -- GetModel function XCharacterAgency:GetModelCharacterElement() return self._Model:GetCharacterElement() end function XCharacterAgency:GetModelCharacterFilterController() return self._Model:GetCharacterFilterController() end function XCharacterAgency:GetModelCharacter() return self._Model:GetCharacter() end function XCharacterAgency:GetModelLevelUpTemplate() return self._Model:GetLevelUpTemplate() end function XCharacterAgency:GetModelCharacterCareer() return self._Model:GetCharacterCareer() end function XCharacterAgency:GetModelCharacterGraph() return self._Model:GetCharacterGraph() end function XCharacterAgency:GetModelCharacterRecommend() return self._Model:GetCharacterRecommend() end function XCharacterAgency:GetModelCharacterTabId() return self._Model:GetCharacterTabId() end --- @return XTableCharacterQualityIcon function XCharacterAgency:GetModelCharacterLiberation() return self._Model:GetCharacterLiberation() end function XCharacterAgency:GetModelGetCharacterLiberationIcon() return self._Model:GetCharacterLiberationIcon() end function XCharacterAgency:GetModelCharacterQualityIcon(quality) return self._Model:GetCharacterQualityIcon(quality) end function XCharacterAgency:GetModelCharacterSkillQualityApart() return self._Model:GetCharacterSkillQualityApart() end function XCharacterAgency:GetModelCharacterSkillQualityBigEffectBall() return self._Model:GetCharacterSkillQualityBigEffectBall() end function XCharacterAgency:GetModelCharacterQuality() return self._Model:GetCharacterQuality() end function XCharacterAgency:GetModelCharacterSkillUpgradeDes() return self._Model:GetCharacterSkillUpgradeDes() end function XCharacterAgency:GetModelCharacterSkillExchangeDes() return self._Model:GetCharacterSkillExchangeDes() end function XCharacterAgency:GetModelCharacterSkillGate() return self._Model:GetCharacterSkillGate() end --region getModeComplex 以下是需要对model里的get表接口做数据处理再返回的方法 function XCharacterAgency:GetSkillIconById(skillId) return XCharacterConfigs.GetSkillIconById(skillId) end -- 获取核心切换技能的描述 function XCharacterAgency:GetCharacterSkillExchangeDesBySkillIdAndLevel(skillId, skillLevel) local levelString = (skillLevel >= 10) and skillLevel or ("0"..skillLevel) local targetId = tonumber((skillId *100)..levelString) return self:GetModelCharacterSkillExchangeDes()[targetId] end -- 获得当前品质的各个star的进化表演阶段 ---@return table function XCharacterAgency:GetCharacterSkillQualityBigEffectBallPerformArea(quality) local config = self:GetModelCharacterSkillQualityBigEffectBall()[quality] local res = {} for k, areaStr in pairs(config.PerformArea) do local areaTable = string.Split(areaStr, '|') -- 把area做成table 且转换为number for j, v in pairs(areaTable) do areaTable[j] = tonumber(v) end res[k] = areaTable end return res end -- 根据角色获得当前其处在哪个表演阶段 function XCharacterAgency:GetCharQualityPerformArea(charId, quality) local char = self:GetCharacter(charId) if not char then return end local allAreas = self:GetCharacterSkillQualityBigEffectBallPerformArea(quality) local curQualityState = self:GetQualityState(charId, quality) if curQualityState == XEnumConst.CHARACTER.QualityState.ActiveFinish then return #allAreas -- 最大阶段 end if curQualityState == XEnumConst.CHARACTER.QualityState.Lock then return XEnumConst.CHARACTER.PerformState.One end local star = char.Star for k, area in pairs(allAreas) do local areaMin = area[1] local areaMax = area[2] if star >= areaMin and star <= areaMax then return k end end end --endregion getModeComplex结束 --region XCharacterConfigs临时接口后期整改 这里的接口和XCharacterConfigs里的接口一一对应 function XCharacterAgency:GetCharacterName(templateId) return XCharacterConfigs.GetCharacterName(templateId) end function XCharacterAgency:GetCharacterTradeName(templateId) return XCharacterConfigs.GetCharacterTradeName(templateId) end function XCharacterAgency:GetCharMaxQuality(templateId) return XCharacterConfigs.GetCharMaxQuality(templateId) end function XCharacterAgency:GetQualityTemplate(templateId, quality) return XCharacterConfigs.GetQualityTemplate(templateId, quality) end --endregion -- Notify协议相关 function XCharacterAgency:NotifyCharacterDataListV2P6(data) self:NotifyCharacterDataList(data) XDataCenter.CharacterManager.NotifyCharacterDataList(data) end return XCharacterAgency