Files
Sun1602/Client/GameClient/State/StateAir.cpp
T
2022-10-26 12:25:11 +08:00

327 lines
9.8 KiB
C++

//------------------------------------------------------------------------------
// StateAir.cpp
// (C) 2005 Webzen Sunstudio
//------------------------------------------------------------------------------
#include "SunClientPrecompiledHeader.h"
#include "statebase.h"
#include "stateair.h"
#include "Character.h"
//------------------------------------------------------------------------------
/**
*/
StateAir::StateAir(void)
{
}
//------------------------------------------------------------------------------
/**
*/
StateAir::~StateAir(void)
{
}
//------------------------------------------------------------------------------
/**
*/
BOOL StateAir::CanTransite(Object* pOwner, DWORD CurTime, StateBase* pToTransiteState)
{
switch(pToTransiteState->GetStateKind())
{
case 0:
break;
}
return TRUE;
}
//------------------------------------------------------------------------------
/**
*/
STATECHANGE::TYPE StateAir::OnStart(Object* pOwner, DWORD CurTime)
{
Character* pChr = (Character*)pOwner;
// 점프 시작모션
switch( pChr->GetWeaponAnimationCode() )
{
case '0': pChr->SetAnimation( "HS01", FALSE); break;
case '1': pChr->SetAnimation( "HS11", FALSE); break;
case '2': pChr->SetAnimation( "HS21", FALSE); break;
case '3': pChr->SetAnimation( "HS31", FALSE); break;
}
pChr->m_AirAnimationState = Character::AIR_ANIMATION_STATE_BLOW;
pChr->m_fHeight = 0.001f;
return STATECHANGE::SUCCESS;
}
//------------------------------------------------------------------------------
/**
중력 가속도
friend 설정때문에 모든 변수에 접근가능 전부 작성후 함수로 교체
*/
STATEPROCESS::TYPE StateAir::OnProcess(Object* pOwner, DWORD CurTime,DWORD dwTick)
{
Character* pChr = (Character*)pOwner;
pChr->ProcessInterpolation(dwTick);
float fRet = pChr->Character::ProcessAnimation(dwTick);
#ifdef _NA_006688_20130502_1302_SKILL_RENEWAL_AIR_ANIMATION_RENEWAL
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_BLOW )
{
pChr->UpdateAir( dwTick );
if( pChr->m_AirData.m_NoDown == TRUE )
{
// 버서커의 더블 어택
if( pChr->GetHeight() == 0.0f )
{
// 바닥에 착지하는 타이밍에 연출
pChr->SetAngleX( 0.0f );
pChr->SetHeight( 0.0f );
// 떨림효과
WzVector vUp;
vUp.x = 0.0f;
vUp.y = 0.0f;
vUp.z = 1.0f;
pChr->Vibrate(vUp,0.05f);
// 먼지튀기
pChr->CreateEffectAtHead(StrToWzID("A012"),0.0f);
// 죽었으면 ㅃㅃ~
if (pChr->GetHP() <= 0)
{
pChr->SetNextState(STATE::DEATH,g_CurTime);
return STATEPROCESS::SUSPEND;
}
pChr->m_AirAnimationState = Character::AIR_ANIMATION_STATE_SLASH;
fRet = 0.0f;
}
}
else
{
// 에어블로우
if( pChr->GetHeight() == 0.0f )
{
pChr->SetAngleX( 0.0f );
pChr->SetHeight( 0.0f );
// 떨림효과
WzVector vUp;
vUp.x = 0.0f;
vUp.y = 0.0f;
vUp.z = 1.0f;
pChr->Vibrate(vUp,0.05f);
// 먼지튀기
pChr->CreateEffectAtHead(StrToWzID("A012"),0.0f);
// 죽었으면 ㅃㅃ~
if (pChr->GetHP() <= 0)
{
pChr->SetNextState(STATE::DEATH,g_CurTime);
return STATEPROCESS::SUSPEND;
}
// 바닥에 패댕겨쳐지는 동작
switch( pChr->GetWeaponAnimationCode() )
{
case '0': pChr->SetAnimation( "HS04", FALSE); break;
case '1': pChr->SetAnimation( "HS14", FALSE); break;
case '2': pChr->SetAnimation( "HS24", FALSE); break;
case '3': pChr->SetAnimation( "HS34", FALSE); break;
}
pChr->m_AirAnimationState = Character::AIR_ANIMATION_STATE_DOWN;
fRet = 0.0f;
}
}
}
// 버서커의 더블어택 애니메이션은 여기에서 끝낸다
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_SLASH && fRet == 100.0f )
{
return STATEPROCESS::END;
}
// 에어블로우의 착지와 일어나는 애니메이션 처리
// 구버전은 F002, F003 애니메이션을 이용해 착지후 정신차리는 연출을 구현했었는데
// F00X 시리즈는 다운상태의 애니메이션에서도 사용되고 있어서 마음대로 바꾸질 못함..
//
// 그래서 전용 애니메이션을 추가한것이 HS07, HS08임..
// 문제는 이 두 애니메이션은 플레이어만 가지고 있다는것인데...
// 그런 이유로 플레이어들은 HS07, HS08 애니메이션을 사용하기로하고,
// 그외의 몬스터등은 이전의 애니메이션인 F002, F003을 그대로 사용하게된것임
//
// 플레이어형 몬스터가 존재하기 때문에 단순히 오브젝트 타입만으로는 식별할 수 없어
// Class 정보를 이용해 식별함. SSQ이 아닌 플레이어형 몬스터는 MONSTER_OBJECT로 되어있기때문에...
// 다운 애니메이션 착지후 일어나는 동작
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_DOWN && fRet == 100.0f )
{
bool is_monster = pChr->GetClass() == eCHAR_TYPE_MAX;
// 다운상태의 스턴 모션
if( is_monster )
{
switch( pChr->GetWeaponAnimationCode() )
{
case '0': pChr->SetAnimation( "F002", TRUE); break;
case '1': pChr->SetAnimation( "F102", TRUE); break;
case '2': pChr->SetAnimation( "F202", TRUE); break;
case '3': pChr->SetAnimation( "F302", TRUE); break;
}
}
else
{
switch( pChr->GetWeaponAnimationCode() )
{
case '0': pChr->SetAnimation( "HS07", TRUE); break;
case '1': pChr->SetAnimation( "HS17", TRUE); break;
case '2': pChr->SetAnimation( "HS27", TRUE); break;
case '3': pChr->SetAnimation( "HS37", TRUE); break;
}
}
pChr->m_AirAnimationState = Character::AIR_ANIMATION_STATE_DOWN_STUN;
}
#ifdef _NA_007619_20140916_PROCESS_CHANGE_AIRBLOW_DOWN
// 일어나는 동작 후 상태 종료
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_DOWN_STUN && fRet == 100.0f )
{
return STATEPROCESS::END;
}
#else
// 다운 애니메이션 일어나는 동작
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_DOWN_STUN && CurTime >= pChr->m_AirData.m_AirTime)
{
bool is_monster = pChr->GetClass() == eCHAR_TYPE_MAX;
// 다운상태에서 일어서는 모션
if( is_monster )
{
switch( pChr->GetWeaponAnimationCode() )
{
case '0': pChr->SetAnimation( "F003", FALSE); break;
case '1': pChr->SetAnimation( "F103", FALSE); break;
case '2': pChr->SetAnimation( "F203", FALSE); break;
case '3': pChr->SetAnimation( "F303", FALSE); break;
}
}
else
{
switch( pChr->GetWeaponAnimationCode() )
{
case '0': pChr->SetAnimation( "HS08", FALSE); break;
case '1': pChr->SetAnimation( "HS18", FALSE); break;
case '2': pChr->SetAnimation( "HS28", FALSE); break;
case '3': pChr->SetAnimation( "HS38", FALSE); break;
}
}
pChr->m_AirAnimationState = Character::AIR_ANIMATION_STATE_GETUP;
fRet = 0.0f;
}
// 일어나는 동작 후 상태 종료
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_GETUP && fRet == 100.0f )
{
return STATEPROCESS::END;
}
#endif // _NA_007619_20140916_PROCESS_CHANGE_AIRBLOW_DOWN
#else // _NA_006688_20130502_1302_SKILL_RENEWAL_AIR_ANIMATION_RENEWAL
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_BLOW )
{
pChr->UpdateAir( dwTick );
if( pChr->GetHeight() == 0.0f )
{
pChr->SetAngleX( 0.0f );
pChr->SetHeight( 0.0f );
// 떨림효과
WzVector vUp;
vUp.x = 0.0f;
vUp.y = 0.0f;
vUp.z = 1.0f;
pChr->Vibrate(vUp,0.05f);
// 먼지튀기
pChr->CreateEffectAtHead(StrToWzID("A012"),0.0f);
// 죽었으면 ㅃㅃ~
if (pChr->GetHP() <= 0)
{
pChr->SetNextState(STATE::DEATH,g_CurTime);
return STATEPROCESS::SUSPEND;
}
// 다운 동작으로 변경
switch( pChr->GetWeaponAnimationCode() )
{
case '0': pChr->SetAnimation( "F002", TRUE); break;
case '1': pChr->SetAnimation( "F102", TRUE); break;
case '2': pChr->SetAnimation( "F202", TRUE); break;
case '3': pChr->SetAnimation( "F302", TRUE); break;
}
if( pChr->m_AirData.m_NoDown == TRUE )
{
// 다운되지 않고 바로 상태종료
return STATEPROCESS::END;
}
else
{
pChr->m_AirAnimationState = Character::AIR_ANIMATION_STATE_DOWN;
}
}
}
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_DOWN && CurTime >= pChr->m_AirData.m_AirTime)
{
switch( pChr->GetWeaponAnimationCode() )
{
case '0': pChr->SetAnimation( "F003", FALSE); break;
case '1': pChr->SetAnimation( "F103", FALSE); break;
case '2': pChr->SetAnimation( "F203", FALSE); break;
case '3': pChr->SetAnimation( "F303", FALSE); break;
}
pChr->m_AirAnimationState = Character::AIR_ANIMATION_STATE_GETUP;
}
if( pChr->m_AirAnimationState == Character::AIR_ANIMATION_STATE_GETUP && fRet == 100.0f )
{
return STATEPROCESS::END;
}
#endif // _NA_006688_20130502_1302_SKILL_RENEWAL_AIR_ANIMATION_RENEWAL
return STATEPROCESS::HOLD;
}
//------------------------------------------------------------------------------
/**
*/
STATECHANGE::TYPE StateAir::OnEnd(Object* pOwner, DWORD CurTime)
{
Character* pChr = (Character*)pOwner;
pChr->SetAngleX( 0.0f );
pChr->SetHeight( 0.0f );
return STATECHANGE::SUCCESS;
}