DragonNest/Server/DNGameServer/DnWorldBrokenDamageProp.cpp

167 lines
5.6 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#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Ÿ<70><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>.
#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()){
// <20><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>
// g_pLogConnection->QueryLogStage(GetRoom()->GetRoomID(), pTask->GetMapTableID(), 0, 0, nTableID); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> 090226
}
else {
for( DWORD i=0; i<m_VecDropItemList.size(); i++ ) {
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
if( CDnDropItem::PreInitializeItem( GetRoom(), m_VecDropItemList[i].nItemID, m_VecDropItemList[i].nEnchantID ) == false )
#else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
if( CDnDropItem::PreInitializeItem( GetRoom(), m_VecDropItemList[i].nItemID ) == false )
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
{
m_VecDropItemList.erase( m_VecDropItemList.begin() + i );
i--;
continue;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>
// g_pLogConnection->QueryLogStage(GetRoom()->GetRoomID(), pTask->GetMapTableID(), 0, m_VecDropItemList[i].nItemID, nTableID); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> 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 )
{
// <20><>ų <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><>Ÿ ģ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ.
if( APPLY_SKILL_LASTHITTER == m_iSkillApplyType )
{
DnActorHandle hLastHitter = pHitter->GetActorHandle();
if( hLastHitter )
{
const CDnSkill::SkillInfo& SkillInfo = m_SkillComponent.GetSkillInfo();
map<int, bool> 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 -> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!\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 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ִ<EFBFBD> Ÿ<><C5B8> Ÿ<>Ե<EFBFBD><D4B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD>ؼ<EFBFBD> hitsignal <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
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 );
}