86 lines
1.7 KiB
C#
86 lines
1.7 KiB
C#
|
|
using Godot;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool][GlobalClass, Icon("res://addons/rokojori_action_library/Icons/Parallel.svg") ]
|
|
public partial class RepeatSequence : SequenceAction
|
|
{
|
|
[Export]
|
|
public Action action;
|
|
|
|
[Export]
|
|
public int maxNumRepeats = 3;
|
|
|
|
[Export]
|
|
public float maxRepeatDuration = 60;
|
|
|
|
[Export]
|
|
public TimeLine timeLine;
|
|
|
|
|
|
protected override void _OnTrigger()
|
|
{
|
|
|
|
var id = DispatchStart();
|
|
|
|
if ( ! ( action is SequenceAction ) )
|
|
{
|
|
Trigger( action );
|
|
DispatchEnd( id );
|
|
return;
|
|
}
|
|
|
|
var sa = (SequenceAction) action;
|
|
|
|
var executed = 0;
|
|
|
|
System.Action<SequenceActionFinishedEvent> callBack = null;
|
|
|
|
var tl = TimeLineManager.Ensure( timeLine );
|
|
|
|
if ( maxNumRepeats <= 0 && ( tl == null || maxRepeatDuration <= 0 ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
var startTime = tl.position;
|
|
var endTime = tl.position + maxRepeatDuration;
|
|
|
|
callBack = ( a )=>
|
|
{
|
|
if ( ! a.success )
|
|
{
|
|
DispatchCancelled( id );
|
|
sa.onSequenceDone.RemoveAction( callBack );
|
|
return;
|
|
}
|
|
|
|
executed ++;
|
|
|
|
var finished = ( maxNumRepeats > 0 && executed >= maxNumRepeats ) ||
|
|
( tl != null && tl.position >= endTime );
|
|
|
|
if ( finished )
|
|
{
|
|
DispatchEnd( id );
|
|
sa.onSequenceDone.RemoveAction( callBack );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
Trigger( action );
|
|
}
|
|
|
|
};
|
|
|
|
|
|
sa.onSequenceDone.AddAction( callBack );
|
|
|
|
|
|
Trigger( action );
|
|
|
|
}
|
|
}
|
|
} |