224 lines
6.3 KiB
C#
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;
|
||
|
}
|
||
|
}
|