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

165 lines
4.8 KiB
C++

//------------------------------------------------------------------------------
// SkillStatePoisonDagger.cpp
// (C) 2008 Webzen Sunstudio
//------------------------------------------------------------------------------
#include "SunClientPrecompiledHeader.h"
#include "statebase.h"
#include "SkillState.h"
#include "SkillStatePoisonDagger.h"
#include "ProjectileManagerEx.h"
#include "Character.h"
#include "Hero.h"
#include "GlobalFunc.h"
#include "Camera.h"
#include "SkillInfoParser.h"
class Projectile;
SkillStatePoisonDagger::SkillStatePoisonDagger()
{
m_bAniStop = FALSE;
}
SkillStatePoisonDagger::~SkillStatePoisonDagger(void)
{
}
//------------------------------------------------------------------------------
/**
*/
STATEPROCESS::TYPE SkillStatePoisonDagger::OnProcess(Object* pOwner, DWORD CurTime,DWORD dwTick)
{
if(m_bAniStop)
{
////팔사체가 돌아오기전까지는 애니메이션 정지한다.
//Projectile* pProject = g_ProjectileManager.GetProjectile(m_dwDaggerKey);
//if(!pProject)
{
m_bAniStop = FALSE;
EnterProcess(pOwner,CurTime,dwTick);
}
}
else
{
EnterProcess(pOwner,CurTime,dwTick);
}
Character* pChr = (Character*)pOwner;
CheckEvent();
//첫번째이벤트에 발사체를 날린다.
if (CheckNotProcessedHitEvent(1))
{
++m_iHitProcessed;
BOOL IsMyHero = pChr->GetObjectKey() == g_pHero->GetObjectKey();
//행위주체가 주인공일때는 흔들어준다.
if ( IsMyHero == TRUE )
{
g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL);
g_Camera.StartVibration(100,0.07f);
}
if( Character* pTarget = (Character *)pChr->GetTargetObject() )
{
SkillScriptInfo* pInfo = GetSkillInfo();
WzVector StartPosition = pChr->GetWeaponBonePos(0);
WzVector TargetPosition = pTarget->GetArrowTargetPos();
WzVector vDistance = TargetPosition - StartPosition;
float fRange = VectorLength(&vDistance);
float fSkillRange = ((float)pInfo->m_wSkillRange / 10.0f);
DWORD LifeTime1 = (DWORD)(160.0f * fRange/fSkillRange);
DWORD LifeTime2 = max(900,(DWORD)(150.0f * (14.f+fRange)/fSkillRange));
WzVector vCharDir = pChr->GetDirection();
//첫번째 제어점
WzVector vCtrlDir1;
float fAngle1 = n_deg2rad(33);
vCtrlDir1.x = vCharDir.x * cos(fAngle1) + vCharDir.y * sin(fAngle1);
vCtrlDir1.y = vCharDir.x * -sin(fAngle1) + vCharDir.y * cos(fAngle1);
vCtrlDir1.z = 0.0f;
WzVector ControlPoint1 = (StartPosition + vCtrlDir1 * (fRange/2) );
//두번째 제어점
WzVector vCtrlDir2;
float fAngle2 = n_deg2rad(-33);
vCtrlDir2.x = vCharDir.x * cos(fAngle2) + vCharDir.y * sin(fAngle2);
vCtrlDir2.y = vCharDir.x * -sin(fAngle2) + vCharDir.y * cos(fAngle2);
vCtrlDir2.z = 0.0f;
WzVector ControlPoint2 = ( StartPosition + vCtrlDir2 * 14.f );
{
cProjectileBezierUnit* pProjectile = new cProjectileBezierUnit();
pProjectile->SetBezierCourseSingleControl( StartPosition, TargetPosition, ControlPoint1 );
pProjectile->CreateEffect( StrToWzID("K845"), pChr->GetObjectKey(), pTarget->GetObjectKey() );
pProjectile->SetEffectScale( 0.5f );
pProjectile->SetHitData( pChr->GetObjectKey(), pChr->GetCurrentAttackSerial(), StrToWzID("K849"), FALSE, 0, FALSE );
if( IsMyHero == TRUE )
{
pProjectile->SetCameraShakeHit( TRUE );
pProjectile->SetCameraShakeType( Camera::VIBE_TYPE_VERTICAL, 100.0f, 0.07f );
}
pProjectile->SetLifeTime( LifeTime1 );
g_ProjectileManagerEx.InsertProjectile( pProjectile );
}
{
cProjectileBezierUnit* pProjectile = new cProjectileBezierUnit();
pProjectile->SetBezierCourseSingleControl( TargetPosition, StartPosition, ControlPoint2 );
pProjectile->CreateEffect( StrToWzID("K845"), pChr->GetObjectKey(), pTarget->GetObjectKey() );
pProjectile->SetEffectScale( 0.5f );
pProjectile->SetHitData( pChr->GetObjectKey(), 0, StrToWzID("K848"), FALSE, 0, FALSE );
//pProjectile->SetCameraShakeHit( TRUE );
//pProjectile->SetCameraShakeType( Camera::VIBE_TYPE_VERTICAL, 100.0f, 0.07f );
pProjectile->SetLifeTime( LifeTime2 );
pProjectile->SetActiveDelayTime( LifeTime1 );
g_ProjectileManagerEx.InsertProjectile( pProjectile );
}
}
}
//두번째 타점에는 애니를 멈춘다.
if(CheckNotProcessedHitEvent(2))
{
++m_iHitProcessed;
m_bAniStop = TRUE;
}
return LeaveProcess(pOwner,CurTime,dwTick);
}