#include "StdAfx.h" #include "DnWorldBrokenBuffProp.h" #include "DnPropCondition.h" #include "DnPropStateScanActor.h" #include "DnPropActionCondition.h" #include "TaskManager.h" #include "DnGameTask.h" CDnWorldBrokenBuffProp::CDnWorldBrokenBuffProp( CMultiRoom* pRoom ) : CDnWorldBrokenProp( pRoom ), m_pBuffFSM( new TDnFiniteStateMachine(GetMySmartPtr()) ) { } CDnWorldBrokenBuffProp::~CDnWorldBrokenBuffProp(void) { SAFE_DELETE( m_pBuffFSM ); ReleasePostCustomParam(); } bool CDnWorldBrokenBuffProp::Initialize( CEtWorldSector *pParentSector, const char *szPropName, EtVector3 &vPos, EtVector3 &vRotate, EtVector3 &vScale ) { if( CDnWorldBrokenProp::Initialize( pParentSector, szPropName, vPos, vRotate, vScale ) == false ) return false; if( m_hMonster ) *m_hMonster->GetMatEx() = *GetMatEx(); return true; } bool CDnWorldBrokenBuffProp::InitializeTable( int nTableID ) { if( CDnWorldActProp::InitializeTable( nTableID ) == false ) return false; bool bResult = false; if( GetData() ) { BuffBrokenStruct* pStruct = (BuffBrokenStruct*)(GetData()); int nSkillTableID = pStruct->nSkillTableID; int nSkillLevel = pStruct->nSkillLevel; float fCheckRange = pStruct->fCheckRange; // ¾×Å͵é üũ ¹üÀ§ //m_iAffectTeam = pStruct->nTeam; // Àû¿ëÇÒ ÆÀ. bResult = InitializeMonsterActorProp( pStruct->nMonsterTableID ); // À߸øµÈ ½ºÅ³ Á¤º¸ #if !defined( PRE_TRIGGER_TEST ) _ASSERT( nSkillTableID != 0 && nSkillLevel != 0 ); #endif // #if defined( PRE_TRIGGER_TEST ) if( nSkillTableID == 0 || nSkillLevel == 0 ) return false; if( bResult ) { m_BuffPropComponent.Initialize( GetRoom(), pStruct->nTeam, nSkillTableID, nSkillLevel ); m_nDurability = pStruct->nDurability; if( -1 != m_nDurability ) { if( 0 == m_nDurability ) m_nDurability = 1; m_nItemDropGroupTableID = pStruct->nItemDropGroupTableID; if( m_nItemDropGroupTableID > 0 ) { CDnDropItem::CalcDropItemList( GetRoom(), Dungeon::Difficulty::Max, m_nItemDropGroupTableID, m_VecDropItemList ); if (m_VecDropItemList.empty()){ // ÇÁ¶ø·Î±× // g_pLogConnection->QueryLogStage(GetRoom()->GetRoomID(), pTask->GetMapTableID(), 0, 0, nTableID); // ½ºÅ×ÀÌÁö ·Î±× 090226 } else { for( DWORD i=0; iQueryLogStage(GetRoom()->GetRoomID(), pTask->GetMapTableID(), 0, m_VecDropItemList[i].nItemID, nTableID); // ½ºÅ×ÀÌÁö ·Î±× 090226 } } } } // state µé ÃʱâÈ­. // Idle ¾×¼Ç¿¡¼­´Â ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°í, Activate ¾×¼ÇÀÌ ½ÇÇàµÇ¸é ÁÖº¯À» °Ë»öÇØ¼­ °É¸®´Â ³ðµé¿¡°Ô ½ºÅ³¿¡ ºÙ¾îÀÖ´Â »óÅÂÈ¿°ú ºÎ¿©. CDnPropState* pNormalState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::NORMAL ); CDnPropState* pScanState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::SCAN_ACTOR ); CDnPropCondition* pNormalToScan = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::ACTION_CHECK ); CDnPropCondition* pScanToNormal = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::ACTION_CHECK ); static_cast(pScanState)->SetRange( fCheckRange ); static_cast(pNormalToScan)->SetActionName( "Activate" ); static_cast(pScanToNormal)->SetActionName( "Idle" ); m_pBuffFSM->AddCondition( pNormalToScan ); m_pBuffFSM->AddCondition( pScanToNormal ); m_pBuffFSM->AddState( pNormalState ); m_pBuffFSM->AddState( pScanState ); pNormalState->AddTransitState( pScanState, pNormalToScan ); pScanState->AddTransitState( pNormalState, pScanToNormal ); m_pBuffFSM->SetEntryState( pNormalState ); } } return bResult; } void CDnWorldBrokenBuffProp::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnWorldBrokenProp::Process( LocalTime, fDelta ); /* if( false == m_bProcessAllowed ) return; */ m_pBuffFSM->Process( LocalTime, fDelta ); } void CDnWorldBrokenBuffProp::OnMessage( const boost::shared_ptr& pMessage ) { m_BuffPropComponent.OnMessage( pMessage ); } void CDnWorldBrokenBuffProp::OnChangeAction( const char *szPrevAction ) { if( (0 == strcmp( szPrevAction, "Activate" ) && 0 == strcmp( GetCurrentAction(), "Idle" )) || (0 == strcmp( szPrevAction, "Off" ) && 0 == strcmp(GetCurrentAction(), "Idle")) ) // off ¾×¼Ç ÈÄ¿¡ idle ·Î ³Ñ¾î°¡´Â ÇÁ¶øµµ ÀÖÀ½. { // Àû¿ëµÇ´ø È¿°ú »èÁ¦. m_BuffPropComponent.RemoveAffectedStateEffects(); } }