r2mods/ilspy_dump/ror2_csproj/EntityStates.VoidRaidCrab.W.../FireMissiles.cs

141 lines
3.6 KiB
C#

using RoR2;
using RoR2.Projectile;
using RoR2.Skills;
using UnityEngine;
namespace EntityStates.VoidRaidCrab.Weapon;
public class FireMissiles : BaseState
{
[SerializeField]
public float baseInitialDelay;
[SerializeField]
public float baseDelayBetweenWaves;
[SerializeField]
public float baseEndDelay;
[SerializeField]
public int numWaves;
[SerializeField]
public int numMissilesPerWave;
[SerializeField]
public string muzzleName;
[SerializeField]
public GameObject muzzleFlashPrefab;
[SerializeField]
public GameObject projectilePrefab;
[SerializeField]
public float damageCoefficient;
[SerializeField]
public float force;
[SerializeField]
public float minSpreadDegrees;
[SerializeField]
public float rangeSpreadDegrees;
[SerializeField]
public string fireWaveSoundString;
[SerializeField]
public bool isSoundScaledByAttackSpeed;
[SerializeField]
public string animationLayerName;
[SerializeField]
public string animationStateName;
[SerializeField]
public string animationPlaybackRateParam;
[SerializeField]
public SkillDef skillDefToReplaceAtStocksEmpty;
[SerializeField]
public SkillDef nextSkillDef;
private float delayBetweenWaves;
private float duration;
private int numWavesFired;
private float timeUntilNextWave;
private Transform muzzleTransform;
public override void OnEnter()
{
base.OnEnter();
if ((bool)nextSkillDef)
{
GenericSkill genericSkill = base.skillLocator.FindSkillByDef(skillDefToReplaceAtStocksEmpty);
if ((bool)genericSkill && genericSkill.stock == 0)
{
genericSkill.SetBaseSkill(nextSkillDef);
}
}
float num = baseInitialDelay + Mathf.Max(0f, baseDelayBetweenWaves * (float)(numWaves - 1)) + baseEndDelay;
duration = num / attackSpeedStat;
timeUntilNextWave = baseInitialDelay / attackSpeedStat;
delayBetweenWaves = baseDelayBetweenWaves / attackSpeedStat;
muzzleTransform = FindModelChild(muzzleName);
}
public override void FixedUpdate()
{
base.FixedUpdate();
timeUntilNextWave -= GetDeltaTime();
while (timeUntilNextWave < 0f && numWavesFired < numWaves)
{
PlayAnimation(animationLayerName, animationStateName, animationPlaybackRateParam, duration);
timeUntilNextWave += delayBetweenWaves;
numWavesFired++;
EffectManager.SimpleMuzzleFlash(muzzleFlashPrefab, base.gameObject, muzzleName, transmit: false);
if (base.isAuthority)
{
Quaternion quaternion = Util.QuaternionSafeLookRotation(GetAimRay().direction);
FireProjectileInfo fireProjectileInfo = default(FireProjectileInfo);
fireProjectileInfo.projectilePrefab = projectilePrefab;
fireProjectileInfo.position = muzzleTransform.position;
fireProjectileInfo.owner = base.gameObject;
fireProjectileInfo.damage = damageStat * damageCoefficient;
fireProjectileInfo.force = force;
FireProjectileInfo fireProjectileInfo2 = fireProjectileInfo;
for (int i = 0; i < numMissilesPerWave; i++)
{
fireProjectileInfo2.rotation = quaternion * GetRandomRollPitch();
fireProjectileInfo2.crit = Util.CheckRoll(critStat, base.characterBody.master);
ProjectileManager.instance.FireProjectile(fireProjectileInfo2);
}
}
}
if (base.isAuthority && base.fixedAge >= duration)
{
outer.SetNextStateToMain();
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
return InterruptPriority.PrioritySkill;
}
protected Quaternion GetRandomRollPitch()
{
Quaternion quaternion = Quaternion.AngleAxis(Random.Range(0, 360), Vector3.forward);
Quaternion quaternion2 = Quaternion.AngleAxis(minSpreadDegrees + Random.Range(0f, rangeSpreadDegrees), Vector3.left);
return quaternion * quaternion2;
}
}