Exemple #1
0
		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
		}
Exemple #2
0
		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());
					}
				}
			}
		}
Exemple #3
0
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
}