2023-10-19 15:00:19 +08:00
|
|
|
|
using System.Collections.Generic;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
using cfg.CharacterCfg;
|
|
|
|
|
|
using Framework;
|
|
|
|
|
|
using CharacterInfo = Gameplay.Net.CharacterInfo;
|
|
|
|
|
|
using cfg;
|
2023-12-05 12:49:29 +08:00
|
|
|
|
using Gameplay;
|
2024-01-15 12:39:20 +08:00
|
|
|
|
using Gameplay.Utils;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
using PhxhSDK;
|
2024-01-16 14:10:09 +08:00
|
|
|
|
using cfg.WeaponCfg;
|
2024-03-19 18:37:00 +08:00
|
|
|
|
using UnityEngine;
|
2024-06-25 18:53:27 +08:00
|
|
|
|
using Gameplay.Common;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public class CharacterDataInfoManager : Singlenton<CharacterDataInfoManager>, IInitable
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
2024-07-15 18:59:46 +08:00
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
|
{
|
|
|
|
|
|
DataList.Clear();
|
|
|
|
|
|
DataDic.Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void AddAllCfgCharacter()
|
|
|
|
|
|
{
|
|
|
|
|
|
DataList.Clear();
|
|
|
|
|
|
DataDic.Clear();
|
2024-01-08 13:13:35 +08:00
|
|
|
|
cfg.Tables Table = TableManager.Instance.Tables;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
CharacterAttri attriCfg = Table.CharacterAttri;
|
|
|
|
|
|
foreach (var item in attriCfg.DataList)
|
|
|
|
|
|
{
|
2024-03-19 18:37:00 +08:00
|
|
|
|
var isAvaliable = _CheckCharacterCfgAvaliable(item);
|
|
|
|
|
|
if (!isAvaliable)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("角色ID:{0}的配置不可用", item.RoleID);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
CharacterDataInfo info = new CharacterDataInfo(item);
|
2024-01-11 14:12:39 +08:00
|
|
|
|
if (DataDic.ContainsKey((uint)info.Cfg.RoleID))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2024-06-27 18:55:53 +08:00
|
|
|
|
info.ConstructRedPointTree(30);//TableManager.Instance.Tables.RedPointConfig.Get(30).ParentID
|
2023-08-22 19:08:45 +08:00
|
|
|
|
DataList.Add(info);
|
|
|
|
|
|
DataDic[(uint)info.Cfg.RoleID] = info;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-03-19 18:37:00 +08:00
|
|
|
|
|
|
|
|
|
|
private bool _CheckCharacterCfgAvaliable(DataCharacterAttri checkCfg)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
2024-06-25 18:53:27 +08:00
|
|
|
|
var skinCfg = TableManager.Instance.Tables.SkinCfg.Get(GLConfig.Inst.data.DEFAULTSKINID, checkCfg.RoleID);
|
2024-03-19 18:37:00 +08:00
|
|
|
|
if (skinCfg == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的皮肤配置为空");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2024-10-23 15:08:29 +08:00
|
|
|
|
|
|
|
|
|
|
var picHeadPath = CommonUtils.GetCharacterPicPath(checkCfg.RoleID, CommonUtils.ECharacterPicPathType.HeadPic);//CommonUtils.GetWholeHeadPath(skinCfg.PIcHeadPath);
|
2024-03-19 18:37:00 +08:00
|
|
|
|
if (!AssetManager.Instance.CanLocateAsset<Sprite>(picHeadPath))
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的头像资源路径:{picHeadPath}不存在");
|
2024-03-21 16:52:08 +08:00
|
|
|
|
// TODO: 暂时允许头像资源不存在
|
|
|
|
|
|
// return false;
|
2024-03-19 18:37:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-03-19 18:43:08 +08:00
|
|
|
|
var fakeSkillLevel = 1;
|
2024-03-19 18:37:00 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-03-19 18:43:08 +08:00
|
|
|
|
var awakeLevel = 1;
|
2024-03-19 18:37:00 +08:00
|
|
|
|
var awakeCfg = TableManager.Instance.Tables.CharacterAwaking.Get(checkCfg.RoleID, awakeLevel);
|
|
|
|
|
|
if (awakeCfg == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的觉醒配置为空");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2024-03-19 18:43:08 +08:00
|
|
|
|
var breakLevel = 1;
|
2024-03-19 18:37:00 +08:00
|
|
|
|
var breakCfg = TableManager.Instance.Tables.CharacterBreak.Get(checkCfg.RoleID, breakLevel);
|
|
|
|
|
|
if (breakCfg == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的突破配置为空");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void Add(CharacterInfo info)
|
|
|
|
|
|
{
|
2024-06-27 18:55:53 +08:00
|
|
|
|
if (DataDic.TryGetValue(info.ID, out CharacterDataInfo info2))//已添加则刷新相关信息
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
|
|
|
|
|
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();
|
2024-04-16 17:14:50 +08:00
|
|
|
|
var cfg = TableManager.Instance.Tables.CharacterAttri.GetOrDefault((int)info.ID);
|
|
|
|
|
|
if (cfg == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"CharacterDefaultConfig缺少角色配置,当前角色ID:{info.ID}");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-06-27 18:55:53 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
newInfo.Refresh(info);
|
2024-06-27 18:55:53 +08:00
|
|
|
|
newInfo.ConstructRedPointTree(30);//TableManager.Instance.Tables.RedPointConfig.Get(30).ParentID
|
2023-08-22 19:08:45 +08:00
|
|
|
|
DataList.Add(newInfo);
|
|
|
|
|
|
DataDic[info.ID] = newInfo;
|
2023-11-01 14:50:52 +08:00
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.GetNewCharacter, info.ID);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-06-27 18:55:53 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-07 18:48:55 +08:00
|
|
|
|
public void SortCharactersByLevel()
|
|
|
|
|
|
{
|
2024-07-09 14:04:13 +08:00
|
|
|
|
DataList.Sort((a, b) => b.Level.CompareTo(a.Level));
|
2024-06-07 18:48:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-02 14:23:00 +08:00
|
|
|
|
public void SortCharactersByID()//角色ID排序默认为从小到大升序
|
2024-03-15 13:36:53 +08:00
|
|
|
|
{
|
2024-08-02 14:23:00 +08:00
|
|
|
|
DataList.Sort((a, b) => a.Cfg.RoleID.CompareTo(b.Cfg.RoleID));
|
2024-03-15 13:36:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-02 15:57:31 +08:00
|
|
|
|
public void SortCharacterDefault()//默认排序方式:整体以等级降序,等级相同的情况下按照角色ID升序
|
|
|
|
|
|
{
|
|
|
|
|
|
DataList.Sort((a, b) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
int ret = b.Level.CompareTo(a.Level);
|
|
|
|
|
|
if (ret == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
ret = a.Cfg.RoleID.CompareTo(b.Cfg.RoleID);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-07 18:48:55 +08:00
|
|
|
|
public void SortCharactersByLevel(List<CharacterDataInfo> dataInfos)
|
|
|
|
|
|
{
|
2024-08-02 14:23:00 +08:00
|
|
|
|
dataInfos.Sort((a, b) => b.Level.CompareTo(a.Level));
|
2024-06-07 18:48:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public CharacterDataInfo GetCharacterInfo(uint selectId)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (DataDic.TryGetValue(selectId, out var info))
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
|
|
|
|
|
return info;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
DebugUtil.LogError("找不到该角色ID {0}", selectId);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-26 19:36:48 +08:00
|
|
|
|
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;
|
|
|
|
|
|
});
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-12-26 19:36:48 +08:00
|
|
|
|
return dataList[0];
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2024-10-16 14:15:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取指挥官推荐职业列表
|
|
|
|
|
|
/// </summary>
|
2024-10-16 14:21:40 +08:00
|
|
|
|
public List<ProvideJob> GetCommanderProvideJobs(uint id)
|
2024-10-08 16:35:07 +08:00
|
|
|
|
{
|
2024-10-16 14:21:40 +08:00
|
|
|
|
var jobs = new List<ProvideJob>();
|
2024-10-08 16:35:07 +08:00
|
|
|
|
if (DataDic.TryGetValue(id, out var characterDataInfo))
|
|
|
|
|
|
{
|
2024-10-16 14:15:35 +08:00
|
|
|
|
if (characterDataInfo.Cfg.Job != Ejob.Job_Commander)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("该角色不为指挥官{0}", id);
|
|
|
|
|
|
return jobs;
|
|
|
|
|
|
}
|
|
|
|
|
|
var provideJobs = characterDataInfo.Cfg.ProvideJob;
|
|
|
|
|
|
if (provideJobs.Length == 0)
|
|
|
|
|
|
{
|
2024-10-18 14:10:32 +08:00
|
|
|
|
DebugUtil.LogError("该指挥官{0}推荐职位为空", id);
|
2024-10-16 14:15:35 +08:00
|
|
|
|
return jobs;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-18 14:10:32 +08:00
|
|
|
|
var vehicleList = new List<ProvideJob>();
|
|
|
|
|
|
var characterList = new List<ProvideJob>();
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var job in provideJobs)
|
2024-10-16 14:15:35 +08:00
|
|
|
|
{
|
2024-10-25 13:55:17 +08:00
|
|
|
|
if (job == ProvideJob.ProvideJob_None)
|
2024-10-18 14:10:32 +08:00
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("该指挥官{0}配置的推荐职业包含空");
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-25 13:55:17 +08:00
|
|
|
|
if (job == ProvideJob.ProvideJob_Vehicle)
|
2024-10-18 14:10:32 +08:00
|
|
|
|
{
|
|
|
|
|
|
vehicleList.Add(job);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
2024-10-16 14:15:35 +08:00
|
|
|
|
{
|
2024-10-18 14:10:32 +08:00
|
|
|
|
characterList.Add(job);
|
2024-10-16 14:15:35 +08:00
|
|
|
|
}
|
2024-10-18 14:10:32 +08:00
|
|
|
|
|
2024-10-16 14:15:35 +08:00
|
|
|
|
}
|
2024-10-18 14:10:32 +08:00
|
|
|
|
jobs.AddRange(vehicleList);
|
|
|
|
|
|
jobs.AddRange(characterList);
|
2024-10-08 16:35:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-16 14:15:35 +08:00
|
|
|
|
return jobs;
|
|
|
|
|
|
}
|
2024-10-16 14:21:40 +08:00
|
|
|
|
|
2024-10-11 15:22:03 +08:00
|
|
|
|
public int GetSpendLeadership(uint id)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (DataDic.TryGetValue(id, out var characterDataInfo))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (characterDataInfo.Cfg != null)
|
|
|
|
|
|
return characterDataInfo.Cfg.SpendLeadership;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-27 18:55:53 +08:00
|
|
|
|
public class CharacterDataInfo : CharacterInfo, IRedPointTreeNode
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
public DataCharacterAttri Cfg => _cfg;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
private DataCharacterAttri _cfg;
|
|
|
|
|
|
|
|
|
|
|
|
private DataCharacterBreak _breakCfg;
|
2024-04-12 13:05:20 +08:00
|
|
|
|
public DataCharacterBreak BreakCfg => _breakCfg;
|
2024-06-27 18:55:53 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
private DataCharacterAwaking _awakeCfg;
|
2024-04-12 13:05:20 +08:00
|
|
|
|
public DataCharacterAwaking AwakeCfg => _awakeCfg;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2024-06-27 18:55:53 +08:00
|
|
|
|
RedPointNodeCharacter _redPointNode;
|
|
|
|
|
|
public RedPointNodeCharacter RedPointNode => _redPointNode;
|
|
|
|
|
|
|
|
|
|
|
|
RedPointNodeCharacter characterAwakingNode;
|
|
|
|
|
|
public RedPointNodeCharacter CharacterAwakingNode => characterAwakingNode;
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public uint Uid => ID;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public CharacterDataInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
2023-12-27 13:57:32 +08:00
|
|
|
|
public CharacterDataInfo(uint id, uint level, uint breakLevel, uint awakeLevel)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
ID = id;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
Level = level;
|
|
|
|
|
|
BreakLevel = breakLevel;
|
2023-12-27 13:57:32 +08:00
|
|
|
|
AwakeLevel = awakeLevel;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
LikelyExp = 0;
|
|
|
|
|
|
LikelyLevel = 0;
|
|
|
|
|
|
UltraSkillLevel = 0;
|
2024-06-24 13:53:23 +08:00
|
|
|
|
SkinID = 1;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
CfgLoad();
|
|
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
private void CfgLoad()
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_cfg = TableManager.Instance.Tables.CharacterAttri.GetOrDefault((int)ID);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
OnBreakCfgLoaded(TableManager.Instance.Tables.CharacterBreak);
|
|
|
|
|
|
OnAwakeCfgLoaded(TableManager.Instance.Tables.CharacterAwaking);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
private void OnAwakeCfgLoaded(CharacterAwaking characterAwaking)
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_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);
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnBreakCfgLoaded(CharacterBreak characterBreak)
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_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);
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int GetBreakPassiveId()
|
|
|
|
|
|
{
|
2024-06-27 18:55:53 +08:00
|
|
|
|
// if (BreakLevel == 0)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return Cfg.PassiveBreakSkillID;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _breakCfg.PassiveSkillID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
public int HasPassiveSkillCount()
|
|
|
|
|
|
{
|
|
|
|
|
|
var count = 0;
|
|
|
|
|
|
if (GetBreakPassiveId() != 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
count++;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-30 18:47:08 +08:00
|
|
|
|
if (GetAwakePassiveId() != 0)
|
2023-10-19 15:00:19 +08:00
|
|
|
|
{
|
|
|
|
|
|
count++;
|
|
|
|
|
|
}
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public int GetMaxBreakPassiveSkillLv()
|
|
|
|
|
|
{
|
|
|
|
|
|
return GetMaxBreakLevel();
|
|
|
|
|
|
}
|
|
|
|
|
|
public int GetMaxAwakePassiveSkillLv()
|
|
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
public int GetAwakePassiveId()
|
|
|
|
|
|
{
|
2024-06-27 18:55:53 +08:00
|
|
|
|
// if (AwakeLevel == 0)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return Cfg.PassiveAwakeSkillID;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _awakeCfg.PassiveSkillID;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
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();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-30 18:47:08 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _breakCfg.Hp;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
private float HpAwakeLvUp()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (_awakeCfg != null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _awakeCfg.Hp;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2024-11-25 14:54:54 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 突破获取的攻击力,受武器影响
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2023-08-22 19:08:45 +08:00
|
|
|
|
private int AttackBreakLvUp()
|
|
|
|
|
|
{
|
2024-11-25 14:54:54 +08:00
|
|
|
|
//更换武器后,攻击力不再由突破表上的攻击力决定,而是由武器表上的攻击力决定
|
|
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
return weaponConfig.AttackPower;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-11-25 15:48:58 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 角色觉醒获得的攻击力,暂时改为无效果
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2023-08-22 19:08:45 +08:00
|
|
|
|
private int AttackAwakeLvUp()
|
|
|
|
|
|
{
|
2024-11-25 15:48:58 +08:00
|
|
|
|
//if (_awakeCfg != null)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// return _awakeCfg.Attack;
|
|
|
|
|
|
//}
|
|
|
|
|
|
//角色觉醒表优化,角色的攻击力不再受觉醒表上的攻击力影响
|
2023-08-22 19:08:45 +08:00
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2023-12-29 15:07:04 +08:00
|
|
|
|
|
|
|
|
|
|
public string Name => CommonUtils.GetLocalizeText(_cfg.NameRead);
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public float HP()
|
2023-10-30 18:47:08 +08:00
|
|
|
|
{
|
|
|
|
|
|
return HpLevelUp((int)Level) + HPBreakLvUp() + HpAwakeLvUp();
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
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];
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
public int Attack()
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
return AttackLevelUp((int)Level) + AttackAwakeLvUp() + AttackBreakLvUp();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-11-18 14:51:17 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public int AttackLevelUp(int level)
|
|
|
|
|
|
{
|
2024-11-11 13:52:53 +08:00
|
|
|
|
// 2024-11-11 移除了角色主表上的攻击属性
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
// if (level > Cfg.Attack.Count)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// DebugUtil.LogError("characterDefault表的attack不够了!!!!!");
|
|
|
|
|
|
// return Cfg.Attack[Cfg.Attack.Count - 1];
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return Cfg.Attack[(int)level - 1];
|
|
|
|
|
|
// }
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-18 14:51:17 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 武器熟练度
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public float WeaponDegree()
|
|
|
|
|
|
{
|
|
|
|
|
|
// TODO: 这里需要补齐代码
|
|
|
|
|
|
return Cfg.WeaponDegree;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 武器掌握度
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public float WeaponGrasp()
|
|
|
|
|
|
{
|
|
|
|
|
|
// TODO: 这里需要补齐代码
|
|
|
|
|
|
return Cfg.WeaponGrasp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
//private float LevelUpDefence()
|
|
|
|
|
|
//{
|
|
|
|
|
|
// return Cfg.DefenceLevelUpTemplate[Level - 1];
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
private int ArmorAwakeLvUp()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (_awakeCfg != null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _awakeCfg.Shield;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
private int ArmorBreakLvUp()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _breakCfg.Shield;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
public float Armor()
|
|
|
|
|
|
{
|
2024-08-08 19:16:34 +08:00
|
|
|
|
return ArmorLevelUp((int)Level);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-08-08 19:16:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 指定等级护盾值
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="level"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public int ArmorLevelUp(int level)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (level > Cfg.Shield.Count)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("characterDefault表的shield不够了!!!!!");
|
2024-08-08 19:16:34 +08:00
|
|
|
|
return Cfg.Shield[Cfg.Shield.Count - 1] + ArmorAwakeLvUp() + ArmorBreakLvUp();
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2024-08-08 19:16:34 +08:00
|
|
|
|
return Cfg.Shield[(int)level - 1] + ArmorAwakeLvUp() + ArmorBreakLvUp();
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
//private float LevelUpArmor()
|
|
|
|
|
|
//{
|
|
|
|
|
|
// return Cfg.ShieldLevelUpTemplate[Level - 1];
|
|
|
|
|
|
//}
|
|
|
|
|
|
private float DenfenceBreakLvUp()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _breakCfg.Defence;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
private float DenfenceAwakeLvUp()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (_awakeCfg != null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _awakeCfg.Defence;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public float Defence()
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
return DefenceLevelUp((int)Level) + DenfenceAwakeLvUp() + DenfenceBreakLvUp();
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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];
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
public float Corrage()
|
|
|
|
|
|
{
|
|
|
|
|
|
// 最大士气值
|
|
|
|
|
|
return Cfg.MaxMorale;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-11-11 19:21:33 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 弹夹容量
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public int BulletCapacity()
|
|
|
|
|
|
{
|
2024-11-11 19:21:33 +08:00
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2024-11-25 15:48:58 +08:00
|
|
|
|
return weaponConfig.MaxBulletCount;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
2023-10-30 18:47:08 +08:00
|
|
|
|
|
2024-11-11 19:21:33 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 换弹时间
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public float ChangeBulletTime()
|
|
|
|
|
|
{
|
2024-11-11 19:21:33 +08:00
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2024-11-25 15:48:58 +08:00
|
|
|
|
return weaponConfig.ReloadTime;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-11-19 13:21:40 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 攻击轮次,每次攻击多少轮进入一次攻击间隔
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public int AttackLoopCount()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Cfg.AttackLoopCount;
|
|
|
|
|
|
}
|
2024-11-11 19:21:33 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 射速,每秒开几枪
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public float ShootSpeed()
|
|
|
|
|
|
{
|
2024-11-11 19:21:33 +08:00
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2024-11-25 15:48:58 +08:00
|
|
|
|
return weaponConfig.ShootSpeed;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-11-11 19:28:18 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 攻击范围,单位:格子
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public int AttackDistance()
|
|
|
|
|
|
{
|
|
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
return weaponConfig.AttackDistance;
|
|
|
|
|
|
}
|
2023-10-30 18:47:08 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
private float SpeedAwakeLvUp()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (_awakeCfg != null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _awakeCfg.Speed;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public float MoveSpeed()
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
return Cfg.Speed + _breakCfg.Speed + SpeedAwakeLvUp();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-11-11 19:21:33 +08:00
|
|
|
|
|
|
|
|
|
|
public int WeaponId()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_breakCfg == null || _breakCfg.WeaponId == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Cfg.WeaponId;
|
|
|
|
|
|
}
|
|
|
|
|
|
return _breakCfg.WeaponId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public float YaZhi()
|
|
|
|
|
|
{
|
2024-11-11 19:21:33 +08:00
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2024-11-25 15:48:58 +08:00
|
|
|
|
return weaponConfig.MoraleDamage;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-11-25 15:48:58 +08:00
|
|
|
|
|
2024-11-11 19:21:33 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 对人形伤害缩放
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public float DamageScaleToHuman()
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2024-11-11 19:21:33 +08:00
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2024-11-25 15:48:58 +08:00
|
|
|
|
return weaponConfig.DamageScaleForHuman;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-11-11 19:21:33 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 对载具伤害缩放
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public float DamageScaleToCarrier()
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2024-11-11 19:21:33 +08:00
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2024-11-25 15:48:58 +08:00
|
|
|
|
return weaponConfig.DamageScaleForVehicle;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-11-11 19:21:33 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 对建筑伤害缩放
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public float DamageScaleToBuilding()
|
2024-10-16 13:51:40 +08:00
|
|
|
|
{
|
2024-11-11 19:21:33 +08:00
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
return weaponConfig.DamageScaleForBuilding;
|
2024-10-16 13:51:40 +08:00
|
|
|
|
}
|
2024-11-11 19:21:33 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 对血量伤害缩放
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public float DamageScaleToHp()
|
2024-10-16 13:51:40 +08:00
|
|
|
|
{
|
2024-11-11 19:21:33 +08:00
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 1f;
|
|
|
|
|
|
}
|
|
|
|
|
|
return weaponConfig.DamageScaleForHp;
|
|
|
|
|
|
}
|
|
|
|
|
|
public float DamageScaleToShiled()
|
|
|
|
|
|
{
|
|
|
|
|
|
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
|
|
|
|
|
|
if (weaponConfig == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
|
|
|
|
|
|
return 1f;
|
|
|
|
|
|
}
|
|
|
|
|
|
return weaponConfig.DamageScaleForShiled;
|
2024-10-16 13:51:40 +08:00
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
private float CriticalDamageAwakeLvUp()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (_awakeCfg != null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _awakeCfg.CriticalDamage;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
public float CriticalDamage()
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
return Cfg.CriticalDamage + _breakCfg.CriticalDamage + CriticalDamageAwakeLvUp();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
private float CriticalRatioAwakeLvUp()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (_awakeCfg != null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return _awakeCfg.CriticalRatio;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
public float CriticalRatio()
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
return Cfg.CriticalRatio + _breakCfg.CriticalRatio + CriticalRatioAwakeLvUp();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void AddLikeLyEXPInfo(int exp)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetLikelyLv();
|
|
|
|
|
|
}
|
|
|
|
|
|
private void SetLikelyLv()
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
public bool IsMaxBreak()
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
if ((GetBreakPassiveId() == 0) || BreakLevel >= GetMaxBreakLevel())
|
2023-10-19 15:00:19 +08:00
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2024-05-29 16:55:12 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public bool IsMaxAwake()
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((GetAwakePassiveId() == 0) || AwakeLevel >= GetMaxAwakeLevel())
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
2024-05-29 16:55:12 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 是否满好感度
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public bool IsMaxLikely()
|
|
|
|
|
|
{
|
|
|
|
|
|
return LikelyLevel >= GetMaxLikelyLevel();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int GetMaxLikelyLevel()
|
|
|
|
|
|
{
|
|
|
|
|
|
int maxLevel = 0;
|
|
|
|
|
|
CharacterLikability likelyCfg = TableManager.Instance.Tables.CharacterLikability;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < likelyCfg.DataList.Count; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (likelyCfg.DataList[i].RoleID == ID && likelyCfg.DataList[i].LikabilityLevel > maxLevel)
|
|
|
|
|
|
maxLevel = likelyCfg.DataList[i].LikabilityLevel;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return maxLevel;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public int GetMaxBreakLevel()
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
int maxLevel = 0;
|
|
|
|
|
|
CharacterBreak breakCfg = TableManager.Instance.Tables.CharacterBreak;
|
2023-10-30 18:47:08 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
for (int i = 0; i < breakCfg.DataList.Count; i++)
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
if (breakCfg.DataList[i].RoleID == ID)
|
2023-10-19 15:00:19 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (breakCfg.DataList[i].BreakLevel > maxLevel)
|
|
|
|
|
|
{
|
|
|
|
|
|
maxLevel = breakCfg.DataList[i].BreakLevel;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return maxLevel;
|
|
|
|
|
|
}
|
2024-05-29 16:55:12 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2024-05-29 16:55:12 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public int GetMaxUltralSkillLevel()
|
|
|
|
|
|
{
|
|
|
|
|
|
int maxSkillLevel = 0;
|
|
|
|
|
|
CharacterSkillLevel cfg = TableManager.Instance.Tables.CharacterSkillLevel;
|
|
|
|
|
|
for (int i = 0; i < cfg.DataList.Count; i++)
|
|
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
if (cfg.DataList[i].RoleID == ID)
|
2023-10-19 15:00:19 +08:00
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
if (cfg.DataList[i].SkillLevel > maxSkillLevel)
|
2023-10-19 15:00:19 +08:00
|
|
|
|
{
|
2023-10-30 18:47:08 +08:00
|
|
|
|
maxSkillLevel = cfg.DataList[i].SkillLevel;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
return maxSkillLevel;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-30 18:47:08 +08:00
|
|
|
|
|
2024-06-27 18:55:53 +08:00
|
|
|
|
public string GetWholeHeadPath(int Skinindex = -1)
|
2023-10-30 18:47:08 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (Skinindex == -1)
|
2024-06-25 18:53:27 +08:00
|
|
|
|
Skinindex = GLConfig.Inst.data.DEFAULTSKINID;
|
2024-06-27 18:55:53 +08:00
|
|
|
|
|
2024-10-23 15:08:29 +08:00
|
|
|
|
return CommonUtils.GetCharacterPicPath(Cfg.RoleID, CommonUtils.ECharacterPicPathType.HeadPic, Skinindex);//CommonUtils.GetWholeHeadPath(TableManager.Instance.Tables.SkinCfg.Get(Skinindex, Cfg.RoleID).PIcHeadPath);
|
2023-10-30 18:47:08 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
2024-01-03 14:56:46 +08:00
|
|
|
|
|
|
|
|
|
|
public string PrefabPath =>
|
2024-01-15 12:39:20 +08:00
|
|
|
|
PathEx.GetCharacterDisplayModelPath(Cfg.NameID);
|
2024-01-16 14:10:09 +08:00
|
|
|
|
|
|
|
|
|
|
public string WeaponName()
|
|
|
|
|
|
{
|
|
|
|
|
|
DataWeapon dataWeapon = TableManager.Instance.Tables.WeaponConfig.Get(Cfg.WeaponId);
|
2024-06-27 18:55:53 +08:00
|
|
|
|
if (dataWeapon == null)
|
2024-01-16 14:10:09 +08:00
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("武器id为{0}的武器没配" + Cfg.WeaponId);
|
|
|
|
|
|
return Cfg.WeaponId.ToString();
|
|
|
|
|
|
}
|
2024-08-23 15:23:33 +08:00
|
|
|
|
return CommonUtils.GetLocalizeText(E_LocalizePrefix.weapon, Cfg.WeaponId);//dataWeapon.Name
|
2024-01-16 14:10:09 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
2024-06-27 18:55:53 +08:00
|
|
|
|
|
|
|
|
|
|
public void ConstructRedPointTree(int parentID)
|
|
|
|
|
|
{
|
2024-08-15 19:47:57 +08:00
|
|
|
|
//角色节点,非叶子节点
|
2024-06-27 18:55:53 +08:00
|
|
|
|
_redPointNode = RedPointManager.Instance.AddDynamicNode(cfg.RedPoint.NodeType.Character, parentID) as RedPointNodeCharacter;
|
2024-07-16 13:11:18 +08:00
|
|
|
|
|
2024-08-15 19:47:57 +08:00
|
|
|
|
//此处添加角色所需要的所有红点节点,如觉醒,突破,技能等,挂在角色节点下
|
|
|
|
|
|
#region 觉醒红点
|
2024-06-27 18:55:53 +08:00
|
|
|
|
characterAwakingNode = RedPointManager.Instance.AddDynamicNode
|
|
|
|
|
|
(cfg.RedPoint.NodeType.Character,
|
|
|
|
|
|
_redPointNode.ID,
|
|
|
|
|
|
new List<int>() { (int)ID, (int)RedPointNodeCharacter.CharacterType.Awaking }) as RedPointNodeCharacter;
|
2024-08-15 19:47:57 +08:00
|
|
|
|
#endregion
|
2024-06-27 18:55:53 +08:00
|
|
|
|
|
|
|
|
|
|
if (_redPointNode == null)
|
|
|
|
|
|
DebugUtil.LogError("_redPointNode is null");
|
|
|
|
|
|
if (characterAwakingNode == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("characterAwakingNode is null");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ConstructRedPointTree(RedPointNode parent)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new System.NotImplementedException();
|
|
|
|
|
|
}
|
2024-11-20 15:18:21 +08:00
|
|
|
|
|
|
|
|
|
|
public void ForceSetCfg(DataCharacterAttri cfg)
|
|
|
|
|
|
{
|
|
|
|
|
|
_cfg = cfg;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|