#include "StdAfx.h" #include "DnWorldBrokenDamageProp.h" #include "TaskManager.h" #include "DnGameTask.h" CDnWorldBrokenDamageProp::CDnWorldBrokenDamageProp( CMultiRoom* pRoom ) : CDnWorldBrokenProp( pRoom ), CDnDamageBase( DamageObjectTypeEnum::Prop ), m_iSkillApplyType( -1 ), m_bEnableHitSignal( true ) { } CDnWorldBrokenDamageProp::~CDnWorldBrokenDamageProp(void) { ReleasePostCustomParam(); } bool CDnWorldBrokenDamageProp::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 CDnWorldBrokenDamageProp::InitializeTable( int nTableID ) { if( CDnWorldActProp::InitializeTable( nTableID ) == false ) return false; if( GetData() ) { BrokenDamageStruct* pStruct = (BrokenDamageStruct *)GetData(); bool bResult = false; //#61146 TrapŸÀÔ ÇÁ¶øÀÇ °ø°Ý·ÂÀ» ³­À̵µ¿¡ µû¶ó ´Ù¸£°Ô ¼¼ÆÃÇÒ ¼ö ÀÖ´Â ±¸Á¶. #ifdef PER_ADD_PROP_TRAP_DIFFICULT_SET bResult = InitializeMonsterActorProp( pStruct->nMonsterTableID, pStruct->MonsterWeight ); #else bResult = InitializeMonsterActorProp( pStruct->nMonsterTableID ); #endif if( bResult ) { // m_hMonster->SetUniqueID( STATIC_INSTANCE(CDnActor::s_dwUniqueCount)++ ); 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 } } } } m_iSkillApplyType = pStruct->SkillApplyType; if( 0 != pStruct->nSkillTableID ) { m_SkillComponent.Initialize( pStruct->nSkillTableID, pStruct->nSkillLevel ); } m_HitComponent.Initialize( m_hMonster, &m_Cross, GetMySmartPtr(), this ); } else return false; } return true; } void CDnWorldBrokenDamageProp::OnDamage( CDnDamageBase *pHitter, CDnDamageBase::SHitParam &HitParam ) { CDnWorldBrokenProp::OnDamage( pHitter, HitParam ); if( m_nDurability <= 0 ) { // ½ºÅ³ Àû¿ëŸÀÔÀÌ ¸·Å¸ Ä£ À¯Àú¶ó¸é.. ³»±¸µµ°¡ 0ÀÎÁö Ã¼Å©ÇØ¼­ ½ºÅ³¿¡ ÀÖ´Â »óÅÂÈ¿°ú Àû¿ë½ÃÅ´. if( APPLY_SKILL_LASTHITTER == m_iSkillApplyType ) { DnActorHandle hLastHitter = pHitter->GetActorHandle(); if( hLastHitter ) { const CDnSkill::SkillInfo& SkillInfo = m_SkillComponent.GetSkillInfo(); map mapDuplicateResult; bool bAllowAddStateEffect = (CDnSkill::Fail != CDnSkill::CanApplySkillStateEffect( &SkillInfo, hLastHitter, SkillInfo.iSkillID, SkillInfo.iLevel, SkillInfo.iSkillDuplicateMethod, SkillInfo.eDurationType, mapDuplicateResult )); if( bAllowAddStateEffect ) { int iNumStateEffect = m_SkillComponent.GetNumStateEffect(); for( int iStateEffect = 0; iStateEffect < iNumStateEffect; ++iStateEffect ) { const CDnSkill::StateEffectStruct* pStateEffectInfo = m_SkillComponent.GetStateEffectInfo( iStateEffect ); int iID = hLastHitter->CmdAddStateEffect( &SkillInfo, (STATE_BLOW::emBLOW_INDEX)pStateEffectInfo->nID, pStateEffectInfo->nDurationTime, pStateEffectInfo->szValue.c_str() ); } } else { OutputDebug( "CDnWorldBrokenDamageProp::OnDamage() : APPLY_SKILL_LASTHITTER -> »óÅÂÈ¿°ú Àû¿ë ½ÇÆÐ!\n" ); } } } } } void CDnWorldBrokenDamageProp::OnSignal( SignalTypeEnum Type, void *pPtr, LOCAL_TIME LocalTime, LOCAL_TIME SignalStartTime, LOCAL_TIME SignalEndTime, int nSignalIndex ) { if( m_bEnableHitSignal ) { #ifdef PRE_ADD_HIT_PROP_ADD_SE if( m_hMonster ) { DNVector(DnActorHandle) vlHittedActors; m_HitComponent.OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex, &vlHittedActors ); if( false == vlHittedActors.empty() ) { if( APPLY_SKILL_HITSIGNAL_RANGE == m_iSkillApplyType ) { // ÇÁ¶ø¿¡ Àû¿ëµÉ ¶§´Â ½ºÅ³¿¡ Àִ Ÿ°Ù ŸÀÔµîÀº ¹«½ÃÇϰí ÀýÂ÷ÀÇ °£¼ÒÈ­¸¦ À§Çؼ­ hitsignal À» Åë°úÇÑ °æ¿ì // ½ºÅ³¿¡ ÁöÁ¤µÈ ´ë»ó ÆÀ üũ¸¦ µû·Î ÇÏÁö ¾Ê´Â´Ù. m_SkillComponent.ApplyStateBlowsToTheseTargets( m_hMonster, vlHittedActors ); } } } #else m_HitComponent.OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex ); #endif // #ifdef PRE_ADD_HIT_PROP_ADD_SE } CDnWorldBrokenProp::OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex ); } void CDnWorldBrokenDamageProp::_OnLifeTimeEnd( LOCAL_TIME LocalTime, float fDelta ) { m_bEnableHitSignal = true; CDnWorldBrokenProp::_OnLifeTimeEnd( LocalTime, fDelta ); }