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

182 lines
4.5 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "statebase.h"
#include "SkillState.h"
#include "SkillStateFactory.h"
#include "Hero.h"
#include "Character.h"
#include "Clone.h"
#include "CloneManager.h"
#include "GlobalFunc.h"
#include "GameFunc.h"
#include "ObjectManager.h"
#include "HeroActionInput.h"
#include "SkillInfoParser.h"
#include "PlayerAttributes.h"
#include "SkillEffectFunc.h"
#include "InterfaceManager.h"
#include "SkillStateCreateCrystalWarp.h"
SkillStateCreateCrystalWarp::SkillStateCreateCrystalWarp()
{
}
SkillStateCreateCrystalWarp::~SkillStateCreateCrystalWarp(void)
{
}
BOOL SkillStateCreateCrystalWarp::CanTransite(Object* pOwner, DWORD CurTime, StateBase* pToTransiteState)
{
return TRUE;
}
STATECHANGE::TYPE SkillStateCreateCrystalWarp::OnStart(Object* pOwner, DWORD CurTime)
{
Character *pChr = (Character *)pOwner;
if (g_pHero)
{
if (g_pHero->GetObjectKey() != pChr->GetObjectKey()) {
DWORD dwAttackSerial = pChr->GetNextActionAttackSerial();
pChr->SetCurrentAttackSerial(dwAttackSerial);
pChr->SetNextAttackSerial(dwAttackSerial);
}
if(g_pHero->GetObjectKey()==pChr->GetObjectKey())
{
//////////////////////////////////////////////////////////////////////////
MSG_CG_CRYSTALWARP_COMMAND_SYN SendPacket;
SendPacket.m_wvPos = g_HeroInput.GetPickingPosition();
SendPacket.m_dwCrystalWarpObjKey = 0;
SendPacket.m_byCommand = eCRYSTALWARP_COMMAND_CREATE;
if(FALSE == GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ))
{
assert(!"패킷 전송 실패");
return STATECHANGE::FAILED;
}
//////////////////////////////////////////////////////////////////////////
}
}
pChr->OnUseSkill();
BASE_SKILLINFO *pInfo = GetSkillInfo();
assert(pInfo);
if(pInfo)
{
const PLAYER_ACTION *pAction = pChr->GetCurrentAction();
if(pInfo->m_wzidCastAniCode.id != StrToWzID("NULL"))//캐스팅코드가 있다면
{
pChr->SetAnimation(pInfo->m_wzidCastAniCode.id,TRUE);
m_isCastAni=TRUE;
m_dwTotalCastTime=pInfo->m_wSkillCasting;//캐스팅 시간
if(pChr==g_pHero)
{
g_InterfaceManager.ShowWindow(InterfaceManager::DIALOG_CASTING,TRUE);
//캐스팅 이벤트 삽입
keyMsg msg;
ZeroMemory(&msg,sizeof(msg));
msg.dwType=eDoType_cast_cancel;
msg.DoSomething=GlobalFunc::DoCastCancel;
//msg.bPriority=1;
g_KeyQueueManager.PushBack(msg);
g_pHero->SetCast(m_isCastAni);
}
// Casting Effect
if( m_hCastHandle[0] != INVALID_HANDLE_VALUE )
{
g_pEffectManager->RemoveEffectPtr( m_hCastHandle[0] );
}
m_hCastHandle[0] = SkillEffectFunc::CreateCastingSkillEffect( m_dwSkillClassCode, pChr );
}
else
{
StartSkillAnimation( pChr );
}
if(pInfo->m_byTarget==SKILL_TARGET_ENEMY||
pInfo->m_byTarget==SKILL_TARGET_FRIEND||
pInfo->m_byTarget==SKILL_TARGET_FRIEND_CORPSE||
pInfo->m_byTarget==SKILL_TARGET_REACHABLE_ENEMY||
pInfo->m_byTarget==SKILL_TARGET_REACHABLE_FRIEND ||
pInfo->m_byTarget==SKILL_TARGET_ENEMY_PLAYER
|| pInfo->m_byTarget==SKILL_TARGET_ENEMY_AND_ME
)
{
Character *pTarget = (Character *)pChr->GetTargetObject();
if (pTarget)
{
pChr->SetDirection(pTarget->GetPosition());
}
}
else if(pInfo->m_byTarget==SKILL_TARGET_AREA)
{
WzVector vTarget=pChr->GetCurrentAction()->SKILL.vTargePos;
pChr->SetDirection(vTarget);
}
// Casting BottomEffect
if( m_hCastHandle[1] != INVALID_HANDLE_VALUE )
{
g_pEffectManager->RemoveEffectPtr( m_hCastHandle[1] );
}
m_hCastHandle[1] = SkillEffectFunc::CreateCastingSkillBottomEffect( m_dwSkillClassCode, pChr );
// StartSkillEffect
m_dwStartProjectileKey = SkillEffectFunc::CreateStartSkillEffect( m_dwSkillClassCode, pChr );
if( pInfo->m_szSkillMasterEffectName )
{
if( StrnCmp ( pInfo->m_szSkillMasterEffectName , _T("NULL") , MAX_SKILLNAME_LENGTH ) != 0 )
{
GlobalFunc::CreateEffectBeUpToOption(StrToWzID(pInfo->m_szSkillMasterEffectName), pChr->GetBonePos(1),pChr->GetScale());
}
}
}
return STATECHANGE::SUCCESS;
}
STATEPROCESS::TYPE SkillStateCreateCrystalWarp::OnProcess(Object* pOwner, DWORD CurTime,DWORD dwTick)
{
EnterProcess(pOwner,CurTime,dwTick);
Character* pChr = (Character*)pOwner;
CheckEvent();
//첫번째이벤트에 발사체를 날린다.
if (CheckNotProcessedHitEvent(1))
{
++m_iHitProcessed;
}
// 대부분의 State에서 공통적으로 처리하는 상태변화를 처리한다.
if (pChr->CommonStateProcess())
{
return STATEPROCESS::SUSPEND;
}
return LeaveProcess(pOwner,CurTime,dwTick);
}
STATECHANGE::TYPE SkillStateCreateCrystalWarp::OnEnd(Object* pOwner, DWORD CurTime)
{
return STATECHANGE::SUCCESS;
}