using vnxbqy.UI;
using System.Collections.Generic;
using UnityEngine;
///
/// 对所有技能数据进行处理和缓存的类
///
public class SkillHelper : Singleton
{
private TreasureSkillModel m_TreasureSkillModel;
private TreasureSkillModel treasureSkillModel
{
get
{
return m_TreasureSkillModel ?? (m_TreasureSkillModel = ModelCenter.Instance.GetModel());
}
}
private Dictionary m_SkillInfoDict;
private Dictionary> m_SkillToSpSkill;
private Dictionary 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();
}
if (m_SkillToSpSkill == null)
{
m_SkillToSpSkill = new Dictionary>();
}
if (m_SkillTypeIDToSkillID == null)
{
m_SkillTypeIDToSkillID = new Dictionary();
}
vnxbqy.UI.TreasureSkillModel _model = vnxbqy.UI.ModelCenter.Instance.GetModel();
_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 _spSkillList = new List();
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 GetSpSkill(int skillID)
{
List tmpSkills = new List();
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
{
///
/// 技能配置
///
public SkillConfig config;
///
/// 插帧文件
///
public SoSkill soFile;
///
/// 效果值, 从SkillConfig抽出的配置
///
public Dictionary effectValue;
public bool HasHitEvent { get; private set; }
///
/// 构造
///
/// 技能id
public SkillInfo(int skillID)
{
effectValue = new Dictionary();
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;
}
}
}
}
}
}
///
/// 效果值类
///
public struct EffectValue
{
public int value1;
public int value2;
public int value3;
}
}