r2mods/ilspy_dump/ror2_csproj/EntityStates.Engi.SpiderMine/ChaseTarget.cs

112 lines
2.4 KiB
C#
Raw Normal View History

2024-10-04 07:26:37 +00:00
using UnityEngine;
namespace EntityStates.Engi.SpiderMine;
public class ChaseTarget : BaseSpiderMineState
{
private class OrientationHelper : MonoBehaviour
{
private Rigidbody rigidbody;
private void Awake()
{
rigidbody = GetComponent<Rigidbody>();
}
private void OnCollisionStay(Collision collision)
{
int contactCount = collision.contactCount;
if (contactCount == 0)
{
return;
}
Vector3 forward = collision.GetContact(0).normal;
for (int i = 1; i < contactCount; i++)
{
Vector3 normal = collision.GetContact(i).normal;
if (forward.y < normal.y)
{
forward = normal;
}
}
rigidbody.MoveRotation(Quaternion.LookRotation(forward));
}
}
public static float speed;
public static float triggerRadius;
private bool passedDetonationRadius;
private float bestDistance;
private OrientationHelper orientationHelper;
private Transform target => base.projectileTargetComponent.target;
protected override bool shouldStick => false;
public override void OnEnter()
{
base.OnEnter();
passedDetonationRadius = false;
bestDistance = float.PositiveInfinity;
PlayAnimation("Base", BaseSpiderMineState.ChaseStateHash);
if (base.isAuthority)
{
orientationHelper = base.gameObject.AddComponent<OrientationHelper>();
}
}
public override void FixedUpdate()
{
base.FixedUpdate();
if (!base.isAuthority)
{
return;
}
if (!target)
{
base.rigidbody.AddForce(Vector3.up, ForceMode.VelocityChange);
outer.SetNextState(new WaitForStick());
return;
}
Vector3 position = target.position;
Vector3 position2 = base.transform.position;
Vector3 vector = position - position2;
float magnitude = vector.magnitude;
float y = base.rigidbody.velocity.y;
Vector3 velocity = vector * (speed / magnitude);
velocity.y = y;
base.rigidbody.velocity = velocity;
if (!passedDetonationRadius && magnitude <= triggerRadius)
{
passedDetonationRadius = true;
}
if (magnitude < bestDistance)
{
bestDistance = magnitude;
}
else if (passedDetonationRadius)
{
outer.SetNextState(new PreDetonate());
}
}
public override void OnExit()
{
Transform transform = FindModelChild(childLocatorStringToEnable);
if ((bool)transform)
{
transform.gameObject.SetActive(value: false);
}
if ((object)orientationHelper != null)
{
EntityState.Destroy(orientationHelper);
orientationHelper = null;
}
base.OnExit();
}
}