r2mods/ilspy_dump/ror2_csproj/EntityStates.NullifierMonster/FirePortalBomb.cs

114 lines
2.8 KiB
C#
Raw Normal View History

2024-10-04 07:26:37 +00:00
using RoR2;
using RoR2.Projectile;
using UnityEngine;
namespace EntityStates.NullifierMonster;
public class FirePortalBomb : BaseState
{
public static GameObject portalBombProjectileEffect;
public static GameObject muzzleflashEffectPrefab;
public static string muzzleString;
public static int portalBombCount;
public static float baseDuration;
public static float maxDistance;
public static float damageCoefficient;
public static float procCoefficient;
public static float randomRadius;
public static float force;
public static float minimumDistanceBetweenBombs;
public Quaternion? startRotation;
public Quaternion? endRotation;
private float duration;
private int bombsFired;
private float fireTimer;
private float fireInterval;
private Vector3 lastBombPosition;
public override InterruptPriority GetMinimumInterruptPriority()
{
return InterruptPriority.PrioritySkill;
}
public override void OnEnter()
{
base.OnEnter();
duration = baseDuration / attackSpeedStat;
StartAimMode(4f);
if (base.isAuthority)
{
fireInterval = duration / (float)portalBombCount;
fireTimer = 0f;
}
}
private void FireBomb(Ray fireRay)
{
if (Physics.Raycast(fireRay, out var hitInfo, maxDistance, LayerIndex.world.mask))
{
Vector3 point = hitInfo.point;
Vector3 vector = point - lastBombPosition;
if (bombsFired > 0 && vector.sqrMagnitude < minimumDistanceBetweenBombs * minimumDistanceBetweenBombs)
{
point += vector.normalized * minimumDistanceBetweenBombs;
}
FireProjectileInfo fireProjectileInfo = default(FireProjectileInfo);
fireProjectileInfo.projectilePrefab = portalBombProjectileEffect;
fireProjectileInfo.position = point;
fireProjectileInfo.rotation = Quaternion.identity;
fireProjectileInfo.owner = base.gameObject;
fireProjectileInfo.damage = damageStat * damageCoefficient;
fireProjectileInfo.force = force;
fireProjectileInfo.crit = base.characterBody.RollCrit();
ProjectileManager.instance.FireProjectile(fireProjectileInfo);
lastBombPosition = point;
}
}
public override void FixedUpdate()
{
base.FixedUpdate();
if (!base.isAuthority)
{
return;
}
fireTimer -= GetDeltaTime();
if (fireTimer <= 0f)
{
fireTimer += fireInterval;
if (startRotation.HasValue && endRotation.HasValue)
{
float num = 1f / ((float)portalBombCount - 1f);
float t = (float)bombsFired * num;
Ray aimRay = GetAimRay();
Quaternion quaternion = Quaternion.Slerp(startRotation.Value, endRotation.Value, t);
aimRay.direction = quaternion * Vector3.forward;
FireBomb(aimRay);
EffectManager.SimpleMuzzleFlash(muzzleflashEffectPrefab, base.gameObject, muzzleString, transmit: true);
}
bombsFired++;
}
if (base.fixedAge >= duration)
{
outer.SetNextStateToMain();
}
}
}