Ejemplo n.º 1
0
void	CMover::CMD_SetMeleeAttack( OBJID idTarget, FLOAT fRange )
{
	ItemProp *pProp = GetActiveHandItemProp();
	if( pProp->dwItemKind2 == IK2_TOOLS )			// 툴을 들고선 공격못한다,.
		return;

	if( m_pActMover->IsActAttack() )	
		return;
	if( IsDie() )	
		return;										// 죽었을때 사용금지.

	// 요요는 밀리어택이긴 하나 약간 거리를 두고 공격한다.( 프로퍼티 참조함 )
	if( pProp->dwItemKind3 == IK3_YOYO )
		fRange = GetAttackRange( pProp->dwAttackRange );
	
#ifdef __CLIENT
	ClearActParam();
	SetDestObj( idTarget, fRange );		// 이동할 목표물을 idTarget으로 설정.
	SetCmd( OBJACT_MELEE_ATTACK, idTarget );		// 사정거리가 되었을때 실행할 명령 셋팅.
#elif defined(__WORLDSERVER)
#ifdef __TRAFIC_1222
	if( GetDestId() == idTarget )
		return;
#endif	// __TRAFIC_1222
	SetDestObj( idTarget, fRange );		// 이동할 목표물을 idTarget으로 설정.
	g_UserMng.AddMoverSetDestObj( this, idTarget, fRange );
#endif // WORLDSERVER
}
Ejemplo n.º 2
0
void CAIMonster2::OnBeginState( int nInput, DWORD dwParam1, DWORD dwParam2 )
{
	CMover* pMover = GetMover();

	switch( GetState() )
	{
	case AI2_MOVE:
		{
			D3DXVECTOR3 vPos = m_vPosBegin;
			int x = xRandom( 20 );
			int z = xRandom( 20 );
			vPos.x += (float)(x - 10);
			vPos.z += (float)(z - 10);

			MoveToDst( vPos );		// y는 어떻게 되나?
		}
		break;
	case AI2_IDLE:
		//m_dwReattack = GetTickCount() + xRandom( 0, 2000 );
		m_dwReattack = GetTickCount() + 2000;
		m_idTarget = NULL_ID;			
		m_vTarget.x = m_vTarget.y = m_vTarget.z = 0.0f;
		pMover->SetStop(); 
		MoveToDst( pMover->GetPos() );
		break;

	case AI2_ATTACK:
		if( BeginAttack() == FALSE )						// 공격 
			SendAIMsg( AIMSG_END_MELEEATTACK, 0, 0 );			// 실패할 경우 공격완료 메세지는 오지 않는다.
		break;

	case AI2_TRACKING:
		if( m_idTarget == NULL_ID )
		{
			m_idTarget = m_idLastAttacker;
			ASSERT( m_idTarget != NULL_ID );
		}

#ifdef __TRAFIC_1222
		if( pMover->GetDestId() == m_idTarget )
			break;
#endif	// __TRAFIC_1222
		// 이동할 목표물을 idTarget으로 설정.
		pMover->SetDestObj( m_idTarget, m_fAttackRange );
		g_UserMng.AddMoverSetDestObj( pMover, m_idTarget, m_fAttackRange );
		break;
	case AI2_SEARCH:
		break;
	}
}
Ejemplo n.º 3
0
//
// fRange = 도달범위.  디폴트는 0.0f은 상대방의 반경까지 붙는거다.
void CMover::SetDestObj( OBJID objid, float fRange, BOOL bSend )
{
#ifdef __WORLDSERVER
	if( FALSE == IsPlayer() && m_idDest != objid )
		m_nCorr	= -1;
#else	// __WORLDSERVER
	if( bSend && IsActiveMover() && m_idDest != objid )
	{
#ifdef __BS_ADJUST_SYNC
		CMover* pTarget = prj.GetMover( m_idDest );
		if( pTarget )
		{
			if( pTarget->IsPlayer( ) )
				g_DPlay.SendPlayerBehavior();	// 새로운 Obj로 이동할경우 동기화 한번 맞춰주고....
		}
#endif
		g_DPlay.SendPlayerDestObj( objid, fRange );
		m_nCorr	= -1;
	}
#endif	// not __WORLDSERVER

	m_idDest	    = objid;
	m_fArrivalRange = fRange;
	ClearDestPos();

#ifdef __WORLDSERVER
	// 서버에서 SetDestObj를 실행하면 클라들에게 보내주는게 없어서 이걸 넣음.
	if( bSend )
		g_UserMng.AddMoverSetDestObj( this, objid, fRange, FALSE );
#endif	// __WORLDSERVER

#ifdef __CLIENT
	m_oaCmd = OBJACT_NONE;		// CMD_ 시리즈를 거치지 않고 이것만 호출되는 경우는 Cmd를 해제시키자.
#endif // Client

//	if( IsPlayer() )
//		TRACE( "SetDestObj %08x\n", objid );
}