using vnxbqy.UI;
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
/// <summary>
|
/// 对所有技能数据进行处理和缓存的类
|
/// </summary>
|
|
public class SkillHelper : Singleton<SkillHelper>
|
{
|
private TreasureSkillModel m_TreasureSkillModel;
|
private TreasureSkillModel treasureSkillModel
|
{
|
get
|
{
|
return m_TreasureSkillModel ?? (m_TreasureSkillModel = ModelCenter.Instance.GetModel<TreasureSkillModel>());
|
}
|
}
|
|
private Dictionary<int, SkillInfo> m_SkillInfoDict;
|
private Dictionary<int, List<SkillInfo>> m_SkillToSpSkill;
|
private Dictionary<int, int> m_SkillTypeIDToSkillID;
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
m_SkillInfoDict.Clear();
|
m_SkillToSpSkill.Clear();
|
m_SkillTypeIDToSkillID.Clear();
|
}
|
public SkillInfo GetExpertSkill(int mainSkillId)
|
{
|
int _expertSkillID = 0;
|
if (treasureSkillModel.TryGetExpertSkill(mainSkillId, out _expertSkillID))
|
{
|
int _level = 0;
|
if (treasureSkillModel.TryGetExpertActiveLevel(_expertSkillID, out _level))
|
{
|
_expertSkillID += (_level - 1);
|
}
|
return SkillHelper.Instance.Get(_expertSkillID);
|
}
|
return null;
|
}
|
|
public bool TryGetExpertSkillEvByMainSkillID(int mainSkillId, int evID, out EffectValue ev)
|
{
|
var _skillInfo = GetExpertSkill(mainSkillId);
|
if (_skillInfo != null)
|
{
|
if (_skillInfo.effectValue.ContainsKey(evID))
|
{
|
ev = _skillInfo.effectValue[evID];
|
return true;
|
}
|
}
|
ev = default(EffectValue);
|
return false;
|
}
|
|
public void Init()
|
{
|
if (m_SkillInfoDict == null)
|
{
|
m_SkillInfoDict = new Dictionary<int, SkillInfo>();
|
}
|
|
if (m_SkillToSpSkill == null)
|
{
|
m_SkillToSpSkill = new Dictionary<int, List<SkillInfo>>();
|
}
|
|
if (m_SkillTypeIDToSkillID == null)
|
{
|
m_SkillTypeIDToSkillID = new Dictionary<int, int>();
|
}
|
|
vnxbqy.UI.TreasureSkillModel _model = vnxbqy.UI.ModelCenter.Instance.GetModel<vnxbqy.UI.TreasureSkillModel>();
|
_model.potentialLevelRefresh += OnSpSkillChange;
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
|
}
|
|
public void BindSkill(int skillID)
|
{
|
SkillConfig _skill = SkillConfig.Get(skillID);
|
if (_skill == null)
|
{
|
return;
|
}
|
|
m_SkillTypeIDToSkillID[_skill.SkillTypeID] = _skill.SkillID;
|
}
|
|
public int GetSkillID(int typeID)
|
{
|
if (m_SkillTypeIDToSkillID.ContainsKey(typeID))
|
{
|
return m_SkillTypeIDToSkillID[typeID];
|
}
|
return typeID;
|
}
|
|
public void OnSpSkillChange(int skillTypeID, int level)
|
{
|
//Debug.LogFormat("# sp技能[{0}]发生了改变: {1} #", skillTypeID, level);
|
int _skillID = skillTypeID + level - 1;
|
SkillConfig _skill = SkillConfig.Get(_skillID);
|
|
//Debug.LogFormat("# -- 关联的技能id: {0}", _skill.ExAttr1);
|
// 关联的技能
|
if (!m_SkillToSpSkill.ContainsKey(_skill.ExAttr1))
|
{
|
List<SkillInfo> _spSkillList = new List<SkillInfo>();
|
m_SkillToSpSkill.Add(_skill.ExAttr1, _spSkillList);
|
}
|
|
bool _needCreate = true;
|
|
for (int i = m_SkillToSpSkill[_skill.ExAttr1].Count - 1; i >= 0; --i)
|
{
|
if (m_SkillToSpSkill[_skill.ExAttr1][i].config.SkillTypeID == skillTypeID)
|
{
|
_needCreate = false;
|
//Debug.LogFormat("# -- 此技能已经存在: {0} 的sp技能列表中", _skill.ExAttr1);
|
if (m_SkillToSpSkill[_skill.ExAttr1][i].config.SkillLV < level)
|
{
|
//Debug.LogFormat("# -- 但是等级发生了改变, 这里删除旧的", _skill.ExAttr1);
|
m_SkillToSpSkill[_skill.ExAttr1].RemoveAt(i);
|
_needCreate = true;
|
}
|
}
|
}
|
|
if (_needCreate)
|
{
|
SkillInfo _skillInfo = Get(_skillID);
|
m_SkillToSpSkill[_skill.ExAttr1].Add(_skillInfo);
|
#if UNITY_EDITOR
|
Debug.LogFormat("# -- 为技能: {0} 创建sp技能: {1}", _skill.ExAttr1, _skillID);
|
#endif
|
}
|
}
|
|
public List<SkillInfo> GetSpSkill(int skillID)
|
{
|
List <SkillInfo> tmpSkills = new List<SkillInfo>();
|
tmpSkills.Clear();
|
|
if (SkillClassifingConfig.Get(skillID).FuncType == 8)
|
{
|
if (m_SkillToSpSkill.ContainsKey(3))
|
tmpSkills.AddRange(m_SkillToSpSkill[3]);
|
}
|
if (m_SkillToSpSkill.ContainsKey(skillID))
|
{
|
tmpSkills.AddRange(m_SkillToSpSkill[skillID]);
|
return tmpSkills;
|
}
|
|
return tmpSkills;
|
}
|
|
public SkillInfo Get(int skillID)
|
{
|
SkillInfo _info = null;
|
|
if (!m_SkillInfoDict.TryGetValue(skillID, out _info))
|
{
|
_info = new SkillInfo(skillID);
|
m_SkillInfoDict.Add(skillID, _info);
|
}
|
|
return _info;
|
}
|
|
public class SkillInfo
|
{
|
/// <summary>
|
/// 技能配置
|
/// </summary>
|
public SkillConfig config;
|
|
/// <summary>
|
/// 插帧文件
|
/// </summary>
|
public SoSkill soFile;
|
|
/// <summary>
|
/// 效果值, 从SkillConfig抽出的配置
|
/// </summary>
|
public Dictionary<int, EffectValue> effectValue;
|
|
public bool HasHitEvent { get; private set; }
|
|
/// <summary>
|
/// 构造
|
/// </summary>
|
/// <param name="skillID">技能id</param>
|
public SkillInfo(int skillID)
|
{
|
effectValue = new Dictionary<int, EffectValue>();
|
|
config = SkillConfig.Get(skillID);
|
|
if (config != null)
|
{
|
if (config.Effect1 > 0)
|
{
|
EffectValue _effectValue = new EffectValue()
|
{
|
value1 = config.EffectValue11,
|
value2 = config.EffectValue12,
|
value3 = config.EffectValue13
|
};
|
effectValue[config.Effect1] = _effectValue;
|
}
|
if (config.Effect2 > 0)
|
{
|
EffectValue _effectValue = new EffectValue()
|
{
|
value1 = config.EffectValue21,
|
value2 = config.EffectValue22,
|
value3 = config.EffectValue23
|
};
|
effectValue[config.Effect2] = _effectValue;
|
}
|
if (config.Effect3 > 0)
|
{
|
EffectValue _effectValue = new EffectValue()
|
{
|
value1 = config.EffectValue31,
|
value2 = config.EffectValue32,
|
value3 = config.EffectValue33
|
};
|
effectValue[config.Effect3] = _effectValue;
|
}
|
if (config.Effect4 > 0)
|
{
|
EffectValue _effectValue = new EffectValue()
|
{
|
value1 = config.EffectValue41,
|
value2 = config.EffectValue42,
|
value3 = config.EffectValue43
|
};
|
effectValue[config.Effect4] = _effectValue;
|
}
|
if (config.Effect5 > 0)
|
{
|
EffectValue _effectValue = new EffectValue()
|
{
|
value1 = config.EffectValue51,
|
value2 = config.EffectValue52,
|
value3 = config.EffectValue53
|
};
|
effectValue[config.Effect5] = _effectValue;
|
}
|
if (config.Effect6 > 0)
|
{
|
EffectValue _effectValue = new EffectValue()
|
{
|
value1 = config.EffectValue61,
|
value2 = config.EffectValue62,
|
value3 = config.EffectValue63
|
};
|
effectValue[config.Effect5] = _effectValue;
|
}
|
}
|
|
soFile = ScriptableObjectLoader.LoadSoSkill(config.SkillTypeID);
|
|
if (soFile)
|
{
|
HasHitEvent = soFile.animationEventList.Count > 0;
|
if (HasHitEvent)
|
{
|
HasHitEvent = false;
|
SoConfigBase _soConfig = null;
|
int _param;
|
int _id;
|
SoSkill.E_AttackType _type;
|
for (int i = 0; i < soFile.animationEventList.Count; ++i)
|
{
|
if (soFile.animationEventList[i].frameEventType != E_FrameEventType.OnSkillEvent)
|
{
|
continue;
|
}
|
|
_soConfig = null;
|
_param = soFile.animationEventList[i].intParam;
|
_id = SoSkill.GetFrameEventId(_param);
|
_type = SoSkill.GetAttactType(_param);
|
|
if (_type == SoSkill.E_AttackType.Sweep)
|
{
|
_soConfig = ScriptableObjectLoader.LoadSoSweepHit(_id);
|
}
|
else if (_type == SoSkill.E_AttackType.FlyObject)
|
{
|
_soConfig = ScriptableObjectLoader.LoadSoFlyObject(_id);
|
}
|
|
if (_soConfig != null && _soConfig.floodPercent != 0)
|
{
|
HasHitEvent = true;
|
break;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 效果值类
|
/// </summary>
|
public struct EffectValue
|
{
|
public int value1;
|
public int value2;
|
public int value3;
|
}
|
}
|