//------------------------------------------------------------------------------ // StateJump.cpp // (C) 2005 Webzen Sunstudio //------------------------------------------------------------------------------ #include "SunClientPrecompiledHeader.h" #include "statebase.h" #include "statejump.h" #include "character.h" #include "monster.h" #include "NumericValues.h" //------------------------------------------------------------------------------ /** */ StateJump::StateJump(void) { } //------------------------------------------------------------------------------ /** */ StateJump::~StateJump(void) { } //------------------------------------------------------------------------------ /** Á¡ÇÁ´Â MOVE ·Î ¹Ýµå½Ã µ¹¾Æ°¡¾ßÇÑ´Ù. Á×Áöµµ ¾Ê¾Æ¿ä~ */ BOOL StateJump::CanTransite(Object* pOwner, DWORD CurTime, StateBase* pToTransiteState) { switch(pToTransiteState->GetStateKind()) { case STATE::MOVE: return TRUE; } return FALSE; } //------------------------------------------------------------------------------ /** */ STATECHANGE::TYPE StateJump::OnStart(Object* pOwner, DWORD CurTime) { Character* pChr = (Character*)pOwner; pChr->SetAnimation( "J001" ); if(pChr->IsKindOfObject(MONSTER_OBJECT) ) { Monster *pMonster = (Monster *)pChr; if (pChr->GetMoveState() == CMS_WALK ) { pChr->SetMoveSpeed( pMonster->GetMonsterInfo()->m_fWalkSpeed * SPEED_MULTIPLIER); } else { pChr->SetMoveSpeed( pMonster->GetMonsterInfo()->m_fRunSpeed * SPEED_MULTIPLIER * 2.0f); } } else { if (pChr->GetMoveState() == CMS_WALK ) { pChr->SetMoveSpeed( GetBaseMoveSpeedAsState(CMS_RUN) ); } else { pChr->SetMoveSpeed( GetBaseMoveSpeedAsState(CMS_RUN) ); } } return STATECHANGE::SUCCESS; } //------------------------------------------------------------------------------ /** */ STATEPROCESS::TYPE StateJump::OnProcess(Object* pOwner, DWORD CurTime,DWORD dwTick) { STATEPROCESS::TYPE ret = STATEPROCESS::HOLD; Character* pChr = (Character*)pOwner; // À̵¿ float fMoveSpeed = pChr->GetMoveSpeed() * (float)dwTick; WzPathFindEvent wzEvent; ZeroMemory(&wzEvent,sizeof(wzEvent)); WzVector vOldPos = pChr->GetPosition(); SUNPROCESSPROFILE_BEGIN(_T("PathFinding")); if (g_pSunTerrain->PathExp_Progress(pChr->GetPathExplorer(), fMoveSpeed ,&wzEvent)) { // ¹æÇâ ¼³Á¤ pChr->SetDirection(pChr->GetPosition(), vOldPos); } SUNPROCESSPROFILE_END(_T("PathFinding")); // ÃÖÁ¾ÀûÀÎ Á¡ÇÁ Á¤º¸¸¸ Áß¿äÇÏ´Ù. if (wzEvent.m_iCountJump > 0) { int lastindex = wzEvent.m_iCountJump - 1; if (wzEvent.m_Jump[lastindex].m_eJumpStep == EJS_JUMPEND) { // Á¡ÇÁ·Î pChr->SetJumpFlag(FALSE); pChr->SetNextState(STATE::MOVE,g_CurTime); ret = STATEPROCESS::SUSPEND; } } float fFrame = pChr->GetCurrentFrame(); pChr->ProcessInterpolation(dwTick); WzVector vJumpFrom; WzVector vJumpTo; float fDistance; float fCurDistance; float fMoveRate; pChr->GetJumpInfo(&vJumpFrom,&vJumpTo,&fDistance); float fHeightConst = -fDistance * 1.0f; WzVector vCurrent = pChr->GetPathExplorer()->GetPos(); WzVector vCurDistance = vJumpTo - vCurrent; fCurDistance = VectorLength(&vCurDistance); if (fCurDistance >= fDistance) { fCurDistance = fDistance; } if (fDistance <= 0.0f) { fMoveRate = 1.0f; } else { fMoveRate = fCurDistance / fDistance; } float fTotalFrame = pChr->GetTotalFrame(); // 1¹øÂ°¹æ¹ý if (fMoveRate <= 0.2f) { float fNewFrame = (fTotalFrame * 0.5f) * (fMoveRate / 0.2f); pChr->SetCurrentFrame(fNewFrame); pChr->ProcessAnimation(0); } else if (fMoveRate >= 0.8f) { if (pChr->IsKindOfObject(MONSTER_OBJECT) ) { pChr->SetAnimation("J002",FALSE); } float fNewFrame = (fTotalFrame * 0.5f) * (1.0f + (fMoveRate - 0.8f) / 0.2f); pChr->SetCurrentFrame(fNewFrame); pChr->ProcessAnimation(0); } else { if (pChr->IsKindOfObject(MONSTER_OBJECT) ) { pChr->SetAnimation("N007",TRUE); } pChr->ProcessAnimation(dwTick); } pChr->m_fHeight = fHeightConst * fMoveRate * (fMoveRate - 1.0f); return ret; } //------------------------------------------------------------------------------ /** */ STATECHANGE::TYPE StateJump::OnEnd(Object* pOwner, DWORD CurTime) { Character* pChr = (Character*)pOwner; pChr->SetJumpFlag(FALSE); pChr->m_fHeight = 0.0f; return STATECHANGE::SUCCESS; }