125 lines
3.2 KiB
C#
125 lines
3.2 KiB
C#
|
using RoR2;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Networking;
|
||
|
|
||
|
namespace EntityStates.Mage;
|
||
|
|
||
|
public class FlyUpState : MageCharacterMain
|
||
|
{
|
||
|
public static GameObject blinkPrefab;
|
||
|
|
||
|
public static float duration = 0.3f;
|
||
|
|
||
|
public static string beginSoundString;
|
||
|
|
||
|
public static string endSoundString;
|
||
|
|
||
|
public static AnimationCurve speedCoefficientCurve;
|
||
|
|
||
|
public static GameObject muzzleflashEffect;
|
||
|
|
||
|
public static float blastAttackRadius;
|
||
|
|
||
|
public static float blastAttackDamageCoefficient;
|
||
|
|
||
|
public static float blastAttackProcCoefficient;
|
||
|
|
||
|
public static float blastAttackForce;
|
||
|
|
||
|
private Vector3 flyVector = Vector3.zero;
|
||
|
|
||
|
private Transform modelTransform;
|
||
|
|
||
|
private CharacterModel characterModel;
|
||
|
|
||
|
private HurtBoxGroup hurtboxGroup;
|
||
|
|
||
|
private Vector3 blastPosition;
|
||
|
|
||
|
public override void OnEnter()
|
||
|
{
|
||
|
base.OnEnter();
|
||
|
Util.PlaySound(beginSoundString, base.gameObject);
|
||
|
modelTransform = GetModelTransform();
|
||
|
flyVector = Vector3.up;
|
||
|
CreateBlinkEffect(Util.GetCorePosition(base.gameObject));
|
||
|
PlayCrossfade("Body", "FlyUp", "FlyUp.playbackRate", duration, 0.1f);
|
||
|
base.characterMotor.Motor.ForceUnground();
|
||
|
base.characterMotor.velocity = Vector3.zero;
|
||
|
EffectManager.SimpleMuzzleFlash(muzzleflashEffect, base.gameObject, "MuzzleLeft", transmit: false);
|
||
|
EffectManager.SimpleMuzzleFlash(muzzleflashEffect, base.gameObject, "MuzzleRight", transmit: false);
|
||
|
if (base.isAuthority)
|
||
|
{
|
||
|
blastPosition = base.characterBody.corePosition;
|
||
|
}
|
||
|
if (NetworkServer.active)
|
||
|
{
|
||
|
BlastAttack obj = new BlastAttack
|
||
|
{
|
||
|
radius = blastAttackRadius,
|
||
|
procCoefficient = blastAttackProcCoefficient,
|
||
|
position = blastPosition,
|
||
|
attacker = base.gameObject,
|
||
|
crit = Util.CheckRoll(base.characterBody.crit, base.characterBody.master),
|
||
|
baseDamage = base.characterBody.damage * blastAttackDamageCoefficient,
|
||
|
falloffModel = BlastAttack.FalloffModel.None,
|
||
|
baseForce = blastAttackForce
|
||
|
};
|
||
|
obj.teamIndex = TeamComponent.GetObjectTeam(obj.attacker);
|
||
|
obj.damageType = DamageType.Stun1s;
|
||
|
obj.attackerFiltering = AttackerFiltering.NeverHitSelf;
|
||
|
obj.Fire();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void OnSerialize(NetworkWriter writer)
|
||
|
{
|
||
|
base.OnSerialize(writer);
|
||
|
writer.Write(blastPosition);
|
||
|
}
|
||
|
|
||
|
public override void OnDeserialize(NetworkReader reader)
|
||
|
{
|
||
|
base.OnDeserialize(reader);
|
||
|
blastPosition = reader.ReadVector3();
|
||
|
}
|
||
|
|
||
|
public override void HandleMovements()
|
||
|
{
|
||
|
base.HandleMovements();
|
||
|
base.characterMotor.rootMotion += flyVector * (moveSpeedStat * speedCoefficientCurve.Evaluate(base.fixedAge / duration) * GetDeltaTime());
|
||
|
base.characterMotor.velocity.y = 0f;
|
||
|
}
|
||
|
|
||
|
protected override void UpdateAnimationParameters()
|
||
|
{
|
||
|
base.UpdateAnimationParameters();
|
||
|
}
|
||
|
|
||
|
private void CreateBlinkEffect(Vector3 origin)
|
||
|
{
|
||
|
EffectData effectData = new EffectData();
|
||
|
effectData.rotation = Util.QuaternionSafeLookRotation(flyVector);
|
||
|
effectData.origin = origin;
|
||
|
EffectManager.SpawnEffect(blinkPrefab, effectData, transmit: false);
|
||
|
}
|
||
|
|
||
|
public override void FixedUpdate()
|
||
|
{
|
||
|
base.FixedUpdate();
|
||
|
if (base.fixedAge >= duration && base.isAuthority)
|
||
|
{
|
||
|
outer.SetNextStateToMain();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void OnExit()
|
||
|
{
|
||
|
if (!outer.destroying)
|
||
|
{
|
||
|
Util.PlaySound(endSoundString, base.gameObject);
|
||
|
}
|
||
|
base.OnExit();
|
||
|
}
|
||
|
}
|