DragonNest/GameCommon/DnEscapeBlow.cpp

804 lines
51 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
<EFBFBD><EFBFBD>#include "StdAfx.h"
#include "DnEscapeBlow.h"
#include "DnCantMoveBlow.h"
#include "DnCantActionBlow.h"
#include "DnTableDB.h"
#include "DnFrameStopBlow.h"
#include "DnMonsterActor.h"
#ifdef _GAMESERVER
#include "DnGameRoom.h"
#include "DnGameDataManager.h"
#include "DnUserSession.h"
#else
#include "DnEtcObject.h"
#include "DnLocalPlayerActor.h"
#include "DnInterface.h"
#include "navigationmesh.h"
#include "InputWrapper.h"
#endif
#if !defined( USE_BOOST_MEMPOOL )
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif // #if !defined( USE_BOOST_MEMPOOL )
const int ICE_DAMAGE_ADD_PROBABILITY = 30;
const LOCAL_TIME SHAKE_TIME = 3000;
CDnEscapeBlow::CDnEscapeBlow( 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_iDurabilityCount( 1 ),
m_dwOriSpeedFrame( 0 ),
m_bNestMap( false )
#ifndef _GAMESERVER
,m_ComboCalc( CDnComboCalculator::CIRCULAR_CHECK )
,m_bShake( false )
,m_ShakeStartTime( 0 )
#endif
,m_bPlayerCharacter( false )
,m_bAllowShakeControl(false)
,m_IntervalChecker( hActor, GetMySmartPtr() )
,m_isAbleIntervalChecker(false)
{
static int sValueType = 1;
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_218;
SetValue( szValue );
std::string str = szValue;//"U<>`<60>;<00><>l<EFBFBD>ij;(0/1)T<><EFBFBD><E4B4BC>ŀ<EFBFBD>;<>a<EFBFBD>X<EFBFBD>";
std::vector<std::string> tokens;
std::string delimiters = ";";
bool bValidValues = false;
//1. <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD>@<EFBFBD> ȩ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> l<EFBFBD><EFBFBD><EFBFBD>
TokenizeA(str, tokens, delimiters);
if (tokens.size() >= 3)
{
m_fValue = (float)atof(tokens[0].c_str());
// m_iDurabilityCount = atoi(tokens[1].c_str());
m_bAllowShakeControl = atoi(tokens[1].c_str()) == 0; //0 : T<EFBFBD><EFBFBD>, 1 : T<EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>L<EFBFBD>
//ȹ<EFBFBD><EFBFBD>ɹ <թ<EFBFBD> a<EFBFBD>X<EFBFBD>@<EFBFBD> 5<EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD>m<EFBFBD>
if (tokens.size() == 3)
{
m_strHitedAction = tokens[2];
}
bValidValues = true;
}
else
{
m_fValue = 0.0f;
// m_iDurabilityCount = 2;
bValidValues = false;
}
if (bValidValues)
{
#ifndef _GAMESERVER
std::vector<BYTE> vlKeysToCheck;
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVELEFT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVERIGHT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVELEFT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVERIGHT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVELEFT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVERIGHT] );
m_ComboCalc.SetKeysToCheck( vlKeysToCheck );
vlKeysToCheck.clear();
vlKeysToCheck.push_back( IW_MOVELEFT ); vlKeysToCheck.push_back( IW_MOVELEFT ); vlKeysToCheck.push_back( IW_MOVELEFT );
vlKeysToCheck.push_back( IW_MOVERIGHT ); vlKeysToCheck.push_back( IW_MOVERIGHT ); vlKeysToCheck.push_back( IW_MOVERIGHT );
vlKeysToCheck.push_back( IW_MOVEBACK ); vlKeysToCheck.push_back( IW_MOVEBACK ); vlKeysToCheck.push_back( IW_MOVEBACK );
vlKeysToCheck.push_back( IW_MOVEFRONT ); vlKeysToCheck.push_back( IW_MOVEFRONT ); vlKeysToCheck.push_back( IW_MOVEFRONT );
m_ComboCalc.SetPadsToCheck( vlKeysToCheck, 3.0f );
UseTableDefinedGraphicEffect( false );
if (m_pCantMoveBlow)
m_pCantMoveBlow->UseTableDefinedGraphicEffect( false );
m_bPlayerCharacter = dynamic_cast<CDnLocalPlayerActor*>(m_hActor.GetPointer()) ? true : false;
#endif
//AddCallBackType( SB_ONCALCDAMAGE );
//<թ<EFBFBD> a<EFBFBD>X<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD>L<EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD>t<EFBFBD> Freezing<EFBFBD><EFBFBD> ٳ|<EFBFBD><EFBFBD>..
if (m_pCantActionBlow)
{
//x<EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(isMoveable)<EFBFBD><EFBFBD><EFBFBD>ij <թ<EFBFBD> a<EFBFBD>X<EFBFBD> $<EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD>t<EFBFBD>(m_strHitedAction.empty() ? false : true)
m_pCantActionBlow->SetAvailableNormalState(!m_strHitedAction.empty());
m_pCantActionBlow->SetActionWhenCancelAttack( m_strHitedAction.empty() ? "Freezing" : m_strHitedAction.c_str() );
}
}
#ifdef _GAMESERVER
CDNGameRoom* pGameRoom = static_cast<CDNGameRoom*>(m_hActor->GetRoom());
if( false == pGameRoom->bIsPvPRoom() )
{
UINT uiSessionID = 0;
pGameRoom->GetLeaderSessionID( uiSessionID );
CDNUserSession *pUserSession = pGameRoom ? pGameRoom->GetUserSession(uiSessionID) : NULL;
if( pUserSession )
{
const TMapInfo* pMapData = g_pDataManager->GetMapInfo( pUserSession->GetMapIndex() );
if( pMapData )
#if defined(PRE_ADD_DRAGON_FELLOWSHIP)
m_bNestMap = CDnBlow::CheckEffectIgnoreMapType(pMapData->MapType, pMapData->MapSubType);
#else // #if defined(PRE_ADD_DRAGON_FELLOWSHIP)
m_bNestMap = (GlobalEnum::MAP_DUNGEON == pMapData->MapType) &&
((GlobalEnum::MAPSUB_NEST == pMapData->MapSubType) ||(GlobalEnum::MAPSUB_NESTNORMAL == pMapData->MapSubType));
#endif // #if defined(PRE_ADD_DRAGON_FELLOWSHIP)
}
}
#else
#if defined(PRE_ADD_DRAGON_FELLOWSHIP)
m_bNestMap = CDnBlow::CheckEffectIgnoreMapType();
#else // #if defined(PRE_ADD_DRAGON_FELLOWSHIP)
CDnWorld* pWorld = CDnWorld::GetInstancePtr();
m_bNestMap = (CDnWorld::MapTypeEnum::MapTypeDungeon == pWorld->GetMapType()) &&
((CDnWorld::MapSubTypeEnum::MapSubTypeNest == pWorld->GetMapSubType() || CDnWorld::MapSubTypeEnum::MapSubTypeNestNormal == pWorld->GetMapSubType()));
#endif // #if defined(PRE_ADD_DRAGON_FELLOWSHIP)
#endif
CheckBossMonster();
m_fOrigWight = 0.0f;
m_iOrigPressLevel = 0;
// <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ĭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD>t<EFBFBD><EFBFBD>
if (m_pCantMoveBlow)
m_pCantMoveBlow->SetPermanent(true);
if (m_pCantActionBlow)
m_pCantActionBlow->SetPermanent(true);
if (m_pFrameStopBlow)
m_pFrameStopBlow->SetPermanent(true);
}
CDnEscapeBlow::~CDnEscapeBlow(void)
{
SAFE_DELETE( m_pCantMoveBlow );
SAFE_DELETE( m_pCantActionBlow );
SAFE_DELETE( m_pFrameStopBlow );
}
#ifdef _GAMESERVER
bool CDnEscapeBlow::CanBegin( void )
{
bool bResult = true;
int iProb = int(m_fValue * 10000.0f);
if( _rand(GetRoom())%10000 > iProb )
{
// 8֜<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CanBegin 8֜<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ƞ<EFBFBD>]<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//SetState( STATE_BLOW::STATE_END );
OutputDebug( "%s - Freezing Fail\n", __FUNCTION__ );
bResult = false;
}
return bResult;
}
#endif
// <EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Y<EFBFBD>t<EFBFBD> x<EFBFBD><EFBFBD><EFBFBD> U<EFBFBD>`<EFBFBD>t<EFBFBD> Value \<EFBFBD> K<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> U<EFBFBD>`<EFBFBD><EFBFBD><EFBFBD> ޹<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> ]<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CDnEscapeBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
// <EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD>ɍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = <<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>> * (1  <<EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>weight<EFBFBD>)
float fGlobalStateEffectWeight = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::StateRevision );
float fIceResistance = m_hActor->GetElementDefense(CDnState::Ice);
// <EFBFBD>ɍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_StateBlow.fDurationTime = m_StateBlow.fDurationTime * (1.0f - fIceResistance*fGlobalStateEffectWeight);
// <EFBFBD><EFBFBD>ٳ<EFBFBD><EFBFBD><EFBFBD>, t<EFBFBD>ٳ<EFBFBD><EFBFBD><EFBFBD>
if( m_pCantMoveBlow ) m_pCantMoveBlow->OnBegin( LocalTime, fDelta );
if( m_pCantActionBlow ) m_pCantActionBlow->OnBegin( LocalTime, fDelta );
// TODO: tǙӸ<EFBFBD> <EFBFBD><EFBFBD>%<EFBFBD>.. t<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹ t<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>
#ifndef _GAMESERVER
m_vlBreakActions.clear();
_AttachGraphicEffect();
m_vlBreakActions.push_back( "Break" );
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>8<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>
if( m_bPlayerCharacter )
{
GetInterface().ShowStickAniDialog( true );
}
#else
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> a<EFBFBD>0<EFBFBD>|<EFBFBD>t<EFBFBD> tǙӸ<EFBFBD> L<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>ňǔ<EFBFBD> a<EFBFBD>X<EFBFBD>t<EFBFBD> t<EFBFBD>|<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> (ӷ<EFBFBD>t<EFBFBD> $<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD> (CmdAction @<EFBFBD> t<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (ӷ<EFBFBD> H<EFBFBD><EFBFBD><EFBFBD>İ)
// <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD> 0<EFBFBD>\<EFBFBD> <EFBFBD>̬<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( m_hActor->IsMonsterActor() )
{
if (false == m_bIgnoreEffectAction)
{
if( false == m_bIgnoreEffectAction )
{
DNTableFileFormat* pStateEffectTable = CDnTableDB::GetInstancePtr()->GetTable( CDnTableDB::TSTATEEFFECT );
std::vector<std::string> infoTokens;
std::string delimiters = ";";
TokenizeA(m_ParentSkillInfo.szEffectOutputIDs, infoTokens, delimiters);
int nTokenSize = (int)infoTokens.size();
for (int i = 0; i < nTokenSize; ++i)
{
int nEffectOutputID = atoi(infoTokens[i].c_str());
if (IsMatchStateEffectIndex(nEffectOutputID))
{
string strActionName = pStateEffectTable->GetFieldFromLablePtr( nEffectOutputID, "_ActorActionName" )->GetString();
m_hActor->SetActionQueue( strActionName.c_str() );
}
}
}
}
}
// t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD>Ō<EFBFBD>ij t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD>ɍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> )<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>p<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD>ԯ<EFBFBD><EFBFBD><EFBFBD>.
// PVP <EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD>D<EFBFBD> 8<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> , <EFBFBD><EFBFBD><EFBFBD>@<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD>X<EFBFBD> ٳ0<EFBFBD><EFBFBD> <EFBFBD>Ҵ<EFBFBD><EFBFBD>ɔ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>4<EFBFBD><EFBFBD><EFBFBD>.
m_hActor->CmdModifyStateEffect( GetBlowID(), m_StateBlow );
#endif
//<EFBFBD>‘<EFBFBD> <EFBFBD>L<EFBFBD> Weight/PressLevelD<EFBFBD> ȥ<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_fOrigWight = m_hActor->GetWeight();
m_iOrigPressLevel = m_hActor->GetPressLevel();
////<EFBFBD>έ<EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> )<EFBFBD><EFBFBD><EFBFBD> X<EFBFBD>0<EFBFBD> <EFBFBD>t<EFBFBD> $<EFBFBD><EFBFBD>.
//m_hActor->SetWeight(0.0f);
//m_hActor->SetPressLevel(-1);
//<թ<EFBFBD> a<EFBFBD>X<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><<EFBFBD>t<EFBFBD> <թ<EFBFBD> a<EFBFBD>X<EFBFBD>t<EFBFBD> ]<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> H<EFBFBD><EFBFBD><EFBFBD>ij]<EFBFBD>..
if (!m_strHitedAction.empty())
{
//SAFE_DELETE(m_pFrameStopBlow);
CEtActionBase::ActionElementStruct* pStruct = m_hActor->GetElement( m_strHitedAction.c_str() );
if( pStruct )
{
m_isAbleIntervalChecker = true;
//60frame0<EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD>
float fFrameTime = 0.01666666666666666666666666666667f * 1000.0f;
m_IntervalChecker.OnBegin( LocalTime, (DWORD)(pStruct->dwLength * fFrameTime));
}
}
else
if( m_pFrameStopBlow ) m_pFrameStopBlow->OnBegin( LocalTime, fDelta );
OutputDebug( "%s - BlowID:%d, Ice Resistance: %2.2f, Result DurationTime: %2.2f\n", __FUNCTION__, GetBlowID(), fIceResistance, GetDurationTime() );
}
#ifndef _GAMESERVER
void CDnEscapeBlow::_ProcessShake( LOCAL_TIME LocalTime, float fDelta )
{
LOCAL_TIME TimeGap = LocalTime - m_ShakeStartTime;
if( TimeGap > SHAKE_TIME )
{
m_bShake = false;
return;
}
float fShakeDelta = 0.0f;
float fStartRatio = 0.2f;
float fEndRatio = 0.2f;
float fShakeValue = 3.0f;
if( LocalTime < m_ShakeStartTime + ( TimeGap * fStartRatio ) )
{
fShakeDelta = 1.f / ( SHAKE_TIME * fStartRatio ) * ( TimeGap );
fShakeDelta *= fShakeValue;
}
else if( LocalTime < m_ShakeStartTime + ( SHAKE_TIME * fEndRatio ) )
{
fShakeDelta = fShakeValue;
}
else
{
fShakeDelta = 1.f / ( SHAKE_TIME * fEndRatio ) * ( ( m_ShakeStartTime + SHAKE_TIME ) - LocalTime );
fShakeDelta *= fShakeValue;
}
if( fShakeDelta > 0.1f )
{
//MatrixEx *pCross = m_hActor->GetMatEx();
MatrixEx CrossMove = *m_hActor->GetMatEx();
EtVector3 vPrevPos = CrossMove.m_vPosition;
CrossMove.m_vPosition.x += -fShakeDelta + ( ( _rand()%(int)(fShakeDelta*20) ) / 10.f );
CrossMove.m_vPosition.y += -fShakeDelta + ( ( _rand()%(int)(fShakeDelta*20) ) / 10.f );
CrossMove.m_vPosition.z += -fShakeDelta + ( ( _rand()%(int)(fShakeDelta*20) ) / 10.f );
NavigationMesh *pNavMesh = INSTANCE(CDnWorld).GetNavMesh( CrossMove.m_vPosition );
if( !pNavMesh )
{
if( CDnWorld::GetInstance().GetAttribute( CrossMove.m_vPosition ) != 0 )
{
CrossMove.m_vPosition = vPrevPos;
}
CrossMove.m_vPosition.y = CDnWorld::GetInstance().GetHeight( CrossMove.m_vPosition );
}
else
{
NavigationCell* pCurCell = NULL;
if( pCurCell == NULL )
{
pCurCell = pNavMesh->FindClosestCell( CrossMove.m_vPosition );
if( ( pCurCell == NULL ) || ( !pCurCell->IsPointInCellCollumn( CrossMove.m_vPosition ) ) )
{
pCurCell = NULL;
//EtVector3 vPrevPos = Cross.m_vPosition;
if( CDnWorld::GetInstance().GetAttribute( CrossMove.m_vPosition ) != 0 )
{
CrossMove.m_vPosition = vPrevPos;
}
CrossMove.m_vPosition.y = CDnWorld::GetInstance().GetHeight( CrossMove.m_vPosition );
}
}
if( pCurCell )
{
//EtVector3 vPrevPos = Cross.m_vPosition;
//Cross.MoveLocalZAxis( fValue );
int nSide = -1;
NavigationCell *pLastCell = NULL;
pCurCell->FindLastCollision( vPrevPos, CrossMove.m_vPosition, &pLastCell, nSide );
if( nSide != -1 )
{
if( pLastCell->Link( nSide ) == NULL )
{
EtVector2 vMoveDir2D( CrossMove.m_vPosition.x - vPrevPos.x, CrossMove.m_vPosition.z - vPrevPos.z );
float fMoveLength = EtVec2Length( &vMoveDir2D );
vMoveDir2D /= fMoveLength;
EtVector2 vWallDir2D = pLastCell->Side( nSide )->EndPointB() - pLastCell->Side( nSide )->EndPointA();
EtVec2Normalize( &vWallDir2D, &vWallDir2D );
fMoveLength *= EtVec2Dot( &vWallDir2D, &vMoveDir2D );
CrossMove.m_vPosition.x = vPrevPos.x + fMoveLength * vWallDir2D.x;
CrossMove.m_vPosition.z = vPrevPos.z + fMoveLength * vWallDir2D.y;
int nNewSide = -1;
pCurCell->FindLastCollision( vPrevPos, CrossMove.m_vPosition, &pLastCell, nNewSide );
if( nNewSide != -1 )
{
if( pLastCell->Link( nNewSide ) )
{
NavigationCell *pNewCell;
pNewCell = pLastCell->Link( nNewSide );
if( pNewCell->IsPointInCellCollumn( CrossMove.m_vPosition ) )
{
pCurCell = pNewCell;
}
else
{
CrossMove.m_vPosition.x = vPrevPos.x;
CrossMove.m_vPosition.z = vPrevPos.z;
}
}
else if( !pCurCell->IsPointInCellCollumn( CrossMove.m_vPosition ) )
{
CrossMove.m_vPosition.x = vPrevPos.x;
CrossMove.m_vPosition.z = vPrevPos.z;
}
}
}
else
{
pCurCell = pLastCell->Link( nSide );
}
}
if( pCurCell->GetType() == NavigationCell::CT_PROP )
CrossMove.m_vPosition.y = pCurCell->GetPlane()->SolveForY( CrossMove.m_vPosition.x, CrossMove.m_vPosition.z );
else
CrossMove.m_vPosition.y = CDnWorld::GetInstance().GetHeight( CrossMove.m_vPosition );
}
}
m_hActor->ProcessCollision( EtVector3(CrossMove.m_vPosition - vPrevPos) );
}
}
#endif
// <EFBFBD><EFBFBD>Y<EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD>Դż<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
void CDnEscapeBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
//<թ<EFBFBD> ٳ<EFBFBD><EFBFBD>t<EFBFBD> $<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><<EFBFBD>t<EFBFBD> <թ<EFBFBD> ٳ<EFBFBD><EFBFBD> ]<EFBFBD><EFBFBD><EFBFBD>L<EFBFBD> FrameStop<EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> \<EFBFBD>1<EFBFBD>T<EFBFBD>|<EFBFBD> <EFBFBD>t<EFBFBD> time<EFBFBD><EFBFBD>l<EFBFBD>..
if (m_isAbleIntervalChecker)
m_IntervalChecker.Process( LocalTime, fDelta );
#ifndef _GAMESERVER
if( CDnLocalPlayerActor::s_hLocalActor == m_hActor )
{
// TODO: <EFBFBD>Ȱ<EFBFBD> <EFBFBD><EFBFBD>%<EFBFBD> <EFBFBD>D<EFBFBD> L<EFBFBD> ȹ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD>ij <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> h<EFBFBD>...
int iNumComboCount = 0;
bool bComboSatisfy = m_ComboCalc.Process( LocalTime, fDelta, &iNumComboCount );
for( int i = 0; i < iNumComboCount; ++i )
m_StateBlow.fDurationTime -= 1.0f;
if( bComboSatisfy )
{
m_bShake = true;
m_ShakeStartTime = LocalTime;
OutputDebug( "[<04>0<EFBFBD><30>М<EFBFBD>] %d <00><> d<><64><EFBFBD> 1<><31><EFBFBD>, <00><><04> %2.2f \<EFBFBD> ɴ<><C9B4><EFBFBD> \n", iNumComboCount, m_StateBlow.fDurationTime );
}
}
if( m_bAllowShakeControl && m_bShake )
_ProcessShake( LocalTime, fDelta );
// <EFBFBD><EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>έ<EFBFBD>0<EFBFBD>̹ <EFBFBD>0<EFBFBD> <EFBFBD>М<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD>|<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> ]<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>İ.
if( CDnLocalPlayerActor::s_hLocalActor == m_hActor )
{
if( m_StateBlow.fDurationTime < 0.2f )
{
CDnLocalPlayerActor* pLocalPlayerActor = static_cast<CDnLocalPlayerActor*>(m_hActor.GetPointer());
if (pLocalPlayerActor)
pLocalPlayerActor->CmdRemoveStateEffectByServerBlowID( GetServerBlowID() );
}
}
#endif
if( m_pCantMoveBlow ) m_pCantMoveBlow->Process( LocalTime, fDelta );
if( m_pCantActionBlow ) m_pCantActionBlow->Process( LocalTime, fDelta );
}
bool CDnEscapeBlow::OnCustomIntervalProcess( void )
{
m_IntervalChecker.OnEnd(0, 0.0f);
if (m_pFrameStopBlow)
m_pFrameStopBlow->OnBegin(m_LastLocalTime, 0.0f);
m_isAbleIntervalChecker = false;
return true;
}
void CDnEscapeBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
if( m_pCantMoveBlow ) m_pCantMoveBlow->OnEnd( LocalTime, fDelta );
if( m_pCantActionBlow ) m_pCantActionBlow->OnEnd( LocalTime, fDelta );
if( m_pFrameStopBlow ) m_pFrameStopBlow->OnEnd( LocalTime, fDelta );
//////////////////////////////////////////////////////////////////////////
// #36294
// D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><մ<EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̬<EFBFBD>L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD> OnBegin<EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// OnEnd\<EFBFBD> <EFBFBD> $Ɣ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>. t<EFBFBD>L<EFBFBD> OnBegin<EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> m_bIgnoreEffectAction<EFBFBD> false
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD> <EFBFBD>L<EFBFBD>ȹ<EFBFBD><EFBFBD> OnEnd\<EFBFBD> <EFBFBD>@<EFBFBD><EFBFBD> SetActionQueue("Stand")8֜<EFBFBD>(<EFBFBD>.
// CheckBossMonster()\<EFBFBD> h<EFBFBD><EFBFBD> |<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8֜<EFBFBD><EFBFBD>ij]<EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>
// m_bIgnoreEffectAction <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> $<EFBFBD><EFBFBD> <EFBFBD>ij]<EFBFBD> <EFBFBD><EFBFBD>h<EFBFBD>.
//////////////////////////////////////////////////////////////////////////
// <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> D<EFBFBD>Ȳ|<EFBFBD>t<EFBFBD> <EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( false == m_bIgnoreEffectAction )
{
// tǙӸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD>D<EFBFBD> Ĭ<EFBFBD><EFBFBD> <EFBFBD>‰<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Stand \<EFBFBD> <EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>ij]<EFBFBD> \<EFBFBD><EFBFBD><EFBFBD>.
#ifdef _GAMESERVER
if( false == m_hActor->IsDown() )
#else
// #37065 tǙӸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD> <EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD>p<EFBFBD><EFBFBD><EFBFBD> (|<EFBFBD>ȲT<EFBFBD> <EFBFBD>|<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> 6<EFBFBD>0<EFBFBD>)
// tǙӸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>X<EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Y<EFBFBD> <EFBFBD><EFBFBD≯<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Stand a<EFBFBD>X<EFBFBD> <EFBFBD>‰<EFBFBD>.
if( NULL == m_pEffectOutputInfo ||
m_pEffectOutputInfo->strActorActionName.empty() ||
m_pEffectOutputInfo->strActorActionName == m_hActor->GetCurrentAction() )
#endif
{
#if defined(PRE_FIX_50007)
//t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ɣ<EFBFBD> ٳ<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>ij]<EFBFBD>..
const char *szCurrentAction = m_hActor->GetCurrentAction();
//Dieٳ<EFBFBD><EFBFBD>x<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ɣ<EFBFBD> Stand\<EFBFBD> <EFBFBD>X<EFBFBD> H<EFBFBD><EFBFBD>ij]<EFBFBD> \<EFBFBD><EFBFBD><EFBFBD>.
if (strstr(szCurrentAction, "Die") == NULL &&
strstr(szCurrentAction, "Relieve") == NULL) //#53900
#endif // PRE_FIX_50007
m_hActor->SetActionQueue( "Stand" );
}
}
#ifndef _GAMESERVER
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>8<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>
if( dynamic_cast<CDnLocalPlayerActor*>(m_hActor.GetPointer()) )
{
GetInterface().ShowStickAniDialog( false );
}
if( m_pEffectOutputInfo )
{
// #30527 <EFBFBD><EFBFBD>Y<EFBFBD> tǙӸ<EFBFBD>ij <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ňǔ<EFBFBD> tǙӸ<EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD>P<EFBFBD> ><EFBFBD>D<EFBFBD><EFBFBD> break a<EFBFBD>X<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( EffectOutputInfo::ATTACH == m_pEffectOutputInfo->iOutputType )
{
if( !m_vlBreakActions.empty() && m_hEtcObjectEffect )
m_hEtcObjectEffect->SetActionQueue( m_vlBreakActions.at( _rand() % (int)m_vlBreakActions.size() ).c_str() );
// h<EFBFBD><EFBFBD>ɔ<EFBFBD> a<EFBFBD>X<EFBFBD> <EFBFBD>‰<EFBFBD> <EFBFBD> L<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD> J<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;
}
else
if( EffectOutputInfo::DUMMY_BONE_ATTACH == m_pEffectOutputInfo->iOutputType )
{
int nNumBone = (int)m_pEffectOutputInfo->vlDummyBoneIndices.size();
for( int nBone = 0; nBone < nNumBone; ++nBone )
{
if( m_hActor->TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::IsExistSignalHandle( STATEBLOWEFFECT_ETCOFFSET + m_StateBlow.emBlowIndex, (m_nBlowID*100)+nBone ) )
{
// h<EFBFBD><EFBFBD>ɔ<EFBFBD> a<EFBFBD>X<EFBFBD> <EFBFBD>‰<EFBFBD> <EFBFBD> L<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD> J<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>
TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::SmartPtrSignalImpStruct *pStruct =
(TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::SmartPtrSignalImpStruct *)m_hActor->TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::GetStruct( STATEBLOWEFFECT_ETCOFFSET + m_StateBlow.emBlowIndex, (m_nBlowID*100)+nBone );
if( pStruct )
pStruct->bLinkObject = false;
DnEtcHandle hEffectHandle = m_hActor->TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::GetSignalHandle( STATEBLOWEFFECT_ETCOFFSET + m_StateBlow.emBlowIndex, (m_nBlowID*100)+nBone );
if( hEffectHandle )
{
if( hEffectHandle->IsExistAction( "Break" ) )
hEffectHandle->SetActionQueue( "Break" ); // Destroy <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ܴ<EFBFBD><EFBFBD> <EFBFBD>t<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD>(<EFBFBD>
else
m_hActor->TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::RemoveSignalHandle( STATEBLOWEFFECT_ETCOFFSET + m_StateBlow.emBlowIndex, (m_nBlowID*100)+nBone );
}
else
m_hActor->TSmartPtrSignalImp<DnEtcHandle, EtcObjectSignalStruct>::RemoveSignalHandle( STATEBLOWEFFECT_ETCOFFSET + m_StateBlow.emBlowIndex, (m_nBlowID*100)+nBone );
}
}
}
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>... <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> tǙӸ<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>`Ŕ<EFBFBD> t<EFBFBD> D<EFBFBD>Ȳ<EFBFBD><EFBFBD>, tǙӸ<EFBFBD> <EFBFBD>Ǵ̔<EFBFBD> destroy <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> L<EFBFBD>D<EFBFBD><EFBFBD> <EFBFBD>Ȕ<EFBFBD><EFBFBD><EFBFBD>.
// X<EFBFBD><EFBFBD><EFBFBD>̹ <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ]<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> tǙӸ<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> L<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>p<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> \<EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><<EFBFBD>t<EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> Ĭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>DňǴ<EFBFBD><EFBFBD> tǙӸ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> H<EFBFBD>(<EFBFBD>.
m_hActor->DetachSEEffectSkillInfo( m_ParentSkillInfo );
_SetDiffuse( 1.0f, 1.0f, 1.0f, 1.0f );
//m_hActor->DetachSEEffect( m_ParentSkillInfo, m_StateBlow.emBlowIndex, GetBlowID(), m_pEffectOutputInfo );
#else
#endif
////<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ]<EFBFBD><EFBFBD><EFBFBD>L<EFBFBD> 0<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> ȥ<EFBFBD><EFBFBD>@<EFBFBD> <EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//m_hActor->SetWeight(m_fOrigWight);
//m_hActor->SetPressLevel(m_iOrigPressLevel);
OutputDebug( "%s BlowID: %d\n", __FUNCTION__, GetBlowID() );
}
// #ifdef _GAMESERVER
// float CDnEscapeBlow::OnCalcDamage( float fOriginalDamage, CDnDamageBase::SHitParam& HitParam )
// {
// float fResult = 0.0f;
//
// --m_iDurabilityCount;
//
// // <EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> p<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> 1.50<EFBFBD>\<EFBFBD> 9<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// fResult = fOriginalDamage / 2.0f;
//
// // <EFBFBD><EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Freezing t<EFBFBD>X<EFBFBD> Stand a<EFBFBD>X<EFBFBD>D<EFBFBD> X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> ޹X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> hit X<EFBFBD> a<EFBFBD>X<EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
// // hit X<EFBFBD>X<EFBFBD> CanHit <EFBFBD> false t<EFBFBD>t<EFBFBD> Ĭ<EFBFBD><EFBFBD> ޹<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>4<EFBFBD><EFBFBD><EFBFBD>. #15675
// HitParam.szActionName.clear();
//
// // ɹ<EFBFBD><EFBFBD>|<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD≯.
// if( m_iDurabilityCount <= 0 )
// {
// SetState( STATE_BLOW::STATE_END );
// OutputDebug( "%s - Freezing Broken by Attack!\n", __FUNCTION__ );
// }
//
// return fResult;
// }
// #else
// float CDnEscapeBlow::OnCalcDamage( float fOriginalDamage, CDnDamageBase::SHitParam& HitParam )
// {
// --m_iDurabilityCount;
//
// // ȹ<EFBFBD><EFBFBD>ɹ <EFBFBD>Щ<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> p<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> P<EFBFBD> 0<EFBFBD>\<EFBFBD> 9<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... t<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> D<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ޹X<EFBFBD>D<EFBFBD> L<EFBFBD>ij
// // <EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD>$ƌ<EFBFBD> (<EFBFBD>..
// // t<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>8<EFBFBD>D<EFBFBD> L<EFBFBD>ij p<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> 9<EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><<EFBFBD>\<EFBFBD> 8֜<EFBFBD>(<EFBFBD>..
// // 0<EFBFBD>|<EFBFBD><EFBFBD> 2<EFBFBD><EFBFBD> ޹<<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> L<EFBFBD> <EFBFBD> 3<EFBFBD><EFBFBD>\<EFBFBD> t<EFBFBD><EFBFBD>ȴ<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>Y<EFBFBD> x<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> P<EFBFBD> <EFBFBD><EFBFBD> ޹<EFBFBD><EFBFBD> h<EFBFBD><EFBFBD>Ɍ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
// if( m_iDurabilityCount <= 0 )
// {
// SetState( STATE_BLOW::STATE_END );
// OutputDebug( "%s - Freezing Broken by Attack!\n", __FUNCTION__ );
// }
//
// return 0.0f;
// }
// #endif
void CDnEscapeBlow::OnDuplicate( const STATE_BLOW& StateBlowInfo )
{
// <EFBFBD><EFBFBD>Y<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>`<EFBFBD> L<EFBFBD> D<EFBFBD>4<EFBFBD><EFBFBD><EFBFBD>ij X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>U<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD><EFBFBD><EFBFBD>m<EFBFBD>t<EFBFBD> $<EFBFBD>t<EFBFBD> <EFBFBD>Ơ<EFBFBD>]<EFBFBD> \<EFBFBD><EFBFBD><EFBFBD>.
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnEscapeBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
std::vector<string> vlTokens[2];
string strArgument[2];
//<EFBFBD>\<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
float fValue[2] = { 0.0f, };
int nCountValue[2] = { 0, };
int nAllowShakeControl[2] = {0, };
std::string strHitedAction[2];
//////////////////////////////////////////////////////////////////////////
//<EFBFBD>̈<EFBFBD><EFBFBD><EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
strArgument[0] = szOrigValue;
TokenizeA( strArgument[0], vlTokens[0], ";" );
if( vlTokens[0].size() >= 3 )
{
fValue[0] = (float)atof( vlTokens[0][0].c_str() );
nCountValue[0] = atoi( vlTokens[0][1].c_str() );
nAllowShakeControl[0] = atoi(vlTokens[0][2].c_str());
if (vlTokens[0].size() == 4)
strHitedAction[0] = vlTokens[0][3];
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//P<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
strArgument[1] = szAddValue;
TokenizeA( strArgument[1], vlTokens[1], ";" );
if( vlTokens[1].size() == 2 )
{
fValue[1] = (float)atof( vlTokens[1][0].c_str() );
nCountValue[1] = atoi( vlTokens[1][1].c_str() );
nAllowShakeControl[1] = atoi(vlTokens[1][2].c_str());
if (vlTokens[1].size() == 4)
strHitedAction[1] = vlTokens[1][3];
}
//////////////////////////////////////////////////////////////////////////
//P<EFBFBD> <EFBFBD>D<EFBFBD> T<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
float fResultValue = fValue[0] + fValue[1];
int nResultCount = (nCountValue[0] + nCountValue[1]);
int nResultAllowShakeControl = (nAllowShakeControl[0] == 0 || nAllowShakeControl[1] == 0) ? 0 : 1;
std::string strResultAction = strHitedAction[0].empty() ? (strHitedAction[1].empty() ? "" : strHitedAction[1]) : strHitedAction[0];
sprintf_s(szBuff, "%f;%d;%d;%s", fResultValue, nResultCount, nResultAllowShakeControl, strResultAction.c_str());
szNewValue = szBuff;
}
void CDnEscapeBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
std::vector<string> vlTokens[2];
string strArgument[2];
//<EFBFBD>\<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
float fValue[2] = { 0.0f, };
int nCountValue[2] = { 0, };
int nAllowShakeControl[2] = {0, };
std::string strHitedAction[2];
//////////////////////////////////////////////////////////////////////////
//<EFBFBD>̈<EFBFBD><EFBFBD><EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
strArgument[0] = szOrigValue;
TokenizeA( strArgument[0], vlTokens[0], ";" );
if( vlTokens[0].size() >= 3 )
{
fValue[0] = (float)atof( vlTokens[0][0].c_str() );
nCountValue[0] = atoi( vlTokens[0][1].c_str() );
nAllowShakeControl[0] = atoi(vlTokens[0][2].c_str());
if (vlTokens[0].size() == 4)
strHitedAction[0] = vlTokens[0][3];
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//P<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
strArgument[1] = szAddValue;
TokenizeA( strArgument[1], vlTokens[1], ";" );
if( vlTokens[1].size() == 2 )
{
fValue[1] = (float)atof( vlTokens[1][0].c_str() );
nCountValue[1] = atoi( vlTokens[1][1].c_str() );
nAllowShakeControl[1] = atoi(vlTokens[1][2].c_str());
if (vlTokens[1].size() == 4)
strHitedAction[1] = vlTokens[1][3];
}
//////////////////////////////////////////////////////////////////////////
//P<EFBFBD> <EFBFBD>D<EFBFBD> T<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
float fResultValue = fValue[0] - fValue[1];
int nResultCount = (nCountValue[0] - nCountValue[1]);
int nResultAllowShakeControl = (nAllowShakeControl[0] == 0 || nAllowShakeControl[1] == 0) ? 0 : 1;
std::string strResultAction = strHitedAction[0].empty() ? (strHitedAction[1].empty() ? "" : strHitedAction[1]) : strHitedAction[0];
sprintf_s(szBuff, "%f;%d;%d;%s", fResultValue, nResultCount, nResultAllowShakeControl, strResultAction.c_str());
szNewValue = szBuff;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
void CDnEscapeBlow::CheckBossMonster()
{
// #27679 $<EFBFBD><EFBFBD><EFBFBD>ܴ, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 8x<EFBFBD> $<EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> escape X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
// #28385 $<EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹ ȩ<EFBFBD>(<EFBFBD>.
if( m_hActor->IsMonsterActor() )
{
if( m_bNestMap )
{
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>(m_hActor.GetPointer());
if( (CDnMonsterState::Boss == pMonsterActor->GetGrade() ||
CDnMonsterState::BossHP4 == pMonsterActor->GetGrade() ||
CDnMonsterState::NestBoss == pMonsterActor->GetGrade() ||
CDnMonsterState::NestBoss8 == pMonsterActor->GetGrade()) )
{
SAFE_DELETE( m_pCantMoveBlow );
SAFE_DELETE( m_pCantActionBlow );
SAFE_DELETE( m_pFrameStopBlow );
// <EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> freezing a<EFBFBD>X<EFBFBD> <EFBFBD>‰<EFBFBD> H<EFBFBD>(<EFBFBD>.
m_bIgnoreEffectAction = true;
}
}
// #51048 <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> $<EFBFBD><EFBFBD>¸<EFBFBD> $<EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ٳ|<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// ų<EFBFBD><EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ה<EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ĭ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_235) )
{
m_bIgnoreEffectAction = true;
}
}
}
#if defined(PRE_FIX_51048)
void CDnEscapeBlow::RemoveDebufAction(LOCAL_TIME LocalTime, float fDelta)
{
if( m_pCantMoveBlow ) m_pCantMoveBlow->OnEnd( LocalTime, fDelta );
if( m_pCantActionBlow ) m_pCantActionBlow->OnEnd( LocalTime, fDelta );
if( m_pFrameStopBlow ) m_pFrameStopBlow->OnEnd( LocalTime, fDelta );
SAFE_DELETE( m_pCantMoveBlow );
SAFE_DELETE( m_pCantActionBlow );
SAFE_DELETE( m_pFrameStopBlow );
m_bIgnoreEffectAction = true;
}
#endif // PRE_FIX_51048