66 lines
1.9 KiB
C#
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;
|
|
}
|
|
}
|