#include "StdAfx.h" #include "DnSkillPropComponent.h" #include "DnTableDB.h" #include "EtMatrixEx.h" #include "DnWorldProp.h" #include "DnProjectile.h" #include "DnMonsterActor.h" CDnSkillPropComponent::CDnSkillPropComponent(void) { } CDnSkillPropComponent::~CDnSkillPropComponent(void) { SAFE_RELEASE_SPTR( m_hSkill ); } void CDnSkillPropComponent::Initialize( int iSkillID, int iSkillLevel ) { if( iSkillID == 0 || iSkillLevel == 0 ) return; // »ç¿ëÇÒ »óÅÂÈ¿°ú¸¦ ¹Ì¸® »ý¼ºÇØ ³õ´Â´Ù. DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL ); DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL ); vector vlSkillLevelList; if( pSkillLevelTable->GetItemIDListFromField( "_SkillIndex", iSkillID, vlSkillLevelList ) <= 0 ) { _ASSERT( !"ÇÁ¶øÀÌ »ç¿ëÇÏ´Â ½ºÅ³¿¡¼­ ½ºÅ³ À妽º¸¦ ½ºÅ³ ·¹º§ Å×ÀÌºí¿¡¼­ ãÀ» ¼ö ¾øÀ½." ); //return false; } int iSkillLevelTableID = -1; for( int i = 0; i < (int)vlSkillLevelList.size(); ++i ) { int iNowLevel = pSkillLevelTable->GetFieldFromLablePtr( vlSkillLevelList.at(i), "_SkillLevel" )->GetInteger(); if( iNowLevel == iSkillLevel ) { iSkillLevelTableID = vlSkillLevelList.at( i ); break; } } _ASSERT( -1 != iSkillLevelTableID && "ÇÁ¶øÀÌ »ç¿ëÇÏ´Â ½ºÅ³ÀÇ ÇØ´ç ·¹º§ÀÌ ¾øÀ½." ); // »óÅ ȿ°ú Á¤º¸ ·Îµù CDnSkill::StateEffectStruct StateEffect; char caLable[ 64 ]; ZeroMemory( caLable, sizeof(caLable) ); for( int i = 0; i < CDnSkill::MAX_STATE_EFFECT_COUNT; ++i ) { sprintf_s( caLable, "_EffectClass%d", i + 1 ); StateEffect.nID = pSkillTable->GetFieldFromLablePtr( iSkillID, caLable )->GetInteger(); if( StateEffect.nID < 1 ) continue; sprintf_s( caLable, "_EffectClass%dApplyType", i + 1 ); StateEffect.ApplyType = (CDnSkill::StateEffectApplyType)pSkillTable->GetFieldFromLablePtr( iSkillID, caLable )->GetInteger(); sprintf_s( caLable, "_EffectClassValue%d", i + 1 ); StateEffect.szValue = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caLable )->GetString(); sprintf_s( caLable, "_EffectClassValue%dDuration", i + 1 ); StateEffect.nDurationTime = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caLable )->GetInteger(); m_vlStateEffectList.push_back( StateEffect ); } m_SkillInfo.iSkillID = iSkillID; m_SkillInfo.iSkillLevelID = iSkillLevelTableID; m_SkillInfo.iLevel = iSkillLevel; m_SkillInfo.eDurationType = (CDnSkill::DurationTypeEnum)pSkillTable->GetFieldFromLablePtr( iSkillID, "_DurationType" )->GetInteger(); m_SkillInfo.eTargetType = (CDnSkill::TargetTypeEnum)pSkillTable->GetFieldFromLablePtr( iSkillID, "_TargetType" )->GetInteger(); m_SkillInfo.iSkillDuplicateMethod = pSkillTable->GetFieldFromLablePtr( iSkillID, "_SkillDuplicate" )->GetInteger(); m_SkillInfo.iDuplicateCount = pSkillTable->GetFieldFromLablePtr( iSkillID, "_EffectAmassCount" )->GetInteger(); m_SkillInfo.iDissolvable = pSkillTable->GetFieldFromLablePtr( iSkillID, "_Dissolvable" )->GetInteger(); // ¹öÇÁ ÇÁ¶ø¿¡¼­ »ç¿ëÇÏ´Â ¸ðµâÀ̹ǷΠÇÁ¶ø¿¡¼­ ºñ·ÔµÈ ½ºÅ³À̶ó´Â Á¤º¸¸¦ ¼ÂÆÃ. m_SkillInfo.bFromBuffProp = true; } void CDnSkillPropComponent::OnSignal( DnActorHandle hActor, DnPropHandle hProp, SignalTypeEnum Type, void *pPtr, LOCAL_TIME LocalTime, LOCAL_TIME SignalStartTime, LOCAL_TIME SignalEndTime, int nSignalIndex ) { switch( Type ) { case STE_Projectile: { ProjectileStruct *pStruct = (ProjectileStruct *)pPtr; MatrixEx LocalCross = *hProp->GetMatEx(); CDnProjectile *pProjectile = CDnProjectile::CreateProjectile( hProp->GetRoom(), hActor, LocalCross, pStruct ); if( pProjectile == NULL ) break; pProjectile->SetShooterProp( hProp ); if( m_SkillInfo.iSkillID != 0 ) { int iNumStateEffect = (int)m_vlStateEffectList.size(); for( int iStateEffect = 0; iStateEffect < iNumStateEffect; ++iStateEffect ) pProjectile->AddStateEffect( m_vlStateEffectList.at(iStateEffect) ); if( !m_hSkill ) m_hSkill = CDnSkill::CreateSkill( hActor, m_SkillInfo.iSkillID, m_SkillInfo.iLevel ); pProjectile->SetParentSkill( m_hSkill ); pProjectile->SetParentSkillInfo( m_SkillInfo ); //bool bActorAttachWeapon = false; //if( pStruct->nWeaponTableID == 0 && GetWeapon(1) ) bActorAttachWeapon = true; //OnProjectile( pProjectile, bActorAttachWeapon ); //OnSkillProjectile( pProjectile ); } } break; default: hActor->OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex ); break; } } #ifdef PRE_ADD_HIT_PROP_ADD_SE //void CDnSkillPropComponent::ApplyStateBlowsToTheseTargets( DnActorHandle hPropActor, DNVector(DnActorHandle)& vlhActors ) void CDnSkillPropComponent::ApplyStateBlowsToTheseTargets( DnActorHandle hPropActor, DNVector(DnActorHandle)& vlhActors, HitStruct * pStruct ) { if( !m_hSkill ) m_hSkill = CDnSkill::CreateSkill( hPropActor, m_SkillInfo.iSkillID, m_SkillInfo.iLevel ); if( !m_hSkill ) return; int iNumActorApplyStateEffect = (int)vlhActors.size(); for( int i = 0; i < iNumActorApplyStateEffect; ++i ) { // ´ë»óÀÌ ¾óÀ½°¨¿Á »óÅÂÀ϶§´Â »óÅÂÈ¿°ú Àû¿ë ¹«½Ã if (vlhActors[ i ]->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149)) continue; // ÇÁ¶ø¿¡¼­´Â È÷Æ® ½Ã±×³ÎÀ» Åë°úÇÑ ´ë»ó¿¡°Ô // »óÅÂÈ¿°ú¸¦ ³Ö¾îÁÖµµ·Ï ó¸®ÇÑ´Ù. // ³ªÁß¿¡ ¸ó½ºÅͳª Ç÷¹À̾îó·³ ½ºÅ³ Áßø ó¸® µî º¹ÀâÇÑ ±â´ÉÀÌ ¿ä±¸µÇ¸é // ¾×ÅÍÀÇ hit signal ó¸®¿Í µ¿ÀÏÇÑ Çü½ÄÀ¸·Î °¡Á®°¡¾ß ÇÑ´Ù. //// ½ºÅ³ ´ë»ó ¼³Á¤ÀÌ ¾Æ±ºÀΰ¡ Ÿ°ÙÀΰ¡¿¡ µû¶ó »óÅÂÈ¿°ú Àû¿ëÀ» ±¸ºÐÇÑ´Ù. //switch( m_hSkill->GetTargetType() ) //{ // case CDnSkill::Enemy: // case CDnSkill::Self: // if( hPropActor->GetTeam() == vlhActors[ i ]->GetTeam() ) // continue; // break; // case CDnSkill::Friend: // case CDnSkill::Party: // if( hPropActor->GetTeam() != vlhActors[ i ]->GetTeam() ) // continue; // break; // // ½ºÅ³ Àû¿ë ´ë»óÀÌ ¾Æ±º/Àû±º ÀüºÎ ´Ù ¶ó¸é »óÅÂÈ¿°ú Àû¿ë ÂÊ¿¡¼­ Àû¿ë ¿©ºÎ¸¦ ±¸ºÐÇØ¾ß ÇÑ´Ù. // case CDnSkill::All: // break; //} // // »óÅÂÀÌ»ó Add ½Ã¿¡ Áö¼Ó ±¸ºÐ À妽º ó¸® ÇÊ¿ä. // // ÇØ´ç ActorÀÇ Áö¼ÓÈ¿°ú ±¸ºÐ À妽º¸¦ ±¸ºÐÇÏ¿© ¼º°øÇÑ °æ¿ì¿¡ »óÅÂÀÌ»ó Ãß°¡ ½ÃÅ´. // map mapDuplicateResult; // CDnSkill::CanApply eResult = CDnSkill::CanApplySkillStateEffect( vlhActors[i], m_hSkill, mapDuplicateResult ); // if( CDnSkill::CanApply::Fail != eResult ) // { for( DWORD k = 0; k < m_hSkill->GetStateEffectCount(); k++ ) { CDnSkill::StateEffectStruct *pLocalStruct = m_hSkill->GetStateEffectFromIndex(k); // //#if defined(PRE_ADD_SKIP_STATEBLOW) // #74389 [µ¥ÀúÆ® µå·¡°ï] HitStateEffect ¼Ó¼º ÇÁ¶ø ¹ö±×. if( pStruct && pStruct->szSkipStateBlows && CDnSkill::IsSkipStateBlow(pStruct->szSkipStateBlows, (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID) ) continue; //#endif // PRE_ADD_SKIP_STATEBLOW // // // ¾Æ±º±îÁö Èú ½ÃÄÑÁÖ´Â ½ºÅ³ÀÇ °æ¿ì¿£ Self Èú°ú Target Èú µÎ °³ÀÇ »óÅÂÈ¿°ú°¡ ¼±¾ðµÇ¾îÀÖ´Ù. // // Self »óÅÂÈ¿°ú´Â Àڽſ¡°Ô ÀÌ¹Ì Àû¿ëµÇ¾ú°í ¿©±ä Hit ½Ã±×³Î ÆÇÁ¤µÇ´Â °÷ÀÌ±â ‹š¹®¿¡ Target ¸¸ Àû¿ëµÈ´Ù. // switch( pLocalStruct->ApplyType ) // { // case CDnSkill::ApplySelf: // continue; // break; // // case CDnSkill::ApplyTarget: // break; // // case CDnSkill::ApplyEnemy: // if( hPropActor->GetTeam() == vlhActors[ i ]->GetTeam() ) // continue; // break; // // case CDnSkill::ApplyFriend: // if( hPropActor->GetTeam() != vlhActors[ i ]->GetTeam() ) // continue; // break; // } // // // °°Àº ½ºÅ³ ÁßøÀÏ °æ¿ì¿£ ½ºÅ³ È¿°ú Áß¿¡ È®·ü üũÇÏ´Â °ÍµéÀº ÀÌ¹Ì CanApplySkillStateEffect ¿¡¼­ È®·üüũµÇ°í // // Åë°úµÈ »óÅÂÀÌ´Ù. µû¶ó¼­ ¿©±â¼± È®·ü üũ µÈ°ÇÁö È®ÀÎÇÏ°í µÈ°Å¶ó¸é ´Ù½Ã È®·ü üũ ¾ÈÇϵµ·Ï ÇÔ¼ö È£Ãâ ÇØÁØ´Ù. // bool bAllowAddThisSE = true; // bool bCheckCanBegin = true; // if( CDnSkill::ApplyDuplicateSameSkill == eResult ) // { // map::iterator iter = mapDuplicateResult.find( pLocalStruct->nID ); // // ¸Ê¿¡ ¾ø´Â °æ¿ì ÇöÀç ¾×ÅͰ¡ »óÅÂÈ¿°ú¿¡ °É·ÁÀÖÁö ¾ÊÀ¸¹Ç·Î ±×³É Á¤»óÀûÀ¸·Î »óÅÂÈ¿°ú Ãß°¡ ·çƾ ½ÇÇà. // if( mapDuplicateResult.end() != iter ) // { // // °°Àº ½ºÅ³ÀÇ È®·üÀÖ´Â »óÅÂÈ¿°ú°¡ ÇöÀç °É·ÁÀ־ CanAdd ¸¦ È£ÃâÇØº¸¾ÒÀ¸³ª ½ÇÆÐÇßÀ½. // // ÀÌ·± °æ¿ì¿£ »óÅÂÈ¿°ú Ãß°¡ÇÏÁö ¾Ê´Â´Ù. // if( false == (iter->second) ) // bAllowAddThisSE = false; // else // // ÀÌ¹Ì CanAdd ¸¦ Åë°úÇÑ »óÅÂÀ̹ǷΠCmdAddStateEffect È£Ã⠽à µû·Î üũÇÏÁö ¾Êµµ·Ï ÇØÁØ´Ù. // bCheckCanBegin = false; // } // } //if( bAllowAddThisSE ) //{ //// ¿©±â¼­ µî·ÏµÇ¾î ÀÖ´Â Á¦°Å µÇ¾î¾ßÇÒ »óÅÂÈ¿°úµé ¾ø¾Ø´Ù. [2010/12/08 semozz] //vlhActors[i]->RemoveResetStateBlow(); vlhActors[i]->CmdAddStateEffect( m_hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID, pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str()/*, false, bCheckCanBegin*/ ); //} } //} // ½ºÅ³ »ç¿ë ³¡³µÀ¸¸é ¸®¼Â¸®½ºÆ® ÃʱâÈ­ [2010/12/09 semozz] //vlhActors[i]->InitStateBlowIDToRemove(); } } #endif // #ifdef PRE_ADD_HIT_PROP_ADD_SE