using System;
using System.Collections.Generic;
using CombatCore.SerializationTimeLine;
using CombatLibrary.CombatLibrary.CombatCore;
using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Common.Combat.FxAILogic;
using Common.Utility.CombatEvent;
using Excel2Json;
using Fort23.Common;
using Fort23.Core;
using Fort23.UTool;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Hero;
using GameLogic.Combat.Skill.IntensifierEffect;
using GameLogic.CombatScenesTool;
using GameLogic.Player;
using UnityEngine;
using Utility;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
using Random = UnityEngine.Random;
namespace GameLogic.Combat.Skill
{
public abstract class SkillBasic : CObject, ITimeLineTriggerEntity, ITimeLineEndSing, ITimeLineTargetEntity,
ITimeLineTriggerEvent, ITimeLineAlertTargetEnter
{
public int skillGuid;
public int UseCount;
///
/// 是否被激活
///
public bool isActive = true;
///
/// 是否使用中
///
private bool isUse;
public CombatHeroEntity CombatHeroEntity
{
get { return _combatHeroEntity; }
}
///
/// 转盘中的下表
///
public int index;
private bool _isDis;
public float angle = 180;
public float useAngle;
public float lasetAngle = 360;
public int useCount;
///
/// 当前激活技能的TimeLine数据
///
protected List currUseAllTimeLineLogic = new List();
private CombatHeroEntity _combatHeroEntity;
private Map>
_triggerCallBack =
new Map>();
public SkillConfig SelfSkillConfig;
// public SkillIntensifierData SkillIntensifierData;
///
/// 释放技能的时候当前焦点的目标
///
public CombatHeroEntity currFocusTarget;
private SkillFeaturesData SkillFeaturesData;
///
/// 激活的timelinegoup名字
///
public string ActiveTimeLineGroupName;
private System.Action finishCallBack;
///
/// 完成时 是否是要完成的timeGroupName
///
protected string _finishTimeLineGroupName;
protected BetterList _enterAlertTarget = new BetterList();
protected BetterList _currUseSkillTarget = new BetterList();
protected bool _isEarlyWarning;
///
/// 是否使用技能目标里的缓存池子
///
protected bool _useSkillTargetPool = true;
public WuXingType wuXingType;
public TriggerData triggerData
{
get
{
_triggerData.Source = this;
return _triggerData;
}
}
private TriggerData _triggerData;
///
/// 技能cd
///
public float SkillCd
{
get { return _skillCd; }
set { _skillCd = value; }
}
private float _skillCd;
public float SkillMaxCd;
private CombatParticleSystemPool _earlyWarningFx;
private CombatHeroEntity _earlyWarningFristHero;
public T This()
{
return (T)(object)this;
}
public void InitSkill(CombatHeroEntity combatHeroEntity)
{
wuXingType = (WuXingType)SelfSkillConfig.attribute;
SkillFeaturesData = new SkillFeaturesData();
SkillFeaturesData.WuXingType = wuXingType;
SkillFeaturesData.hp = Random.Range(100, 200);
SkillFeaturesData.isEnemy = combatHeroEntity.IsEnemy;
_combatHeroEntity = combatHeroEntity;
ProInitSkill();
}
public void IntensifyingEffect(float bl)
{
if (SelfSkillConfig.intensifierIndex == null)
{
return;
}
float[] effectValue = SelfSkillConfig.effectValue;
float[] newEffectValue = new float[effectValue.Length];
for (int i = 0; i < SelfSkillConfig.intensifierIndex.Length; i++)
{
int index = SelfSkillConfig.intensifierIndex[i];
if (index >= effectValue.Length)
{
continue;
}
newEffectValue[index] = effectValue[index] * (1 + (bl * 0.01f));
}
SelfSkillConfig.effectValue = newEffectValue;
}
public SkillFeaturesData GetSkillFeaturesData()
{
return SkillFeaturesData.CapyFeaturesData();
}
public override void ActiveObj()
{
}
///
/// 激活技能,准备使用技能
///
public void ActiveSkill()
{
ProActiveSkill();
}
protected virtual void ProActiveSkill()
{
}
///
/// 轮询的初始化
///
public void PollingInit(BetterList skillQueue)
{
ProPollingnInit(skillQueue);
}
protected virtual void ProPollingnInit(BetterList skillQueue)
{
}
///
/// 休眠
///
public override void DormancyObj()
{
Dispose();
_enterAlertTarget.Clear();
_currUseSkillTarget.Clear();
_triggerCallBack.Clear();
_earlyWarningFx = null;
_earlyWarningFristHero = null;
_finishTimeLineGroupName = null;
_earlyWarningFx = null;
_isEarlyWarning = false;
_triggerData = new TriggerData();
_useSkillTargetPool = true;
isUse = false;
_combatHeroEntity = null;
SkillMaxCd = 0;
currUseAllTimeLineLogic.Clear();
finishCallBack = null;
_isDis = false;
}
public virtual void ActiveLimitSkill()
{
isActive = true;
}
///
/// 开始游戏
///
public void StartGame()
{
// InitSpecialWeapon();
if (SelfSkillConfig.SkillType == 4 || SelfSkillConfig.SkillType == 5)
{
UseSkill();
}
ProStartGame();
}
public void InitSkillConfig(SkillConfig skillConfig)
{
SkillMaxCd = skillConfig.cd;
_skillCd = SkillMaxCd;
SelfSkillConfig = skillConfig;
UseCount = skillConfig.SkillType * 100000;
skillGuid = skillConfig.ID;
// if (SkillIntensifierData == null)
// {
// SkillIntensifierData = new SkillIntensifierData();
// }
switch (skillConfig.attribute)
{
case 1:
useAngle = 0;
break;
case 2:
useAngle = 72;
break;
case 4:
useAngle = 144;
break;
case 8:
useAngle = 216;
break;
case 16:
useAngle = 288;
break;
}
ProInitSkillConfig();
// LogTool.Log("初始化技能"+skillConfig.scriptName);
}
protected virtual void ProInitSkillConfig()
{
}
///
/// 设置激活的TimeLine名字
///
public void SetActiveTimeLineGroupName(string groupName)
{
ActiveTimeLineGroupName = groupName;
}
public virtual bool IsCanUse()
{
return true;
}
public HarmReturnInfo Harm(CombatHeroEntity source, CombatHeroHitPoint target, long att, AttType attType,
TriggerData triggerData, HarmType harmType = HarmType.Null)
{
if (target == null || target.combatHeroEntity == null)
{
return null;
}
return CombatCalculateTool.Instance.Harm(source, target, att, attType, triggerData, wuXingType,
harmType);
}
public HarmReturnInfo Recover(CombatHeroEntity source, CombatHeroHitPoint target, long att,
AttType attType, HarmType harmType)
{
return CombatCalculateTool.Instance.Recover(source, target, att, attType, harmType, triggerData);
}
public void SetSkillFinishCallBack(System.Action finishCallBack)
{
this.finishCallBack = finishCallBack;
}
///
/// 开始使用技能
///
public void UseSkill()
{
// BetterList currIntensifierEffectBasicList =
// SkillIntensifierData.currIntensifierEffectBasicList;
// for (int i = 0; i < currIntensifierEffectBasicList.Count; i++)
// {
// currIntensifierEffectBasicList[i].IntensifierSkillUseBefore(this);
// }
SkillCd = SkillMaxCd;
_enterAlertTarget.Clear();
UseCount++;
_triggerData = new TriggerData();
isUse = true;
_triggerData.TriggerGuid = UseCount;
_currUseSkillTarget.Clear();
currUseAllTimeLineLogic.Clear();
// CombatEventManager.Instance.Dispatch(CombatEventType.HeroUseSkill, new HeroUseSkillEventData()
// {
// CombatHeroEntity = CombatHeroEntity,
// SkillBasic = this
// });
ProUseSkill();
}
public override void Dispose()
{
if (_isDis)
{
return;
}
_isDis = true;
currUseAllTimeLineLogic.Clear();
ProDispose();
_combatHeroEntity = null;
}
public void ReduceCd(float time)
{
if (!isActive || !IsCanReduceCd())
{
return;
}
_skillCd -= time;
}
protected virtual bool IsCanReduceCd()
{
return true;
}
public SpecialDotInfo GetSpecialDotInfo(string specialDotName)
{
return _combatHeroEntity.GetSpecialDotInfo(specialDotName);
}
public T GetILifetCycleHitPoint(string hitPoinName, bool isStandType, bool isIgnoreHind)
where T : ILifetCycleHitPoint
{
return _combatHeroEntity.GetILifetCycleHitPoint(hitPoinName, isStandType, isIgnoreHind);
}
public T GetMainHotPoin(bool isIgnoreHind) where T : ILifetCycleHitPoint
{
throw new NotImplementedException();
}
public void CloseLoopFx(IGObjectPoolInterface objectPoolInterface)
{
}
///
/// 添加trigger监听事件
///
///
///
protected void AddTriggerCallBack(string groupName,
System.Action callBack)
{
if (!_triggerCallBack.ContainsKey(groupName))
{
_triggerCallBack.Add(groupName, callBack);
}
}
///
/// 移除trigger添加事件
///
///
///
protected void RemoveTriggerCallBack(string groupName,
System.Action callBack)
{
if (_triggerCallBack.ContainsKey(groupName))
{
_triggerCallBack.Remove(groupName);
}
}
///
/// 激活timeLine数据
///
/// 组
/// 传递给timeLine的目标
/// 透传消息
/// 自定义坐标
/// timeLine完成回调
public TimeLineEventLogicGroupBasic ActivationTimeLineData(string groupName, string timeLineName = null,
BetterList currTarget = null,
Vector3[] customizePos = null, System.Action finishCallBack = null, float startTime = default,
object extraData = null, int indexCount = 0)
{
bool isNoAnim = false;
if (groupName.Contains("noAnim"))
{
groupName = groupName.Replace("noAnim", "");
isNoAnim = true;
}
TimeLineEventLogicGroupBasic timeLineEventLogicGroup =
_combatHeroEntity.combatHeroTimeLineControl
.GetTimeLineEventLogicGroup(timeLineName, groupName);
try
{
if (timeLineEventLogicGroup != null)
{
timeLineEventLogicGroup.extraData = extraData;
timeLineEventLogicGroup.SetCombatInfo(_combatHeroEntity, this, currTarget, triggerData,
customizePos, indexCount);
timeLineEventLogicGroup.TimeLineUpdateEnd = finishCallBack;
timeLineEventLogicGroup.timeLineTime = startTime;
_combatHeroEntity.combatHeroTimeLineControl.AddEventLogicGroup(timeLineEventLogicGroup);
currUseAllTimeLineLogic.Add(timeLineEventLogicGroup);
}
}
catch (Exception e)
{
LogTool.Error(e);
}
return timeLineEventLogicGroup;
}
///
/// 打断技能
///
public void BreakSkill()
{
// CombatEventManager.Instance.Dispatch(CombatEventType.BreakSkill, new CombatEventDefaultData()
// {
// datas = new object[2] { _combatHeroEntity, this }
// });
for (int i = 0; i < currUseAllTimeLineLogic.Count; i++)
{
if (currUseAllTimeLineLogic[i] != null && currUseAllTimeLineLogic[i].CastEntity != CombatHeroEntity)
{
LogTool.Log("对象以移交");
}
else
{
currUseAllTimeLineLogic[i].BreakTimeLine(CombatHeroEntity);
_combatHeroEntity.combatHeroTimeLineControl.RemoveEventLogicGroup(currUseAllTimeLineLogic[i]);
}
}
currUseAllTimeLineLogic.Clear();
SkillPlayFinish();
ProBreakSkill();
}
///
/// 技能timeLine的完成标志。表示当前TimeLine播放完成
///
/// 那一个组的完成了
public void TimeLineEndSing(string groupName)
{
ProTimeLineEndSing(groupName);
}
///
/// 技能更新
///
///
public void CombatUpdate(float time)
{
ProCombatUpdate(time);
}
///
/// 技能播放完成
///
public void SkillPlayFinish()
{
if (!isUse)
{
return;
}
isUse = false;
finishCallBack?.Invoke(this);
ProSkillPlayFinish();
finishCallBack = null;
_isEarlyWarning = false;
_earlyWarningFristHero = null;
if (_earlyWarningFx != null)
{
GObjectPool.Instance.Recycle(_earlyWarningFx);
_earlyWarningFx = null;
}
// BetterList currIntensifierEffectBasicList =
// SkillIntensifierData.currIntensifierEffectBasicList;
// for (int i = 0; i < currIntensifierEffectBasicList.Count; i++)
// {
// currIntensifierEffectBasicList[i].IntensifierSkillTimelineFxLogicUseFinish(this);
// }
}
///
/// timeLine和子弹碰撞后会调用
///
/// 触发类型,默认没用
/// 时间线上配置的数据(默认null)
/// 目标对象(敌人)
/// 触发的额外数据——透传数据
public void TimeLineTrigger(string groupName, ILifetCycleHitPoint targetEntity,
ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
{
if (targetEntity == null || _isDis)
{
return;
}
if (_triggerCallBack.ContainsKey(groupName))
{
_triggerCallBack[groupName]?.Invoke(groupName,
targetEntity != null ? targetEntity.This() : null, timelineFxLogic,
triggerData);
}
else
{
ProDefaultTimeLineTrigger(groupName,
targetEntity != null ? targetEntity.This() : null, timelineFxLogic,
triggerData);
}
}
public ILifetCycleHitPoint[] GetTineLineTargetEntity(TimeLineEventLogicBasic timeLineEventLogicBasic)
{
// BetterList point = CombatListPool.Instance.Get();
if (_useSkillTargetPool)
{
if (_currUseSkillTarget != null && _currUseSkillTarget.Count > 0)
{
return _currUseSkillTarget.ToArray();
}
}
_currUseSkillTarget.Clear();
ILifetCycleHitPoint[] allHit = ProGetTineLineTargetEntity(timeLineEventLogicBasic);
_currUseSkillTarget.AddRange(allHit);
return _currUseSkillTarget.ToArray();
}
public ILifetCycleHitPoint[] FilterTarget(TimeLineEventLogicBasic timeLineEventLogicBasic,
FXTargetType fixtarget, ILifetCycleHitPoint[] target)
{
if ((int)fixtarget == 1)
{
return target;
}
// BetterList point = CombatListPool.Instance.Get();
// bool myEnemy = _combatHeroEntity.CombatHeroDataComponent.CurrCombatHeroInfo.IsEnemy;
// for (int i = 0; i < target.Count; i++)
// {
// bool targetEnemy = target[i].This().CombatHeroEntity.CombatHeroDataComponent
// .CurrCombatHeroInfo.IsEnemy;
// if (fixtarget.HasFlag(FXTargetType.Enemy) && targetEnemy != myEnemy)
// {
// point.Add(target[i]);
// }
//
// if (fixtarget.HasFlag(FXTargetType.Teammate) && targetEnemy == myEnemy)
// {
// point.Add(target[i]);
// }
//
// if (fixtarget.HasFlag(FXTargetType.Oneself) &&
// target[i].This().CombatHeroEntity == _combatHeroEntity)
// {
// point.Add(target[i]);
// }
// }
return target;
}
public ILifetCycleHitPoint[] FilterTargetForCombat(TimeLineEventLogicBasic timeLineEventLogicBasic,
FXTargetType fixtarget,
ILifetCycleHitPoint[] target)
{
return target;
}
protected virtual void ProInitSkill()
{
}
protected abstract void ProUseSkill();
protected virtual ILifetCycleHitPoint[] ProGetTineLineTargetEntity(
TimeLineEventLogicBasic timeLineEventLogicBasic)
{
if (CombatHeroEntity.CombatAIBasic.currFocusTarget == null)
{
return null;
}
if (CombatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)
{
return null;
}
ILifetCycleHitPoint lifetCycleHitPoint = CombatHeroEntity.CombatAIBasic.currFocusTarget
.GetThis()
.GetMainHotPoin();
if (lifetCycleHitPoint == null)
{
return null;
}
return new[] { lifetCycleHitPoint };
}
///
/// 默认的触发器
///
///
///
///
///
///
protected virtual void ProDefaultTimeLineTrigger(string groupName, CombatHeroHitPoint targetEntity,
ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
{
}
protected virtual void ProSkillPlayFinish()
{
}
protected virtual void ProDispose()
{
}
///
///
///
///
protected virtual void ProTimeLineEndSing(string groupName)
{
if (string.IsNullOrEmpty(_finishTimeLineGroupName))
{
SkillPlayFinish();
}
else if (_finishTimeLineGroupName == groupName)
{
SkillPlayFinish();
}
}
protected virtual void ProCombatUpdate(float time)
{
}
///
/// 技能被打断
///
protected virtual void ProBreakSkill()
{
}
protected virtual void ProStartGame()
{
}
public void TimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
{
ProTimelineFxLogicInit(groupName, timelineFxLogic, triggerData);
TimelineFxLogicInitEventData eventData = TimelineFxLogicInitEventData.Create();
eventData.SkillBasic = this;
eventData.timelineFxLogic = timelineFxLogic as FxAILogicBasic;
CombatEventManager.Instance.Dispatch(CombatEventType.TimelineFxLogicInit, eventData);
}
///
/// 实例化出的特效逻辑初始化
///
///
///
protected virtual void ProTimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic,
TriggerData triggerData)
{
}
public void TimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
{
ProTimeLineTriggerGround(groupName, timelineFxLogic, triggerData);
}
///
/// 触碰地面
///
///
///
protected virtual void ProTimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic,
TriggerData triggerData)
{
}
public void InitAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion, GameObject gameObject)
{
CombatAlertManager.Instance.AddAlert(gameObject, _combatHeroEntity);
}
public void LeaveAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion, GameObject gameObject)
{
_enterAlertTarget.Clear();
CombatAlertManager.Instance.RemoveAlert(gameObject);
}
public void Enter(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider, GameObject gameObject)
{
HeroEntityMono heroEntityMono = collider.gameObject.GetComponent();
if (heroEntityMono == null)
{
return;
}
CombatHeroEntity target = heroEntityMono.combatHeroEntity;
if (timeLineAlertSeriailztion.isFindEnemy && target.IsEnemy == _combatHeroEntity.IsEnemy ||
timeLineAlertSeriailztion.isFindMyHero && target.IsEnemy != _combatHeroEntity.IsEnemy)
{
return;
}
if (_enterAlertTarget.Contains(target))
{
return;
}
_enterAlertTarget.Add(target);
if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
{
AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
alertTriggerEventData.combatHeroEntity = target;
alertTriggerEventData.attackEntity = _combatHeroEntity;
alertTriggerEventData.collider = collider;
alertTriggerEventData.triggerObject = gameObject;
alertTriggerEventData.isTrigger = true;
CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
}
ProHeroEnter(timeLineAlertSeriailztion, target);
}
protected virtual void ProHeroEnter(TimeLineAlertSeriailztion timeLineAlertSeriailztion,
CombatHeroEntity target)
{
}
public void Leave(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider, GameObject gameObject)
{
HeroEntityMono heroEntityMono = collider.gameObject.GetComponent();
if (heroEntityMono == null || CombatHeroEntity == null)
{
return;
}
CombatHeroEntity target = heroEntityMono.combatHeroEntity;
if (target.IsEnemy == CombatHeroEntity.IsEnemy)
{
return;
}
if (!_enterAlertTarget.Contains(target))
{
return;
}
_enterAlertTarget.Remove(target);
if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
{
AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
alertTriggerEventData.combatHeroEntity = target;
alertTriggerEventData.attackEntity = _combatHeroEntity;
alertTriggerEventData.collider = collider;
alertTriggerEventData.isTrigger = false;
alertTriggerEventData.triggerObject = gameObject;
CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
}
ProHeroLeave(timeLineAlertSeriailztion, target);
}
protected virtual void ProHeroLeave(TimeLineAlertSeriailztion timeLineAlertSeriailztion,
CombatHeroEntity target)
{
}
}
}