#include "StdAfx.h" #include "DnCannonMonsterActor.h" #include "DnProjectile.h" #include "DnPlayerActor.h" CDnCannonMonsterActor::CDnCannonMonsterActor( CMultiRoom *pRoom, int nClassID ) : TDnMonsterActor( pRoom, nClassID ), m_vShootDir( 0.0f, 0.0f, 0.0f ), m_vCannonGroundHitPos( 0.0f, 0.0f, 0.0f ), m_vCannonTargetingDir( 0.0f, 0.0f, 0.0f ) { m_vCannonLookDirection = GetMatEx()->m_vZAxis; // Rotha - ´ëÆ÷ÀÇ ½ÃÀÛ Ãʱ⠹æÇâÀº ÇöÀç ´ëÆ÷ÀÚüÀÇ ½ÃÁ¡°ú ÀÏÄ¡. } CDnCannonMonsterActor::~CDnCannonMonsterActor() { if( m_hMasterPlayerActor ) { CDnPlayerActor* pPlayerActor = static_cast( m_hMasterPlayerActor.GetPointer() ); pPlayerActor->OnCannonMonsterDie(); ClearMasterPlayerActor(); } } MAMovementBase* CDnCannonMonsterActor::CreateMovement() { MAMovementBase* pMovement = new IBoostPoolMAStaticMovement(); return pMovement; } void CDnCannonMonsterActor::SetMasterPlayerActor( DnActorHandle hMasterPlayerActor ) { m_hMasterPlayerActor = hMasterPlayerActor; SlaveOf( hMasterPlayerActor->GetUniqueID() ); // ³ë¿¹ ÁöÁ¤À» ÇØÁà¾ß Ç÷¹À̾î È­¸é¿¡ µ¥¹ÌÁö ¶ä. ¾Ë¾Æ¼­ Ŭ¶ó·Î ÆÐŶµµ º¸³½´Ù. SetCannonLookDirection(&GetMatEx()->m_vZAxis); // Rotha Ÿ°í ³»¸±¶§ ´ëÆ÷ Look Á¤º¸¸¦ ÃʱâÈ­ ÇØ ÁÝ´Ï´Ù. // TODO: ´ëÆ÷ Å×½ºÆ® ÄÚµå SetTeam( hMasterPlayerActor->GetTeam() ); } void CDnCannonMonsterActor::ClearMasterPlayerActor( void ) { m_hMasterPlayerActor.Identity(); SetCannonLookDirection(&GetMatEx()->m_vZAxis); // Rotha Ÿ°í³»¸±¶§ ´ëÆ÷ Look Á¤º¸¸¦ ÃʱâÈ­ÇØÁÝ´Ï´Ù. // ³ë¿¹ ÇØÁ¦. SlaveRelease(); } void CDnCannonMonsterActor::Look( EtVector2& vVec, bool bForceRotate) { if( bForceRotate ) { if( EtVec2LengthSq( &vVec ) > 0.f ) { GetMatEx()->m_vZAxis = EtVector3( vVec.x, 0.f, vVec.y ); EtVec3Normalize( &GetMatEx()->m_vZAxis, &GetMatEx()->m_vZAxis ); GetMatEx()->MakeUpCartesianByZAxis(); } } } void CDnCannonMonsterActor::OnHitSuccess( LOCAL_TIME LocalTime, DnActorHandle hActor, HitStruct *pStruct ) { // ´ëÆ÷¸¦ Àâ°í ÀÖ´Â ¾×ÅÍÀÇ ÄÞº¸ ¹× CP ·Î 󸮵ǵµ·Ï ÇÑ´Ù. if( m_hMasterPlayerActor && m_hMasterPlayerActor->IsPlayerActor() ) { m_hMasterPlayerActor->OnHitSuccess( LocalTime, hActor, pStruct ); } } void CDnCannonMonsterActor::OnHitFinish( LOCAL_TIME LocalTime, HitStruct *pStruct ) { if( m_hMasterPlayerActor && m_hMasterPlayerActor->IsPlayerActor() ) { m_hMasterPlayerActor->OnHitFinish( LocalTime, pStruct ); } } void CDnCannonMonsterActor::OnMasterPlayerActorDie( void ) { ClearMasterPlayerActor(); } void CDnCannonMonsterActor::OnDie( DnActorHandle hHitter ) { if( m_hMasterPlayerActor ) { CDnPlayerActor* pPlayerActor = static_cast( m_hMasterPlayerActor.GetPointer() ); pPlayerActor->OnCannonMonsterDie(); ClearMasterPlayerActor(); } } void CDnCannonMonsterActor::OnSignal( SignalTypeEnum Type, void *pPtr, LOCAL_TIME LocalTime, LOCAL_TIME SignalStartTime, LOCAL_TIME SignalEndTime, int nSignalIndex ) { switch( Type ) { case STE_Projectile: { // ´ëÆ÷ ¹ß»çü´Â ´ëÆ÷¿¡¼­ Ŭ¶ó¿¡¼­ º¸³»ÁØ Å¸°Ù Á¤º¸·Î °­Á¦ Ÿ°ÙÆÃÇØ¼­ µû·Î ½ð´Ù. ProjectileStruct* pStruct = (ProjectileStruct *)pPtr; // ´ëÆ÷ÀÇ ½ÇÁ¦ ½î´Â ¹æÇâ¿¡ µû¶ó Æ÷½Å º»¸¸ µ¹·ÁÁֱ⠶§¹®¿¡ ½ÇÁ¦ m_Cross °ªÀº ȸÀü°ªÀÌ ¹Ý¿µµÇ¾îÀÖÁö ¾Ê´Ù. // ¿©±â¼­ ¹Ý¿µÇؼ­ ¹ß»çü¸¦ »ý¼ºÇØÁØ´Ù. MatrixEx LocalCross = m_Cross; LocalCross.m_vZAxis = m_vCannonTargetingDir; LocalCross.m_vZAxis.y = 0.0f; EtVec3Normalize( &LocalCross.m_vZAxis, &LocalCross.m_vZAxis ); LocalCross.MakeUpCartesianByZAxis(); // ¸ó½ºÅͰ¡ ¹ß»çü ½î´Â °¡¿îµ¥ CreateProjectile ³»ºÎ¿¡¼­ ¸ó½ºÅÍÀÇ MatrixEx ¸¦ ÂüÁ¶ÇÏ¿© Target À» Á¤ÇÏ´Â // ·çƾÀÌ À־ Àá½Ã °ªÀ» ¿©±â¼­ ¹Ù²ãÁá´Ù º¹±¸ ½ÃÄÑÁÜ. MatrixEx Temp = m_Cross; m_Cross = LocalCross; CDnProjectile* pProjectile = CDnProjectile::CreateProjectile( GetRoom(), GetMySmartPtr(), LocalCross, pStruct, &m_vCannonGroundHitPos, CDnActor::Identity(), &m_vShootDir ); if( pProjectile == NULL ) return; pProjectile->SetShooterType( GetMySmartPtr(), m_nActionIndex, nSignalIndex ); SendProjectile( pProjectile, pStruct, LocalCross, nSignalIndex ); OnProjectile( pProjectile, pStruct, LocalCross, nSignalIndex ); OnSkillProjectile( pProjectile ); m_Cross = Temp; return; } break; } CDnMonsterActor::OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex ); }