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 }
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; } }
// // 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 ); }