2024-12-21 10:04:04 +08:00
# 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 ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <EFBFBD> <EFBFBD> <20> ̸<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ´ <EFBFBD> .
DNTableFileFormat * pSkillTable = GetDNTable ( CDnTableDB : : TSKILL ) ;
DNTableFileFormat * pSkillLevelTable = GetDNTable ( CDnTableDB : : TSKILLLEVEL ) ;
vector < int > vlSkillLevelList ;
if ( pSkillLevelTable - > GetItemIDListFromField ( " _SkillIndex " , iSkillID , vlSkillLevelList ) < = 0 )
{
_ASSERT ( ! " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> <20> <> ų<EFBFBD> <C5B3> <EFBFBD> <EFBFBD> <20> <> ų <20> ε<EFBFBD> <CEB5> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ų <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ̺<EFBFBD> <CCBA> <EFBFBD> <EFBFBD> <EFBFBD> ã<> <C3A3> <20> <> <20> <> <EFBFBD> <EFBFBD> ." ) ;
//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 & & " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> <20> <> ų<EFBFBD> <C5B3> <20> ش<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ." ) ;
// <20> <> <EFBFBD> <EFBFBD> ȿ<> <C8BF> <20> <> <EFBFBD> <EFBFBD> <20> ε<EFBFBD>
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 ( ) ;
// <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ̹Ƿ<CCB9> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> Ե<EFBFBD> <20> <> ų<EFBFBD> ̶<EFBFBD> <CCB6> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> .
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 )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϶<EFBFBD> <CFB6> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
if ( vlhActors [ i ] - > IsAppliedThisStateBlow ( STATE_BLOW : : BLOW_149 ) )
continue ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> Ʈ <20> ñ׳ <C3B1> <D7B3> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <EFBFBD> <EFBFBD> <20> ־<EFBFBD> <D6BE> ֵ<EFBFBD> <D6B5> <EFBFBD> ó<> <C3B3> <EFBFBD> Ѵ <EFBFBD> .
// <20> <> <EFBFBD> ߿<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ͳ<EFBFBD> <20> ÷<EFBFBD> <C3B7> ̾<EFBFBD> ó<EFBFBD> <C3B3> <20> <> ų <20> <> ø ó<> <C3B3> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> 䱸<EFBFBD> Ǹ<EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> hit signal ó<> <C3B3> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> Ѵ <EFBFBD> .
//// <20> <> ų <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> Ʊ<EFBFBD> <C6B1> ΰ<EFBFBD> Ÿ<> <C5B8> <EFBFBD> ΰ<EFBFBD> <CEB0> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ѵ <EFBFBD> .
//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;
// // <20> <> ų <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> Ʊ<EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <20> <> <EFBFBD> <EFBFBD> <20> ʿ<EFBFBD> <CABF> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> θ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ؾ<EFBFBD> <20> Ѵ <EFBFBD> .
// case CDnSkill::All:
// break;
//}
// // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ̻<EFBFBD> Add <20> ÿ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ε<EFBFBD> <CEB5> <EFBFBD> ó<> <C3B3> <20> ʿ<EFBFBD> .
// // <20> ش<EFBFBD> Actor<6F> <72> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <20> <> <EFBFBD> <EFBFBD> <20> ε<EFBFBD> <CEB5> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ͽ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> 쿡 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ̻<EFBFBD> <20> ߰<EFBFBD> <20> <> Ŵ.
// map<int, bool> 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 [<5B> <> <EFBFBD> <EFBFBD> Ʈ <20> 巡<EFBFBD> <E5B7A1> ] HitStateEffect <20> Ӽ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> .
if ( pStruct & & pStruct - > szSkipStateBlows & & CDnSkill : : IsSkipStateBlow ( pStruct - > szSkipStateBlows , ( STATE_BLOW : : emBLOW_INDEX ) pLocalStruct - > nID ) )
continue ;
//#endif // PRE_ADD_SKIP_STATEBLOW
//
// // <20> Ʊ<EFBFBD> <C6B1> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ִ<EFBFBD> <20> <> ų<EFBFBD> <C5B3> <20> <> <EFBFBD> 쿣 Self <20> <> <EFBFBD> <EFBFBD> Target <20> <> <20> <> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ǿ<EFBFBD> <C7BE> ִ<EFBFBD> .
// // Self <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <EFBFBD> <EFBFBD> <20> ڽſ <DABD> <C5BF> <EFBFBD> <20> ̹<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ǿ<EFBFBD> <C7BE> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> Hit <20> ñ׳ <C3B1> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ǵ<EFBFBD> <20> <> <EFBFBD> ̱<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Target <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ȴ<EFBFBD> .
// 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;
// }
//
// // <20> <> <EFBFBD> <EFBFBD> <20> <> ų <20> <> ø<EFBFBD> <C3B8> <20> <> <EFBFBD> 쿣 <20> <> ų ȿ<> <C8BF> <20> ߿<EFBFBD> Ȯ<> <C8AE> üũ<C3BC> ϴ<EFBFBD> <20> ͵<EFBFBD> <CDB5> <EFBFBD> <20> ̹<EFBFBD> CanApplySkillStateEffect <20> <> <EFBFBD> <EFBFBD> Ȯ<> <C8AE> üũ<C3BC> ǰ<EFBFBD>
// // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ̴<EFBFBD> . <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ⼱ Ȯ<> <C8AE> üũ <20> Ȱ<EFBFBD> <C8B0> <EFBFBD> Ȯ<> <C8AE> <EFBFBD> ϰ<EFBFBD> <20> ȰŶ<C8B0> <C5B6> <EFBFBD> <20> ٽ<EFBFBD> Ȯ<> <C8AE> üũ <20> <> <EFBFBD> ϵ<EFBFBD> <CFB5> <EFBFBD> <20> Լ<EFBFBD> ȣ <> <C8A3> <20> <> <EFBFBD> ش<EFBFBD> .
// bool bAllowAddThisSE = true;
// bool bCheckCanBegin = true;
// if( CDnSkill::ApplyDuplicateSameSkill == eResult )
// {
// map<int, bool>::iterator iter = mapDuplicateResult.find( pLocalStruct->nID );
// // <20> ʿ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> Ͱ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <EFBFBD> <EFBFBD> <20> ɷ<EFBFBD> <C9B7> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ƿ<EFBFBD> <20> ׳ <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <20> ߰<EFBFBD> <20> <> ƾ <20> <> <EFBFBD> <EFBFBD> .
// if( mapDuplicateResult.end() != iter )
// {
// // <20> <> <EFBFBD> <EFBFBD> <20> <> ų<EFBFBD> <C5B3> Ȯ<> <C8AE> <EFBFBD> ִ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ɷ<EFBFBD> <C9B7> ־ CanAdd <20> <> ȣ <> <C8A3> <EFBFBD> غ<EFBFBD> <D8BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> .
// // <20> ̷<EFBFBD> <20> <> <EFBFBD> 쿣 <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <20> ߰<EFBFBD> <DFB0> <EFBFBD> <EFBFBD> <EFBFBD> <20> ʴ´ <CAB4> .
// if( false == (iter->second) )
// bAllowAddThisSE = false;
// else
// // <20> ̹<EFBFBD> CanAdd <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ̹Ƿ<CCB9> CmdAddStateEffect ȣ <> <C8A3> <20> <> <20> <> <EFBFBD> <EFBFBD> üũ<C3BC> <C5A9> <EFBFBD> <EFBFBD> <20> ʵ<EFBFBD> <CAB5> <EFBFBD> <20> <> <EFBFBD> ش<EFBFBD> .
// bCheckCanBegin = false;
// }
// }
//if( bAllowAddThisSE )
//{
//// <20> <> <EFBFBD> ⼭ <20> <> <EFBFBD> ϵǾ<CFB5> <20> ִ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> Ǿ<EFBFBD> <C7BE> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ȿ<EFBFBD> <C8BF> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ش<EFBFBD> . [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*/ ) ;
//}
}
//}
// <20> <> ų <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ¸ <EFBFBD> <C2B8> <EFBFBD> Ʈ <20> ʱ<EFBFBD> ȭ [2010/12/09 semozz]
//vlhActors[i]->InitStateBlowIDToRemove();
}
}
# endif // #ifdef PRE_ADD_HIT_PROP_ADD_SE