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

66 lines
1.9 KiB
C#

using EntityStates;
using JetBrains.Annotations;
using UnityEngine;
namespace RoR2.Skills;
[CreateAssetMenu(menuName = "RoR2/SkillDef/ReloadSkillDef")]
public class ReloadSkillDef : SkillDef
{
protected class InstanceData : BaseSkillInstanceData
{
public int currentStock;
public float graceStopwatch;
}
[Header("Reload Parameters")]
[Tooltip("The reload state to go into, when stock is less than max.")]
public SerializableEntityStateType reloadState;
[Tooltip("The priority of this reload state.")]
public InterruptPriority reloadInterruptPriority = InterruptPriority.Skill;
[Tooltip("The amount of time to wait between when we COULD reload, and when we actually start")]
public float graceDuration;
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;
instanceData.currentStock = skillSlot.stock;
if (instanceData.currentStock >= GetMaxStock(skillSlot))
{
return;
}
if ((bool)skillSlot.stateMachine && !skillSlot.stateMachine.HasPendingState() && skillSlot.stateMachine.CanInterruptState(reloadInterruptPriority))
{
instanceData.graceStopwatch += deltaTime;
if (instanceData.graceStopwatch >= graceDuration || instanceData.currentStock == 0)
{
skillSlot.stateMachine.SetNextState(EntityStateCatalog.InstantiateState(ref reloadState));
}
}
else
{
instanceData.graceStopwatch = 0f;
}
}
public override void OnExecute([NotNull] GenericSkill skillSlot)
{
base.OnExecute(skillSlot);
((InstanceData)skillSlot.skillInstanceData).currentStock = skillSlot.stock;
}
}