187 lines
4.2 KiB
C#
187 lines
4.2 KiB
C#
|
using RoR2;
|
||
|
using RoR2.Skills;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Networking;
|
||
|
|
||
|
namespace EntityStates.FalseSon;
|
||
|
|
||
|
public class ClubSwing : BasicMeleeAttack, SteppedSkillDef.IStepSetter, ISkillOverrideHandoff
|
||
|
{
|
||
|
public int club;
|
||
|
|
||
|
public static GameObject secondarySwingEffectPrefab;
|
||
|
|
||
|
[SerializeField]
|
||
|
public SkillDef secondaryOverrideSkill;
|
||
|
|
||
|
[SerializeField]
|
||
|
public SkillDef specialOverrideSkill;
|
||
|
|
||
|
[SerializeField]
|
||
|
public float secondaryAltCooldownDuration = 0.7f;
|
||
|
|
||
|
private SkillStateOverrideData skillOverrideData;
|
||
|
|
||
|
private float startTimeStamp;
|
||
|
|
||
|
private bool resetClubSwing;
|
||
|
|
||
|
private bool clearOverrides = true;
|
||
|
|
||
|
private FalseSonController falseSonController;
|
||
|
|
||
|
void SteppedSkillDef.IStepSetter.SetStep(int i)
|
||
|
{
|
||
|
club = i;
|
||
|
}
|
||
|
|
||
|
public override void OnEnter()
|
||
|
{
|
||
|
base.OnEnter();
|
||
|
falseSonController = base.characterBody.GetComponent<FalseSonController>();
|
||
|
if (CheckReadyForSecondaryAlt())
|
||
|
{
|
||
|
GenerateSkillOverrideData();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EnsureSkillOverrideState(readyToFire: false);
|
||
|
}
|
||
|
clearOverrides = true;
|
||
|
startTimeStamp = Time.time;
|
||
|
}
|
||
|
|
||
|
void ISkillOverrideHandoff.TransferSkillOverride(SkillStateOverrideData skillOverrideData)
|
||
|
{
|
||
|
this.skillOverrideData = skillOverrideData;
|
||
|
}
|
||
|
|
||
|
private bool CheckReadyForSecondaryAlt()
|
||
|
{
|
||
|
if (base.inputBank.skill1.down)
|
||
|
{
|
||
|
return Time.time - falseSonController.GetClubSwingAltSecondaryTimestamp() > secondaryAltCooldownDuration;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
private void EnsureSkillOverrideState(bool readyToFire)
|
||
|
{
|
||
|
if (readyToFire ^ (skillOverrideData != null))
|
||
|
{
|
||
|
if (readyToFire)
|
||
|
{
|
||
|
GenerateSkillOverrideData();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ClearSkillOverrideData();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void GenerateSkillOverrideData()
|
||
|
{
|
||
|
if (skillOverrideData == null)
|
||
|
{
|
||
|
skillOverrideData = new SkillStateOverrideData(base.characterBody);
|
||
|
skillOverrideData.secondarySkillOverride = secondaryOverrideSkill;
|
||
|
skillOverrideData.overrideFullReloadOnAssign = true;
|
||
|
skillOverrideData.simulateRestockForOverridenSkills = false;
|
||
|
skillOverrideData.OverrideSkills(base.skillLocator);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void ClearSkillOverrideData()
|
||
|
{
|
||
|
if (skillOverrideData != null)
|
||
|
{
|
||
|
skillOverrideData.ClearOverrides();
|
||
|
}
|
||
|
skillOverrideData = null;
|
||
|
}
|
||
|
|
||
|
public override void FixedUpdate()
|
||
|
{
|
||
|
if (skillOverrideData != null)
|
||
|
{
|
||
|
skillOverrideData.StepRestock();
|
||
|
}
|
||
|
bool flag = CheckReadyForSecondaryAlt();
|
||
|
EnsureSkillOverrideState(flag);
|
||
|
if (flag && base.inputBank.skill2.justPressed)
|
||
|
{
|
||
|
ResetClubSwing();
|
||
|
outer.SetNextState(GetNextStateAuthority());
|
||
|
}
|
||
|
base.FixedUpdate();
|
||
|
}
|
||
|
|
||
|
private void ResetClubSwing()
|
||
|
{
|
||
|
SteppedSkillDef.InstanceData instanceData = (SteppedSkillDef.InstanceData)(base.skillLocator.GetSkill(SkillSlot.Primary)?.skillInstanceData);
|
||
|
if (instanceData != null)
|
||
|
{
|
||
|
instanceData.step = 0;
|
||
|
club = 0;
|
||
|
resetClubSwing = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void PlayAnimation()
|
||
|
{
|
||
|
string animationStateName = ((club == 0) ? "SwingClubRight" : "SwingClubLeft");
|
||
|
float num = Mathf.Max(duration, 0.2f);
|
||
|
PlayCrossfade("Gesture, Additive", animationStateName, "SwingClub.playbackRate", num, 0.1f);
|
||
|
PlayCrossfade("Gesture, Override", animationStateName, "SwingClub.playbackRate", num, 0.1f);
|
||
|
}
|
||
|
|
||
|
protected override void BeginMeleeAttackEffect()
|
||
|
{
|
||
|
swingEffectPrefab = ((club == 0) ? swingEffectPrefab : secondarySwingEffectPrefab);
|
||
|
swingEffectMuzzleString = ((club == 0) ? "SwingRight" : "SwingLeft");
|
||
|
base.BeginMeleeAttackEffect();
|
||
|
}
|
||
|
|
||
|
public override void OnSerialize(NetworkWriter writer)
|
||
|
{
|
||
|
base.OnSerialize(writer);
|
||
|
writer.Write((byte)club);
|
||
|
}
|
||
|
|
||
|
public override void OnDeserialize(NetworkReader reader)
|
||
|
{
|
||
|
base.OnDeserialize(reader);
|
||
|
club = reader.ReadByte();
|
||
|
}
|
||
|
|
||
|
public override void OnExit()
|
||
|
{
|
||
|
base.OnExit();
|
||
|
if (clearOverrides && skillOverrideData != null)
|
||
|
{
|
||
|
skillOverrideData.ClearOverrides();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void ModifyNextState(EntityState nextState)
|
||
|
{
|
||
|
base.ModifyNextState(nextState);
|
||
|
if (nextState is ISkillOverrideHandoff skillOverrideHandoff && skillOverrideData != null)
|
||
|
{
|
||
|
skillOverrideHandoff.TransferSkillOverride(skillOverrideData);
|
||
|
clearOverrides = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override InterruptPriority GetMinimumInterruptPriority()
|
||
|
{
|
||
|
return InterruptPriority.Skill;
|
||
|
}
|
||
|
|
||
|
protected virtual EntityState GetNextStateAuthority()
|
||
|
{
|
||
|
return new ClubSwing3();
|
||
|
}
|
||
|
}
|