//Execute(Agent* pAgent)method hava be change to Execute(Agent* pAgent, EBTStatus childStatus) EBTStatus Action::Execute(const Agent* pAgent, EBTStatus childStatus) { EBTStatus result = BT_SUCCESS; if (this->m_method) { //#if BEHAVIAC_ENABLE_PROFILING // BEHAVIAC_PROFILE("Node"); //#endif uint32_t nodeId = this->GetId(); uint32_t slot = SetNodeId(nodeId); BEHAVIAC_ASSERT(slot != (uint32_t)-1, "no empty slot found!"); const Agent* pParent = this->m_method->GetParentAgent(pAgent); this->m_method->run(pParent, pAgent); if (this->m_resultOption != BT_INVALID) { result = this->m_resultOption; } else if (this->m_resultFunctor) { const Agent* pParentCheckResult = this->m_resultFunctor->GetParentAgent(pAgent); result = (EBTStatus)this->m_method->CheckReturn(pParent, pParentCheckResult, this->m_resultFunctor); } else { this->m_method->CheckReturn(pParent, result); } ClearNodeId(slot); } else { //#if BEHAVIAC_ENABLE_PROFILING // BEHAVIAC_PROFILE("ActionGenerated"); //#endif result = this->update_impl((Agent*)pAgent, childStatus); } return result; }
EBTStatus State::Execute(Agent* pAgent) { EBTStatus result = BT_RUNNING; if (this->m_method) { uint32_t nodeId = this->GetId(); uint32_t slot = SetNodeId(nodeId); BEHAVIAC_ASSERT(slot != (uint32_t)-1, "no empty slot found!"); const Agent* pParent = this->m_method->GetParentAgent(pAgent); this->m_method->run(pParent, pAgent); ClearNodeId(slot); } else { result = this->update_impl((Agent*)pAgent, BT_RUNNING); } return result; }
EBTStatus ActionTask::update(Agent* pAgent, EBTStatus childStatus) { BEHAVIAC_UNUSED_VAR(pAgent); BEHAVIAC_UNUSED_VAR(childStatus); BEHAVIAC_ASSERT(Action::DynamicCast(this->GetNode())); Action* pActionNode = (Action*)(this->GetNode()); if (!this->CheckPredicates(pAgent)) { return pActionNode->m_resultPreconditionFail; } EBTStatus result = BT_SUCCESS; if (pActionNode->m_method) { //#if BEHAVIAC_ENABLE_PROFILING // BEHAVIAC_PROFILE("Node"); //#endif ParentType pt = pActionNode->m_method->GetParentType(); Agent* pParent = pAgent; if (pt == PT_INSTANCE) { pParent = Agent::GetInstance(pActionNode->m_method->GetInstanceNameString(), pParent->GetContextId()); BEHAVIAC_ASSERT(pParent); } int nodeId = this->GetId(); int slot = SetNodeId(nodeId); BEHAVIAC_ASSERT(slot != -1, "no empty slot found!"); pActionNode->m_method->run(pParent, pAgent); if (pActionNode->m_resultOption != BT_INVALID) { result = pActionNode->m_resultOption; } else if (pActionNode->m_resultFunctor) { ParentType pt = pActionNode->m_resultFunctor->GetParentType(); Agent* pParentCheckResult = pAgent; if (pt == PT_INSTANCE) { pParentCheckResult = Agent::GetInstance(pActionNode->m_resultFunctor->GetInstanceNameString(), pParentCheckResult->GetContextId()); BEHAVIAC_ASSERT(pParentCheckResult); } result = (EBTStatus)pActionNode->m_method->CheckReturn(pParent, pParentCheckResult, pActionNode->m_resultFunctor); } else { pActionNode->m_method->CheckReturn(pParent, result); } ClearNodeId(slot); } else { //#if BEHAVIAC_ENABLE_PROFILING // BEHAVIAC_PROFILE("ActionGenerated"); //#endif result = pActionNode->update_impl(pAgent, childStatus); } return result; }