You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
6.6 KiB
179 lines
6.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using CoreGame.Render;
|
|
using GAS.Runtime;
|
|
using Sog;
|
|
using UnityEngine;
|
|
|
|
namespace CoreGame.Render
|
|
{
|
|
public sealed class GARotateHurt : GameplayAbility
|
|
{
|
|
public GARotateHurt(IAbilityData abilityAsset) : base(abilityAsset)
|
|
{
|
|
}
|
|
|
|
public override AbilitySpec CreateSpec(AbilitySystemComponent owner, GameAbilityContext ctx)
|
|
{
|
|
var rotateHurtSpec = SptPool<GARotateHurtSpec>.Malloc();
|
|
rotateHurtSpec.Awake(this, ctx);
|
|
return rotateHurtSpec;
|
|
}
|
|
|
|
public override void FreeSpec(ref AbilitySpec spec)
|
|
{
|
|
if (spec is not GARotateHurtSpec rotateHurtSpec)
|
|
{
|
|
BattleLogger.LogInfo("RotateHurtSpec.FreeSpec: spec is not RotateHurtSpec");
|
|
return;
|
|
}
|
|
SptPool<GARotateHurtSpec>.Free(ref rotateHurtSpec);
|
|
}
|
|
}
|
|
|
|
public sealed class GARotateHurtSpec : AbilitySpec, ISptPool
|
|
{
|
|
private int m_RotateCount;
|
|
private float m_TimeAcc;
|
|
private Fixed64Vector2 m_RotateDir;
|
|
|
|
private List<int> m_VFXList;
|
|
private List<Tuple<InstantListenTask, TaskSpec>> m_TriggerTasks;
|
|
private static readonly List<CombatEntity> s_CacheEntities = new();
|
|
private static readonly List<int> s_CacheVFXList = new();
|
|
private GARotateHurtAsset RotateHurtAsset => Ability.DataReference as GARotateHurtAsset;
|
|
|
|
public override void Awake(GameplayAbility ability, GameAbilityContext gaCtx)
|
|
{
|
|
base.Awake(ability, gaCtx);
|
|
m_VFXList = ListPool<int>.Pop();
|
|
m_TriggerTasks = ListPool<Tuple<InstantListenTask, TaskSpec>>.Pop();
|
|
}
|
|
|
|
public override void GrantAbility()
|
|
{
|
|
base.GrantAbility();
|
|
|
|
if (RotateHurtAsset.triggerIds != null)
|
|
{
|
|
for (var index = 0; index < RotateHurtAsset.triggerIds.Length; index++)
|
|
{
|
|
// TODO: 整改到Asset里面去
|
|
var trigger = new CommTriggerTask();
|
|
trigger.cfgId = RotateHurtAsset.triggerIds[index];
|
|
var taskSpec = new TaskSpec(this);
|
|
trigger.AddListen(ref taskSpec);
|
|
m_TriggerTasks.Add(new Tuple<InstantListenTask, TaskSpec>(trigger, taskSpec));
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void UnGrantAbility()
|
|
{
|
|
base.UnGrantAbility();
|
|
for (var index = 0; index < m_TriggerTasks.Count; index++)
|
|
{
|
|
var (triggerTask, taskSpec) = m_TriggerTasks[index];
|
|
triggerTask.RemoveListen(ref taskSpec);
|
|
}
|
|
m_TriggerTasks.Clear();
|
|
}
|
|
|
|
|
|
public override void ActivateAbility()
|
|
{
|
|
m_RotateCount = 0;
|
|
m_TimeAcc = 0f;
|
|
TargetSelectSrv.SpellSelectEnts(ctx, RotateHurtAsset.geCastPointSelectCfgId, ctx.castPos, s_CacheEntities);
|
|
m_RotateDir = (ctx.castPos[0] - ctx.ownerEnt.logicTransform.position);
|
|
m_RotateDir.Normalize();
|
|
DoCost();
|
|
}
|
|
|
|
protected override void AbilityTick(Fixed64 dt)
|
|
{
|
|
// if (m_TimeAcc >= RotateHurtAsset.maxDuration)
|
|
// {
|
|
// TryEndAbility();
|
|
// return;
|
|
// }
|
|
//
|
|
// var castHurt = false;
|
|
//
|
|
//
|
|
// if (m_TimeAcc > RotateHurtAsset.rotateInterval * m_RotateCount || m_RotateCount == 0)
|
|
// {
|
|
// if (m_RotateCount > 0)
|
|
// {
|
|
// var radians = -RotateHurtAsset.rotateAngleEachTime * Mathf.Deg2Rad;
|
|
// var cos = Mathf.Cos(radians);
|
|
// var sin = Mathf.Sin(radians);
|
|
// var newX = m_RotateDir.x * cos - m_RotateDir.y * sin;
|
|
// var newY = m_RotateDir.x * sin + m_RotateDir.y * cos;
|
|
// m_RotateDir = new Vector2(newX, newY);
|
|
// }
|
|
// else if (!string.IsNullOrEmpty(RotateHurtAsset.animStateName))
|
|
// {
|
|
// ctx.ownerEnt.animationProxy.Play(RotateHurtAsset.AnimStateName, 1f, true);
|
|
// }
|
|
// m_RotateCount++;
|
|
// castHurt = true;
|
|
// }
|
|
//
|
|
// if (castHurt)
|
|
// {
|
|
// ctx.castPos.Clear();
|
|
// ctx.castTarget.Clear();
|
|
// ctx.castPos.Add(ctx.ownerEnt.transformProxy.position + m_RotateDir);
|
|
// if (RotateHurtAsset.castEffectId > 0)
|
|
// {
|
|
// TexiaoShowParam param = default;
|
|
// param.effectId = RotateHurtAsset.castEffectId;
|
|
// param.scale = Vector3.one;
|
|
// param.rotation = Quaternion.identity;
|
|
// param.offset = Vector2.zero;
|
|
// ctx.ownerEnt.effectShowProxy.GA_ShowCastEffect(ref param, ctx, s_CacheVFXList);
|
|
// m_VFXList.AddRange(s_CacheVFXList);
|
|
// }
|
|
// TargetSelectSrv.EffectSelectEnts(ctx, RotateHurtAsset.geCatchTargetCfgId);
|
|
// for (int i = 0; i < ctx.geCatchTargets.Count; i++)
|
|
// {
|
|
// var targetEnt = ctx.geCatchTargets[i];
|
|
// if (targetEnt.IsValid() == false)
|
|
// continue;
|
|
//
|
|
// var context = AbilitySrv.GrantTransferAbility(ctx.ownerEnt, RotateHurtAsset.castHurtSkillId,
|
|
// ctx.abilitySpec.gaInitCfg, null, ctx.level);
|
|
// if (context != null)
|
|
// {
|
|
// context.castPos.Add(targetEnt.transformProxy.position);
|
|
// context.castTarget.Add(targetEnt.creationIndex); // 有可能追着目标
|
|
// context.dropAbilityWhenEnd = true;
|
|
// context.asc.TryActivateAbility_WithSeqAndParam(context.gaSeq,
|
|
// ctx.abilitySpec.gaParams);
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// m_TimeAcc += dt;
|
|
}
|
|
|
|
|
|
public override void CancelAbility()
|
|
{
|
|
}
|
|
|
|
public override void EndAbility()
|
|
{
|
|
if (RotateHurtAsset.castEffectId > 0)
|
|
ctx.ownerEnt.effectShowProxy.DestroyEffect(m_VFXList);
|
|
m_VFXList.Clear();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
ListPool<Tuple<InstantListenTask, TaskSpec>>.Push(ref m_TriggerTasks);
|
|
ListPool<int>.Push(ref m_VFXList);
|
|
}
|
|
}
|
|
}
|