218 lines
5.8 KiB
C++
218 lines
5.8 KiB
C++
#include "StdAfx.h"
|
||
#include "DnTeleportBlow.h"
|
||
|
||
#include "DnMonsterActor.h"
|
||
|
||
#if !defined( USE_BOOST_MEMPOOL )
|
||
#ifdef _DEBUG
|
||
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
||
#endif
|
||
#endif // #if !defined( USE_BOOST_MEMPOOL )
|
||
|
||
|
||
CDnTeleportBlow::CDnTeleportBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ),
|
||
m_dwMonsterIDToTeleport( 0 ),
|
||
m_fTeleportRangeMax( 0.0f )
|
||
{
|
||
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_205;
|
||
SetValue( szValue );
|
||
|
||
m_fValue = 0.0f;
|
||
|
||
std::string str = szValue;
|
||
std::vector<std::string> tokens;
|
||
std::string delimiters = ";";
|
||
|
||
TokenizeA(str, tokens, delimiters);
|
||
|
||
m_dwMonsterIDToTeleport = atoi( tokens.at( 0 ).c_str() );
|
||
m_fTeleportRangeMax = (float)atof( tokens.at( 1 ).c_str() );
|
||
}
|
||
|
||
CDnTeleportBlow::~CDnTeleportBlow(void)
|
||
{
|
||
|
||
}
|
||
|
||
void CDnTeleportBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
|
||
{
|
||
__super::OnBegin(LocalTime, fDelta);
|
||
|
||
#if defined(_GAMESERVER)
|
||
if (!m_hActor)
|
||
return;
|
||
|
||
//
|
||
EtVector3* pDestPosition = NULL;
|
||
float fShortestDistanceSQ = FLT_MAX;
|
||
|
||
/*
|
||
DNVector(CEtWorldProp*) vlPropList;
|
||
|
||
CDnWorld* pWorld = NULL;
|
||
CDnGameTask *pGameTask = (CDnGameTask *)CTaskManager::GetInstance(m_hActor->GetRoom()).GetTask( "GameTask" );
|
||
pWorld = pGameTask ? &CDnWorld:GetInstance(pGameTask->GetRoom()) : NULL;
|
||
|
||
|
||
if (pWorld)
|
||
pWorld->ScanProp(*m_hActor->GetPosition(), pWorld->GetGridWidth(), vlPropList);
|
||
|
||
int nScanPropCount = vlPropList.size();
|
||
for (int i = 0; i < nScanPropCount; ++i)
|
||
{
|
||
CEtWorldProp* pWorldProp = vlPropList[i];
|
||
if (pWorldProp && pWorldProp->GetClassID() == m_nObejctID &&
|
||
pWorldProp->GetMasterActor() == m_hActor)
|
||
{
|
||
EtVector3 vDistance = (*m_hActor->GetPosition()) - (*pWorldProp->GetPosition());
|
||
|
||
float fLengthSQ = EtVec3LengthSq( &vDistance );
|
||
if( fLengthSQ < fShortestDistanceSQ )
|
||
{
|
||
fShortestDistanceSQ = fLengthSQ;
|
||
pDestPosition = pWorldProp->GetPosition();
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
|
||
DNVector(DnActorHandle) vlMonsterActorList;
|
||
m_hActor->ScanActor(m_hActor->GetRoom(), *m_hActor->GetPosition(), m_fTeleportRangeMax, vlMonsterActorList);
|
||
int nMonsterActorCount = (int)vlMonsterActorList.size();
|
||
for (int i = 0; i < nMonsterActorCount; ++i)
|
||
{
|
||
DnActorHandle hActor = vlMonsterActorList[i];
|
||
if (hActor && hActor->IsMonsterActor())
|
||
{
|
||
CDnMonsterActor* pMonster = static_cast<CDnMonsterActor*>(hActor.GetPointer());
|
||
if( pMonster &&
|
||
(pMonster->GetMonsterClassID() == m_dwMonsterIDToTeleport) &&
|
||
(pMonster->GetSummonerPlayerActor() == m_hActor) )
|
||
{
|
||
EtVector3 vDistance = (*m_hActor->GetPosition()) - (*pMonster->GetPosition());
|
||
|
||
float fLengthSQ = EtVec3LengthSq( &vDistance );
|
||
if( fLengthSQ < fShortestDistanceSQ )
|
||
{
|
||
fShortestDistanceSQ = fLengthSQ;
|
||
pDestPosition = pMonster->GetPosition();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//<2F><><EFBFBD><EFBFBD> <20><>ǥ <20><>ġ<EFBFBD><C4A1> ã<><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||
if (pDestPosition)
|
||
{
|
||
m_hActor->SetPosition(*pDestPosition);
|
||
m_hActor->CmdWarp();
|
||
}
|
||
#endif // _GAMESERVER
|
||
}
|
||
|
||
void CDnTeleportBlow::Process( LOCAL_TIME LocalTime, float fDelta )
|
||
{
|
||
__super::Process( LocalTime, fDelta );
|
||
|
||
}
|
||
|
||
|
||
void CDnTeleportBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
|
||
{
|
||
__super::OnEnd(LocalTime, fDelta);
|
||
|
||
}
|
||
|
||
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
|
||
void CDnTeleportBlow::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>
|
||
DWORD dwMonsterID[2] = {0, };
|
||
float fTeleportMaxRange[2] = {0.0f, };
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//ù<><C3B9>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>.
|
||
strArgument[0] = szOrigValue;
|
||
TokenizeA( strArgument[0], vlTokens[0], ";" );
|
||
|
||
if( vlTokens[0].size() == 2 )
|
||
{
|
||
dwMonsterID[0] = atoi( vlTokens[0][0].c_str() );
|
||
fTeleportMaxRange[0] = (float)atof( vlTokens[0][1].c_str() );
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//<2F>ι<EFBFBD>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>
|
||
strArgument[1] = szAddValue;
|
||
TokenizeA( strArgument[1], vlTokens[1], ";" );
|
||
|
||
if( vlTokens[1].size() == 2 )
|
||
{
|
||
dwMonsterID[1] = atoi( vlTokens[1][0].c_str() );
|
||
fTeleportMaxRange[1] = (float)atof( vlTokens[1][1].c_str() );
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
|
||
DWORD dwResultMonsterID = dwMonsterID[0];
|
||
float fResultMaxRange = max(fTeleportMaxRange[0], fTeleportMaxRange[1]);
|
||
|
||
sprintf_s(szBuff, "%d;%f", dwResultMonsterID, fResultMaxRange);
|
||
|
||
szNewValue = szBuff;
|
||
}
|
||
|
||
void CDnTeleportBlow::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>
|
||
DWORD dwMonsterID[2] = {0, };
|
||
float fTeleportMaxRange[2] = {0.0f, };
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//ù<><C3B9>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>.
|
||
strArgument[0] = szOrigValue;
|
||
TokenizeA( strArgument[0], vlTokens[0], ";" );
|
||
|
||
if( vlTokens[0].size() == 2 )
|
||
{
|
||
dwMonsterID[0] = atoi( vlTokens[0][0].c_str() );
|
||
fTeleportMaxRange[0] = (float)atof( vlTokens[0][1].c_str() );
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//<2F>ι<EFBFBD>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>
|
||
strArgument[1] = szAddValue;
|
||
TokenizeA( strArgument[1], vlTokens[1], ";" );
|
||
|
||
if( vlTokens[1].size() == 2 )
|
||
{
|
||
dwMonsterID[1] = atoi( vlTokens[1][0].c_str() );
|
||
fTeleportMaxRange[1] = (float)atof( vlTokens[1][1].c_str() );
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
|
||
DWORD dwResultMonsterID = dwMonsterID[0];
|
||
float fResultMaxRange = min(fTeleportMaxRange[0], fTeleportMaxRange[1]);
|
||
|
||
sprintf_s(szBuff, "%d;%f", dwResultMonsterID, fResultMaxRange);
|
||
|
||
szNewValue = szBuff;
|
||
}
|
||
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
|