DragonNest/GameCommon/DnFreezingPrisonBlow.cpp

531 lines
16 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnFreezingPrisonBlow.h"
#include "DnHighLanderBlow.h"
#include "DnCantMoveBlow.h"
#include "DnCantActionBlow.h"
#include "DnFrameStopBlow.h"
#include "EtActionBase.h"
#include "EtActionSignal.h"
#if !defined( USE_BOOST_MEMPOOL )
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif // #if !defined( USE_BOOST_MEMPOOL )
const int FREEZING_PRISON_INTERVAL_TIME = 1000;
CDnFreezingPrisonBlow::CDnFreezingPrisonBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ),
m_pCantMoveBlow( new CDnCantMoveBlow(hActor, NULL ) ),
m_pCantActionBlow( new CDnCantActionBlow(hActor, NULL) ),
m_pFrameStopBlow( new CDnFrameStopBlow(hActor, NULL) ),
m_IntervalChecker( hActor, GetMySmartPtr() ),
m_fIntervalDamage( 0.0f ),
m_iDurability( 0 ),
m_bDurabilityDestroyed( false )
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_149;
SetValue( szValue );
m_iFinalDamage = 0;
m_iOriginalTeam = -1;
// <20><><EFBFBD>ڰ<EFBFBD> <20><> 3<><33><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>ӽð<D3BD> <20><> <20>Ǿ<EFBFBD> <20><><EFBFBD>߽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
string strValue( szValue );
// <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
std::vector<string> vlTokens;
TokenizeA( strValue, vlTokens, ";" );
bool bValidArgument = (3 == (int)vlTokens.size());
_ASSERT( bValidArgument && "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>." );
if( bValidArgument )
{
string strDurability = vlTokens.at( 0 );
string strFinalDamage = vlTokens.at( 1 );
string strIntervalDamage = vlTokens.at( 2 );
m_iDurability = atoi( strDurability.c_str() );
m_iFinalDamage = atoi( strFinalDamage.c_str() );
m_fIntervalDamage = (float)atoi( strIntervalDamage.c_str() );
#ifdef _GAMESERVER
AddCallBackType( SB_ONDEFENSEATTACK );
AddCallBackType( SB_ONCALCDAMAGE );
#endif
m_pCantActionBlow->SetActionWhenCancelAttack( "Freezing" );
}
m_fOrigWight = 0.0f;
m_iOrigPressLevel = 0;
m_iMaxDurability = m_iDurability;
// [2010/12/13 semozz]
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>
if (m_pCantMoveBlow)
m_pCantMoveBlow->SetPermanent(true);
if (m_pCantActionBlow)
m_pCantActionBlow->SetPermanent(true);
if (m_pFrameStopBlow)
m_pFrameStopBlow->SetPermanent(true);
}
CDnFreezingPrisonBlow::~CDnFreezingPrisonBlow(void)
{
SAFE_DELETE( m_pCantMoveBlow );
SAFE_DELETE( m_pCantActionBlow );
SAFE_DELETE( m_pFrameStopBlow );
}
void CDnFreezingPrisonBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
m_IntervalChecker.OnBegin( LocalTime, FREEZING_PRISON_INTERVAL_TIME );
// <20>ൿ<EFBFBD>Ұ<EFBFBD>, <20>̵<EFBFBD><CCB5>Ұ<EFBFBD>
if( m_pCantMoveBlow )
m_pCantMoveBlow->OnBegin( LocalTime, fDelta );
if( m_pCantActionBlow )
m_pCantActionBlow->OnBegin( LocalTime, fDelta );
if( m_pFrameStopBlow )
m_pFrameStopBlow->OnBegin( LocalTime, fDelta );
#if defined(PRE_FIX_50482)
if (m_hActor && m_hActor->GetChangeTeamRefCount() == 0)
{
// <20><><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
m_iOriginalTeam = m_hActor->GetTeam();
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>´<EFBFBD>.
m_hActor->SetOriginalTeam(m_iOriginalTeam);
}
m_hActor->AddChangeTeamRefCount();
m_hActor->SetTeam( m_ParentSkillInfo.iSkillUserTeam );
#else
// <20><><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
m_iOriginalTeam = m_hActor->GetTeam();
m_hActor->SetTeam( m_ParentSkillInfo.iSkillUserTeam );
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>´<EFBFBD>.
m_hActor->SetOriginalTeam(m_iOriginalTeam);
#endif // PRE_FIX_50482
#ifndef _GAMESERVER
_AttachGraphicEffect();
// ó<><C3B3><EFBFBD><EFBFBD> idle <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if( m_hEtcObjectEffect )
m_hEtcObjectEffect->SetActionQueue( "Idle" );
#endif
//<2F><><EFBFBD>۵ɶ<DBB5> Weight/PressLevel<65><6C> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
m_fOrigWight = m_hActor->GetWeight();
m_iOrigPressLevel = m_hActor->GetPressLevel();
//ij<><C4B3><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_hActor->SetWeight(0.0f);
m_hActor->SetPressLevel(-1);
#if defined(_GAMESERVER)
//StateBlow<6F><77> <20><><EFBFBD>۵ɶ<DBB5> UI ǥ<><C7A5>
m_hActor->CmdFreezingPrisonDurablity(GetBlowID(), 100.0f, true);
#endif
OutputDebug( "CDnFreezingPrisonBlow::OnBegin\n" );
}
#ifdef _GAMESERVER
void CDnFreezingPrisonBlow::_RequestDamage( float fDamage )
{
#if defined(PRE_FIX_44884)
#if defined(PRE_FIX_61382)
DnActorHandle hActor = CDnActor::GetOwnerActorHandle(m_hActor);
if (hActor &&
hActor->IsDie() == false)
{
m_hActor->RequestDamageFromStateBlow(GetMySmartPtr(), (int)fDamage);
//#48491 Ÿ<≯ӷ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ActorStatIntervlaManipulator<6F><72><EFBFBD><EFBFBD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD>.
//<2F><><EFBFBD><EFBFBD><E2BCAD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
//if (m_hActor->IsDie())
// m_hActor->Die(m_ParentSkillInfo.hSkillUser);
}
#else
if (m_hActor->IsDie() == false)
{
m_hActor->RequestDamageFromStateBlow(GetMySmartPtr(), (int)fDamage);
//#48491 Ÿ<≯ӷ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ActorStatIntervlaManipulator<6F><72><EFBFBD><EFBFBD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD>.
//<2F><><EFBFBD><EFBFBD><E2BCAD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
//if (m_hActor->IsDie())
// m_hActor->Die(m_ParentSkillInfo.hSkillUser);
}
#endif // PRE_FIX_61382
#else
// <20><><EFBFBD>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾƾ<CABE> <20>Ѵ<EFBFBD>.
float fResultDamage = fDamage;
if( m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_143 ) )
{
// IsAppliedThisStateBlow() <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> true <20><> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><> <20><>
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> GatherAppliedStateBlowByBlowIndex() <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
DNVector( DnBlowHandle ) vlhHighLanderBlow;
m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_143, vlhHighLanderBlow );
if( 0 < (int)vlhHighLanderBlow.size() )
{
CDnHighlanderBlow* pHighlanderBlow = static_cast<CDnHighlanderBlow*>(vlhHighLanderBlow.front().GetPointer());
fResultDamage += pHighlanderBlow->CalcDamage( fResultDamage );
}
}
DWORD dwHitterUniqueID = m_ParentSkillInfo.hSkillUser ? m_ParentSkillInfo.hSkillUser->GetUniqueID() : -1;
m_hActor->SetHP( m_hActor->GetHP()-(INT64)fResultDamage );
m_hActor->RequestHPMPDelta( m_ParentSkillInfo.eSkillElement, -(INT64)fResultDamage, dwHitterUniqueID );
#endif // PRE_FIX_44884
}
#endif
bool CDnFreezingPrisonBlow::OnCustomIntervalProcess( void )
{
#ifdef _GAMESERVER
if( 0.0f < m_fIntervalDamage )
{
_RequestDamage( m_fIntervalDamage );
}
#else
//if( m_hEtcObjectEffect )
//{
// CEtActionBase::ActionElementStruct* pStruct = m_hEtcObjectEffect->GetElement( "Idle" );
// if( pStruct )
// {
// m_fEffectLength = (float)pStruct->dwLength / 1000.0f;
// }
// _SetDiffuse( 0.0f, 1.0f, 0.0f, 1.0f );
// m_bEffecting = true;
//}
#endif
return true;
}
void CDnFreezingPrisonBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
m_IntervalChecker.Process( LocalTime, fDelta );
if( m_pCantMoveBlow )
m_pCantMoveBlow->Process( LocalTime, fDelta );
if( m_pCantActionBlow )
m_pCantActionBlow->Process( LocalTime, fDelta );
if( m_pFrameStopBlow )
m_pFrameStopBlow->Process( LocalTime, fDelta );
}
void CDnFreezingPrisonBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
#ifndef _GAMESERVER
//_SetDiffuse( 1.0f, 1.0f, 1.0f, 1.0f );
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>. <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//_DetachGraphicEffect();
#endif
if( m_pCantMoveBlow )
m_pCantMoveBlow->OnEnd( LocalTime, fDelta );
if( m_pCantActionBlow )
m_pCantActionBlow->OnEnd( LocalTime, fDelta );
if( m_pFrameStopBlow )
m_pFrameStopBlow->OnEnd( LocalTime, fDelta );
// <20>̷<EFBFBD><CCB7><EFBFBD> <20>ؾ<EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD>.
m_hActor->SetStiffDelta( 0.001f );
#ifdef _GAMESERVER
// <20><><EFBFBD>ӽð<D3BD> <20><> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
if( false == m_bDurabilityDestroyed )
{
_RequestDamage( (float)m_iFinalDamage );
//#48491<39><31><EFBFBD><EFBFBD> Ÿ<≯ӷ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ActorStatIntervlaManipulator<6F><72><EFBFBD><EFBFBD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OnEnd<6E><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Dieó<65><C3B3> <20>ؾ<EFBFBD><D8BE><EFBFBD>.
#if defined(PRE_FIX_61382)
DnActorHandle hActor = CDnActor::GetOwnerActorHandle(m_hActor);
if (hActor && hActor->IsDie())
hActor->Die(m_ParentSkillInfo.hSkillUser);
#else
if (m_hActor->IsDie())
m_hActor->Die(m_ParentSkillInfo.hSkillUser);
#endif // PRE_FIX_61382
}
#else
if (m_hActor->IsDie())
{
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>׾<EFBFBD><D7BE>ٸ<EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Effect <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( m_hEtcObjectEffect )
m_hEtcObjectEffect->SetActionQueue( "Summon_Off" );
OutputDebug("SetActionQueue ---> Summon_Off\n");
}
else
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִµ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ű<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if( IsEnd() )
{
// <20><><EFBFBD><EFBFBD>Ʈ <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD>.
if( m_hEtcObjectEffect )
m_hEtcObjectEffect->SetActionQueue( "Attack" );
OutputDebug("SetActionQueue ---> Attack\n");
}
else
{
// <20><><EFBFBD><EFBFBD>Ʈ <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD>.
if( m_hEtcObjectEffect )
m_hEtcObjectEffect->SetActionQueue( "Break" );
OutputDebug("SetActionQueue ---> Break\n");
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ũ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::SmartPtrSignalImpStruct *pStruct =
(TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::SmartPtrSignalImpStruct *)m_hActor->TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::GetStruct( STATEBLOWEFFECT_ETCOFFSET + m_StateBlow.emBlowIndex, GetBlowID() );
if( pStruct )
pStruct->bLinkObject = false;
// ȿ<><C8BF> <20><><EFBFBD><EFBFBD>... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ִ<EFBFBD> <20><> <20>ƴϰ<C6B4>, <20><><EFBFBD><EFBFBD>Ʈ <20><>ü<EFBFBD><C3BC> destroy <20>ñ׳η<D7B3> <20>˾Ƽ<CBBE> <20>״´<D7B4>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0><EFBFBD> <20><> <20>Ǵ<EFBFBD> <20>ٰŰ<D9B0> <20>Ǵ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
// <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־ <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0><EFBFBD> <20>ȵ<EFBFBD>.
m_hActor->DetachSEEffectSkillInfo( m_ParentSkillInfo );
#endif
m_IntervalChecker.OnEnd( LocalTime, fDelta );
//<2F><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_hActor->SetWeight(m_fOrigWight);
m_hActor->SetPressLevel(m_iOrigPressLevel);
#if defined(_GAMESERVER)
//StateBlow<6F><77> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI<55><49> <20><><EFBFBD>־<EFBFBD><D6BE><EFBFBD>.
m_hActor->CmdFreezingPrisonDurablity(GetBlowID(), 0.0f, false);
#endif
#if defined(PRE_FIX_50482)
if (m_hActor && m_hActor->GetChangeTeamRefCount() == 1)
{
m_hActor->SetTeam(m_iOriginalTeam);
}
m_hActor->RemoveChangeTeamRefCount();
#else
// <20><><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
m_hActor->SetTeam( m_iOriginalTeam );
#endif // PRE_FIX_50482
OutputDebug( "CDnFreezingPrisonBlow::OnEnd\n" );
}
#if !defined(_GAMESERVER)
void CDnFreezingPrisonBlow::OnHit()
{
if (m_hEtcObjectEffect)
m_hEtcObjectEffect->SetActionQueue( "Hit" );
}
//Guage<67>׼ǿ<D7BC><C7BF><EFBFBD> Action<6F>ñ׳<C3B1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Offset<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>.
EtVector3 CDnFreezingPrisonBlow::GetGaugePos()
{
// m_hEtcObjectEffect<63><74> <20><>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>. [2010/12/15 semozz]
EtVector3 vPos = EtVector3(0.0f, 0.0f, 0.0f);
if (m_hEtcObjectEffect)
{
vPos = *m_hEtcObjectEffect->GetPosition();
//<2F><><EFBFBD><EFBFBD><E2BFA1> Hit Signal<61><6C> <20>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>..
CEtActionBase::ActionElementStruct* pActionElement = m_hEtcObjectEffect->GetElement("Gauge");
if (pActionElement)
{
if (pActionElement->pVecSignalList.size() != 1)
{
OutputDebug("Gauge <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Hit Signal<61><6C> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.. !!!\n");
}
else
{
CEtActionSignal *pSignal = pActionElement->pVecSignalList[0];
HitStruct *pStruct = pSignal ? (HitStruct *)pSignal->GetData() : NULL;
if (pStruct)
vPos += *pStruct->vOffset;
}
}
}
return vPos;
}
#endif
#ifdef _GAMESERVER
bool CDnFreezingPrisonBlow::OnDefenseAttack( DnActorHandle hHitter, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess )
{
// <20>ǰݽ<C7B0> <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>?<3F><> <20><><EFBFBD><EFBFBD>
HitParam.vResistance = EtVector3( 0.0f, 0.0f, 0.0f );
HitParam.vVelocity = EtVector3( 0.0f, 0.0f, 0.0f );
HitParam.vViewVec = *(m_hActor->GetLookDir());
return false;
}
float CDnFreezingPrisonBlow::OnCalcDamage( float fOriginalDamage, CDnDamageBase::SHitParam& HitParam )
{
// <20><>Ʈ <20>ñ׳ο<D7B3> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_iDurability -= (int)(HitParam.fDurability * 100.0f);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ǥ<><C7A5> & <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float fCurrentValue = min((float)m_iMaxDurability, max(0.0f, (float)m_iDurability));
float fRate = m_iMaxDurability != 0 ? (fCurrentValue / (float)m_iMaxDurability) : 0.0f;
// <20><><EFBFBD>⼭ false<73><65> <20><><EFBFBD><EFBFBD> <20>ָ<EFBFBD> UI<55><49> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> OnEnd<6E><64><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><E2BFA1><EFBFBD><EFBFBD> bShowGauge<67><65><EFBFBD><EFBFBD> <20>׻<EFBFBD> true<75>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// OnEnd<6E><64><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>Լ<EFBFBD> ȣ<><C8A3>..
bool bShowGauge = true;//fRate > 0.0f;
m_hActor->CmdFreezingPrisonDurablity(GetBlowID(), fRate, bShowGauge);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>
if( m_iDurability <= 0 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ǿ<EFBFBD> <20>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ƹ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>.
m_bDurabilityDestroyed = true;
// CDnStateBlow::Process() <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵȴ<C5B5>.
// Ŭ<><C5AC><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_hActor->AddReserveRemoveBlow( GetMySmartPtr() );
OutputDebug( "CDnFreezingBlow::OnCalcDamage - Freezing Broken by Attack!\n" );
}
return -fOriginalDamage;
}
#endif
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnFreezingPrisonBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
//<2F>Ľ̿<C4BD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::vector<string> vlTokens[2];
string strArgument[2];
//<2F>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
int iDurability[2] = {0, };
int iFinalDamage[2] = {0, };
float fIntervalDamage[2] = {0.0f, };
//////////////////////////////////////////////////////////////////////////
//ù<><C3B9>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>.
strArgument[0] = szOrigValue;
TokenizeA( strArgument[0], vlTokens[0], ";" );
if( vlTokens[0].size() == 3 )
{
iDurability[0] = atoi( vlTokens[0][0].c_str() );
iFinalDamage[0] = atoi( vlTokens[0][1].c_str() );
fIntervalDamage[0] = (float)atof( vlTokens[0][2].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//<2F>ι<EFBFBD>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>
strArgument[1] = szAddValue;
TokenizeA( strArgument[1], vlTokens[1], ";" );
if( vlTokens[1].size() == 3 )
{
iDurability[1] = atoi( vlTokens[1][0].c_str() );
iFinalDamage[1] = atoi( vlTokens[1][1].c_str() );
fIntervalDamage[1] = (float)atof( vlTokens[1][2].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
int iResultDurability = iDurability[0] + iDurability[1];
int iResultFinalDamage = iFinalDamage[0] + iFinalDamage[1];
float fResultIntervalDamage = fIntervalDamage[0] + fIntervalDamage[1];
sprintf_s(szBuff, "%d;%d;%f", iResultDurability, iResultFinalDamage, fResultIntervalDamage);
szNewValue = szBuff;
}
void CDnFreezingPrisonBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
//<2F>Ľ̿<C4BD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::vector<string> vlTokens[2];
string strArgument[2];
//<2F>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
int iDurability[2] = {0, };
int iFinalDamage[2] = {0, };
float fIntervalDamage[2] = {0.0f, };
//////////////////////////////////////////////////////////////////////////
//ù<><C3B9>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>.
strArgument[0] = szOrigValue;
TokenizeA( strArgument[0], vlTokens[0], ";" );
if( vlTokens[0].size() == 3 )
{
iDurability[0] = atoi( vlTokens[0][0].c_str() );
iFinalDamage[0] = atoi( vlTokens[0][1].c_str() );
fIntervalDamage[0] = (float)atof( vlTokens[0][2].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//<2F>ι<EFBFBD>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>
strArgument[1] = szAddValue;
TokenizeA( strArgument[1], vlTokens[1], ";" );
if( vlTokens[1].size() == 3 )
{
iDurability[1] = atoi( vlTokens[1][0].c_str() );
iFinalDamage[1] = atoi( vlTokens[1][1].c_str() );
fIntervalDamage[1] = (float)atof( vlTokens[1][2].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
int iResultDurability = iDurability[0] - iDurability[1];
int iResultFinalDamage = iFinalDamage[0] - iFinalDamage[1];
float fResultIntervalDamage = fIntervalDamage[0] - fIntervalDamage[1];
sprintf_s(szBuff, "%d;%d;%f", iResultDurability, iResultFinalDamage, fResultIntervalDamage);
szNewValue = szBuff;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW