r2mods/ilspy_dump/ror2_csproj/EntityStates.HermitCrab/FireMortar.cs

117 lines
3.3 KiB
C#
Raw Normal View History

2024-10-04 07:26:37 +00:00
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;
}
}