r2mods/ilspy_dump/ror2_csproj/EntityStates.Toolbot/FireBuzzsaw.cs

224 lines
6.3 KiB
C#

using RoR2;
using UnityEngine;
namespace EntityStates.Toolbot;
public class FireBuzzsaw : BaseToolbotPrimarySkillState
{
public static float damageCoefficientPerSecond;
public static float procCoefficientPerSecond = 1f;
public static string fireSoundString;
public static string impactSoundString;
public static string spinUpSoundString;
public static string spinDownSoundString;
public static float spreadBloomValue = 0.2f;
public static float baseFireFrequency;
public static GameObject spinEffectPrefab;
public static GameObject spinImpactEffectPrefab;
public static GameObject impactEffectPrefab;
public static float selfForceMagnitude;
private OverlapAttack attack;
private float fireFrequency;
private float fireAge;
private GameObject spinEffectInstance;
private GameObject spinImpactEffectInstance;
private bool hitOverlapLastTick;
protected EffectManagerHelper _emh_spinEffectInstance;
protected EffectManagerHelper _emh_spinImpactEffectInstance;
private static int SpinBuzzsawStateHash = Animator.StringToHash("SpinBuzzsaw");
private static int EnterBuzzsawStateHash = Animator.StringToHash("EnterBuzzsaw");
private static int EmptyStateHash = Animator.StringToHash("Empty");
private static int ExitBuzzsawStateHash = Animator.StringToHash("ExitBuzzsaw");
private static int ImpactBuzzsawStateHash = Animator.StringToHash("ImpactBuzzsaw");
public override string baseMuzzleName => "MuzzleBuzzsaw";
public override void Reset()
{
base.Reset();
if (attack != null)
{
attack.Reset();
}
fireFrequency = 0f;
fireAge = 0f;
spinEffectInstance = null;
spinImpactEffectInstance = null;
base.muzzleTransform = null;
hitOverlapLastTick = false;
_emh_spinEffectInstance = null;
_emh_spinImpactEffectInstance = null;
}
public override void OnEnter()
{
base.OnEnter();
fireFrequency = baseFireFrequency * attackSpeedStat;
Transform modelTransform = GetModelTransform();
Util.PlaySound(spinUpSoundString, base.gameObject);
Util.PlaySound(fireSoundString, base.gameObject);
if (!base.isInDualWield)
{
PlayAnimation("Gesture, Additive Gun", SpinBuzzsawStateHash);
PlayAnimation("Gesture, Additive", EnterBuzzsawStateHash);
}
attack = new OverlapAttack();
attack.attacker = base.gameObject;
attack.inflictor = base.gameObject;
attack.teamIndex = TeamComponent.GetObjectTeam(attack.attacker);
attack.damage = damageCoefficientPerSecond * damageStat / baseFireFrequency;
attack.procCoefficient = procCoefficientPerSecond / baseFireFrequency;
if ((bool)impactEffectPrefab)
{
attack.hitEffectPrefab = impactEffectPrefab;
}
if ((bool)modelTransform)
{
string groupName = "Buzzsaw";
if (base.isInDualWield)
{
if (base.currentHand == -1)
{
groupName = "BuzzsawL";
}
else if (base.currentHand == 1)
{
groupName = "BuzzsawR";
}
}
attack.hitBoxGroup = HitBoxGroup.FindByGroupName(modelTransform.gameObject, groupName);
}
if ((bool)base.muzzleTransform)
{
if ((bool)spinEffectPrefab)
{
if (!EffectManager.ShouldUsePooledEffect(spinEffectPrefab))
{
spinEffectInstance = Object.Instantiate(spinEffectPrefab, base.muzzleTransform.position, base.muzzleTransform.rotation);
}
else
{
_emh_spinEffectInstance = EffectManager.GetAndActivatePooledEffect(spinEffectPrefab, base.muzzleTransform.position, base.muzzleTransform.rotation);
spinEffectInstance = _emh_spinEffectInstance.gameObject;
}
spinEffectInstance.transform.parent = base.muzzleTransform;
spinEffectInstance.transform.localScale = Vector3.one;
}
if ((bool)spinImpactEffectPrefab)
{
if (!EffectManager.ShouldUsePooledEffect(spinImpactEffectPrefab))
{
spinImpactEffectInstance = Object.Instantiate(spinImpactEffectPrefab, base.muzzleTransform.position, base.muzzleTransform.rotation);
}
else
{
_emh_spinImpactEffectInstance = EffectManager.GetAndActivatePooledEffect(spinImpactEffectPrefab, base.muzzleTransform.position, base.muzzleTransform.rotation);
spinImpactEffectInstance = _emh_spinImpactEffectInstance.gameObject;
}
spinImpactEffectInstance.transform.parent = base.muzzleTransform;
spinImpactEffectInstance.transform.localScale = Vector3.one;
spinImpactEffectInstance.gameObject.SetActive(value: false);
}
}
attack.isCrit = Util.CheckRoll(critStat, base.characterBody.master);
}
public override void OnExit()
{
base.OnExit();
Util.PlaySound(spinDownSoundString, base.gameObject);
if (!base.isInDualWield)
{
PlayAnimation("Gesture, Additive Gun", EmptyStateHash);
PlayAnimation("Gesture, Additive", ExitBuzzsawStateHash);
}
if ((bool)spinEffectInstance)
{
if (!EffectManager.UsePools)
{
EntityState.Destroy(spinEffectInstance);
}
else
{
if (_emh_spinEffectInstance != null && _emh_spinEffectInstance.OwningPool != null)
{
_emh_spinEffectInstance.OwningPool.ReturnObject(_emh_spinEffectInstance);
}
else
{
EntityState.Destroy(spinEffectInstance);
}
_emh_spinEffectInstance = null;
}
}
if ((bool)spinImpactEffectInstance)
{
EntityState.Destroy(spinImpactEffectInstance);
}
}
public override void FixedUpdate()
{
base.FixedUpdate();
fireAge += GetDeltaTime();
base.characterBody.SetAimTimer(2f);
attackSpeedStat = base.characterBody.attackSpeed;
fireFrequency = baseFireFrequency * attackSpeedStat;
if (fireAge >= 1f / fireFrequency && base.isAuthority)
{
fireAge = 0f;
attack.ResetIgnoredHealthComponents();
attack.isCrit = base.characterBody.RollCrit();
hitOverlapLastTick = attack.Fire();
if (hitOverlapLastTick)
{
Vector3 normalized = (attack.lastFireAverageHitPosition - GetAimRay().origin).normalized;
if ((bool)base.characterMotor)
{
base.characterMotor.ApplyForce(normalized * selfForceMagnitude);
}
Util.PlaySound(impactSoundString, base.gameObject);
if (!base.isInDualWield)
{
PlayAnimation("Gesture, Additive", ImpactBuzzsawStateHash);
}
}
base.characterBody.AddSpreadBloom(spreadBloomValue);
if (!IsKeyDownAuthority() || (object)base.skillDef != base.activatorSkillSlot.skillDef)
{
outer.SetNextStateToMain();
}
}
spinImpactEffectInstance.gameObject.SetActive(hitOverlapLastTick);
}
public override InterruptPriority GetMinimumInterruptPriority()
{
return InterruptPriority.PrioritySkill;
}
}