r2mods/ilspy_dump/ror2_csproj/EntityStates.Loader/GroundSlam.cs

124 lines
3.4 KiB
C#

using RoR2;
using UnityEngine;
namespace EntityStates.Loader;
public class GroundSlam : BaseCharacterMain
{
public static float airControl;
public static float minimumDuration;
public static float blastRadius;
public static float blastProcCoefficient;
public static float blastDamageCoefficient;
public static float blastForce;
public static string enterSoundString;
public static float initialVerticalVelocity;
public static float exitVerticalVelocity;
public static float verticalAcceleration;
public static float exitSlowdownCoefficient;
public static Vector3 blastBonusForce;
public static GameObject blastImpactEffectPrefab;
public static GameObject blastEffectPrefab;
public static GameObject fistEffectPrefab;
private float previousAirControl;
private GameObject leftFistEffectInstance;
private GameObject rightFistEffectInstance;
private bool detonateNextFrame;
public override void OnEnter()
{
base.OnEnter();
PlayCrossfade("Body", "GroundSlam", 0.2f);
if (base.isAuthority)
{
base.characterMotor.onMovementHit += OnMovementHit;
base.characterMotor.velocity.y = initialVerticalVelocity;
}
Util.PlaySound(enterSoundString, base.gameObject);
previousAirControl = base.characterMotor.airControl;
base.characterMotor.airControl = airControl;
leftFistEffectInstance = Object.Instantiate(fistEffectPrefab, FindModelChild("MechHandR"));
rightFistEffectInstance = Object.Instantiate(fistEffectPrefab, FindModelChild("MechHandL"));
}
public override void FixedUpdate()
{
base.FixedUpdate();
if (base.isAuthority && (bool)base.characterMotor)
{
base.characterMotor.moveDirection = base.inputBank.moveVector;
base.characterDirection.moveVector = base.characterMotor.moveDirection;
base.characterMotor.velocity.y += verticalAcceleration * GetDeltaTime();
if (base.fixedAge >= minimumDuration && (detonateNextFrame || base.characterMotor.Motor.GroundingStatus.IsStableOnGround))
{
DetonateAuthority();
outer.SetNextStateToMain();
}
}
}
public override void OnExit()
{
if (base.isAuthority)
{
base.characterMotor.onMovementHit -= OnMovementHit;
base.characterMotor.Motor.ForceUnground();
base.characterMotor.velocity *= exitSlowdownCoefficient;
base.characterMotor.velocity.y = exitVerticalVelocity;
}
base.characterMotor.airControl = previousAirControl;
EntityState.Destroy(leftFistEffectInstance);
EntityState.Destroy(rightFistEffectInstance);
base.OnExit();
}
private void OnMovementHit(ref CharacterMotor.MovementHitInfo movementHitInfo)
{
detonateNextFrame = true;
}
protected BlastAttack.Result DetonateAuthority()
{
Vector3 footPosition = base.characterBody.footPosition;
EffectManager.SpawnEffect(blastEffectPrefab, new EffectData
{
origin = footPosition,
scale = blastRadius
}, transmit: true);
return new BlastAttack
{
attacker = base.gameObject,
baseDamage = damageStat * blastDamageCoefficient,
baseForce = blastForce,
bonusForce = blastBonusForce,
crit = RollCrit(),
damageType = DamageType.Stun1s,
falloffModel = BlastAttack.FalloffModel.None,
procCoefficient = blastProcCoefficient,
radius = blastRadius,
position = footPosition,
attackerFiltering = AttackerFiltering.NeverHitSelf,
impactEffect = EffectCatalog.FindEffectIndexFromPrefab(blastImpactEffectPrefab),
teamIndex = base.teamComponent.teamIndex
}.Fire();
}
}