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

75 lines
2.0 KiB
C#

using System;
using MoleMole.Config;
using UnityEngine;
namespace MoleMole
{
public class AbilityHitExplodeShotgunBulletMixin : AbilityHitExplodeBulletMixin
{
private HitExplodeShotgunBulletMixin config;
private BaseMonoEntity _attackTarget;
private int _hitCount;
public AbilityHitExplodeShotgunBulletMixin(ActorAbility instancedAbility, ActorModifier instancedModifier, ConfigAbilityMixin config)
: base(instancedAbility, instancedModifier, config)
{
this.config = (HitExplodeShotgunBulletMixin)config;
}
public override void OnAbilityTriggered(EvtAbilityStart evt)
{
for (int i = 0; i < config.BulletNum; i++)
{
base.OnAbilityTriggered(evt);
}
_attackTarget = entity.GetAttackTarget();
_hitCount = config.MaxHitNum;
}
public override void OnRemoved()
{
base.OnRemoved();
}
protected override void InitBulletForward(AbilityTriggerBullet bullet)
{
float value = 10f;
if (_attackTarget != null)
{
value = Vector3.Distance(_attackTarget.XZPosition, actor.entity.XZPosition);
}
float t = Mathf.InverseLerp(config.ScatterDistanceMax, config.ScatterDistanceMin, value);
bullet.triggerBullet.transform.forward = actor.entity.transform.forward;
Vector2 insideUnitCircle = UnityEngine.Random.insideUnitCircle;
insideUnitCircle.x *= Mathf.Tan((float)Math.PI / 180f * Mathf.Lerp(config.ScatterAngleMinX, config.ScatterAngleMaxX, t));
insideUnitCircle.y *= Mathf.Tan((float)Math.PI / 180f * Mathf.Lerp(config.ScatterAngleMinY, config.ScatterAngleMaxY, t));
bullet.triggerBullet.transform.forward += Quaternion.FromToRotation(Vector3.forward, bullet.triggerBullet.transform.forward) * insideUnitCircle;
}
public override bool ListenEvent(BaseEvent evt)
{
if (evt is EvtBulletHit)
{
if (((EvtBulletHit)evt).hitEnvironment)
{
return base.ListenEvent(evt);
}
if (_hitCount == 0)
{
return false;
}
_hitCount--;
return base.ListenEvent(evt);
}
return false;
}
public override void Core()
{
base.Core();
}
}
}