82 lines
2.2 KiB
C#
82 lines
2.2 KiB
C#
using RoR2;
|
|
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
|
|
namespace EntityStates.GlobalSkills.WoundSlash;
|
|
|
|
public class WoundSlash : BaseSkillState
|
|
{
|
|
public static float blastRadius;
|
|
|
|
public static float blastDamageCoefficient;
|
|
|
|
public static float blastForce;
|
|
|
|
public static float blastProcCoefficient;
|
|
|
|
public static GameObject blastImpactEffectPrefab;
|
|
|
|
public static GameObject slashEffectPrefab;
|
|
|
|
public static float slashEffectOffset;
|
|
|
|
public static float baseDuration;
|
|
|
|
public static string soundString;
|
|
|
|
public static float shortHopVelocity;
|
|
|
|
private float duration => baseDuration / attackSpeedStat;
|
|
|
|
public override void OnEnter()
|
|
{
|
|
base.OnEnter();
|
|
Ray aimRay = GetAimRay();
|
|
Vector3 vector = base.characterBody.corePosition + aimRay.direction * slashEffectOffset;
|
|
Util.PlaySound(soundString, base.gameObject);
|
|
EffectData effectData = new EffectData
|
|
{
|
|
origin = vector,
|
|
rotation = Util.QuaternionSafeLookRotation(aimRay.direction)
|
|
};
|
|
EffectManager.SpawnEffect(slashEffectPrefab, effectData, transmit: true);
|
|
if (NetworkServer.active)
|
|
{
|
|
BlastAttack blastAttack = new BlastAttack();
|
|
blastAttack.attacker = base.gameObject;
|
|
blastAttack.baseDamage = blastDamageCoefficient * damageStat;
|
|
blastAttack.baseForce = blastForce;
|
|
blastAttack.attackerFiltering = AttackerFiltering.NeverHitSelf;
|
|
blastAttack.crit = RollCrit();
|
|
blastAttack.damageType = DamageType.Generic;
|
|
blastAttack.falloffModel = BlastAttack.FalloffModel.None;
|
|
blastAttack.inflictor = base.gameObject;
|
|
blastAttack.position = vector;
|
|
blastAttack.procChainMask = default(ProcChainMask);
|
|
blastAttack.procCoefficient = blastProcCoefficient;
|
|
blastAttack.radius = blastRadius;
|
|
blastAttack.teamIndex = base.teamComponent.teamIndex;
|
|
blastAttack.impactEffect = EffectCatalog.FindEffectIndexFromPrefab(blastImpactEffectPrefab);
|
|
blastAttack.Fire();
|
|
}
|
|
if (base.isAuthority && (bool)base.characterMotor)
|
|
{
|
|
base.characterMotor.velocity.y = Mathf.Max(base.characterMotor.velocity.y, shortHopVelocity);
|
|
}
|
|
}
|
|
|
|
public override void FixedUpdate()
|
|
{
|
|
base.FixedUpdate();
|
|
if (base.fixedAge >= duration)
|
|
{
|
|
outer.SetNextStateToMain();
|
|
}
|
|
}
|
|
|
|
public override InterruptPriority GetMinimumInterruptPriority()
|
|
{
|
|
return InterruptPriority.Pain;
|
|
}
|
|
}
|