Files
BH3/Assets/Scripts/Assembly-CSharp/MoleMole/AbilityMonsterDashMixin.cs
2025-08-13 09:26:42 +08:00

115 lines
2.6 KiB
C#

using MoleMole.Config;
using UnityEngine;
namespace MoleMole
{
public class AbilityMonsterDashMixin : BaseAbilityMixin
{
private MonsterDashMixin config;
private BaseMonoMonster _monster;
private Vector3 _startPos;
private Vector3 _targetPos;
private float _timer;
public AbilityMonsterDashMixin(ActorAbility instancedAbility, ActorModifier instancedModifier, ConfigAbilityMixin config)
: base(instancedAbility, instancedModifier, config)
{
this.config = (MonsterDashMixin)config;
_monster = entity as BaseMonoMonster;
_timer = -1f;
}
public override void OnAbilityTriggered(EvtAbilityStart evt)
{
StartDash();
}
private void StartDash()
{
float dashTime = config.DashTime;
if (dashTime != 0f)
{
_timer = dashTime;
BaseMonoEntity attackTarget = entity.GetAttackTarget();
if (!(attackTarget == null))
{
_startPos = entity.transform.position;
float num = Vector3.Distance(_startPos, attackTarget.transform.position) - config.TargetDistance;
_targetPos = _startPos + entity.transform.forward * num;
Vector3 overrideVelocity = (_targetPos - _startPos) / dashTime;
_monster.SetNeedOverrideVelocity(true);
_monster.SetOverrideVelocity(overrideVelocity);
_monster.PushHighspeedMovement();
Singleton<EventManager>.Instance.FireEvent(new EvtTeleport(actor.runtimeID));
Debug.DrawLine(_startPos, _targetPos, Color.yellow, 2f);
}
}
}
private void EndDash()
{
_monster.SetNeedOverrideVelocity(false);
_monster.SetOverrideVelocity(Vector3.zero);
_monster.PopHighspeedMovement();
_timer = -1f;
}
public override void Core()
{
if (_timer <= 0f)
{
return;
}
if (!CheckAllowFollow())
{
EndDash();
return;
}
_timer -= Time.deltaTime * entity.TimeScale;
if (_timer <= 0f)
{
EndDash();
}
else if (Vector3.Distance(entity.transform.position, _startPos) >= Vector3.Distance(_startPos, _targetPos))
{
EndDash();
}
}
private bool CheckAllowFollow()
{
MonsterActor monsterActor = actor as MonsterActor;
if (monsterActor == null)
{
return false;
}
string currentSkillID = monsterActor.monster.CurrentSkillID;
if (string.IsNullOrEmpty(currentSkillID))
{
return false;
}
if (config.SkillIDs == null)
{
return false;
}
if (actor.abilityState.ContainsState(AbilityState.Paralyze) || actor.abilityState.ContainsState(AbilityState.Stun))
{
return false;
}
int i = 0;
for (int num = config.SkillIDs.Length; i < num; i++)
{
if (currentSkillID == config.SkillIDs[i])
{
return true;
}
}
return false;
}
}
}