94 lines
2.3 KiB
C#
94 lines
2.3 KiB
C#
|
using System.Linq;
|
||
|
using RoR2;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace EntityStates.NullifierMonster;
|
||
|
|
||
|
public class AimPortalBomb : BaseState
|
||
|
{
|
||
|
private HurtBox target;
|
||
|
|
||
|
public static float baseDuration;
|
||
|
|
||
|
public static float arcMultiplier;
|
||
|
|
||
|
private float duration;
|
||
|
|
||
|
private Vector3? pointA;
|
||
|
|
||
|
private Vector3? pointB;
|
||
|
|
||
|
public override InterruptPriority GetMinimumInterruptPriority()
|
||
|
{
|
||
|
return InterruptPriority.PrioritySkill;
|
||
|
}
|
||
|
|
||
|
public override void OnEnter()
|
||
|
{
|
||
|
base.OnEnter();
|
||
|
if (base.isAuthority)
|
||
|
{
|
||
|
BullseyeSearch bullseyeSearch = new BullseyeSearch();
|
||
|
bullseyeSearch.viewer = base.characterBody;
|
||
|
bullseyeSearch.searchOrigin = base.characterBody.corePosition;
|
||
|
bullseyeSearch.searchDirection = base.characterBody.corePosition;
|
||
|
bullseyeSearch.maxDistanceFilter = FirePortalBomb.maxDistance;
|
||
|
bullseyeSearch.teamMaskFilter = TeamMask.GetEnemyTeams(GetTeam());
|
||
|
bullseyeSearch.sortMode = BullseyeSearch.SortMode.DistanceAndAngle;
|
||
|
bullseyeSearch.RefreshCandidates();
|
||
|
target = bullseyeSearch.GetResults().FirstOrDefault();
|
||
|
if ((bool)target)
|
||
|
{
|
||
|
pointA = RaycastToFloor(target.transform.position);
|
||
|
}
|
||
|
}
|
||
|
duration = baseDuration;
|
||
|
}
|
||
|
|
||
|
public override void FixedUpdate()
|
||
|
{
|
||
|
base.FixedUpdate();
|
||
|
if (!base.isAuthority || !(base.fixedAge >= duration))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
EntityState entityState = null;
|
||
|
if ((bool)target)
|
||
|
{
|
||
|
pointB = RaycastToFloor(target.transform.position);
|
||
|
if (pointA.HasValue && pointB.HasValue)
|
||
|
{
|
||
|
Ray aimRay = GetAimRay();
|
||
|
Vector3 forward = pointA.Value - aimRay.origin;
|
||
|
Vector3 forward2 = pointB.Value - aimRay.origin;
|
||
|
Quaternion a = Quaternion.LookRotation(forward);
|
||
|
Quaternion quaternion = Quaternion.LookRotation(forward2);
|
||
|
Quaternion value = quaternion;
|
||
|
Quaternion value2 = Quaternion.SlerpUnclamped(a, quaternion, 1f + arcMultiplier);
|
||
|
entityState = new FirePortalBomb
|
||
|
{
|
||
|
startRotation = value,
|
||
|
endRotation = value2
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
if (entityState != null)
|
||
|
{
|
||
|
outer.SetNextState(entityState);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
outer.SetNextStateToMain();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private Vector3? RaycastToFloor(Vector3 position)
|
||
|
{
|
||
|
if (Physics.Raycast(new Ray(position, Vector3.down), out var hitInfo, 10f, LayerIndex.world.mask, QueryTriggerInteraction.Ignore))
|
||
|
{
|
||
|
return hitInfo.point;
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
}
|