VOID StdImpact059_T::BroadcastTargetListMessage( OWN_IMPACT& rImp, Obj_Character& rMe, OBJLIST& rTargets, HitFlagsForOBJLIST_T& rHitFlagsForObjList ) const { __ENTER_FUNCTION SkillInfo_T& rSkillInfo = rMe.GetSkillInfo(); TargetingAndDepletingParams_T& rParams = rMe.GetTargetingAndDepletingParams(); GCTargetListAndHitFlags msg; GCTargetListAndHitFlags::HitFlagList_T& rHitFlags = msg.GetHitFlagList(); msg.SetDataType(msg.BUFF_ACTIVETE); msg.SetObjID(rMe.GetID()); msg.SetUserPos(*(rMe.getWorldPos())); msg.SetLogicCount(rMe.GetLogicCount()); msg.SetSkillOrSpecialObjDataID(rImp.GetSkillID()); msg.SetTargetID(rParams.GetTargetObj()); msg.SetTargetPos(rParams.GetTargetPosition()); msg.SetDir(rParams.GetTargetDirection()); BYTE nNum = rTargets.m_Count; if(msg.MAX_TARGET_LIST_SIZE<nNum) { nNum = msg.MAX_TARGET_LIST_SIZE; } msg.SetTargetNum(nNum); int iTemp = nNum; INT nIdx=0; for(nIdx=0; nNum>nIdx; ++nIdx) { Obj* pTarget = rTargets.m_aObj[nIdx]; if(NULL!=pTarget) { msg.SetTargetObjIDByIndex(nIdx, pTarget->GetID()); if(TRUE == rHitFlagsForObjList.GetFlagByIndex(nIdx)) { rHitFlags.MarkFlagByIndex(nIdx); //msg.SetBallIDByIndex( nIdx, m_aBallUniqueID[nIdx].m_uUniqueID ); } } } Scene* pScene = rMe.getScene(); if(NULL!=pScene) { pScene->BroadCast(&msg, &rMe, TRUE); } __LEAVE_FUNCTION }
VOID StdImpact033_T::OnFadeOut(OWN_IMPACT& rImp, Obj_Character& rMe) const { INT nValue = 0; if(Obj::OBJ_TYPE_MONSTER == rMe.GetObjType()) { Obj_Monster& rMonster = (Obj_Monster&)rMe; INT nAI_Type = GetAiTypeRefix(rImp); rMonster.SetAIType(nAI_Type); AI_Monster * pAI = rMonster.GetMonsterAI(); if(NULL!=pAI) { Obj* pObj = Impact_GetCaster(rMe, rImp); if(NULL!=pObj) { pAI->AddPrimaryEnemy(pObj->GetID()); } } } }
VOID AI_Monster::AI_Logic_Flee( UINT uTime ) { __ENTER_FUNCTION GET_MONSTER_SCENE((VOID)0) Obj* pObj = pScene->GetObjManager()->GetObj(m_CurEnemyID); if (!pObj || !IsCharacterObj(pObj->GetObjType()) || !((Obj_Character*)pObj)->IsAlive() || !((Obj_Character*)pObj)->IsCanViewMe(pMonster) ) {/** 当前敌人无效后转向下一个敌人,直到全部找完为止 */ DelEnemy(m_CurEnemyID); m_CurEnemyID = GetNextEnemy(); if (INVALID_ID == m_CurEnemyID) { ToGoHome(); } return ; } Obj_Character* pCurEnemy = (Obj_Character*)pObj; /** 当前位置和目的地之间的距离 */ FLOAT fDist = MySqrt(GetCharacter()->getWorldPos(),GetCharacter()->GetFinalTarPos()); if( pCurEnemy==NULL /** 无效敌人 */ || !pCurEnemy->IsAlive() /** 敌人死了 */ || fDist < ZERO_VALUE /** 到达目的地 */ ) {/** 忘掉当前目标 */ /** 将自身的移动速度还原 */ GetCharacter()->SetMoveMode(Obj_Monster::MOVE_MODE_WALK); switch(m_FleeType) { /** 返回继续攻击敌人 */ case MONSTERAI_FLEE_RANDOM: ToApproachTar(); break; /** 将自己的仇恨列表copy给队友 */ case MONSTERAI_FLEE_NEARESTFRIEND: for (INT i = 0; i < MAX_TEAMMATE_COUNT; ++i) { Obj* pObj = pScene->GetObjManager()->GetObj(m_TeammateID[i]); if( pObj==NULL || !IsCharacterObj( pObj->GetObjType() ) ) { continue; } /** 活着的;非敌对的;没有敌人的 */ if (((Obj_Character*)pObj)->IsAlive() && !((Obj_Monster*)pObj)->IsEnemy(GetCharacter()) && !((Obj_Monster*)pObj)->GetMonsterAI()->HasEnemy() ) { ((Obj_Monster*)pObj)->GetMonsterAI()->AddPrimaryEnemy( GetPrimaryEnemyID() ); //((Monster*)pObj)->GetMonsterAI()->ToApproachTar(); Log::SaveLog( SERVER_LOGFILE, "Logic_Flee NearestFriend Find Obj! ID:%d", pObj->GetID() ) ; } } ToApproachTar(); break; /** 将自己的仇恨列表copy给周围一定范围的队友 */ case MONSTERAI_FLEE_NEARESTPOINT: { Scene* pScene = GetCharacter()->getScene() ; SCANOPERATOR_TEAMMATE_INIT Init ; Init.m_pScene = pScene ; Init.m_nZoneRadius = 1 ; Init.m_Type = MONSTERAI_SUMMON_REGION; Init.m_nCount = 3; Init.m_bScanHuman = FALSE ; Init.m_ZoneID = GetCharacter()->getZoneID() ; Init.m_pMonster = (Obj_Monster*)GetCharacter() ; Init.m_fRadius = (FLOAT)AIParam(AIPARAM_SCANTEAMMATEDIST)/1000.0f ; ScanOperator_Teammate sc; sc.Init( &Init ) ; pScene->Scan( &sc ) ; if (HasTeammate()) { Obj* pObj = NULL; for (INT i = 0; i < MAX_TEAMMATE_COUNT; ++i) { Obj* pObj = pScene->GetObjManager()->GetObj(m_TeammateID[i]); if( pObj==NULL || !IsCharacterObj( pObj->GetObjType() ) ) { continue; } ((Obj_Monster*)pObj)->GetMonsterAI()->AddPrimaryEnemy( GetPrimaryEnemyID() ); //((Monster*)pObj)->GetMonsterAI()->ToApproachTar(); Log::SaveLog( SERVER_LOGFILE, "Logic_Flee NearestPoINT Find Obj! ID:%d", pObj->GetID() ) ; } } ToApproachTar(); } break; default: Assert(false); break; } } ExcuteAIScript(SFLEE); __LEAVE_FUNCTION }