Spaces:
Runtime error
Runtime error
| using Photon.Deterministic; | |
| using System; | |
| namespace Quantum | |
| { | |
| public unsafe abstract partial class BTComposite : BTNode | |
| { | |
| public AssetRefBTNode[] Children; | |
| public AssetRefBTService[] Services; | |
| [] public AssetRefBTNode TopmostDecorator; | |
| public BTDataIndex CurrentChildIndex; | |
| protected BTNode[] _childInstances; | |
| protected BTService[] _serviceInstances; | |
| protected BTNode _topmostDecoratorInstance; | |
| public bool IsDynamic; | |
| public BTNode[] ChildInstances | |
| { | |
| get | |
| { | |
| return _childInstances; | |
| } | |
| } | |
| public BTService[] ServiceInstances | |
| { | |
| get | |
| { | |
| return _serviceInstances; | |
| } | |
| } | |
| public override BTNodeType NodeType | |
| { | |
| get | |
| { | |
| return BTNodeType.Composite; | |
| } | |
| } | |
| internal Int32 GetCurrentChild(Frame frame, BTAgent* agent) | |
| { | |
| Byte currentChild = (Byte)agent->GetIntData(frame, CurrentChildIndex.Index); | |
| return currentChild; | |
| } | |
| internal void SetCurrentChild(Frame frame, Int32 currentIndex, BTAgent* agent) | |
| { | |
| agent->SetIntData(frame, currentIndex, CurrentChildIndex.Index); | |
| } | |
| /// <summary> | |
| /// When a Composite node is Updated, it only increase the current child updated | |
| /// when the child results in either FAIL/SUCCESS. So we need this callback | |
| /// to be used when the child was RUNNING and then had some result, to properly increase the current | |
| /// child ID | |
| /// </summary> | |
| /// <param name="btParams"></param> | |
| /// <param name="childResult"></param> | |
| internal virtual void ChildCompletedRunning(BTParams btParams, BTStatus childResult) | |
| { | |
| } | |
| public override void Init(Frame frame, AIBlackboardComponent* blackboard, BTAgent* agent) | |
| { | |
| base.Init(frame, blackboard, agent); | |
| agent->AddIntData(frame, 0); | |
| for (Int32 i = 0; i < Services.Length; i++) | |
| { | |
| BTService service = frame.FindAsset<BTService>(Services[i].Id); | |
| service.Init(frame, agent, blackboard); | |
| } | |
| } | |
| public override void OnEnter(BTParams btParams) | |
| { | |
| BTManager.OnNodeEnter?.Invoke(btParams.Entity, Guid.Value); | |
| SetCurrentChild(btParams.Frame, 0, btParams.Agent); | |
| } | |
| public override void OnEnterRunning(BTParams btParams) | |
| { | |
| var activeServicesList = btParams.Frame.ResolveList<AssetRefBTService>(btParams.Agent->ActiveServices); | |
| for (Int32 i = 0; i < _serviceInstances.Length; i++) | |
| { | |
| _serviceInstances[i].OnEnter(btParams); | |
| activeServicesList.Add(Services[i]); | |
| } | |
| if (IsDynamic == true) | |
| { | |
| var dynamicComposites = btParams.Frame.ResolveList<AssetRefBTComposite>(btParams.Agent->DynamicComposites); | |
| dynamicComposites.Add(this); | |
| } | |
| } | |
| public override void OnReset(BTParams btParams) | |
| { | |
| base.OnReset(btParams); | |
| OnExit(btParams); | |
| for (Int32 i = 0; i < _childInstances.Length; i++) | |
| _childInstances[i].OnReset(btParams); | |
| } | |
| public override void OnExit(BTParams btParams) | |
| { | |
| base.OnExit(btParams); | |
| BTManager.OnNodeExit?.Invoke(btParams.Entity, Guid.Value); | |
| var activeServicesList = btParams.Frame.ResolveList<AssetRefBTService>(btParams.Agent->ActiveServices); | |
| for (Int32 i = 0; i < _serviceInstances.Length; i++) | |
| { | |
| activeServicesList.Remove(Services[i]); | |
| } | |
| if (IsDynamic == true) | |
| { | |
| var dynamicComposites = btParams.Frame.ResolveList<AssetRefBTComposite>(btParams.Agent->DynamicComposites); | |
| dynamicComposites.Remove(this); | |
| } | |
| } | |
| public override bool OnDynamicRun(BTParams btParams) | |
| { | |
| if (_topmostDecoratorInstance != null) | |
| { | |
| return _topmostDecoratorInstance.OnDynamicRun(btParams); | |
| } | |
| return true; | |
| } | |
| public void AbortNodes(BTParams btParams, Int32 firstIndex = 0) | |
| { | |
| for (int i = firstIndex; i < _childInstances.Length; i++) | |
| { | |
| _childInstances[i].SetStatus(btParams.Frame, BTStatus.Abort, btParams.Agent); | |
| } | |
| } | |
| public override void Loaded(IResourceManager resourceManager, Native.Allocator allocator) | |
| { | |
| base.Loaded(resourceManager, allocator); | |
| // Cache the child assets links | |
| _childInstances = new BTNode[Children.Length]; | |
| for (Int32 i = 0; i < Children.Length; i++) | |
| { | |
| _childInstances[i] = (BTNode)resourceManager.GetAsset(Children[i].Id); | |
| _childInstances[i].Parent = this; | |
| _childInstances[i].ParentIndex = i; | |
| } | |
| // Cache the service assets links | |
| _serviceInstances = new BTService[Services.Length]; | |
| for (Int32 i = 0; i < Services.Length; i++) | |
| { | |
| _serviceInstances[i] = (BTService)resourceManager.GetAsset(Services[i].Id); | |
| } | |
| if (TopmostDecorator != null) | |
| { | |
| _topmostDecoratorInstance = (BTDecorator)resourceManager.GetAsset(TopmostDecorator.Id); | |
| } | |
| } | |
| } | |
| } |