Spaces:
Runtime error
Runtime error
| using Photon.Deterministic; | |
| using System; | |
| namespace Quantum | |
| { | |
| [] | |
| public unsafe partial class BTLoop : BTDecorator | |
| { | |
| public Int32 LoopIterations; | |
| public Boolean LoopForever; | |
| public FP LoopTimeout = -FP._1; | |
| public BTDataIndex StartTimeIndex; | |
| public BTDataIndex IterationCountIndex; | |
| public override void Init(Frame frame, AIBlackboardComponent* blackboard, BTAgent* agent) | |
| { | |
| base.Init(frame, blackboard, agent); | |
| agent->AddFPData(frame, 0); | |
| agent->AddIntData(frame, 0); | |
| } | |
| public override void OnEnter(BTParams btParams) | |
| { | |
| base.OnEnter(btParams); | |
| var frame = btParams.Frame; | |
| var currentTime = frame.DeltaTime * frame.Number; | |
| btParams.Agent->SetFPData(frame, currentTime, StartTimeIndex.Index); | |
| btParams.Agent->SetIntData(frame, 0, IterationCountIndex.Index); | |
| } | |
| protected override BTStatus OnUpdate(BTParams btParams) | |
| { | |
| var frame = btParams.Frame; | |
| int iteration = btParams.Agent->GetIntData(frame, IterationCountIndex.Index) + 1; | |
| btParams.Agent->SetIntData(frame, iteration, IterationCountIndex.Index); | |
| if (DryRun(btParams) == false) | |
| { | |
| return BTStatus.Success; | |
| } | |
| var childResult = BTStatus.Failure; | |
| if (_childInstance != null) | |
| { | |
| _childInstance.SetStatus(btParams.Frame, BTStatus.Inactive, btParams.Agent); | |
| childResult = _childInstance.RunUpdate(btParams); | |
| } | |
| return childResult; | |
| } | |
| public override Boolean DryRun(BTParams btParams) | |
| { | |
| if (LoopForever && LoopTimeout < FP._0) | |
| { | |
| return true; | |
| } | |
| else if (LoopForever) | |
| { | |
| var frame = btParams.Frame; | |
| FP startTime = btParams.Agent->GetFPData(frame, StartTimeIndex.Index); | |
| var currentTime = frame.DeltaTime * frame.Number; | |
| if (currentTime < startTime + LoopTimeout) | |
| { | |
| return true; | |
| } | |
| } | |
| else | |
| { | |
| var frame = btParams.Frame; | |
| int iteration = btParams.Agent->GetIntData(frame, IterationCountIndex.Index); | |
| if (iteration <= LoopIterations) | |
| { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| } | |
| } | |