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

237 lines
5.2 KiB
C++

//------------------------------------------------------------------------------
// SkillStateExplozenAttack.cpp
// (C) 2005 Webzen Sunstudio
//------------------------------------------------------------------------------
#include "SunClientPrecompiledHeader.h"
#include "statebase.h"
#include "SkillState.h"
#include "SkillStateExplozenAttack.h"
#include "Character.h"
#include "Clone.h"
#include "CloneManager.h"
#include "Camera.h"
#include "Hero.h"
#include "SkillInfoParser.h"
#define UP_TIME 300
#define DOWN_TIME 167
#define DEFAULT_HEIGHT 2.0
#define JUMP_MIN 2.0
#define JUMP_MAX 4.0
//------------------------------------------------------------------------------
/**
*/
SkillStateExplozenAttack::SkillStateExplozenAttack()
{
}
//------------------------------------------------------------------------------
/**
*/
SkillStateExplozenAttack::~SkillStateExplozenAttack()
{
}
//------------------------------------------------------------------------------
/**
*/
BOOL SkillStateExplozenAttack::CanTransite(Object* pOwner, DWORD CurTime, StateBase* pToTransiteState)
{
return TRUE;
}
//------------------------------------------------------------------------------
/**
부모 Onstart 호출안한다.
*/
STATECHANGE::TYPE SkillStateExplozenAttack::OnStart(Object* pOwner, DWORD CurTime)
{
Character* pCharacter = (Character*)pOwner;
m_fHeight = 0.0f;
m_fRate = 1.0f;
WzVector StartPosition = pCharacter->GetVisiblePos();
WzVector TargetPosition;
if( Character* pTarget = (Character*)pCharacter->GetTargetObject() )
{
WzVector Direction = pTarget->GetVisiblePos() - StartPosition;
VectorNormalize(&Direction, &Direction);
TargetPosition = pTarget->GetVisiblePos() + Direction * 1.5f;
m_fHeight = pTarget->GetMeshHeight();
m_fHeight = float( max(m_fHeight,JUMP_MIN) );
m_fHeight = float( min(m_fHeight,JUMP_MAX) );
m_fRate = float( m_fHeight/DEFAULT_HEIGHT );
}
else
{
TargetPosition = StartPosition;
}
pCharacter->Move( StartPosition, TargetPosition, CMS_RUN, TRUE, -1, -1 );
m_vStartpos = StartPosition;
m_vTargetpos = TargetPosition;
m_vStartpos.z += m_fHeight;
m_dwCopyTime = 80;
m_dwCurTime = 0;
m_bFrontMove = FALSE;
m_bUpMove = FALSE;
m_bDownMove = FALSE;
m_dwCurTime = 0;
return StateSkill::OnStart( pOwner, CurTime );
}
//------------------------------------------------------------------------------
/**
*/
// 목표점까지 이동해서 한대 때리는 기술이다.
STATEPROCESS::TYPE SkillStateExplozenAttack::OnProcess(Object* pOwner, DWORD CurTime,DWORD dwTick)
{
EnterProcess(pOwner,CurTime,dwTick);
Character* pCharacter = (Character*)pOwner;
m_dwCurTime+=dwTick;
if(m_dwCurTime>=300&&m_iHitProcessed==0)
{
m_bUpMove=TRUE;
}
// 타격점 체크
CheckEvent();
if(m_bUpMove)//올린다.
{
float fRate=(float)m_dwCurTime/(float)(UP_TIME*m_fRate);
fRate=min(fRate,1.0f);
float temp = m_fHeight * (fRate);
pCharacter->SetHeight(temp);
}
else if(m_bDownMove)//내린다.
{
float fRate=(float)m_dwCurTime/(float)DOWN_TIME;
fRate=min(fRate,1.0f);
float temp = m_fHeight* (1.0f - fRate);
pCharacter->SetHeight(temp);
}
if (CheckNotProcessedHitEvent(1))//올라가는게 끝나는 시간
{
++m_iHitProcessed;
m_bUpMove=FALSE;
}
if (CheckNotProcessedHitEvent(2))//이동시작 시간
{
++m_iHitProcessed;
m_bDownMove=TRUE;
m_dwCurTime=0;
m_bFrontMove=TRUE;
//const PLAYER_ACTION* pAction = pCharacter->GetCurrentAction();
//pCharacter->Move( pAction->SKILL.vCurPos.wvPos, pAction->SKILL.vDestPos.wvPos, CMS_RUN, TRUE, pAction->SKILL.vCurPos.wTile, pAction->SKILL.vDestPos.wTile);
}
if (CheckNotProcessedHitEvent(3))//이동 끝시간
{
++m_iHitProcessed;
m_bFrontMove=FALSE;
g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
g_Camera.StartVibration(40,0.03f);
if (pCharacter->ProcessAttackResult_Group(pCharacter->GetCurrentAttackSerial()))
{
}
}
//Todo:목표점이 속도 안에 갈수 있는 곳이어야겠다.
if(m_bFrontMove)
{
WzVector vDest,vTemp;
float fAngleZ,fAngleX;
vDest = m_vTargetpos - m_vStartpos;
vTemp = vDest;
vTemp.z = 0.0f;
float fLength;
if (vTemp.x == 0.0f && vTemp.y == 0.0f)
{
fLength = 0.0f;
}
else
{
fLength = VectorLength(&vTemp);
}
fAngleX = -atan2(vDest.z,fLength);
fAngleZ = Math_GetAngleFromVector(&vDest);
float fRate=(float)m_dwCurTime/(float)DOWN_TIME;
fRate=min(fRate,1.0f);
float fAngleY = WZ_PI*2 * (fRate);
pCharacter->SetAngle(fAngleX,fAngleY,fAngleZ);//목표지점으로 꺽고 스크류
// 목표점까지 이동
ProcessMove(pCharacter,100.0f * SPEED_MULTIPLIER,dwTick);
if( m_dwCopyTime < dwTick )
{
m_dwCopyTime=30;
DWORD key = g_CloneManager.CreateClone(pCharacter);
if ( Clone* pClone = g_CloneManager.GetClone(key) )
{
pClone->SetColor(WzColor_RGBA(255,255,255,255));
pClone->SetPlayAni(TRUE);
pClone->SetDisappear(400);//알파 안된다
pClone->SetLifeTime(400);
}
}
else
{
m_dwCopyTime-=dwTick;
}
}
return LeaveProcess(pOwner,CurTime,dwTick);
}
//------------------------------------------------------------------------------
/**
*/
STATECHANGE::TYPE SkillStateExplozenAttack::OnEnd(Object* pOwner, DWORD CurTime)
{
//Todo:특화된 처리를 한다.
Character* pCharacter = (Character*)pOwner;
pCharacter->SetHeight(0.0f);
return StateSkill::OnEnd(pOwner,CurTime);
}