r2mods/ilspy_dump/ror2_csproj/EntityStates/ShockState.cs

119 lines
3.0 KiB
C#

using RoR2;
using UnityEngine;
namespace EntityStates;
public class ShockState : BaseState
{
public static GameObject stunVfxPrefab;
public float shockDuration = 1f;
public static float shockInterval = 0.1f;
public static float shockStrength = 1f;
public static float healthFractionToForceExit = 0.1f;
public static string enterSoundString;
public static string exitSoundString;
private float shockTimer;
private Animator animator;
private TemporaryOverlayInstance temporaryOverlay;
private float healthFraction;
private GameObject stunVfxInstance;
private static int Hurt1StateHash = Animator.StringToHash("Hurt1");
private static int Hurt2StateHash = Animator.StringToHash("Hurt2");
public override void OnEnter()
{
base.OnEnter();
animator = GetModelAnimator();
if ((bool)base.sfxLocator && base.sfxLocator.barkSound != "")
{
Util.PlaySound(base.sfxLocator.barkSound, base.gameObject);
}
Util.PlaySound(enterSoundString, base.gameObject);
PlayAnimation("Body", (Random.Range(0, 2) == 0) ? Hurt1StateHash : Hurt2StateHash);
Transform modelTransform = GetModelTransform();
if ((bool)modelTransform)
{
CharacterModel component = modelTransform.GetComponent<CharacterModel>();
if ((bool)component)
{
temporaryOverlay = TemporaryOverlayManager.AddOverlay(base.gameObject);
temporaryOverlay.duration = shockDuration;
temporaryOverlay.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matIsShocked");
temporaryOverlay.AddToCharacterModel(component);
}
}
stunVfxInstance = Object.Instantiate(stunVfxPrefab, base.transform);
stunVfxInstance.GetComponent<ScaleParticleSystemDuration>().newDuration = shockDuration;
if ((bool)base.characterBody.healthComponent)
{
healthFraction = base.characterBody.healthComponent.combinedHealthFraction;
}
if ((bool)base.characterBody)
{
base.characterBody.isSprinting = false;
}
if ((bool)base.characterDirection)
{
base.characterDirection.moveVector = base.characterDirection.forward;
}
if ((bool)base.rigidbodyMotor)
{
base.rigidbodyMotor.moveVector = Vector3.zero;
}
}
public override void FixedUpdate()
{
base.FixedUpdate();
shockTimer -= GetDeltaTime();
float combinedHealthFraction = base.characterBody.healthComponent.combinedHealthFraction;
if (shockTimer <= 0f)
{
shockTimer += shockInterval;
PlayShockAnimation();
}
if (base.fixedAge > shockDuration || healthFraction - combinedHealthFraction > healthFractionToForceExit)
{
outer.SetNextStateToMain();
}
}
public override void OnExit()
{
if (temporaryOverlay != null)
{
temporaryOverlay.Destroy();
}
if ((bool)stunVfxInstance)
{
EntityState.Destroy(stunVfxInstance);
}
Util.PlaySound(exitSoundString, base.gameObject);
base.OnExit();
}
private void PlayShockAnimation()
{
string layerName = "Flinch";
int layerIndex = animator.GetLayerIndex(layerName);
if (layerIndex >= 0)
{
animator.SetLayerWeight(layerIndex, shockStrength);
animator.Play("FlinchStart", layerIndex);
}
}
}