r2mods/ilspy_dump/ror2_csproj/RoR2.Skills/MercDashSkillDef.cs

105 lines
2.6 KiB
C#

using EntityStates;
using EntityStates.Merc;
using HG;
using JetBrains.Annotations;
using UnityEngine;
namespace RoR2.Skills;
[CreateAssetMenu(menuName = "RoR2/SkillDef/MercDashSkillDef")]
public class MercDashSkillDef : SkillDef
{
protected class InstanceData : BaseSkillInstanceData
{
public int currentDashIndex;
public float timeoutTimer;
public bool waitingForHit;
public bool hasExtraStock;
}
public int maxDashes;
public float timeoutDuration;
public Sprite[] icons;
public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot)
{
return new InstanceData();
}
public override void OnUnassigned([NotNull] GenericSkill skillSlot)
{
base.OnUnassigned(skillSlot);
}
public override void OnFixedUpdate([NotNull] GenericSkill skillSlot, float deltaTime)
{
base.OnFixedUpdate(skillSlot, deltaTime);
InstanceData instanceData = (InstanceData)skillSlot.skillInstanceData;
if (instanceData.waitingForHit && skillSlot.stateMachine.state is Assaulter2 { grantAnotherDash: not false })
{
instanceData.waitingForHit = false;
AddHit(skillSlot);
}
instanceData.timeoutTimer -= deltaTime;
if (instanceData.timeoutTimer <= 0f && instanceData.currentDashIndex != 0)
{
if (instanceData.hasExtraStock)
{
skillSlot.stock--;
instanceData.hasExtraStock = false;
}
instanceData.currentDashIndex = 0;
}
}
protected override EntityState InstantiateNextState([NotNull] GenericSkill skillSlot)
{
EntityState entityState = base.InstantiateNextState(skillSlot);
if (entityState is PrepAssaulter2 prepAssaulter)
{
prepAssaulter.dashIndex = ((InstanceData)skillSlot.skillInstanceData).currentDashIndex;
}
return entityState;
}
public override void OnExecute([NotNull] GenericSkill skillSlot)
{
base.OnExecute(skillSlot);
InstanceData instanceData = (InstanceData)skillSlot.skillInstanceData;
if (!instanceData.hasExtraStock)
{
instanceData.currentDashIndex = 0;
}
instanceData.waitingForHit = true;
instanceData.hasExtraStock = false;
instanceData.timeoutTimer = timeoutDuration;
}
protected void AddHit([NotNull] GenericSkill skillSlot)
{
InstanceData instanceData = (InstanceData)skillSlot.skillInstanceData;
if (instanceData.currentDashIndex < maxDashes - 1)
{
instanceData.currentDashIndex++;
int stock = skillSlot.stock + 1;
skillSlot.stock = stock;
instanceData.hasExtraStock = true;
}
else
{
instanceData.currentDashIndex = 0;
}
}
public override Sprite GetCurrentIcon([NotNull] GenericSkill skillSlot)
{
int index = ((InstanceData)skillSlot.skillInstanceData)?.currentDashIndex ?? 0;
return ArrayUtils.GetSafe(icons, index);
}
}