PGRData/Script/matrix/xentity/xcharacter/XCharacter.lua
2024-09-01 22:49:41 +02:00

323 lines
No EOL
9.9 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local XCharacterViewModel = require("XEntity/XCharacter/XCharacterViewModel")
local XCharacterSkillGroup = require("XEntity/XCharacter/XCharacterSkillGroup")
local XEnhanceSkillGroup = require("XEntity/XCharacter/XEnhanceSkillGroup")
local type = type
---@class XCharacter
XCharacter = XClass(nil, "XCharacter")
local Default = {
Id = 0,
Level = 1,
Exp = 0,
Quality = 1,
Star = 0,
Grade = 1, -- 军阶等级
CreateTime = 0,
Ability = 0,
TrustLv = 0,
TrustExp = 0,
Type = 0, -- 职业类型
NpcId = 0,
LiberateAureoleId = 0, -- 超解环颜色
Attribs = {},
__SkillGroupDatas = {},
__EnhanceSkillGroupPosDic = {},
__EnhanceSkillGroupDatas = {},
__EnhanceSkillIdToGroupIdDic = {},
CharacterHeadInfo = {
HeadFashionId = 0, --涂装头像Id
HeadFashionType = XFashionConfigs.HeadPortraitType.Default, --涂装头像类型
}
}
function XCharacter.GetDefaultFields()
return Default
end
function XCharacter:Ctor(data)
-- XCharacterViewModel
---@type XCharacterAgency
local ag = XMVCA:GetAgency(ModuleId.XCharacter)
self.CharacterAgency = ag
self.CharacterViewModel = nil
self.UpdatedData = nil
for key, value in pairs(Default) do
if type(value) == "table" then
self[key] = {}
else
self[key] = value
end
end
XEventManager.AddEventListener(XEventId.EVENT_LOGIN_DATA_LOAD_COMPLETE, self.RefreshAttribsByEvent, self)
XEventManager.AddEventListener(XEventId.EVENT_BASE_EQUIP_DATA_CHANGE_NOTIFY, self.RefreshAttribsByEvent, self)
XEventManager.AddEventListener(XEventId.EVENT_REFRESH_CHRACTER_ABLIITY, self.RefreshAbility, self)
XEventManager.AddEventListener(XEventId.EVENT_PARTNER_ABLITYCHANGE, self.RefreshAbility, self)
if data then self:Sync(data) end
end
function XCharacter:RemoveEventListeners()
XEventManager.RemoveEventListener(XEventId.EVENT_LOGIN_DATA_LOAD_COMPLETE, self.RefreshAttribsByEvent, self)
XEventManager.RemoveEventListener(XEventId.EVENT_BASE_EQUIP_DATA_CHANGE_NOTIFY, self.RefreshAttribsByEvent, self)
XEventManager.RemoveEventListener(XEventId.EVENT_REFRESH_CHRACTER_ABLIITY, self.RefreshAbility, self)
XEventManager.RemoveEventListener(XEventId.EVENT_PARTNER_ABLITYCHANGE, self.RefreshAbility, self)
end
function XCharacter:Sync(data)
for k, v in pairs(data) do
self[k] = v
end
self.UpdatedData = data
-- 对视图数据更新
if self.CharacterViewModel and self.CharacterViewModel:GetUpdatedData() ~= data then
self.CharacterViewModel:UpdateWithData(data)
end
self:ChangeNpcId()
self:UpdateSkillData(data.SkillList, true)
self:CreateEnhanceSkillData()
self:UpdateEnhanceSkillData(data.EnhanceSkillList, true)
self:RefreshAttribs(true)
self:RefreshAbility()
end
function XCharacter:GetSkillGroupData(skillGroupId)
return self.__SkillGroupDatas[skillGroupId]
end
function XCharacter:UpdateSkillData(skillList, ignoreChangeAbility)
XTool.LoopCollection(skillList, function(data)
local skillId = data.Id
local skillGroupId = XCharacterConfigs.GetSkillGroupIdAndIndex(skillId)
if not skillGroupId then
XLog.Error("XCharacter:UpdateSkillData Error: 角色技能数据同步错误技能Id未配置在技能组中, skillId: " .. skillId)
return
end
local skillGroupData = self:GetSkillGroupData(skillGroupId)
if not skillGroupData then
skillGroupData = XCharacterSkillGroup.New()
self.__SkillGroupDatas[skillGroupId] = skillGroupData
end
skillGroupData:UpdateData(data)
end)
if not ignoreChangeAbility then
self:RefreshAbility()
end
end
function XCharacter:SwithSkill(skillId)
local skillGroupId = XCharacterConfigs.GetSkillGroupIdAndIndex(skillId)
local skillGroupData = self:GetSkillGroupData(skillGroupId)
if not skillGroupData then return end
skillGroupData:SwitchSkill(skillId)
end
function XCharacter:GetSkillLevelBySkillId(skillId)
local skillGroupId = XCharacterConfigs.GetSkillGroupIdAndIndex(skillId)
return self:GetSkillLevel(skillGroupId)
end
function XCharacter:GetSkillLevel(skillGroupId)
local skillGroupData = self:GetSkillGroupData(skillGroupId)
return skillGroupData and skillGroupData:GetLevel() or 0
end
function XCharacter:GetGroupCurSkillId(skillGroupId)
local skillGroupData = self:GetSkillGroupData(skillGroupId)
if not skillGroupData then
return XCharacterConfigs.GetGroupDefaultSkillId(skillGroupId)
end
return skillGroupData:GetCurSKillId() or 0
end
function XCharacter:IsSkillUsing(skillId)
if not skillId or skillId == 0 then return false end
local skillGroupId = XCharacterConfigs.GetSkillGroupIdAndIndex(skillId)
return self:GetGroupCurSkillId(skillGroupId) == skillId
end
function XCharacter:RefreshAttribs(ignoreChangeAbility)
local attribs = self.CharacterAgency:GetCharacterAttribs(self)
if attribs then
self.Attribs = attribs
end
if not ignoreChangeAbility then
self:RefreshAbility()
end
end
function XCharacter:RefreshAttribsByEvent()
self:RefreshAttribs()
end
function XCharacter:GetAttributes()
return self.Attribs
end
function XCharacter:RefreshAbility()
self.Ability = self.CharacterAgency:GetCharacterAbility(self)
end
function XCharacter:ChangeNpcId()
local npcId = XCharacterConfigs.GetCharNpcId(self.Id, self.Quality)
if npcId == nil then
return
end
if self.NpcId and self.NpcId ~= npcId then
self.NpcId = npcId
self:ChangeType()
end
end
function XCharacter:ChangeType()
local npcTemplate = CS.XNpcManager.GetNpcTemplate(self.NpcId)
if not npcTemplate then
XLog.Error("XCharacter:ChangeType error: can not found npc template, npcId is " .. self.NpcId)
return
end
self.Type = npcTemplate.Type
end
function XCharacter:IsContains(container, item)
for _, v in pairs(container or {}) do
if v == item then
return true
end
end
return false
end
function XCharacter:GetCharacterType()
return self.Type
end
-- return : XCharacterViewModel
function XCharacter:GetCharacterViewModel()
if self.CharacterViewModel == nil then
self.CharacterViewModel = XCharacterViewModel.New(self.Id)
self.CharacterViewModel:UpdateWithData(self.UpdatedData)
self.CharacterViewModel:UpdateCharacter(self)
self.CharacterViewModel:UpdateIsBelongPlayer(true)
end
return self.CharacterViewModel
end
function XCharacter:GetId()
return self.Id
end
-------------------------补强技能相关---------------------------------
function XCharacter:GetEnhanceSkillCfg()
return XCharacterConfigs.GetEnhanceSkillConfig(self:GetId()) or {}
end
function XCharacter:GetEnhanceSkillPosCfg()
return XCharacterConfigs.GetEnhanceSkillPosConfig(self:GetId()) or {}
end
function XCharacter:GetEnhanceSkillGroupIdList()
return self:GetEnhanceSkillCfg().SkillGroupId
end
function XCharacter:GetEnhanceSkillPosList()
return self:GetEnhanceSkillCfg().Pos
end
function XCharacter:GetEnhanceSkillPosName(index)
return self:GetEnhanceSkillPosCfg().MainSkillName and self:GetEnhanceSkillPosCfg().MainSkillName[index] or ""
end
function XCharacter:GetIsHasEnhanceSkill()
if not self:GetEnhanceSkillGroupIdList() or not next(self:GetEnhanceSkillGroupIdList()) then
return false
else
return true
end
end
function XCharacter:GetEnhanceSkillGroupByPos(pos)
return self.__EnhanceSkillGroupPosDic[pos]
end
function XCharacter:GetEnhanceSkillGroupDataDic()
return self.__EnhanceSkillGroupDatas
end
function XCharacter:GetEnhanceSkillGroupData(skillGroupId)
return self.__EnhanceSkillGroupDatas[skillGroupId]
end
function XCharacter:EnhanceSkillIdToGroupId(skillId)
if not self.__EnhanceSkillIdToGroupIdDic[skillId] then
XLog.Error("XCharacter:EnhanceSkillIdToGroupId Error: 角色补强技能Id未配置在技能组中, skillId: " .. skillId)
end
return self.__EnhanceSkillIdToGroupIdDic[skillId]
end
function XCharacter:CreateEnhanceSkillData()
if not next(self.__EnhanceSkillGroupDatas) then
local skillGroupIdList = self:GetEnhanceSkillGroupIdList()
local skillPosList = self:GetEnhanceSkillPosList()
for index,skillGroupId in pairs(skillGroupIdList or {}) do
local pos = skillPosList[index]
local skillGroup = XEnhanceSkillGroup.New(skillGroupId, pos)
self.__EnhanceSkillGroupDatas[skillGroupId] = skillGroup
self.__EnhanceSkillGroupPosDic[pos] = skillGroup
self:CreateSkillIdToGroupIdDic(skillGroup)
end
end
end
function XCharacter:CreateSkillIdToGroupIdDic(skillGroup)
local skillIdList = skillGroup:GetSkillIdList()
for _,skillId in pairs(skillIdList or {}) do
self.__EnhanceSkillIdToGroupIdDic[skillId] = skillGroup:GetSkillGroupId()
end
end
function XCharacter:UpdateEnhanceSkillData(skillList, ignoreChangeAbility)
XTool.LoopCollection(skillList, function(data)
local skillId = data.Id
local skillGroupId = self:EnhanceSkillIdToGroupId(skillId)
if not skillGroupId then
return
end
local skillGroupData = self:GetEnhanceSkillGroupData(skillGroupId)
if not skillGroupData then
return
end
local tagData = {
Level = data.Level,
IsUnLock = true,
ActiveSkillId = data.Id,
}
skillGroupData:UpdateData(tagData)
end)
if not ignoreChangeAbility then
self:RefreshAbility()
end
end
function XCharacter:GetEnhanceSkillAbility()
local skillAbility = 0
for _, groupEntity in pairs(self.__EnhanceSkillGroupDatas or {}) do
if groupEntity:GetIsUnLock() then
skillAbility = skillAbility + groupEntity:GetAbility()
end
end
return skillAbility
end