199 lines
5.3 KiB
C++
199 lines
5.3 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "DnPuppetBlow.h"
|
|||
|
|
#if defined(_GAMESERVER)
|
|||
|
|
#include "DnGameTask.h"
|
|||
|
|
#include "TaskManager.h"
|
|||
|
|
#include "DnMonsterActor.h"
|
|||
|
|
#ifdef PRE_ADD_DECREASE_EFFECT
|
|||
|
|
#include "DnStateBlow.h"
|
|||
|
|
#endif // PRE_ADD_DECREASE_EFFECT
|
|||
|
|
#endif // _GAMESERVER
|
|||
|
|
|
|||
|
|
#ifdef _DEBUG
|
|||
|
|
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
CDnPuppetBlow::CDnPuppetBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor )
|
|||
|
|
{
|
|||
|
|
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_247;
|
|||
|
|
|
|||
|
|
SetValue( szValue );
|
|||
|
|
//m_fValue = (float)atof(szValue);
|
|||
|
|
m_fLimitRange = -1.0f;
|
|||
|
|
|
|||
|
|
std::string str = szValue;
|
|||
|
|
std::vector<std::string> tokens;
|
|||
|
|
std::string delimiters = ";";
|
|||
|
|
|
|||
|
|
TokenizeA(str, tokens, delimiters);
|
|||
|
|
if (tokens.size() >= 2)
|
|||
|
|
{
|
|||
|
|
m_fValue = (float)atof(tokens[0].c_str()); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
|
|||
|
|
m_DamageChangeRateArg = tokens[1]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (tokens.size() >= 3)
|
|||
|
|
m_fLimitRange = (float)atof(tokens[2].c_str());
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// m_fValue = 33501.0f;
|
|||
|
|
// m_DamageChangeRateArg = "1.2";
|
|||
|
|
OutputDebug("%s Invalidvalue.... %s\n", __FUNCTION__, szValue);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if defined(_GAMESERVER)
|
|||
|
|
m_vDeltaPos = EtVector3(1.0f, 0.0f, 1.0f);
|
|||
|
|
#endif // _GAMESERVER
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CDnPuppetBlow::~CDnPuppetBlow(void)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#ifdef _GAMESERVER
|
|||
|
|
bool CDnPuppetBlow::CanBegin( void )
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
|
if (m_hActor && m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_246) == true)
|
|||
|
|
return true;
|
|||
|
|
else
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
void CDnPuppetBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
|
|||
|
|
{
|
|||
|
|
__super::OnBegin(LocalTime, fDelta);
|
|||
|
|
|
|||
|
|
#if defined(_GAMESERVER)
|
|||
|
|
SummonMonsterStruct Struct;
|
|||
|
|
memset(&Struct, 0, sizeof(Struct));
|
|||
|
|
Struct.MonsterID = (int)m_fValue;
|
|||
|
|
Struct.vPosition = &m_vDeltaPos;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> <20><>ȯü <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
Struct.nLifeTime = (int)(m_StateBlow.fDurationTime*1000.0f);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>⼭ <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> RequestSummonMonster<65>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> Owner<65><72> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
//Struct.nTeam = m_hActor->GetTeam();
|
|||
|
|
|
|||
|
|
Struct.bCopySummonerState = true;
|
|||
|
|
Struct.fHPAdjustValue = 1.0f;
|
|||
|
|
|
|||
|
|
Struct.bSuicideWhenSummonerDie = TRUE; //<2F><>ȯ<EFBFBD><C8AF> <20><><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
Struct.bFollowSummonerStage = FALSE; //<2F><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٴϱ<D9B4> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
CDnGameTask* pGameTask = static_cast<CDnGameTask*>(CTaskManager::GetInstancePtr(GetRoom())->GetTask( "GameTask" ));
|
|||
|
|
|
|||
|
|
if( pGameTask )
|
|||
|
|
m_hSummonMonster = pGameTask->RequestSummonMonsterBySkill( m_hActor, m_ParentSkillInfo.hSkillUser, &Struct );
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD> <20>Ѵ<EFBFBD>..
|
|||
|
|
if (m_hSummonMonster)
|
|||
|
|
{
|
|||
|
|
int nDurationTime = (int)(m_StateBlow.fDurationTime * 1000.0f);
|
|||
|
|
const char* szParam = m_DamageChangeRateArg.c_str();
|
|||
|
|
|
|||
|
|
m_hSummonMonster->CmdAddStateEffect(&m_ParentSkillInfo, STATE_BLOW::BLOW_134, nDurationTime, szParam);
|
|||
|
|
m_hSummonMonster->CmdAddStateEffect(&m_ParentSkillInfo, STATE_BLOW::BLOW_135, nDurationTime, szParam);
|
|||
|
|
|
|||
|
|
|
|||
|
|
//<2F><> pGameTask->RequestSummonMonsterBySkill<6C><6C><EFBFBD><EFBFBD> ȣ<><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
|
|||
|
|
m_hSummonMonster->SetPuppetSummonMonster(true);
|
|||
|
|
}
|
|||
|
|
#ifdef PRE_ADD_DECREASE_EFFECT
|
|||
|
|
if( m_hSummonMonster && m_bShowReduce )
|
|||
|
|
{
|
|||
|
|
m_hSummonMonster->SendAddSEFail( CDnStateBlow::ADD_DECREASE_EFFECT_BY_IMMUNE, m_StateBlow.emBlowIndex );
|
|||
|
|
m_bShowReduce = false;
|
|||
|
|
}
|
|||
|
|
#endif // PRE_ADD_DECREASE_EFFECT
|
|||
|
|
#endif // _GAMESERVER
|
|||
|
|
|
|||
|
|
OutputDebug( "%s\n", __FUNCTION__ );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDnPuppetBlow::Process( LOCAL_TIME LocalTime, float fDelta )
|
|||
|
|
{
|
|||
|
|
__super::Process( LocalTime, fDelta );
|
|||
|
|
|
|||
|
|
#if defined(_GAMESERVER)
|
|||
|
|
if (m_fLimitRange >= 0.0f)
|
|||
|
|
{
|
|||
|
|
if (m_hActor && m_hSummonMonster)
|
|||
|
|
{
|
|||
|
|
#if defined(PRE_FIX_61438)
|
|||
|
|
SSphere actorSphere;
|
|||
|
|
SSphere summonActorSphere;
|
|||
|
|
|
|||
|
|
//<2F>巡<EFBFBD><E5B7A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û ũ<><C5A9> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>찡 <20><><EFBFBD><EFBFBD>.
|
|||
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
|||
|
|
m_hActor->GetBoundingSphere(actorSphere, true);
|
|||
|
|
m_hSummonMonster->GetBoundingSphere(summonActorSphere, true);
|
|||
|
|
|
|||
|
|
EtVector2 vVec;
|
|||
|
|
vVec.x = summonActorSphere.Center.x - actorSphere.Center.x;
|
|||
|
|
vVec.y = summonActorSphere.Center.z - actorSphere.Center.z;
|
|||
|
|
|
|||
|
|
float fLength = EtVec2Length(&vVec);
|
|||
|
|
if (summonActorSphere.fRadius + actorSphere.fRadius + m_fLimitRange < fLength)
|
|||
|
|
{
|
|||
|
|
SetState(STATE_BLOW::STATE_END);
|
|||
|
|
|
|||
|
|
//Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
|
|||
|
|
m_hActor->CmdRemoveStateEffectFromID(GetBlowID());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#else
|
|||
|
|
EtVector3 ownerActorPos = *(m_hActor->GetPosition());
|
|||
|
|
EtVector3 puppetActorPos = *(m_hSummonMonster->GetPosition());
|
|||
|
|
|
|||
|
|
EtVector2 vVec;
|
|||
|
|
vVec.x = puppetActorPos.x - ownerActorPos.x;
|
|||
|
|
vVec.y = puppetActorPos.z - ownerActorPos.z;
|
|||
|
|
|
|||
|
|
float fLength = EtVec2Length(&vVec);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>..
|
|||
|
|
if( m_fLimitRange < fLength )
|
|||
|
|
{
|
|||
|
|
SetState( STATE_BLOW::STATE_END );
|
|||
|
|
|
|||
|
|
//Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
|
|||
|
|
m_hActor->CmdRemoveStateEffectFromID(GetBlowID());
|
|||
|
|
}
|
|||
|
|
#endif // PRE_FIX_61438
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif // _GAMESERVER
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDnPuppetBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
|
|||
|
|
{
|
|||
|
|
__super::OnEnd(LocalTime, fDelta);
|
|||
|
|
|
|||
|
|
#if defined(_GAMESERVER)
|
|||
|
|
if (m_hSummonMonster)
|
|||
|
|
m_hSummonMonster->CmdSuicide(false, false);
|
|||
|
|
#endif // _GAMESERVER
|
|||
|
|
|
|||
|
|
OutputDebug( "%s\n", __FUNCTION__);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
|
|||
|
|
void CDnPuppetBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
|
|||
|
|
{
|
|||
|
|
char szBuff[128] = {0, };
|
|||
|
|
|
|||
|
|
szNewValue = szOrigValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDnPuppetBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
|
|||
|
|
{
|
|||
|
|
char szBuff[128] = {0, };
|
|||
|
|
|
|||
|
|
szNewValue = szOrigValue;
|
|||
|
|
}
|
|||
|
|
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
|