#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 "SkillStateDestroyCrystalWarp.h" SkillStateDestroyCrystalWarp::SkillStateDestroyCrystalWarp() { } SkillStateDestroyCrystalWarp::~SkillStateDestroyCrystalWarp(void) { } BOOL SkillStateDestroyCrystalWarp::CanTransite(Object* pOwner, DWORD CurTime, StateBase* pToTransiteState) { return TRUE; } STATECHANGE::TYPE SkillStateDestroyCrystalWarp::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 = c_ZeroVector; SendPacket.m_dwCrystalWarpObjKey = g_pHero->GetTargetObject()->GetObjectKey(); SendPacket.m_byCommand = eCRYSTALWARP_COMMAND_DESTROY; if(FALSE == GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) )) { assert(!"ÆÐŶ Àü¼Û ½ÇÆÐ"); return STATECHANGE::FAILED; } ////////////////////////////////////////////////////////////////////////// } } pChr->OnUseSkill(); BASE_SKILLINFO *pInfo = GetSkillInfo(); assert(pInfo); //if(!pInfo) //{ // if(g_pHero==pOwner) // { // FILE *fp = fopen("SkillCrashLog.txt","wt"); // if (fp) // { // fprintf(fp,"Hero SkillCode ÀÌ»ó SkillCode : %d",m_dwSkillCode); // fclose(fp); // } // } // else // { // FILE *fp = fopen("SkillCrashLog.txt","wt"); // if (fp) // { // fprintf(fp,"Character SkillCode ÀÌ»ó SkillCode : %d",m_dwSkillCode); // fclose(fp); // } // } //} if(pInfo) { const PLAYER_ACTION *pAction = pChr->GetCurrentAction(); if(pInfo->m_wzidCastAniCode.id != StrToWzID("NULL"))//ij½ºÆÃÄڵ尡 ÀÖ´Ù¸é { pChr->SetAnimation(pInfo->m_wzidCastAniCode.id,TRUE); m_isCastAni=TRUE; m_dwTotalCastTime=pInfo->m_wSkillCasting;//ij½ºÆÃ ½Ã°£ if(pChr==g_pHero) { g_InterfaceManager.ShowWindow(InterfaceManager::DIALOG_CASTING,TRUE); //ij½ºÆÃ À̺¥Æ® »ðÀÔ 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 SkillStateDestroyCrystalWarp::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 SkillStateDestroyCrystalWarp::OnEnd(Object* pOwner, DWORD CurTime) { return STATECHANGE::SUCCESS; }