279 lines
No EOL
7.4 KiB
C++
279 lines
No EOL
7.4 KiB
C++
|
||
#include "StdAfx.h"
|
||
#include "DnRebirthBlow.h"
|
||
#include "DnWorld.h"
|
||
|
||
#ifndef _GAMESERVER
|
||
#include <mmsystem.h>
|
||
|
||
#include "DnLocalPlayerActor.h"
|
||
#include "DnInterface.h"
|
||
#include "DnInCodeResource.h"
|
||
#endif //_GAMESERVER
|
||
|
||
#include "DnHPIncBlow.h"
|
||
#include "DnPlayerActor.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
||
#endif
|
||
|
||
CDnRebirthBlow::CDnRebirthBlow(DnActorHandle hActor, const char *szValue)
|
||
: CDnBlow(hActor)
|
||
, m_bImmortal(false)
|
||
, m_nCount(5)
|
||
, m_fElapseTime(0.0f)
|
||
{
|
||
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_057;
|
||
AddCallBackType(SB_ONDEFENSEATTACK);
|
||
|
||
// Parsing
|
||
std::string strValue(szValue);
|
||
DNVector(std::string) vSplit;
|
||
vSplit.reserve(4);
|
||
boost::algorithm::split( vSplit, strValue, boost::algorithm::is_any_of("/") );
|
||
|
||
m_uiRespawnHPPercent = (vSplit.size() >= 2) ? atoi( vSplit[1].c_str() ) : 100;
|
||
m_uiRespawnMPPercent = (vSplit.size() >= 3) ? atoi( vSplit[2].c_str() ) : 100;
|
||
m_uiRespawnImmortalTimeSec = (vSplit.size() >= 4) ? atoi( vSplit[3].c_str() ) : m_nCount;
|
||
|
||
if( vSplit.empty() )
|
||
SetValue( szValue );
|
||
else
|
||
SetValue( vSplit[0].c_str() );
|
||
|
||
if (strcmp(GetValue(), "StageClear") == 0)
|
||
{
|
||
SetRebirthState();
|
||
m_Type = eStageClear;
|
||
}
|
||
else
|
||
{
|
||
m_Type = eNormal;
|
||
}
|
||
}
|
||
|
||
CDnRebirthBlow::~CDnRebirthBlow(void)
|
||
{
|
||
}
|
||
|
||
#if !defined _GAMESERVER
|
||
void CDnRebirthBlow::DoRebirthAction()
|
||
{
|
||
DnEtcHandle hHandle = CDnInCodeResource::GetInstance().CreatePlayerCommonEffect();
|
||
if( hHandle ) {
|
||
hHandle->SetPosition( *m_hActor->GetPosition() );
|
||
hHandle->SetActionQueue( "Rebirth" );
|
||
}
|
||
}
|
||
#endif
|
||
|
||
void CDnRebirthBlow::Process( LOCAL_TIME LocalTime, float fDelta )
|
||
{
|
||
m_StateBlow.fDurationTime -= fDelta;
|
||
|
||
if (m_Type == eStageClear)
|
||
{
|
||
SetState( STATE_BLOW::STATE_END );
|
||
return;
|
||
}
|
||
|
||
if( m_StateBlow.fDurationTime <= 0.f )
|
||
{
|
||
if( !m_bImmortal )
|
||
{
|
||
SetRebirthValue();
|
||
|
||
#if !defined _GAMESERVER
|
||
DoRebirthAction();
|
||
#else
|
||
#ifndef _GAMESERVER
|
||
DnEtcHandle hHandle = CDnInCodeResource::GetInstance().CreatePlayerCommonEffect();
|
||
if( hHandle ) {
|
||
hHandle->SetPosition( *m_hActor->GetPosition() );
|
||
hHandle->SetActionQueue( "Rebirth" );
|
||
}
|
||
#endif
|
||
#endif // !defined _GAMESERVER
|
||
}
|
||
else
|
||
{
|
||
SetState( STATE_BLOW::STATE_END );
|
||
}
|
||
}
|
||
|
||
#ifndef _GAMESERVER
|
||
CDnLocalPlayerActor *pActor = dynamic_cast<CDnLocalPlayerActor*>((CDnActor*)m_hActor);
|
||
if( pActor && pActor->IsLocalActor() )
|
||
{
|
||
m_fElapseTime += fDelta;
|
||
|
||
if( m_fElapseTime >= 1.0f )
|
||
{
|
||
wchar_t wszTemp[80]={0};
|
||
|
||
if( m_bImmortal )
|
||
{
|
||
if( m_nCount > 0 )
|
||
{
|
||
float fHideTime = (m_nCount == 1) ? 1.0f : 3.0f;
|
||
swprintf_s( wszTemp, 80, L"%d%s", m_nCount--, GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 120413 ) );
|
||
GetInterface().ShowCaptionDialog( CDnInterface::typeCaption2, wszTemp, EtInterface::textcolor::TOMATO, fHideTime );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( m_nCount > 0 )
|
||
{
|
||
float fHideTime = (m_nCount == 1) ? 1.0f : 3.0f;
|
||
swprintf_s( wszTemp, 80, L"%d%s", m_nCount--, GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 120414 ) );
|
||
GetInterface().ShowCaptionDialog( CDnInterface::typeCaption2, wszTemp, EtInterface::textcolor::GOLDENROD, fHideTime );
|
||
}
|
||
}
|
||
|
||
m_fElapseTime = m_fElapseTime - 1.0f;
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
void CDnRebirthBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
|
||
{
|
||
OutputDebug( "CDnRebirthBlow::OnBegin(%d)\n", timeGetTime() );
|
||
|
||
if( strcmp( GetValue(), "Coin" ) == 0 )
|
||
{
|
||
SetRebirthValue();
|
||
m_Type = eNormal;
|
||
#ifndef _GAMESERVER
|
||
CDnLocalPlayerActor::LockInput( false );
|
||
#endif
|
||
}
|
||
else if (strcmp(GetValue(), "StageClear") == 0)
|
||
{
|
||
#ifndef _GAMESERVER
|
||
DoRebirthAction();
|
||
#endif
|
||
}
|
||
}
|
||
|
||
void CDnRebirthBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
|
||
{
|
||
OutputDebug( "CDnRebirthBlow::OnEnd(%d)\n", timeGetTime() );
|
||
|
||
#ifdef _GAMESERVER
|
||
m_hActor->OnAddStateBlowProcessAfterType( CDnActor::eStateBlowAfterProcessType::eRebirth );
|
||
#else
|
||
CDnLocalPlayerActor *pActor = dynamic_cast<CDnLocalPlayerActor*>((CDnActor*)m_hActor);
|
||
if( pActor && pActor->IsLocalActor() )
|
||
{
|
||
CDnWorldEnvironment* pWorldEnv = CDnWorld::GetInstance().GetEnvironment();
|
||
if( pWorldEnv )
|
||
{
|
||
pWorldEnv->ControlColorFilter( CDnWorldEnvironment::Saturation, CDnLocalPlayerActor::GetSaturationColor(), 3000 );
|
||
if (pActor->GetCurrentGhostType() == Ghost::Type::PartyRestore)
|
||
{
|
||
pWorldEnv->ControlColorFilter( CDnWorldEnvironment::Highlight, pActor->GetLastHighLightColor(), 2000 );
|
||
pActor->SetCurrentGhostType(Ghost::Type::Normal);
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
bool CDnRebirthBlow::OnDefenseAttack( DnActorHandle hHitter, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess )
|
||
{
|
||
HitParam.szActionName.clear();
|
||
return true;
|
||
}
|
||
|
||
void CDnRebirthBlow::SetRebirthValue()
|
||
{
|
||
// // HP ȸ<><C8B8> <20><><EFBFBD><EFBFBD> 100% <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> hp <20>ÿ<EFBFBD><C3BF>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵ<EFBFBD> <20><><EFBFBD>±<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> max hp <20><>ġ<EFBFBD><C4A1> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||
//#ifndef _GAMESERVER
|
||
// int iBlowID = m_hActor->AddStateBlow( NULL, STATE_BLOW::BLOW_016, -1, "1.0", true );
|
||
//#else
|
||
// int iBlowID = m_hActor->AddStateBlow( STATE_BLOW::BLOW_016, NULL, -1, "1.0", true );
|
||
//#endif
|
||
//
|
||
// // hp <20><> - <20><> <20><> <20><> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||
// if( m_hActor->GetHP() < 0 )
|
||
// m_hActor->SetHP( 0 );
|
||
//
|
||
// DnBlowHandle hBlow = m_hActor->GetStateBlowFromID( iBlowID );
|
||
// _ASSERT( hBlow );
|
||
// if( hBlow )
|
||
// {
|
||
// CDnHPIncBlow* pBlow = static_cast<CDnHPIncBlow*>( hBlow.GetPointer() );
|
||
// pBlow->FromRebirth( true );
|
||
// }
|
||
|
||
//m_hActor->RefreshState();
|
||
SetRebirthState();
|
||
|
||
m_StateBlow.fDurationTime = static_cast<float>(m_uiRespawnImmortalTimeSec);
|
||
m_nCount = m_uiRespawnImmortalTimeSec;
|
||
m_bImmortal = true;
|
||
m_fElapseTime = 1.f;
|
||
}
|
||
|
||
void CDnRebirthBlow::SetRebirthState()
|
||
{
|
||
if( !m_hActor )
|
||
return;
|
||
|
||
m_hActor->SetHP( m_hActor->GetMaxHP()*m_uiRespawnHPPercent/100 );
|
||
m_hActor->SetSP( m_hActor->GetMaxSP()*m_uiRespawnMPPercent/100 );
|
||
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(m_hActor.GetPointer());
|
||
if( pPlayer ) {
|
||
pPlayer->ToggleGhostMode( false );
|
||
|
||
#ifndef _GAMESERVER
|
||
#ifdef PRE_ADD_CASH_COSTUME_AURA
|
||
if(pPlayer->IsEnableCostumeAura())
|
||
pPlayer->LoadCostumeAuraEffect(true);
|
||
#endif
|
||
#endif
|
||
}
|
||
}
|
||
|
||
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
|
||
void CDnRebirthBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
|
||
{
|
||
char szBuff[128] = {0, };
|
||
|
||
// std::string firstMsg[2];
|
||
// UINT RespawnHPPercent[2] = {0, };
|
||
// UINT RespawnMPPercent[2] = {0, };
|
||
// UINT RespawnImmortalTimeSec[2] = {0, };
|
||
//
|
||
// std::string strValue(szOrigValue);
|
||
// DNVector(std::string) vSplit;
|
||
// vSplit.reserve(4);
|
||
// boost::algorithm::split( vSplit, strValue, boost::algorithm::is_any_of("/") );
|
||
//
|
||
// RespawnHPPercent[0] = (vSplit.size() >= 2) ? atoi( vSplit[1].c_str() ) : 100;
|
||
// RespawnMPPercent[0] = (vSplit.size() >= 3) ? atoi( vSplit[2].c_str() ) : 100;
|
||
// RespawnImmortalTimeSec[0] = (vSplit.size() >= 4) ? atoi( vSplit[3].c_str() ) : m_nCount;
|
||
// firstMsg[0] = vSplit[0].c_str();
|
||
//
|
||
// strValue = szAddValue;
|
||
// boost::algorithm::split( vSplit, strValue, boost::algorithm::is_any_of("/") );
|
||
//
|
||
// RespawnHPPercent[1] = (vSplit.size() >= 2) ? atoi( vSplit[1].c_str() ) : 100;
|
||
// RespawnMPPercent[1] = (vSplit.size() >= 3) ? atoi( vSplit[2].c_str() ) : 100;
|
||
// RespawnImmortalTimeSec[1] = (vSplit.size() >= 4) ? atoi( vSplit[3].c_str() ) : m_nCount;
|
||
// firstMsg[1] = vSplit[0].c_str();
|
||
|
||
|
||
szNewValue = szOrigValue;
|
||
}
|
||
|
||
void CDnRebirthBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
|
||
{
|
||
char szBuff[128] = {0, };
|
||
|
||
szNewValue = szOrigValue;
|
||
}
|
||
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
|