NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/ShowAllCharacter/CharacterDataInfo.cs

669 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Collections.Generic;
using cfg.CharacterCfg;
using Framework;
using CharacterInfo = Gameplay.Net.CharacterInfo;
using cfg;
using Gameplay;
using Gameplay.Utils;
using PhxhSDK;
using cfg.WeaponCfg;
using UnityEngine;
public class CharacterDataInfoManager : Singlenton<CharacterDataInfoManager>, IInitable
{
public List<CharacterDataInfo> DataList;
public Dictionary<uint, CharacterDataInfo> DataDic;
void IInitable.Init()
{
DataList = new List<CharacterDataInfo>();
DataDic = new Dictionary<uint, CharacterDataInfo>();
}
void IInitable.Release()
{
DataList.Clear();
DataDic.Clear();
}
public void AddAllCfgCharacter()
{
DataList.Clear();
DataDic.Clear();
cfg.Tables Table = TableManager.Instance.Tables;
CharacterAttri attriCfg = Table.CharacterAttri;
foreach (var item in attriCfg.DataList)
{
var isAvaliable = _CheckCharacterCfgAvaliable(item);
if (!isAvaliable)
{
DebugUtil.LogError("角色ID:{0}的配置不可用", item.RoleID);
continue;
}
CharacterDataInfo info = new CharacterDataInfo(item);
if (DataDic.ContainsKey((uint)info.Cfg.RoleID))
{
continue;
}
DataList.Add(info);
DataDic[(uint)info.Cfg.RoleID] = info;
}
}
private bool _CheckCharacterCfgAvaliable(DataCharacterAttri checkCfg)
{
if (checkCfg.Attack.Count == 0)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的攻击配置为空");
return false;
}
var skinCfg = TableManager.Instance.Tables.SkinCfg.Get(checkCfg.DefaultSkinIndex, checkCfg.RoleID);
if (skinCfg == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的皮肤配置为空");
return false;
}
var picHeadPath = CommonUtils.GetWholeHeadPath(skinCfg.PIcHeadPath);
if (!AssetManager.Instance.CanLocateAsset<Sprite>(picHeadPath))
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的头像资源路径:{picHeadPath}不存在");
// TODO: 暂时允许头像资源不存在
// return false;
}
var fakeSkillLevel = 1;
var skillLevelInfo = TableManager.Instance.Tables.CharacterSkillLevel.Get(checkCfg.RoleID, fakeSkillLevel);
if (skillLevelInfo == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的技能等级配置为空");
return false;
}
var skillGroupInfo = TableManager.Instance.Tables.SkillReferConfig.Get(skillLevelInfo.SkillGroupId);
if (skillGroupInfo == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的技能组配置为空");
return false;
}
var awakeLevel = 1;
var awakeCfg = TableManager.Instance.Tables.CharacterAwaking.Get(checkCfg.RoleID, awakeLevel);
if (awakeCfg == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的觉醒配置为空");
return false;
}
var breakLevel = 1;
var breakCfg = TableManager.Instance.Tables.CharacterBreak.Get(checkCfg.RoleID, breakLevel);
if (breakCfg == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的突破配置为空");
return false;
}
return true;
}
public void Add(CharacterInfo info)
{
CharacterDataInfo info2;
if (DataDic.TryGetValue(info.ID, out info2))
{
DataDic[info.ID].Refresh(info);
for (int i = 0; i < DataList.Count; i++)
{
if (DataList[i].ID == info.ID)
{
DataList[i].Refresh(info);
return;
}
}
}
else
{
CharacterDataInfo newInfo = new CharacterDataInfo();
var cfg = TableManager.Instance.Tables.CharacterAttri.GetOrDefault((int)info.ID);
if (cfg == null)
{
DebugUtil.LogError($"CharacterDefaultConfig缺少角色配置当前角色ID{info.ID}");
return;
}
newInfo.Refresh(info);
DataList.Add(newInfo);
DataDic[info.ID] = newInfo;
EventManager.Instance.Send(EventManager.EventName.GetNewCharacter, info.ID);
}
}
public void SortCharactersByID()
{
DataList.Sort((a, b) => a.Cfg.RoleID > b.Cfg.RoleID ? 1 : -1);
}
public CharacterDataInfo GetCharacterInfo(uint selectId)
{
if (DataDic.TryGetValue(selectId, out var info))
{
return info;
}
else
{
DebugUtil.LogError("找不到该角色ID {0}", selectId);
return null;
}
}
public CharacterDataInfo GetMaxLevelCharacter()
{
if (DataList.Count <= 0)
{
return null;
}
var dataList = new List<CharacterDataInfo>(DataList);
dataList.Sort((a, b) =>
{
if (a.Level > b.Level) return 1;
return 0;
});
return dataList[0];
}
}
public class CharacterDataInfo : CharacterInfo
{
public DataCharacterAttri Cfg => _cfg;
private DataCharacterAttri _cfg;
private DataCharacterBreak _breakCfg;
public DataCharacterBreak BreakCfg => _breakCfg;
private DataCharacterAwaking _awakeCfg;
public DataCharacterAwaking AwakeCfg => _awakeCfg;
public uint Uid => ID;
public CharacterDataInfo()
{
}
public CharacterDataInfo(uint id, uint level, uint breakLevel, uint awakeLevel)
{
ID = id;
Level = level;
BreakLevel = breakLevel;
AwakeLevel = awakeLevel;
LikelyExp = 0;
LikelyLevel = 0;
UltraSkillLevel = 0;
SkinID = 0;
CfgLoad();
}
private void CfgLoad()
{
_cfg = TableManager.Instance.Tables.CharacterAttri.GetOrDefault((int)ID);
OnBreakCfgLoaded(TableManager.Instance.Tables.CharacterBreak);
OnAwakeCfgLoaded(TableManager.Instance.Tables.CharacterAwaking);
}
private void OnAwakeCfgLoaded(CharacterAwaking characterAwaking)
{
_awakeCfg = characterAwaking.Get((int)Cfg.RoleID, (int)AwakeLevel);
if (_awakeCfg != null) return;
if (AwakeLevel >= characterAwaking.DataList[^1].AwakingLevel)
{
_awakeCfg = characterAwaking.DataList[^1];
DebugUtil.LogError("该角色的觉醒等级超过觉醒表最大等级 {0}", Cfg.RoleID);
}
}
private void OnBreakCfgLoaded(CharacterBreak characterBreak)
{
_breakCfg = characterBreak.Get((int)Cfg.RoleID, (int)BreakLevel);
if (_breakCfg != null) return;
if (AwakeLevel >= characterBreak.DataList[^1].BreakLevel)
{
_breakCfg = characterBreak.DataList[^1];
DebugUtil.LogError("该角色的突破等级超过突破表最大等级 {0}", Cfg.RoleID);
}
}
public int GetBreakPassiveId()
{
if (BreakLevel == 0)
{
return Cfg.PassiveBreakSkillID;
}
else
{
return _breakCfg.PassiveSkillID;
}
}
public int HasPassiveSkillCount()
{
var count = 0;
if (GetBreakPassiveId() != 0)
{
count++;
}
if (GetAwakePassiveId() != 0)
{
count++;
}
return count;
}
public int GetMaxBreakPassiveSkillLv()
{
return GetMaxBreakLevel();
}
public int GetMaxAwakePassiveSkillLv()
{
return 0;
}
public int GetAwakePassiveId()
{
if (AwakeLevel == 0)
{
return Cfg.PassiveAwakeSkillID;
}
else
{
return _awakeCfg.PassiveSkillID;
}
}
public CharacterDataInfo(DataCharacterAttri cfg)
{
ID = (uint)cfg.RoleID;
Exp = 10000;
Level = 10;
BreakLevel = 1;
AwakeLevel = 1;
LikelyExp = 1;
LikelyLevel = 1;
UltraSkillLevel = 1;
SkinID = 1;
CfgLoad();
}
public void Refresh(CharacterInfo info)
{
ID = info.ID;
Exp = info.Exp;
Level = info.Level;
BreakLevel = info.BreakLevel;
AwakeLevel = info.AwakeLevel;
LikelyExp = info.LikelyExp;
LikelyLevel = info.LikelyLevel;
UltraSkillLevel = info.UltraSkillLevel;
SkinID = info.SkinID;
CfgLoad();
}
private float HPBreakLvUp()
{
return _breakCfg.Hp;
}
private float HpAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Hp;
}
return 0;
}
private int AttackBreakLvUp()
{
return _breakCfg.Attack;
}
private int AttackAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Attack;
}
return 0;
}
public string Name => CommonUtils.GetLocalizeText(_cfg.NameRead);
public float HP()
{
return HpLevelUp((int)Level) + HPBreakLvUp() + HpAwakeLvUp();
}
public float HpLevelUp(int level)
{
if (level > Cfg.Hp.Count)
{
DebugUtil.LogError("characterDefault表的HP不够了");
return Cfg.Hp[Cfg.Hp.Count - 1];
}
else
{
return Cfg.Hp[(int)level - 1];
}
}
public int Attack()
{
return AttackLevelUp((int)Level) + AttackAwakeLvUp() + AttackBreakLvUp();
}
public int AttackLevelUp(int level)
{
if (level > Cfg.Attack.Count)
{
DebugUtil.LogError("characterDefault表的attack不够了");
return Cfg.Attack[Cfg.Attack.Count - 1];
}
else
{
return Cfg.Attack[(int)level - 1];
}
}
//private float LevelUpDefence()
//{
// return Cfg.DefenceLevelUpTemplate[Level - 1];
//}
private int ArmorAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Shield;
}
return 0;
}
private int ArmorBreakLvUp()
{
return _breakCfg.Shield;
}
public float Armor()
{
return ArmorLevelUp((int)Level) + ArmorAwakeLvUp() + ArmorBreakLvUp();
}
public int ArmorLevelUp(int level)
{
if (level > Cfg.Shield.Count)
{
DebugUtil.LogError("characterDefault表的shield不够了");
return Cfg.Shield[Cfg.Shield.Count - 1];
}
else
{
return Cfg.Shield[(int)Level - 1];
}
}
//private float LevelUpArmor()
//{
// return Cfg.ShieldLevelUpTemplate[Level - 1];
//}
private float DenfenceBreakLvUp()
{
return _breakCfg.Defence;
}
private float DenfenceAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Defence;
}
return 0;
}
public float Defence()
{
return DefenceLevelUp((int)Level) + DenfenceAwakeLvUp() + DenfenceBreakLvUp();
}
public int DefenceLevelUp(int level)
{
if (level > Cfg.Defence.Count)
{
DebugUtil.LogError("characterDefault表的dnfence不够了");
return Cfg.Defence[Cfg.Defence.Count - 1];
}
else
{
return Cfg.Defence[(int)level - 1];
}
}
public float Corrage()
{
// 最大士气值
return Cfg.MaxMorale;
}
private int ManagazinContainAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.ManagazinContain;
}
return 0;
}
public int BulletCapacity()
{
return Cfg.ManagazinContain + _breakCfg.ManagazinContain + ManagazinContainAwakeLvUp();
}
public float ChangeBulletTime()
{
return Cfg.ChangeBulletTime + _breakCfg.ChangeBulletTime + ChangeBulletTimeAwakeLvUp();
}
private float ShootSpeedAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.ShootSpeed;
}
return 0;
}
public float ShootSpeed()
{
return Cfg.ShootSpeed + _breakCfg.ShootSpeed + ShootSpeedAwakeLvUp(); ;
}
private float ChangeBulletTimeAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.ChangeBulletTime;
}
return 0;
}
private float SpeedAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Speed;
}
return 0;
}
public float MoveSpeed()
{
return Cfg.Speed + _breakCfg.Speed + SpeedAwakeLvUp();
}
private float YaZhiAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.YaZhi;
}
return 0;
}
public float YaZhi()
{
return Cfg.YaZhi + _breakCfg.YaZhi + YaZhiAwakeLvUp();
}
private float DamageToHumanAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.DamageToHuman;
}
return 0;
}
public float DamageToHuman()
{
return Cfg.DamageToHuman + _breakCfg.DamageToHuman + DamageToHumanAwakeLvUp();
}
private float DamageToCarrierAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.DamageToCarrier;
}
return 0;
}
public float DamageToCarrier()
{
return Cfg.DamageToCarrier + _breakCfg.DamageToCarrier + DamageToCarrierAwakeLvUp();
}
private float CriticalDamageAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.CriticalDamage;
}
return 0;
}
public float CriticalDamage()
{
return Cfg.CriticalDamage + _breakCfg.CriticalDamage + CriticalDamageAwakeLvUp();
}
private float CriticalRatioAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.CriticalRatio;
}
return 0;
}
public float CriticalRatio()
{
return Cfg.CriticalRatio + _breakCfg.CriticalRatio + CriticalRatioAwakeLvUp();
}
public void AddLikeLyEXPInfo(int exp)
{
SetLikelyLv();
}
private void SetLikelyLv()
{
}
public bool IsMaxBreak()
{
if ((GetBreakPassiveId() == 0) || BreakLevel >= GetMaxBreakLevel())
{
return true;
}
return false;
}
public bool IsMaxAwake()
{
if ((GetAwakePassiveId() == 0) || AwakeLevel >= GetMaxAwakeLevel())
{
return true;
}
return false;
}
public int GetMaxBreakLevel()
{
int maxLevel = 0;
CharacterBreak breakCfg = TableManager.Instance.Tables.CharacterBreak;
for (int i = 0; i < breakCfg.DataList.Count; i++)
{
if (breakCfg.DataList[i].RoleID == ID)
{
if (breakCfg.DataList[i].BreakLevel > maxLevel)
{
maxLevel = breakCfg.DataList[i].BreakLevel;
}
}
}
return maxLevel;
}
public int GetMaxAwakeLevel()
{
int maxLevel = 0;
CharacterAwaking breakCfg = TableManager.Instance.Tables.CharacterAwaking;
for (int i = 0; i < breakCfg.DataList.Count; i++)
{
if (breakCfg.DataList[i].RoleID == ID)
{
if (breakCfg.DataList[i].AwakingLevel > maxLevel)
{
maxLevel = breakCfg.DataList[i].AwakingLevel;
}
}
}
return maxLevel;
}
public int GetMaxUltralSkillLevel()
{
int maxSkillLevel = 0;
CharacterSkillLevel cfg = TableManager.Instance.Tables.CharacterSkillLevel;
for (int i = 0; i < cfg.DataList.Count; i++)
{
if (cfg.DataList[i].RoleID == ID)
{
if (cfg.DataList[i].SkillLevel > maxSkillLevel)
{
maxSkillLevel = cfg.DataList[i].SkillLevel;
}
}
}
return maxSkillLevel;
}
public string GetWholeHeadPath(int Skinindex=-1)
{
if (Skinindex == -1)
Skinindex = Cfg.DefaultSkinIndex;
return CommonUtils.GetWholeHeadPath(TableManager.Instance.Tables.SkinCfg.Get(Skinindex, Cfg.RoleID).PIcHeadPath);
}
public string PrefabPath =>
PathEx.GetCharacterDisplayModelPath(Cfg.NameID);
public string WeaponName()
{
DataWeapon dataWeapon = TableManager.Instance.Tables.WeaponConfig.Get(Cfg.WeaponId);
if(dataWeapon==null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + Cfg.WeaponId);
return Cfg.WeaponId.ToString();
}
return CommonUtils.GetLocalizeText(dataWeapon.Name);
}
}