#include "StdAfx.h" #include "DnPropStateItemDrop.h" #include "DnWorldActProp.h" #include "TaskManager.h" #include "DnPartyTask.h" #include "DnItemTask.h" #ifdef _GAMESERVER #include "DNUserSession.h" #endif #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif CDnPropStateItemDrop::CDnPropStateItemDrop( DnPropHandle hEntity ) : CDnPropState(hEntity) { m_iType = ITEM_DROP; } CDnPropStateItemDrop::~CDnPropStateItemDrop(void) { } bool CDnPropStateItemDrop::OnEntry( LOCAL_TIME LocalTime, float fDelta ) { CDnPropState::OnEntry( LocalTime, fDelta ); #ifdef _GAMESERVER if( !m_hEntity ) return false; CDnWorldActProp* pActProp = static_cast( m_hEntity.GetPointer() ); #ifdef ENABLE_PROP_STATE_LOG if( NULL == pActProp ) OutputDebug( "[?? Prop FSM Log] CDnPropStateItemDrop::OnEntry Entity Prop is NULL!\n" ); else OutputDebug( "[Prop(%d) FSM Log] CDnPropStateItemDrop::OnEntry Entity Prop is Valid \n", m_hEntity->GetUniqueID() ); #endif if( NULL == pActProp ) return false; CDnPartyTask* pTask = (CDnPartyTask *)CTaskManager::GetInstance(m_hEntity->GetRoom()).GetTask( "PartyTask" ); if( !pTask ) return false; int iNumDropItem = pActProp->GetNumDropItem(); int nItemCount = iNumDropItem; // #37265 ¾ÆÀÌÅÛ µå¶øÀ» ¼­¹ö »çÀ̵å·Î º¯°æ. // ¾ÆÀÌÅÛ »Ñ·ÁÁØ´Ù~ CDnItemTask *pItemTask = (CDnItemTask *)CTaskManager::GetInstance(m_hEntity->GetRoom()).GetTask( "ItemTask" ); EtVector3 vPos = m_hEntity->GetMatEx()->m_vPosition;//m_matExWorld.m_vPosition; // vPos.y = CDnWorld::GetInstance(GetRoom()).GetHeight( vPos ); for( int i = 0; i < iNumDropItem; i++ ) { const CDnItem::DropItemStruct *pItem = pActProp->GetDropItemByIndex( i ); int nRotate = (int)( ( ( ( m_hEntity->GetUniqueID() * 10 ) + 360 ) / (float)iNumDropItem ) * i ); // #37265 ÁÖÀÎÀÌ ÀÖ´Â °æ¿ì¿£ ¼ÒÀ¯±Ç Áã¾îÁ༭ µå¶ø. if( m_hDropItemOwner ) { #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pItemTask->RequestDropItem( pItem->dwUniqueID, vPos, pItem->nItemID, pItem->nSeed, pItem->nCount, nRotate, m_hDropItemOwner->GetSessionID(), pItem->nEnchantID ); #else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pItemTask->RequestDropItem( pItem->dwUniqueID, vPos, pItem->nItemID, pItem->nSeed, pItem->nCount, nRotate, m_hDropItemOwner->GetSessionID() ); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) } else { #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pItemTask->RequestDropItem( pItem->dwUniqueID, vPos, pItem->nItemID, pItem->nSeed, pItem->nCount, nRotate, -1, pItem->nEnchantID ); #else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pItemTask->RequestDropItem( pItem->dwUniqueID, vPos, pItem->nItemID, pItem->nSeed, pItem->nCount, nRotate ); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) } } pActProp->ClearDropItemList(); #endif return true; } bool CDnPropStateItemDrop::OnProcess( LOCAL_TIME LocalTime, float fDelta ) { CDnPropState::OnProcess( LocalTime, fDelta ); return true; } bool CDnPropStateItemDrop::OnLeave( LOCAL_TIME LocalTime, float fDelta ) { CDnPropState::OnLeave( LocalTime, fDelta ); #ifdef ENABLE_PROP_STATE_LOG OutputDebug( "[Prop(%d) FSM Log] CDnPropStateItemDrop::OnLeave\n", m_hEntity->GetUniqueID() ); #endif return true; }