Files
2022-10-26 12:25:11 +08:00

216 lines
5.4 KiB
C++

//------------------------------------------------------------------------------
// StateSit.cpp
// (C) 2005 Webzen Sunstudio
//------------------------------------------------------------------------------
#include "SunClientPrecompiledHeader.h"
#include "statebase.h"
#include "statesit.h"
#include "Hero.h"
#include "HeroActionInput.h"
#include "InterfaceManager.h"
#include "npc.h"
#include "Monster.h"
#ifdef _NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
#include "Map.h"
#include "SpaZoneInfoParser.h"
#endif //_NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
//------------------------------------------------------------------------------
/**
*/
StateSit::StateSit(void)
{
}
//------------------------------------------------------------------------------
/**
*/
StateSit::~StateSit(void)
{
}
//------------------------------------------------------------------------------
/**
*/
BOOL StateSit::CanTransite(Object* pOwner, DWORD CurTime, StateBase* pToTransiteState)
{
switch(pToTransiteState->GetStateKind())
{
case 0:
break;
}
return TRUE;
}
//------------------------------------------------------------------------------
/**
*/
STATECHANGE::TYPE StateSit::OnStart(Object* pOwner, DWORD CurTime)
{
Player* pPlayer = (Player*)pOwner;
assert(pPlayer->IsKindOfObject(PLAYER_OBJECT));
#ifdef _NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
if (pPlayer->IsInSpaTile_Change_Sit())
{
pPlayer->SetSitState(TRUE);
pPlayer->SetStandUp(FALSE);
if(g_pHero->GetObjectKey()==pPlayer->GetObjectKey())
{
g_HeroInput.SetAutoRun(FALSE);
g_HeroInput.SetAutoAttack(FALSE);
g_HeroInput.SetAreaSkill(FALSE);
g_SkillQueue.ClearAll();
}
return STATECHANGE::SUCCESS;
}
#endif //_NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
WzID anim;
pPlayer->SetSitState( FALSE );
pPlayer->SetStandUp(FALSE);
anim = pPlayer->GetCurrentSitAnimation();
pPlayer->SetPlayerAnimation(anim,eANI_SIT,FALSE);
if(g_pHero->GetObjectKey()==pPlayer->GetObjectKey())
{
g_HeroInput.SetAutoRun(FALSE);
g_HeroInput.SetAutoAttack(FALSE);
g_HeroInput.SetAreaSkill(FALSE);
g_SkillQueue.ClearAll();
}
return STATECHANGE::SUCCESS;
}
//------------------------------------------------------------------------------
/**
*/
STATEPROCESS::TYPE StateSit::OnProcess(Object* pOwner, DWORD CurTime,DWORD dwTick)
{
Player* pPlayer = (Player*)pOwner;
assert(pPlayer->IsKindOfObject(PLAYER_OBJECT));
// 에니메이션 업데이트
WzID anim;
pPlayer->ProcessInterpolation(dwTick);
float fRet = pPlayer->ProcessAnimation(dwTick);
#ifdef _NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
if (pPlayer->IsInSpaTile_Change_Sit())
{
return ProcessSpaSitAnimation(pPlayer);
}
#endif //_NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
if(pPlayer->IsStandUp())
{
anim = pPlayer->GetCurrentStandUpAnimation();
pPlayer->SetPlayerAnimation(anim,eANI_GETUP,FALSE);
pPlayer->SetStandUp(FALSE);
}
else if(pPlayer->GetCurrentAnimation()!=pPlayer->GetCurrentStandUpAnimation())
{
if (fRet >= 100.0f)
{
pPlayer->SetSitState( TRUE );
}
if( pPlayer->GetSitState() )
{
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
#ifdef _NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
if (pPlayer->IsInSpaTile_Change_SitIdle())
#else
if (pPlayer->IsInSpaTile())
#endif //_NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
{
// 온천 앉기 애니메이션
pPlayer->SetSpaSittingAnimation(dwTick);
}
else
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
{
anim = pPlayer->GetCurrentSittingAnimation();
pPlayer->SetPlayerAnimation(anim,eANI_SIT_IDLE,TRUE);
}
}
}
else
{
if (fRet >= 100.0f)
return STATEPROCESS::END;
}
// 대부분의 State에서 공통적으로 처리하는 상태변화를 처리한다.
if (pPlayer->CommonStateProcess())
{
return STATEPROCESS::SUSPEND;
}
// 다음 동작이 있으면 바로 수행해주세요~
if (pPlayer->GetActionQueueCount())
{
pPlayer->ProcessNextAction();
return STATEPROCESS::SUSPEND;
}
return STATEPROCESS::SUSPEND;
}
//------------------------------------------------------------------------------
/**
*/
STATECHANGE::TYPE StateSit::OnEnd(Object* pOwner, DWORD CurTime)
{
Player* pPlayer = (Player*)pOwner;
assert(pPlayer->IsKindOfObject(PLAYER_OBJECT));
pPlayer->SetSitState( FALSE );
pPlayer->SetStandUp(FALSE);
return STATECHANGE::SUCCESS;
}
#ifdef _NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION
STATEPROCESS::TYPE StateSit::ProcessSpaSitAnimation(Player* pPlayer)
{
if (pPlayer->IsInSpaTile_Change_Sit())
{
SpaZoneInfo* spa_info = SpaZoneInfoParser::Instance()->GetSpaZoneInfo(g_pMap->GetMapID());
if (spa_info && (spa_info->special_animation[0].id != 0))
{
pPlayer->SetPlayerAnimation(spa_info->special_animation[0].id,eANI_SIT,TRUE);
}
}
if(pPlayer->IsStandUp())
{
pPlayer->SetStandUp(FALSE);
return STATEPROCESS::END;
}
// 대부분의 State에서 공통적으로 처리하는 상태변화를 처리한다.
if (pPlayer->CommonStateProcess())
{
return STATEPROCESS::SUSPEND;
}
// 다음 동작이 있으면 바로 수행해주세요~
if (pPlayer->GetActionQueueCount())
{
pPlayer->ProcessNextAction();
return STATEPROCESS::SUSPEND;
}
return STATEPROCESS::SUSPEND;
}
#endif //_NA_008350_20150617_SPA_NEW_STYLE_MODE_ANIMATION