void NFCAIModule::OnBeAttack(const NFGUID& self, const NFGUID& other, const int nDamageValue) { m_pHateModule->AddHate(self, other, nDamageValue); m_pHateModule->CompSortList(self); NFIStateMachine* pStateMachine = GetStateMachine(self); if (pStateMachine) { if (FightState != pStateMachine->CurrentState()) { pStateMachine->ChangeState(FightState); } } }
bool NFCPatrolState::Execute(const NFGUID& self) { if (!NFIState::Execute(self)) { NFIStateMachine* pStateMachine = m_pAIModule->GetStateMachine(self); if (pStateMachine) { NFGUID ident = m_pHateModule->QueryMaxHateObject(self); NFAI_MOVE_TYPE eMoveType = (NFAI_MOVE_TYPE)(m_pKernelModule->GetPropertyInt(self, "MoveType")); //如果是定点的,则不走,继续idle switch (eMoveType) { case NFAI_MOVE_TYPE::MOVE_BY_POINT_LIST: { //查找是否有可以攻击的对象 if (!ident.IsNull()) { pStateMachine->ChangeState(FightState); } else { //下一个节点 //object记录当前的路径ID和index,以记录寻路的位置 } } break; case NFAI_MOVE_TYPE::MOVE_BY_RANDOM: { //查找是否有可以攻击的对象 if (!ident.IsNull()) { pStateMachine->ChangeState(FightState); } else { RandomPatrol(self); } } break; default: break; } } } return true; }
bool NFCFightState::Execute(const NFGUID& self) { NFIStateMachine* pStateMachine = m_pAIModule->GetStateMachine(self); NFAI_MOVE_TYPE eMoveType = (NFAI_MOVE_TYPE)(m_pKernelModule->GetPropertyInt(self, "MoveType")); NFGUID ident = m_pHateModule->QueryMaxHateObject(self); if (!ident.IsNull()) { if (m_pKernelModule->GetPropertyInt(self, "HP") > 0) { if (m_pKernelModule->GetPropertyInt(ident, "HP") > 0) { NFSkillTestSkillResult eResult = (NFSkillTestSkillResult)m_pAIModule->CanUseAnySkill(self, ident); if (NFSkillTestSkillResult::NFSTSR_OK == eResult) { float fSkillConsumeTime = m_pAIModule->UseAnySkill(self, ident); m_pKernelModule->SetPropertyInt(self, "StateType", (int)NFObjectStateType::NOST_SKILLUSE); //添加心跳,还原状态StateType m_pKernelModule->AddHeartBeat(self, "OnSkillConsumeTime", this, &NFCFightState::OnSkillConsumeTime, fSkillConsumeTime, 1); } else if (NFSkillTestSkillResult::NFSTSR_DISTANCE == eResult) { if (NFAI_MOVE_TYPE::NO_MOVE_TYPE != eMoveType) { RunCloseTarget(self, ident); } else { pStateMachine->ChangeState(IdleState); } } else if (NFSkillTestSkillResult::NFSTSR_CD == eResult) { if (NFAI_MOVE_TYPE::NO_MOVE_TYPE != eMoveType) { RunInFightArea(self); } else { pStateMachine->ChangeState(IdleState); } } } else { m_pHateModule->SetHateValue(self, ident, 0); } } else { pStateMachine->ChangeState(DeadState); } } else { //目标挂了什么的,或者没目标 pStateMachine->ChangeState(IdleState); } return true; }