95 lines
2.7 KiB
C#
95 lines
2.7 KiB
C#
using RoR2;
|
|
using RoR2.Projectile;
|
|
using UnityEngine;
|
|
|
|
namespace EntityStates.BeetleQueenMonster;
|
|
|
|
public class FireSpit : BaseState
|
|
{
|
|
public static GameObject projectilePrefab;
|
|
|
|
public static GameObject effectPrefab;
|
|
|
|
public static float baseDuration = 2f;
|
|
|
|
public static float damageCoefficient = 1.2f;
|
|
|
|
public static float force = 20f;
|
|
|
|
public static int projectileCount = 3;
|
|
|
|
public static float yawSpread = 5f;
|
|
|
|
public static float minSpread = 0f;
|
|
|
|
public static float maxSpread = 5f;
|
|
|
|
public static float arcAngle = 5f;
|
|
|
|
public static float projectileHSpeed = 50f;
|
|
|
|
private Ray aimRay;
|
|
|
|
private float duration;
|
|
|
|
public override void OnEnter()
|
|
{
|
|
base.OnEnter();
|
|
string muzzleName = "Mouth";
|
|
duration = baseDuration / attackSpeedStat;
|
|
if ((bool)effectPrefab)
|
|
{
|
|
EffectManager.SimpleMuzzleFlash(effectPrefab, base.gameObject, muzzleName, transmit: false);
|
|
}
|
|
PlayCrossfade("Gesture", "FireSpit", "FireSpit.playbackRate", duration, 0.1f);
|
|
aimRay = GetAimRay();
|
|
float magnitude = projectileHSpeed;
|
|
Ray ray = aimRay;
|
|
ray.origin = aimRay.GetPoint(6f);
|
|
if (Util.CharacterRaycast(base.gameObject, ray, out var hitInfo, float.PositiveInfinity, (int)LayerIndex.world.mask | (int)LayerIndex.entityPrecise.mask, QueryTriggerInteraction.Ignore))
|
|
{
|
|
float num = magnitude;
|
|
Vector3 vector = hitInfo.point - aimRay.origin;
|
|
Vector2 vector2 = new Vector2(vector.x, vector.z);
|
|
float magnitude2 = vector2.magnitude;
|
|
float y = Trajectory.CalculateInitialYSpeed(magnitude2 / num, vector.y);
|
|
Vector3 vector3 = new Vector3(vector2.x / magnitude2 * num, y, vector2.y / magnitude2 * num);
|
|
magnitude = vector3.magnitude;
|
|
aimRay.direction = vector3 / magnitude;
|
|
}
|
|
EffectManager.SimpleMuzzleFlash(effectPrefab, base.gameObject, muzzleName, transmit: false);
|
|
if (base.isAuthority)
|
|
{
|
|
for (int i = 0; i < projectileCount; i++)
|
|
{
|
|
FireBlob(aimRay, 0f, ((float)projectileCount / 2f - (float)i) * yawSpread, magnitude);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void FireBlob(Ray aimRay, float bonusPitch, float bonusYaw, float speed)
|
|
{
|
|
Vector3 forward = Util.ApplySpread(aimRay.direction, minSpread, maxSpread, 1f, 1f, bonusYaw, bonusPitch);
|
|
ProjectileManager.instance.FireProjectile(projectilePrefab, aimRay.origin, Util.QuaternionSafeLookRotation(forward), base.gameObject, damageStat * damageCoefficient, 0f, Util.CheckRoll(critStat, base.characterBody.master), DamageColorIndex.Default, null, speed);
|
|
}
|
|
|
|
public override void OnExit()
|
|
{
|
|
base.OnExit();
|
|
}
|
|
|
|
public override void FixedUpdate()
|
|
{
|
|
base.FixedUpdate();
|
|
if (base.fixedAge >= duration && base.isAuthority)
|
|
{
|
|
outer.SetNextStateToMain();
|
|
}
|
|
}
|
|
|
|
public override InterruptPriority GetMinimumInterruptPriority()
|
|
{
|
|
return InterruptPriority.Skill;
|
|
}
|
|
}
|