117 lines
3.3 KiB
C#
117 lines
3.3 KiB
C#
using System.Linq;
|
|
using RoR2;
|
|
using RoR2.Projectile;
|
|
using UnityEngine;
|
|
|
|
namespace EntityStates.HermitCrab;
|
|
|
|
public class FireMortar : BaseState
|
|
{
|
|
public static GameObject mortarProjectilePrefab;
|
|
|
|
public static GameObject mortarMuzzleflashEffect;
|
|
|
|
public static int mortarCount;
|
|
|
|
public static string mortarMuzzleName;
|
|
|
|
public static string mortarSoundString;
|
|
|
|
public static float mortarDamageCoefficient;
|
|
|
|
public static float baseDuration;
|
|
|
|
public static float timeToTarget = 3f;
|
|
|
|
public static float projectileVelocity = 55f;
|
|
|
|
public static float minimumDistance;
|
|
|
|
private float stopwatch;
|
|
|
|
private float duration;
|
|
|
|
public override void OnEnter()
|
|
{
|
|
base.OnEnter();
|
|
duration = baseDuration / attackSpeedStat;
|
|
PlayCrossfade("Gesture, Additive", "FireMortar", 0f);
|
|
Util.PlaySound(mortarSoundString, base.gameObject);
|
|
EffectManager.SimpleMuzzleFlash(mortarMuzzleflashEffect, base.gameObject, mortarMuzzleName, transmit: false);
|
|
if (base.isAuthority)
|
|
{
|
|
Fire();
|
|
}
|
|
}
|
|
|
|
private void Fire()
|
|
{
|
|
Ray aimRay = GetAimRay();
|
|
Ray ray = new Ray(aimRay.origin, Vector3.up);
|
|
BullseyeSearch bullseyeSearch = new BullseyeSearch();
|
|
bullseyeSearch.searchOrigin = aimRay.origin;
|
|
bullseyeSearch.searchDirection = aimRay.direction;
|
|
bullseyeSearch.filterByLoS = false;
|
|
bullseyeSearch.teamMaskFilter = TeamMask.allButNeutral;
|
|
if ((bool)base.teamComponent)
|
|
{
|
|
bullseyeSearch.teamMaskFilter.RemoveTeam(base.teamComponent.teamIndex);
|
|
}
|
|
bullseyeSearch.sortMode = BullseyeSearch.SortMode.Angle;
|
|
bullseyeSearch.RefreshCandidates();
|
|
HurtBox hurtBox = bullseyeSearch.GetResults().FirstOrDefault();
|
|
bool flag = false;
|
|
Vector3 vector = Vector3.zero;
|
|
RaycastHit hitInfo;
|
|
if ((bool)hurtBox)
|
|
{
|
|
vector = hurtBox.transform.position;
|
|
flag = true;
|
|
}
|
|
else if (Physics.Raycast(aimRay, out hitInfo, 1000f, (int)LayerIndex.world.mask | (int)LayerIndex.entityPrecise.mask, QueryTriggerInteraction.Ignore))
|
|
{
|
|
vector = hitInfo.point;
|
|
flag = true;
|
|
}
|
|
float magnitude = projectileVelocity;
|
|
if (flag)
|
|
{
|
|
Vector3 vector2 = vector - ray.origin;
|
|
Vector2 vector3 = new Vector2(vector2.x, vector2.z);
|
|
float magnitude2 = vector3.magnitude;
|
|
Vector2 vector4 = vector3 / magnitude2;
|
|
if (magnitude2 < minimumDistance)
|
|
{
|
|
magnitude2 = minimumDistance;
|
|
}
|
|
float y = Trajectory.CalculateInitialYSpeed(timeToTarget, vector2.y);
|
|
float num = magnitude2 / timeToTarget;
|
|
Vector3 direction = new Vector3(vector4.x * num, y, vector4.y * num);
|
|
magnitude = direction.magnitude;
|
|
ray.direction = direction;
|
|
}
|
|
for (int i = 0; i < mortarCount; i++)
|
|
{
|
|
Quaternion rotation = Util.QuaternionSafeLookRotation(ray.direction + ((i != 0) ? (Random.insideUnitSphere * 0.05f) : Vector3.zero));
|
|
ProjectileManager.instance.FireProjectile(mortarProjectilePrefab, ray.origin, rotation, base.gameObject, damageStat * mortarDamageCoefficient, 0f, Util.CheckRoll(critStat, base.characterBody.master), DamageColorIndex.Default, null, magnitude);
|
|
}
|
|
}
|
|
|
|
public override void FixedUpdate()
|
|
{
|
|
base.FixedUpdate();
|
|
stopwatch += GetDeltaTime();
|
|
if (stopwatch > duration)
|
|
{
|
|
Burrowed burrowed = new Burrowed();
|
|
burrowed.duration = Burrowed.mortarCooldown;
|
|
outer.SetNextState(burrowed);
|
|
}
|
|
}
|
|
|
|
public override InterruptPriority GetMinimumInterruptPriority()
|
|
{
|
|
return InterruptPriority.Skill;
|
|
}
|
|
}
|