using System.Collections.Generic;
using Common.Utility.CombatEvent;
using Excel2Json;
using Fort23.Core;
using Fort23.Mono;
using Fort23.UTool;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Skill;
using GameLogic.Player;
using UnityEngine;
namespace GameLogic.Combat.Hero
{
public class CombatHeroSkillControl : CombatHeroSkillControlBasic
{
///
/// 技能指令,0表示没有技能;
///
private BetterList SkillCommands = new BetterList();
public int useSkillCount
{
get { return SkillCommands.size; }
}
///
/// 当前能使用的技能
///
public SkillBasic currUseSkill;
// public float NormalAttSpeedScale;
public BetterList _skillQueue = new BetterList();
public float skillQueueTime = 5f;
// private BetterList _skillQueue = new BetterList();
private int _currUseQueueIndex = 0;
public float allMagic = 500;
protected float addMaicSpeed = 5000;
public float addChongNeng;
public bool isKuoLiQuanKai;
protected float qiankaiTime;
protected override async CTask ProInit()
{
// NormalAttSpeedScale = 2;
CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
List skillId = _combatHeroEntity.CurrCombatHeroInfo.unLockSkills;
if (skillId != null)
{
for (int i = 0; i < skillId.Count; i++)
{
SkillConfig skillConfig = ConfigComponent.Instance.Get(skillId[i]);
SkillBasic skillBasic = AddSkill(skillConfig);
if (skillBasic == null)
{
continue;
}
_skillQueue.Add(skillBasic);
if (!string.IsNullOrEmpty(skillConfig.scriptName))
{
cTaskAwaitBuffer.AddTask(AssetBundleLoadManager.Instance.LoadAssetAsyncTask(
skillConfig.timelineName + ".txt",
delegate(AssetHandle handle)
{
if (handle != null)
{
TextAsset textAsset = handle.AssetObject();
TimeLienData timeLienData = JsonManager.FromJson(textAsset.text);
timeLienData.DeserializeData();
handle.Release();
_combatHeroEntity.combatHeroTimeLineControl.AddTimeLienData(timeLienData);
}
}));
}
}
}
await cTaskAwaitBuffer.WaitAll();
for (int i = 0; i < _skillQueue.Count; i++)
{
_skillQueue[i].angle -= i * 25;
}
CombatEventManager.Instance.Dispatch(CombatEventType.ExercisesAlter, null);
}
public void UpdateSkill(List skillIDs)
{
for (int i = 0; i < skillIDs.Count; i++)
{
SkillConfig skillConfig = ConfigComponent.Instance.Get(skillIDs[i]);
// SkillConfig skillConfig = skillIDs[i];
SkillBasic skillBasic = GetSkillBasic(skillConfig.IDGroup);
if (skillBasic == null)
{
AddSkill(skillConfig);
}
else
{
skillBasic.InitSkillConfig(skillConfig);
skillBasic.InitSkill(_combatHeroEntity);
}
}
}
public void AddCommandSkill(SkillBasic skill)
{
SkillCommands.Add(skill);
}
public void RemoveCommandSkill(SkillBasic skill)
{
SkillCommands.Remove(skill);
}
public void ClearCommandSkill()
{
SkillCommands.Clear();
}
public void UseSkill(SkillBasic skill)
{
CombatUseSkillEventData combatUseSkillEventData = CombatUseSkillEventData.Create();
combatUseSkillEventData.useSkill = skill;
CombatEventManager.Instance.Dispatch(CombatEventType.UseSkill, combatUseSkillEventData);
currUseSkill = skill;
skill.UseSkill();
if (skill.SelfSkillConfig.SkillType == 1)
{
SetNormalAttCd();
}
}
///
/// 判断是否有技能可释放
///
///
public SkillBasic CanReleaseSkill()
{
// if (_combatHeroEntity.IsControl())
// {
// return null;
// }
if (!_combatHeroEntity.IsEnemy && _combatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)
{
return null;
}
SkillBasic skillBasic = null;
for (int i = 0; i < SkillCommands.size; i++)
{
skillBasic = SkillCommands[i];
break;
}
return skillBasic;
}
public void StartPolling()
{
for (int i = 0; i < _skillQueue.size; i++)
{
SkillBasic skillBasic = allSkill[i];
skillBasic.PollingInitBefore(_skillQueue);
}
for (int i = 0; i < _skillQueue.size; i++)
{
SkillBasic skillBasic = allSkill[i];
skillBasic.PollingInit(_skillQueue);
}
_currUseQueueIndex = 0;
}
protected override void ProUpdate(float t)
{
if (CombatController.currActiveCombat.IsFightState)
{
float speed = _combatHeroEntity.CurrCombatHeroInfo.attSpeed.Value * (isKuoLiQuanKai ? 3 : 1f);
for (int i = 0; i < _skillQueue.Count; i++)
{
SkillBasic skillBasic = _skillQueue[i];
skillBasic.angle += 1 * speed;
float jd = skillBasic.angle % 360;
if (jd > skillBasic.useAngle && skillBasic.angle > skillBasic.lasetAngle)
{
skillBasic.lasetAngle += 360;
if (allMagic > 30)
{
allMagic -= 30;
skillBasic.useCount++;
if (!isKuoLiQuanKai)
{
addChongNeng += 10;
if (addChongNeng >= 150)
{
isKuoLiQuanKai = true;
}
}
if (skillBasic.WuXingType.HasFlag(WuXingType.Gold))
{
int odds = Random.Range(0, 100);
if (odds < 50)
{
_combatHeroEntity.CurrCombatHeroInfo.Water_Injury -= Random.Range(2, 5);
if (_combatHeroEntity.CurrCombatHeroInfo.Water_Injury < 0)
{
_combatHeroEntity.CurrCombatHeroInfo.Water_Injury = 0;
}
}
}
if (skillBasic.WuXingType.HasFlag(WuXingType.Wood))
{
int odds = Random.Range(0, 100);
if (odds < 50)
{
_combatHeroEntity.CurrCombatHeroInfo.Fire_Injury -= Random.Range(2, 5);
if (_combatHeroEntity.CurrCombatHeroInfo.Fire_Injury < 0)
{
_combatHeroEntity.CurrCombatHeroInfo.Fire_Injury = 0;
}
}
}
if (skillBasic.WuXingType.HasFlag(WuXingType.Water))
{
int odds = Random.Range(0, 100);
if (odds < 50)
{
_combatHeroEntity.CurrCombatHeroInfo.Wood_Injury -= Random.Range(2, 5);
if (_combatHeroEntity.CurrCombatHeroInfo.Wood_Injury < 0)
{
_combatHeroEntity.CurrCombatHeroInfo.Wood_Injury = 0;
}
}
}
if (skillBasic.WuXingType.HasFlag(WuXingType.Fire))
{
int odds = Random.Range(0, 100);
if (odds < 50)
{
_combatHeroEntity.CurrCombatHeroInfo.Earth_Injury -= Random.Range(2, 5);
if (_combatHeroEntity.CurrCombatHeroInfo.Earth_Injury < 0)
{
_combatHeroEntity.CurrCombatHeroInfo.Earth_Injury = 0;
}
}
}
if (skillBasic.WuXingType.HasFlag(WuXingType.Earth))
{
int odds = Random.Range(0, 100);
if (odds < 50)
{
_combatHeroEntity.CurrCombatHeroInfo.Metal_Injury -= Random.Range(2, 5);
if (_combatHeroEntity.CurrCombatHeroInfo.Metal_Injury < 0)
{
_combatHeroEntity.CurrCombatHeroInfo.Metal_Injury = 0;
}
}
}
AddCommandSkill(skillBasic);
AddUseGongFaEventData addUseGongFaEventData = AddUseGongFaEventData.Create();
addUseGongFaEventData.SkillBasic = skillBasic;
CombatEventManager.Instance.Dispatch(CombatEventType.AddUseGongFa, addUseGongFaEventData);
// Debug.Log("旋转一圈");
}
}
}
}
if (isKuoLiQuanKai)
{
qiankaiTime += t;
if (qiankaiTime > 3)
{
isKuoLiQuanKai = false;
qiankaiTime = 0;
addChongNeng = 0;
}
}
allMagic += t * addMaicSpeed;
if (allMagic > 500)
{
allMagic = 500;
}
// if (currUseSkill == null && SkillCommands.Count <= 0)
// {
// while (_currUseQueueIndex < _skillQueue.Count && SkillCommands.Count <= 0)
// {
// SkillBasic skillBasic = _skillQueue[_currUseQueueIndex];
// if (skillBasic.SelfSkillConfig.SkillType == 1)
// {
// if (skillBasic.IsCanUse())
// {
// AddCommandSkill(skillBasic);
// }
// }
//
// _currUseQueueIndex++;
// }
// }
// if (_currUseQueueIndex >= _skillQueue.Count)
// {
// StartPolling();
// }
}
public void SetNormalAttCd()
{
// if (NormalAttack == null)
// {
// return;
// }
//
// string timeLineName = "attack";
// float maxTime = _combatHeroEntity.combatHeroTimeLineControl.TimeLineData.GetTimeLineEventLogicGroupForTime(
// timeLineName, null);
// float attackSpeed = _combatHeroEntity.CurrCombatHeroInfo.attSpeed.Value;
// float cd = 1.0f / attackSpeed;
// float attSpeed = (float)1;
// if (cd < maxTime)
// {
// attSpeed = maxTime / cd;
// }
//
// NormalAttSpeedScale = attSpeed;
// // Debug.Log(NormalAttSpeedScale);
// NormalAttCd = cd;
}
public virtual void Dispose()
{
_combatHeroEntity = null;
currUseSkill = null;
}
public virtual void ProDormancyObj()
{
for (int i = 0; i < allSkill.size; i++)
{
SkillBasic skillBasic = allSkill[i];
CObjectPool.Instance.Recycle(skillBasic);
}
allSkill.Clear();
SkillCommands.Clear();
}
}
}