DragonNest/GameCommon/DnActorStatIntervalManipulator.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

151 lines
3.8 KiB
C++

#include "StdAfx.h"
#include "DnActorStatIntervalManipulator.h"
#include "DnDamageBase.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CDnActorStatIntervalManipulator::CDnActorStatIntervalManipulator( DnActorHandle hActor, DnBlowHandle hParentBlow ) : m_hActor( hActor ),
m_hParentBlow( hParentBlow ),
m_LocalStartTime( 0 ),
m_dwInterval( 0 ),
m_LocalElapsedTime( 0 ),
m_LastIntervalTime( 0 )
{
}
CDnActorStatIntervalManipulator::~CDnActorStatIntervalManipulator(void)
{
}
void CDnActorStatIntervalManipulator::OnBegin( LOCAL_TIME LocalTime, DWORD dwInterval )
{
m_LocalElapsedTime = 0;
m_LocalStartTime = LocalTime;
m_LastIntervalTime = LocalTime;
m_dwInterval = dwInterval;
}
//void CDnActorStatIntervalManipulator::_ProcessInterval( int& iProcessManipulateCount, int iDestProcessCount )
//{
// if( !m_hActor || m_hActor->IsDie() )
// return;
//
//#ifdef _GAMESERVER
// // 이 객체를 소유한 상태효과는 반드시 주기적으로 처리하는 함수를 구현한 상태여야 함.
// bool bResult = m_hParentBlow->OnCustomIntervalProcess();
// _ASSERT( bResult );
//
// // Blow 로 죽었으면 Blow 시전 Actor 를 Hitter 로 설정해준다.
// if( m_hActor->IsDie() )
// {
// DnActorHandle hHitter;
// if( m_hParentBlow )
// {
// const CDnSkill::SkillInfo* pSkillInfo = m_hParentBlow->GetParentSkillInfo();
// if( pSkillInfo )
// hHitter = pSkillInfo->hSkillUser;
// }
//
// m_hActor->Die( hHitter );
// }
//#endif
//}
void CDnActorStatIntervalManipulator::Process( LOCAL_TIME LocalTime, float fDelta )
{
if( 0 == LocalTime )
return;
if( !m_hActor || m_hActor->IsDie() )
return;
// 존 이동하면 LocalTime 이 리셋되므로..
if( LocalTime < m_LastIntervalTime )
m_LastIntervalTime = LocalTime;
if( m_dwInterval < LocalTime - m_LastIntervalTime )
{
// 이 객체를 소유한 상태효과는 반드시 주기적으로 처리하는 함수를 구현한 상태여야 함.
bool bResult = m_hParentBlow->OnCustomIntervalProcess();
_ASSERT( bResult );
m_LastIntervalTime = LocalTime;
#ifdef _GAMESERVER
// Blow 로 죽었으면 Blow 시전 Actor 를 Hitter 로 설정해준다.
// 중요!!
// 반드시 Die 처리가 가장 나중에 되어야 한다.
// Die 처리가 되면 상태효과가 사라지므로 해당 상태효과가 가지고 있는 이 객체 또한 사라짐.
// 그러므로 어떠한 조작도 있어선 안된다.
#if defined(PRE_FIX_61382)
DnActorHandle hActor = CDnActor::GetOwnerActorHandle(m_hActor);
if( hActor && hActor->IsDie() )
{
DnActorHandle hHitter;
if( m_hParentBlow )
{
const CDnSkill::SkillInfo* pSkillInfo = m_hParentBlow->GetParentSkillInfo();
if( pSkillInfo )
hHitter = pSkillInfo->hSkillUser;
}
hActor->Die( hHitter );
// 이 아래에서 어떠한 변수 값 변경이나 처리를 하면 안됨!
return;
}
#else
if( m_hActor->IsDie() )
{
DnActorHandle hHitter;
if( m_hParentBlow )
{
const CDnSkill::SkillInfo* pSkillInfo = m_hParentBlow->GetParentSkillInfo();
if( pSkillInfo )
hHitter = pSkillInfo->hSkillUser;
}
m_hActor->Die( hHitter );
// 이 아래에서 어떠한 변수 값 변경이나 처리를 하면 안됨!
return;
}
#endif // PRE_FIX_61382
#endif
}
}
void CDnActorStatIntervalManipulator::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
//if( false == m_hActor || m_hActor->IsDie() )
// return;
//if( m_hParentBlow->GetDurationTime() > 0.0f )
//{
// // 중간에 끊어진 상태라면 ServerEndTime은 이미 CmdRemoveStateEffect 패킷을 쏘는 시점에 그 시간으로 갱신된 상태임..
// LOCAL_TIME WholeElapsed = m_ServerEndTime - m_ServerStartTime;
// int iChangedProcessCount = int(WholeElapsed / m_dwInterval) + 1;
// if( m_iProcessedManipulateCount < iChangedProcessCount )
// _ProcessInterval( m_iProcessedManipulateCount, iChangedProcessCount );
//}
//else
//{
// _ProcessInterval( m_iProcessedManipulateCount, m_iExpectedManipulateCount );
//}
}