//------------------------------------------------------------------------------ // HeroActionInput.cpp // (C) 2005 Webzen Sunstudio //------------------------------------------------------------------------------ #include "SunClientPrecompiledHeader.h" #include "HeroActionInput.h" #include "Hero.h" #include "CooltimeManager.h" #include "GameFunc.h" #include "Monster.h" #include "Character.h" #include "ObjectManager.h" #include "TerrainObject.h" #include "KeyQueueManager.h" #include "SkillQueueManager.h" #include "Item.h" #include "InterfaceManager.h" #include "ItemManager.h" #include "item.h" #include "MouseHandler.h" #include #include "NPC.h" #include "NPCVoiceInfoParser.h" #include "uitargetman/uitargetman.h" #include "TargetDialog.h" #include "uiSummonTargetMan/uiSummonTargetMan.h" #include "SummonTargetDialog.h" #include "SummonSkillContainer.h" #include "ShopDialog.h" #include "GmManager.h" #include "StyleInfoParser.h" #include "ChatDialog.h" #include "uiVendorBuy/uiVendorBuy.h" #include "uiTrade/uiTrade.h" #include "uiTradeMan/uiTradeMan.h" #include "uiPartyLeavePopup/uiPartyLeavePopup.h" #include "uiVendorMan/uiVendorMan_def.h" #include "uiVendorSell/uiVendorSell.h" #ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER #include "GuildSystem/GuildSystemFunction.h" #else #include "uiGuildMan/uiGuildMan.h" #include "uiGuildMenu/uiGuildMenu.h" #endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER #include "quickslot.h" #include "Map.h" #include "Camera.h" #ifdef _NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM #include "uiBankMan/uiBankDialog.h" #else #include "BankDialog.h" #endif //_NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM #include "MouseCursor.h" #include "HeroVoiceInfoParser.h" #include "SoundEffect.h" #include "NPCPortalDialog.h" #include "uiAssistMan/uiAssistMan.h" #include "SkillMain.h" #include "quickcontainer.h" #include "uiPartyMember/uiPartyMember.h" #include "uiHelpMan/uiHelpMan.h" #include "uiVendorMan/uiVendorMan.h" #include "SelectCompositeMenu.h" #include "uiPartyMan/uiPartyMan.h" #include "CursorChangeTransact.h" #include "globalfunc.h" #include "GameFramework.h" #include "BattleScene.h" #include "uiSystemMan/uiSystemMan.h" #include "MapObject.h" #include "uiWayPointMan/uiWayPointMan.h" #include "MapEditScene.h" #include "uiQuickContainerMan/uiQuickContainerMan.h" #include "uiCommunityDlg/uiCommunityDlg.h" #include "ChatPersonalOption.h" #include "uibankman/uibankman.h" #include "uiRadarMan/uiRadarMan.h" #include "RadarFullDialog.h" #include #include "castleavefielddialog.h" #include "uiChatMan/uiChatMan_def.h" #include "uiOptionMenuMan/uiOptionMenuMan.h" #include "Interface/uiPetMan/uiPetMan.h" #include "Interface/uiPetGauge/uiPetGauge.h" #include "Clone.h" #include "CloneManager.h" #include "uiDominationTowerMan/uiDominationTowerMan.h" #include "CollectionParser.h" #include "State/StateCollect.h" #include "uiBattleScoreMan/uiBattleScoreMan.h" #include "uipetman\uipetman.h" #include "uiRadarMan/uiRadarMan.h" #include "ContinentMapDlg.h" #include "uiContinentMapEP2\ContinentMapEp2Dialog.h" #ifdef _YMS_AUTOBOT_GAME #include "Autobot/Autobot.h" #endif //_YMS_AUTOBOT_GAME #include "uiInventoryMan/uiInventoryMan.h" #include "ExtendInventoryDialog.h" #include "uiAreaConquestMan/uiAreaConquestMan.h" #include "uiSkillTree/uiSkillTree.h" #ifdef _NA_20100307_BETAKEY_SYSTEM #include "uiLoginMan/uiLoginMan.h" #include "BetaKeyImpl.h" #include "NPCInfoParser.h" #endif//_NA_20100307_BETAKEY_SYSTEM #include "uiGuideSystemMan/uiGuideSystemMan.h" #include "TotalGuideParser.h" #ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include "Chaossystem/ChaosSystemPacketFunction.h" #endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include "Rider.h" #if defined (_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM) #include "uiMissionRankMan2/uiMissionRankMan2.h" #else #include "uiMissionRankMan/uiMissionRankMan.h" #endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM #include "uiSkillMan/uiNewSkillMan.h" #include "uiPerkDialog/uiPerkDialog.h" #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM #ifdef _NA_000000_20130114_RENEWER_UI #include "uiOptionMan.h" #include "uiOptionView.h" #endif #ifdef _NA_007115_20140313_MONDSCHIEN_RENEWAL #include "DominationInfoParser.h" #endif // _NA_007115_20140313_MONDSCHIEN_RENEWAL #include "State/SkillState.h" #include "State/SkillStateHelroidSpin.h" #include "InventoryDialog.h" #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE #include "StatuePlayer.h" #include "uiSUNRankingMan/uiSUNRankingMan.h" #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE extern DWORD g_CurTime; HeroActionInput g_HeroInput; const DWORD VALKYRIE_SHOT_DELAY_MARGIN = 35; const DWORD UPDATE_MOVE_POSITION_TIME = 500; #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX BOOL HeroActionInput::bIsRotateL = FALSE; #endif //_NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX //------------------------------------------------------------------------------ /** */ BOOL GetSidePosNoNearTileCheck( Object *pTarget, float fAngle, WzVector *vDest , float add_distance) { WzVector vTarget = pTarget->GetPosition(); WzVector vPos = g_pHero->GetPosition(); WzVector vDir = (vPos - vTarget); vDir.z = 0.0f; VectorNormalize( &vDir, &vDir ); // Ÿ°Ù¿¡¼­ ¾à°£ ¾Õ¿¡ ÀÚ¸®¸¦ ±¸ÇØÁØ´Ù. WzVector vNewDir; vNewDir.x = vDir.x * cos(fAngle) + vDir.y * -sin(fAngle); vNewDir.y = vDir.x * sin(fAngle) + vDir.y * cos(fAngle); vNewDir.z = 0.0f; WzVector vNewPos; vNewPos = vTarget + (vNewDir * add_distance); g_pSunTerrain->PathExp_Reset( g_pPathExplorer, &vNewPos, -1 ); g_pPathExplorer->Stop(); float length = VectorLength(&vNewPos); WzVector long_offset_vector = vNewDir * length * -1; g_pSunTerrain->PathExp_Thrust(g_pPathExplorer, &long_offset_vector, PTA_NO_WALK); g_pSunTerrain->PathExp_Progress(g_pPathExplorer, 1000000, NULL); int iTile = g_pPathExplorer->GetTile(); if( iTile == -1 ) { return FALSE; } if( !g_pMap ) return FALSE; if( g_pMap->GetWorldBase()->x_pPathFinder->GetAttribute( iTile ) & ( PTA_ONLY_JUMP | PTA_NO_WALK ) ) { return FALSE; } *vDest = vNewPos; return TRUE; } bool _SortItemByDistance(GET_ITEM& item_ref_left, GET_ITEM& item_ref_right) { return (item_ref_left.fDistance < item_ref_right.fDistance); } //////////////////////////////////////////////////////////////////////////////////// PickingData::PickingData() { } void PickingData::Init() { m_dwPickedTarget = 0; m_bCanMoveToPickedPos = FALSE; m_bIgnorePlayer = FALSE; m_iPickedTile = -1; } void PickingData::ProcessPicking() { m_dwPickedTarget = 0; if (!g_pMap) { return; } if (VectorLength(&g_wrMouseRay.m_wvDirection) <= 0.2f) { return; } #ifndef _DEBUG SUNPROCESSPROFILE_BEGIN(_T("CheckMovable")); m_bCanMoveToPickedPos = FALSE; ZeroMemory(&m_vPickedPos,sizeof(m_vPickedPos)); m_iPickedTile = -1; BOOL bPickTerrain = GameFunc::GetClickedPosition(&m_vPickedPos); if (bPickTerrain) { m_iPickedTile = g_pSunTerrain->x_pPathFinder->GetTileToStand( m_vPickedPos, NULL, -1.0f, 100.0f ); if (m_iPickedTile != -1) { if (!(g_pMap->GetWorldBase()->x_pPathFinder->GetAttribute(m_iPickedTile) & ( PTA_ONLY_JUMP |PTA_NO_WALK))) { m_bCanMoveToPickedPos = TRUE; } } } SUNPROCESSPROFILE_END( _T("CheckMovable") ); #else m_iPickedTile = -1; m_bCanMoveToPickedPos = TRUE; #endif DWORD dwPickingOption = PICKING_IGNORE_CORPSE; #ifdef _DH_BATTLEZONE2_ m_bIgnorePlayer = (CGameOption::Instance()->GetPickingFriend() == FALSE); #endif //_DH_BATTLEZONE2_ if (m_bIgnorePlayer) { dwPickingOption |= PICKING_IGNORE_FRIEND; } if ( !g_Input.GetInterfaceInputMouseFlag() ) { Character* pPickedObj = GameFunc::GetPickedCharacter(&g_wrMouseRay,dwPickingOption); if (pPickedObj) { m_dwPickedTarget = pPickedObj->GetObjectKey(); #ifdef _NA_000000_20140423_SUMMON_BACKGROUND_PICKING // ¼Òȯ¼ö°¡ ¾Æ´Ï¶ó¸é ¹Ù·Î ¸®ÅÏ, ¼Òȯ¼öÀÌ¸é ¾ÆÀÌÅÛ,¸Ê¿ÀºêÁ§Æ® üũ·Î ³Ñ¾î°¨ // ¹Ø¿¡¼­µµ ÇØ´ç ¾øÀ¸¸é m_dwPickedTarget¸¦ ÀÚ¿¬½º·´°Ô °¡Á®°¨ if (pPickedObj->IsKindOfObject(MONSTER_OBJECT) == FALSE) { return; } Monster* monster = static_cast(pPickedObj); if (monster && monster->IsShadowSummon() == FALSE) { return; } #else return; #endif //_NA_000000_20140423_SUMMON_BACKGROUND_PICKING } Item* pItem = GameFunc::GetPickedItem(&g_wrMouseRay); if (pItem) { m_dwPickedTarget = pItem->GetObjectKey(); return; } MapObject* pMapObject = GameFunc::GetPickedMapUnitObject(&g_wrMouseRay); if (pMapObject) { #ifdef __NA_0_20080627_MAPOBJECT_PICKING_CHANGE m_dwPickedTarget = pMapObject->GetObjectKey(); #else // ÇöÀç Show°¡ µÇ¾îÀÖ´Â ¿ÀºêÁ§Æ®¸¸ Ŭ¸¯°¡´ÉÇÏ´Ù. if (pMapObject->IsPickable()) { m_dwPickedTarget = pMapObject->GetObjectKey(); } #endif//__NA_0_20080627_MAPOBJECT_PICKING_CHANGE return; } } } Character* PickingData::GetPickedCharacter() { Object *pObject = g_ObjectManager.GetObject(m_dwPickedTarget); if (pObject) { if(pObject->IsKindOfObject(PET_OBJECT)) { return NULL; } if (pObject->IsKindOfObject(CHARACTER_OBJECT)) { return (Character *)pObject; } #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE if (pObject->IsKindOfObject(STATUE_PLAYER_OBJECT)) { return static_cast(pObject); } #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE } return NULL; } Item* PickingData::GetPickedItem() { Object *pObject = g_ObjectManager.GetObject(m_dwPickedTarget); if (pObject) { if (pObject->IsKindOfObject(ITEM_OBJECT)) { return (Item *)pObject; } } return NULL; } MapObject* PickingData::GetPickedMapObject() { Object *pObject = g_ObjectManager.GetObject(m_dwPickedTarget); if (pObject) { if (pObject->IsKindOfObject(MAP_OBJECT)) { return (MapObject *)pObject; } } return NULL; } Object* PickingData::GetPickedObject() { Object *pObject = g_ObjectManager.GetObject(m_dwPickedTarget); return pObject; } DWORD PickingData::GetPickedObjectKey() { return m_dwPickedTarget; } //////////////////////////////////////////////////////////////////////////////////// HeroActionInput::HeroActionInput(void) { m_TargetAreaSkillID = 0; m_ShowTargetAreaPointer= FALSE; SetCurrentTarget(0); ZeroMemory(&m_QueueAction,sizeof(m_QueueAction)); m_QueueAction.ActionID = ACTION_IDLE; m_iComboCount = 0; m_bAutoAttack = FALSE; m_bCanDoNextAttack = FALSE; m_bAutoRun = FALSE; m_bIsHeroKeyboardMove = FALSE; m_bKeyBoardMoveCheck = FALSE; m_bKeyboardQueueAttack = FALSE; m_iKeyboardQueueAttackDelay = 0; m_MousePoint.x = 0; m_MousePoint.y = 0; m_bIsMousePointHide = FALSE; m_iUIVoiceDelay = 0; m_dwUIVoice = 0; m_iMoveDelay=0; ResetSpecialMove(); m_bCannotAttack = FALSE; m_bSpecialMove=FALSE; m_bFollowPlayer = FALSE; m_dwFollowPlayerKey = 0; m_TargetType = RELATIONKIND::None; m_OldReason=0; m_bFixTarget = FALSE; m_bForwardTargeting = TRUE; m_bCanInputMode = TRUE; set_jump_key_pressed(false); PickingData::Init(); m_IsClickedTargetArea = FALSE; } void HeroActionInput::Init() { m_bShowPetInfo=TRUE; m_bSpecialMove=FALSE; m_iUIVoiceDelay = 0; m_dwUIVoice = 0; m_iMoveDelay=0; //m_dwPickedTarget = 0; g_SkillQueue.ClearAll(); m_dwStartPickPosTime=0; m_bCannotAttack = FALSE; m_iMoveToActionTime=0; m_bCanInputMode = TRUE; m_bShowPartyMemberOnly=FALSE; m_TransFormActionQueue.Clear(); m_dwClickedNpcCode = 0; #ifdef PERF_AUTO_MOVE_TEST m_bAutoMove=FALSE; m_vSrcPos=c_ZeroVector; m_vDestPos=c_ZeroVector; m_bSwitch=FALSE; #endif #ifdef MAP_EDIT_MODE m_dwEditMapObjKey=0; #endif m_bCameraBaseMove = TRUE; PickingData::Init(); } void HeroActionInput::SetTransFormAction(PLAYER_ACTION *pAction) { m_TransFormActionQueue.PushBack(*pAction); } //------------------------------------------------------------------------------ /** */ HeroActionInput::~HeroActionInput(void) { m_TransFormActionQueue.Clear(); } //------------------------------------------------------------------------------ /** */ void HeroActionInput::Process(DWORD dwTick) { if (GlobalFunc::BeforeLoadingInputLock()) { ProcessKeyboardMove(); return; } PickingForShowMonsterName(); // Voice Delay´Â »óȲ°ú´Â »ó°ü¾øÀÌ ¹«Á¶°Ç 󸮵Ǿî¾ßÇÔ ProcessVoiceDelay(dwTick); if (!g_pHero) return; m_iMoveToActionTime-=dwTick; m_iMoveToActionTime=max(0,m_iMoveToActionTime); // µ¿¿µ»ó ÃÔ¿µ¿ë ÇÁ¸® Ä«¸Þ¶ó if( GENERALPARAM->IsFreeCameraMode() ) { if( GENERALPARAM->GetFreeCameraState() ) { return; } } if ( g_pMap && !g_pMap->IsRender()) { return; } // ÄÞº¸ ó¸® (ÀÏÁ¤½Ã°£ ³»¿¡ ÀÔ·ÂÀÌ ´Ù½Ã ¾Èµé¾î¿À¸é 1Ÿ·Î ó¸®ÇÏ´Â ºÎºÐ) ProcessComboDelay(dwTick); // Ÿ°Ùâ »óŸ¦ ó¸® ProcessTargeting(); // ÇÇÅ· Á¤º¸¸¦ °»½Å PickingData::ProcessPicking(); // ÇÇÅ·Á¤º¸¸¦ ÀÌ¿ëÇØ Ä¿¼­¸¦ º¯°æ ProcessCursor(); // ¿ÉÀú¹ö¸ðµåÀÏ‹šÀÇ Å°ÀԷ ó¸® ProcessObserverModeKey(dwTick); //Á×¾ú°Å³ª,½ºÅÏ,ÀϾ±â,´Ù¿î,³ì¹éÁß¿¡´Â ÀÔ·Â ¸·´Â´Ù. if (g_pHero) { if( CannotMoveState() == TRUE ) { g_pHero->ResetMoveFlag(); SetAutoRun(FALSE); SetFollowState( FALSE ); } if(g_pHero->IsLockInput()) { if(!MouseCursor::Instance()->IsShowCursor()) { this->m_bIsMousePointHide = FALSE; SetCursorPos( m_MousePoint.x, m_MousePoint.y ); MouseCursor::Instance()->ShowCursor( TRUE ); } //±âº»ÀûÀÎŰ󸮴ÂÇÑ´Ù(Äü½½·Ô+¹Ì´Ï¸Ê+½ºÅ©¸°¼¦+¿ùµå¸Ê) ProcessBaseOptionKey(); // Űº¸µåÀ̵¿ Á¤Áö return; } } if( IsShootingMode() == FALSE ) { // ÀϹÝij¸¯ÅÍ g_pHero->LockOn(0); ProcessAutoAttack(); ProcessKeyboardAttack(); //Todo:À̵¿½Ã ½ºÅ³Å¥¸¦ ÃʱâÈ­ ÇÑ´Ù if(m_iMoveDelay<=0) { m_bIsHeroKeyboardMove = ProcessKeyboardMove(); } ProcessMouse(); // Ÿ°Ù ¾î½Ã½ºÆ®!! ProcessAssistTarget(); ProcessQueueAction(); // ¿ÀÅä ·± // Todo:À̵¿½Ã ½ºÅ³Å¥¸¦ ÃʱâÈ­ ÇÑ´Ù if( m_iMoveDelay <= 0 && m_bAutoRun ) { InitTerm(); if ( IsIdleState() || g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } g_pHero->AddMoveFlag( KEYBOARDMOVE_FOWARD ); } } else { // ¹ß۸® ProcessAutoAttack(); //Todo:À̵¿½Ã ½ºÅ³Å¥¸¦ ÃʱâÈ­ ÇÑ´Ù if(m_iMoveDelay<=0) { m_bIsHeroKeyboardMove = ProcessKeyboardMove(); } ProcessValkyrieMouse(); // Ÿ°Ù ¾î½Ã½ºÆ®!! ProcessAssistTarget(); ProcessQueueAction(); // ¿ÀÅä ·± //Todo:À̵¿½Ã ½ºÅ³Å¥¸¦ ÃʱâÈ­ ÇÑ´Ù if( m_iMoveDelay<=0&&m_bAutoRun ) { InitTerm(); if (IsIdleState() || g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } g_pHero->AddMoveFlag( KEYBOARDMOVE_FOWARD ); } // °¢µµ°¡ 45µµÀÌ»ó ¹ú¾îÁö¸é Ÿ°Ù Ç®¸² if (GetCurrentTarget()) { Character *pTarget = (Character *)g_ObjectManager.GetObject( this->GetCurrentTarget() ); if (pTarget) { WzVector vTarget = pTarget->GetPosition(); WzVector vPos = g_pHero->GetPosition(); WzVector vDiff = vTarget - vPos; float fTargetAngle = Math_GetAngleFromVector(&vDiff); float fAngle = g_pHero->GetAngle(); float fDiff = abs(fTargetAngle - fAngle); float fAnotherDiff = WZ_PI * 2.0f - fDiff; // °¢µµ°¡ 45µµÀÌ»óµÇ¸é ¶ô¿Â Ç®¸² if (min(fDiff,fAnotherDiff) > WZ_PI / 4.0f ) { SetAutoAttack(FALSE); g_pHero->LockOn( 0 ); } else { g_pHero->LockOn( this->GetCurrentTarget() ); } } } } WzVector pickPos; //Áö¿ªÁöÁ¤ Æ÷ÀÎÅÍ if( m_ShowTargetAreaPointer == FALSE || GameFunc::GetClickedPosition(&pickPos) == FALSE ) { g_InterfaceManager.SetAreaPointer(m_ShowTargetAreaPointer,NULL,0); g_InterfaceManager.SetAreaTargetPointerTexture( g_InterfaceManager.GetAreaTargetTextureHandle( g_pHero->GetClass() ) ); } else { #ifdef _YMS_AUTOBOT_GAME Autobot::Instance()->GetAreaSkillClickPosition((SLOTCODE)m_TargetAreaSkillID, pickPos); #endif //_YMS_AUTOBOT_GAME WzColor color = WzColor_RGBA(255, 0,0, 255); BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)m_TargetAreaSkillID); if(pInfo) { float len = GetSkillRange( pInfo ); WzVector vDistance = pickPos - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if( fDistance <= len) { color = WzColor_RGBA(255,255,255, 255); } if (pInfo->m_SkillClassCode == eSKILL_CREATE_CRYSTAL_WARP) { if( GameFunc::IsMove(g_pHero->GetPosition(),m_PickingPosition) == FALSE ) { color = WzColor_RGBA(255, 0,0, 255); } } //Todo:°Å¸®°¡ ³Ê¹« ¸Ö¸é »ç¿ë ¾ÈµÇ°Ô m_PickingPosition = pickPos; if(pInfo->m_wSkillArea) g_InterfaceManager.SetAreaPointer(m_ShowTargetAreaPointer,&m_PickingPosition,(float)pInfo->m_wSkillArea * 0.1f,color); else g_InterfaceManager.SetAreaPointer(m_ShowTargetAreaPointer,&m_PickingPosition,0.0f); g_InterfaceManager.SetAreaTargetPointerTexture( g_InterfaceManager.GetAreaTargetTextureHandle( g_pHero->GetClass() ) ); } } ProcessOptionKey(); m_iMoveDelay -= (short)dwTick; m_iMoveDelay = max( 0, m_iMoveDelay); // Ç÷¹ÀÌ¾î µû¶ó°¡±â ProcessFollow(); } float HeroActionInput::GetSkillRange( BASE_SKILLINFO* skill_info ) { if( skill_info == NULL ) return 0.0f; float range = (float)skill_info->m_wSkillRange * 0.1f; // ½ºÅ³ »ç°Å¸® Áõ°¡ ¹öÇÁ¸¦ ã´Â´Ù if( SKILL_EFFECT* effect = g_pHero->FindSkillEffect( eCHAR_STATE_INCREASE_SKILLRANGE ) ) { if( effect->dwSkillID != 0 ) { float range_bonus = (float)effect->AbilityInfo.m_iParam[1] * 0.1f * 0.01f; range = range + range * range_bonus; } } return range; } //------------------------------------------------------------------------------ /** °ø°Ý ¹üÀ§ ¹× npc,item µî ±âŸ À¯È¿ °Å¸® üũ */ float HeroActionInput::GetActionLength(PLAYER_ACTION action) { float fLength = 0.0f; switch (action.ActionID) { case ACTION_ATTACK: { fLength = GetAttackActionLength(); } break; case ACTION_PLAYERMEET: { if(g_pHero->IsCrystalWarpKey(action.PLAYERMEET.dwTargetID)) { fLength = 2.0f; } else { fLength = DISTANCE_NPC_MEET * 0.9f; } } break; case ACTION_NPCMEET: case ACTION_VENDORMEET: { fLength = DISTANCE_NPC_MEET * 0.9f; } break; case ACTION_USE_OBJECT: { fLength = DISTANCE_NPC_MEET; } break; case ACTION_COLLECTION_OBJECT: { fLength = 3.0f; } break; case ACTION_DOMINATION_OBJECT: case ACTION_WAYPOINT_MEET: case ACTION_AIRSHIP_MEET: { fLength = DISTANCE_NPC_MEET; } break; case ACTION_GETITEM: { return DISTANCE_NPC_MEET; } break; case ACTION_VALKYRIESHOT: { fLength = GetAttackActionLength(); } break; case ACTION_SKILL: { BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)action.SKILL.dwSkillID); assert(pInfo); if(pInfo) { // ÀڽŠÁöÁ¤ ½ºÅ³À̸é if (pInfo->m_byTarget == SKILL_TARGET_ME) { fLength = 9.999999e+29f;; } else { fLength = GetSkillRange(pInfo); //if (pInfo->IsRangedSkill()) //{ // fLength = (float)(pInfo->m_wSkillRange + g_pHero->GetPlayerAttribute()->GetSkillRangeBonus()) / 10.0f; //} //else //{ // fLength = (float)pInfo->m_wSkillRange / 10.0f; //} } } } break; #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE case ACTION_STATUE_PLAYER_MEET: { fLength = 18.0f; } break; #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE } return fLength; } ////------------------------------------------------------------------------------ ///** //*/ BOOL HeroActionInput::ChoaCanUse() { //¼­¹ö¿¡¼­ ¿¡·¯ ó¸® ÇØÁشٰí ÇÔ ¸Þ¼¼Áö ÂïÀ» °Í return TRUE; } //------------------------------------------------------------------------------ /** NPC ¸»°É±â */ BOOL HeroActionInput::ProcessQueueNPCMeet() { NPC * pNPC = (NPC *)g_ObjectManager.GetObject(m_QueueAction.NPCMEET.dwNPCKey); #ifdef _NA_20100307_BETAKEY_SYSTEM if (pNPC && IsUseableNPCBetakey(pNPC->GetNpcInfo()) == FALSE) { return FALSE; } #endif//_NA_20100307_BETAKEY_SYSTEM // NPC¿¡ ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸»°Ç´Ù. if (pNPC && g_pHero) { m_dwClickedNpcCode = pNPC->GetExtraInfo()->m_NPCCODE; WzVector wzVec1 = pNPC->GetPosition() - g_pHero->GetPosition(); WzVector wzVec2; wzVec2 = -wzVec1; wzVec2.z = 0.0f; float fLength = VectorLength(&wzVec1); if (fLength <= GetActionLength(m_QueueAction)) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } SolarDialog * pDlg = NULL; NPC::SetNpcVoiceIndex(rand() % MAX_NPC_VOICE_SAMPLE); if (g_pMap) { pDlg = GameFunc::NPCMeetWithForward( g_pMap->GetMapID(), g_pMap->GetCurrentFieldID(), pNPC->GetMonsterInfo()->m_MonsterCode, pNPC->GetObjectKey()); } if ( pDlg ) { pNPC->SetOpenDialog(pDlg); pDlg->SetOwnerKey(pNPC->GetObjectKey()); } if ( !(wzVec2.x == 0.0f && wzVec2.y == 0.0f) ) { float fAngle = Math_GetAngleFromVector(&wzVec2); if (pNPC->GetExtraInfo() && EXTRA_NPCINFO::eROTATE_ROTATE == pNPC->GetExtraInfo()->m_eRotateType ) { pNPC->SetAngle(fAngle); } } if(g_pHero && pNPC) g_pHero->SetTargetID(pNPC->GetObjectKey()); pNPC->DoAction(&m_QueueAction); pNPC->CommitChangeState(g_CurTime); pNPC->PlayMeetSound(); return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** NPC ¸»°É±â */ BOOL HeroActionInput::ProcessQueueVendorMeet() { if(!ChoaCanUse()) return FALSE; Player * pPlayer = (Player *)g_ObjectManager.GetObject(m_QueueAction.VENDORMEET.dwTargetID); // NPC¿¡ ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸»°Ç´Ù. if (pPlayer && g_pHero) { WzVector wzVec1 = pPlayer->GetPosition() - g_pHero->GetPosition(); WzVector wzVec2; wzVec2 = -wzVec1; wzVec2.z = 0.0f; float fLength = VectorLength(&wzVec1); if (fLength <= GetActionLength(m_QueueAction)) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } uiVendorBuy* pVendorBuy = GET_CAST_DIALOG( uiVendorBuy, IM_VENDOR_MANAGER::VENDOR_BUY ); if(pVendorBuy) pVendorBuy->QueryView( pPlayer->GetObjectKey() ); if ( !(wzVec2.x == 0.0f && wzVec2.y == 0.0f) ) { float fAngle = Math_GetAngleFromVector(&wzVec2); pPlayer->SetAngle(fAngle); } pPlayer->DoAction(&m_QueueAction); pPlayer->CommitChangeState(g_CurTime); return TRUE; } } return FALSE; } #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE BOOL HeroActionInput::ProcessQueueStatuePlayerMeet() { StatuePlayer* statue_player = static_cast(g_ObjectManager.GetObject(m_QueueAction.STATUEMEET.dwStatuePlayerKey)); // µ¿»ó¿¡ ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸»°Ç´Ù. if (statue_player && g_pHero) { WzVector wzVec1 = statue_player->GetPosition() - g_pHero->GetPosition(); WzVector wzVec2; wzVec2 = -wzVec1; wzVec2.z = 0.0f; float fLength = VectorLength(&wzVec1); if (fLength <= GetActionLength(m_QueueAction)) { uiSUNRankingMan* ui_sun_ranking_manager = GET_DIALOG_MANAGER(uiSUNRankingMan, UIMAN_SUNRANKING); if ( ui_sun_ranking_manager ) { ui_sun_ranking_manager->ShowSUNRankingStatueInfo(statue_player->GetObjectKey()); } return TRUE; } } return FALSE; } #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE BOOL HeroActionInput::ProcessQueueCollectObject() { MapObject * pObject = (MapObject *)g_ObjectManager.GetObject(m_QueueAction.COLLECTOBJECT.dwTargetID); if(!pObject || !g_pHero) { #ifdef _DEV_VER GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "[Null] TargetID: %d", m_QueueAction.COLLECTOBJECT.dwTargetID); #endif //_DEV_VER return FALSE; } if(INVALID_WZID == pObject->GetCollectionID()) { #ifdef _DEV_VER GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "ProcessQueueCollectObject()::INVALID_WZID == pObject->GetCollectionID()"); #endif //_DEV_VER return FALSE; } float fDistance = VectorLength( & (pObject->GetPosition() - g_pHero->GetVisiblePos()) ); if (fDistance <= GetActionLength(m_QueueAction)) { //Å»°Íź»óÅ¿¡¼­´Â ÀÚµ¿ÇØÁ¦ g_pHero->SendRiderReleasePacket(false); g_pHero->SendWingsControlByAccessory(false, false); // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE || g_pHero->GetCurState() == STATE::KEYBOARDMOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); return FALSE; } if(STATE::COLLECT != g_pHero->GetCurState()) { StateCollect::SendCollectActionSyn(pObject->GetObjectKey(), g_pHero->GetVisiblePos()); #ifdef _NA_006744_20130531_COLLECT_NAK_TO_REMOVE_COLLECT // syn ³¯¸±¶§ ÇØ´ç objectkey¸¦ ¹Ì¸® Çѹø ÀúÀå if ((GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_MISSION)) { g_pHero->SetCollectObjKey(pObject->GetObjectKey()); } #endif //_NA_006744_20130531_COLLECT_NAK_TO_REMOVE_COLLECT } return TRUE; } return FALSE; } BOOL HeroActionInput::ProcessQueueUseObject() { MapObject * pObject = (MapObject *)g_ObjectManager.GetObject(m_QueueAction.USEOBJECT.dwTargetID); // Ç÷¹À̾ ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸ØÃã. if (pObject && g_pHero) { if(FALSE == pObject->CheckTriggerActive()) return FALSE; WzBoundingVolume *bv = pObject->GetBoundingVolume(); float fMargin = 0.0f; if (bv) { switch(bv->m_eBvType) { case BVT_AABB: { WzVector diff = bv->m_aabb.m_wvMax - bv->m_aabb.m_wvMin; fMargin = max(diff.x,diff.y) / 2.0f; } break; case BVT_SPHERE: { fMargin = bv->m_BvSphere.m_fRadius; } break; } } const float ACTIVATE_TRIGGER_RANGE = 4.0f; WzColor Color; // ¿©±â MapObject GetPosition ¸Â½À´Ï´Ù MapObject´Â VisiblePos ¾È¾¹´Ï´Ù ¹Ù²ÙÁö ¸¶¼¼¿ä!! float fDistance = VectorLength( & (pObject->GetPosition() - g_pHero->GetVisiblePos()) ); fDistance -= fMargin; if (fDistance <= GetActionLength(m_QueueAction)) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE || g_pHero->GetCurState() == STATE::KEYBOARDMOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } MSG_CG_TRIGGER_CLICK_OBJECT_SYN SendPacket; SendPacket.m_byCategory = CG_TRIGGER; SendPacket.m_byProtocol = CG_TRIGGER_CLICK_OBJECT_SYN; SendPacket.m_dwClickedObjectKey = pObject->GetTriggerID(); if( FALSE == GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(MSG_CG_TRIGGER_CLICK_OBJECT_SYN) ) ) { // Send Packet ½ÇÆÐ ¿¡·¯ Color = WzColor_RGBA( 255, 80, 80, 255 ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,_T("MSG_CG_TRIGGER_CLICK_OBJECT_SYN - BattleScene")); } return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** Ç÷¹À̾î·Î Á¢±Ù */ BOOL HeroActionInput::ProcessQueuePlayerMeet() { Player * pPlayer = (Player *)g_ObjectManager.GetObject(m_QueueAction.PLAYERMEET.dwTargetID); // Ç÷¹À̾ ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸ØÃã. if (pPlayer && g_pHero) { WzVector wzVec1 = pPlayer->GetPosition() - g_pHero->GetPosition(); WzVector wzVec2; wzVec2 = -wzVec1; wzVec2.z = 0.0f; float fLength = VectorLength(&wzVec1); if (fLength <= GetActionLength(m_QueueAction)) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } if (MouseHandler::Instance()->IsExistItemAtHand()) { uiTradeMan* tradeMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_TRADE)); assert (tradeMan); if (tradeMan && FALSE == GlobalFunc::IsSSQScene()) { tradeMan->Ask(pPlayer->GetName()); tradeMan->SetPutOneStarting(); } } return TRUE; } } return FALSE; } BOOL HeroActionInput::ProcessQueuePlayerFollow() { Player * pPlayer = (Player *)g_ObjectManager.GetObject(m_QueueAction.PLAYERMEET.dwTargetID); // Ç÷¹À̾ ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸ØÃã. if (pPlayer && g_pHero) { WzVector wzVec1 = pPlayer->GetPosition() - g_pHero->GetPosition(); WzVector wzVec2; wzVec2 = -wzVec1; wzVec2.z = 0.0f; float fLength = VectorLength(&wzVec1); if (fLength <= DISTANCE_FOLLOW_PLAYER ) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** ¿þÀÌÆ÷ÀÎÆ®·Î Á¢±Ù */ BOOL HeroActionInput::ProcessQueueWayPointMeet() { MapObject * pObject = (MapObject *)g_ObjectManager.GetObject(m_QueueAction.WAYPOINTMEET.dwTargetID); // ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸ØÃã. if (pObject && g_pHero) { if(!pObject->IsWayPointObj()) return FALSE; WzVector wzVec1 = pObject->GetPosition() - g_pHero->GetPosition(); float fLength = VectorLength(&wzVec1); if (fLength <= GetActionLength(m_QueueAction)) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } else { // ¿þÀÌÆ÷ÀÎÆ® ¼¼À̺ê uiWayPointMan* waypointMan = GET_DIALOG_MANAGER(uiWayPointMan, UIMAN_WAYPOINT); if(waypointMan) { waypointMan->RqstWayPointSave(m_QueueAction.WAYPOINTMEET.dwTargetID); } return TRUE; } } } return FALSE; } //------------------------------------------------------------------------------ /** ºñ°øÁ¤¿ÀºêÁ§Æ®·Î À̵¿ */ bool HeroActionInput::ProcessQueueAirShipMeet() { MapObject* object = static_cast(g_ObjectManager.GetObject(m_QueueAction.AIRSHIP.target_object)); // ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸ØÃã. if (object && object->IsAirShipObject()) { WzVector distance = object->GetPosition() - g_pHero->GetPosition(); float length = VectorLength(&distance); if (length <= GetActionLength(m_QueueAction)) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } else { uiAssistMan* assist_man = static_cast( g_InterfaceManager.GetUserInterfaceManager(UIMAN_ASSIST)); if (assist_man) { sMAPPORTAL_HASH* hash_table = MapInfoParser::Instance()->GetMapPortalHashTable(); sMAPPORTAL_HASH::const_iterator itr = hash_table->begin(); while (itr != hash_table->end()) { sMAP_ENTERENCE_PORTAL* data = itr->second;// (*itr); if (data && (data->bMoveType == ePORTAL_MOVE_AIRSHIP) && (g_pMap->GetCurrentFieldID() == data->wFieldFrom)) { assist_man->ShowAskAirShipPortal(data->wIndex, false, m_QueueAction.AIRSHIP.target_object); return true; } ++itr; } } } } } return false; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::ProcessQueueDominationObject() { MapObject * pObject = (MapObject *)g_ObjectManager.GetObject(m_QueueAction.DOMINATIONOBJECT.dwTargetID); // ÃæºÐÈ÷ ´Ù°¡°¬À¸¸é ¸ØÃã. if (pObject && g_pHero) { if(!pObject->IsDominationObject()) return FALSE; WzVector wzVec1 = pObject->GetPosition() - g_pHero->GetPosition(); WzVector wzVec2; wzVec2 = -wzVec1; wzVec2.z = 0.0f; float fLength = VectorLength(&wzVec1); if (fLength <= GetActionLength(m_QueueAction)) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } else { uiDominationTowerMan* pUIMan = GET_DIALOG_MANAGER(uiDominationTowerMan, UIMAN_DOMINATIONWAR_TOWER); if (pUIMan) { pUIMan->SEND_DOMINATION_NOTICE_SYN(m_QueueAction.DOMINATIONOBJECT.dwTargetID); } return TRUE; } } } return FALSE; } //------------------------------------------------------------------------------ /** ¾ÆÀÌÅÛ Áݱâ */ BOOL HeroActionInput::ProcessQueueGetItem() { Item * pItem = (Item *)g_ObjectManager.GetObject(m_QueueAction.GETITEM.dwItemKey); // ¾ÆÀÌÅÛ¿¡ ÃæºÐÈ÷ ´Ù°¡°¡¸é Áݴ´٠if (pItem) { WzVector wzVec1 = pItem->GetPosition() - g_pHero->GetPosition(); WzVector wzVec2; wzVec2 = -wzVec1; wzVec2.z = 0.0f; float fLength = VectorLength(&wzVec1); if (fLength <= DISTANCE_SPACE_GET_ITEM) { // À̵¿ÁßÀ̾úÀ¸¸é ¸ØÃá´Ù. if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } if (uiAreaConquestMan::CanPickACItem(pItem, true) == false) { return FALSE; } ItemManager::Instance()->SendPickUpItemObject(pItem); pItem->SetSendPickPacket(TRUE); return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** ½ºÅ¸ÀÏÀÌ ¿¹Àü ½ºÅ¸Àϰú ´Ù¸¦‹š È£Ãâ */ void HeroActionInput::SetComboReset() { m_iComboCount = 0; m_iComboDelay = 0; if(g_pHero) g_pHero->SetComboCount(0); SetAutoRun(FALSE); SetFollowState( FALSE ); } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::ProcessQueueAttack() { Character * pEnemy = (Character *)g_ObjectManager.GetObject(m_QueueAction.ATTACK.dwTargetID); if (pEnemy && g_pHero) { if (!pEnemy->CanBeAttackTarget())//Ÿ°ÙÀ¸·Î ÁöÁ¤µÉ¼ö ¾ø´Ù¸é { return FALSE; } WzVector wzVec1 = pEnemy->GetPosition() - g_pHero->GetPosition(); float fLength = VectorLength(&wzVec1);//Àû°ú ³ªÀÇ °Å¸®¸¦ ±¸ÇÑ´Ù if ( fLength <= g_HeroInput.GetAttackActionLength() + pEnemy->GetBodyRadius() )//°ø°Ý ¹üÀ§ ¾È¿¡ ÀÖ´Ù¸é { if (g_pHero->CanDoQueueAction(&m_QueueAction))// »óŸ¦ º¯È­ ÇÒ¼ö ÀÖ³ª(Á¤Áö³ª À̵¿ »óÅÂ) { g_pHero->StopMove(); // »óÅ º¯È­½Ã À̵¿ÁßÁö g_pHero->SetTargetID(pEnemy->GetObjectKey());// Ÿ°Ù ¼¼ÆÃ g_pHero->SetNextState(STATE::ATTACK,g_CurTime);//´ÙÀ½ µ¿ÀÛ ¼¼ÆÃ g_pHero->SetCurrentAction(&m_QueueAction); return TRUE; } } else { } } else { return FALSE; } return FALSE; } //------------------------------------------------------------------------------ /** */ DWORD HeroActionInput::IncreaseComboCount() { m_iComboCount++;//ÄÞº¸¼ö Áõ°¡ DWORD dwCurStyle = g_pHero->GetCurrentAttackStyle();//°ø°Ý½ºÅ¸ÀÏÀ» ¾òÀ½ BASE_STYLEINFO *pInfo = SkillInfoParser::Instance()->GetStyleInfo((SLOTCODE)dwCurStyle); // ÆÝÄ¡³ª ¿ø°Å¸® °ø°ÝÀº ÄÞº¸¾øÀ½ if(pInfo==NULL) { if (m_iComboCount >= 2)//±âº» °ø°Ý 2Ÿ { m_iComboCount = 0; } return m_iComboCount; } if(g_pHero->IsRangedNormalAttack()) { if (m_iComboCount >= 2)//±âº» °ø°Ý 2Ÿ { m_iComboCount = 0; } } else if(pInfo->m_byStyleCheck==FALSE)//½ºÅ¸ÀÏ ¾øÀ½ 2Ÿ { if (m_iComboCount >= 2) { m_iComboCount = 0; } } // ½ºÅ¸ÀÏÀÌ ÀÖÀ»¶© 3¿¬Å¸~ else { if (m_iComboCount >= g_pHero->NormalAttack.combo_max_count) { m_iComboCount = 0; } } return m_iComboCount; } //------------------------------------------------------------------------------ /** */ DWORD HeroActionInput::GetComboCount() { return m_iComboCount; } //---------------------------------------------------------------------------- /** */ void HeroActionInput::ClearPickingTarget() { PickingData::Init(); //this->m_dwPickedTarget = 0; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::ProcessSpecialMove() { if(g_pHero) { if (g_pHero->CanDoQueueAction(&m_QueueAction)) { // ¼¦µô·¹ÀÌÁß¿¡´Â ¸ø¾¸ if (IsShootingMode()) { if (g_pHero->GetValkyrieShotDelay() > 30) { return FALSE; } } g_pHero->DoAction(&m_QueueAction); //¿ÀÅä·± ²ö´Ù. if( m_bAutoRun == TRUE ) { SetAutoRun(FALSE); SetFollowState( FALSE ); g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** Ű Å¥ ¸Þ´ÏÁ®¿Í ¿¬µ¿ µÊÀ¸·Î Ç×»ó ¼ÂÇÔ¼ö »ç¿ë Çϼ¼¿ä! */ void HeroActionInput::SetAreaSkill(BOOL bShow) { if( bShow == TRUE ) { if( m_ShowTargetAreaPointer != bShow ) { keyMsg msg; ZeroMemory(&msg,sizeof(msg)); msg.dwType = eDoType_Area_Pointer; msg.DoSomething = GlobalFunc::DoAreaSkill; g_KeyQueueManager.PushBack(msg); } } else { if( m_ShowTargetAreaPointer != bShow ) { g_KeyQueueManager.DeleteMsg(eDoType_Area_Pointer); } } m_ShowTargetAreaPointer = bShow; } BOOL HeroActionInput::OnSkill(SLOTCODE dwSkillid) { BOOL rt=FALSE; if(!IsAckBeginVendor()) { BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillid); if(!pInfo) return FALSE; switch(pInfo->m_bySkillUserType) { case eSKILL_USER_PLAYER: rt = InsertSkill(dwSkillid); break; case eSKILL_USER_SUMMONED: rt = UseSummonSkill(dwSkillid); break; case eSKILL_USER_ACTION: rt = ProcessUserAction( dwSkillid ); break; case eSKILL_USER_EMOTICON: //------------------------------------------------------------------------------ // ¼öÁ¤ : define _YMS_CANNOT_EMOTION // ³»¿ë : if ¹®À» ProcessUserEmoticon() ÇÔ¼ö ³»·Î À̵¿ // »çÀ¯ : Áߺ¹µÈ ÄÚµå »èÁ¦ // : ProcessUserEmoticon() ÇÔ¼ö ¾È¿¡¼­ false °¡ µÉ¼ö Àִµ¥ »ó°ü¾øÀÌ // ProcessUserEmoticon() ³»¿ë°ú »ó°ü¾øÀÌ stop ÆÐŶÀ» º¸³»°ÔµÊ //if(g_pHero->IsMove()) // g_pHero->SendStopMovePacket(); //------------------------------------------------------------------------------ rt = ProcessUserEmoticon( dwSkillid ); break; default: assert(!"»ç¿ëÇÒ¼ö¾ø´Â À¯Àú ŸÀÔ"); break; } } return rt; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::UseSummonSkill(SLOTCODE dwSkillid) { if(!g_pHero) return FALSE; DWORD dwId=g_pHero->GetSummonId(); DWORD dwAtt=g_pHero->GetCurrentTileAtt(FALSE); if(dwId==NONE_ID) { // ¸ó½ºÅ͸¦ ¼ÒȯÇϼ¼¿ä. TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; const int c_iSUMMON_MONSTER = 70425; g_InterfaceManager.GetInterfaceString( c_iSUMMON_MONSTER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage); return FALSE; } Monster *pMon=(Monster *)g_ObjectManager.GetObject(dwId); DWORD dwTargetId=GetCurrentTarget(); BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillid); assert(pInfo); if (!pInfo) { return FALSE; } if(!pMon) { return FALSE; } if(!pMon->IsKindOfObject(MONSTER_OBJECT)) { return FALSE; } if(pInfo->m_byTarget==SKILL_TARGET_ME||pInfo->m_byTarget==SKILL_TARGET_REACHABLE_ME) { dwTargetId=dwId;//ÀÚ½ÅÀÇ ¾ÆÀ̵𸦠³Ö¾î ÁØ´Ù. } Character *pTarget=(Character *)g_ObjectManager.GetObject(dwTargetId); if(pInfo->m_byTarget!=SKILL_TARGET_ME&&pInfo->m_byTarget!=SKILL_TARGET_REACHABLE_ME) { int iResult = 0; //¿Ö½ÇÆÐÇß´ÂÁö ±¸Ã¼ÀûÀ¸·Î ¾ò±âÀ§ÇѺ¯¼ö if (!CanBeSkillTarget(dwSkillid,pTarget,lsForceAttack(),iResult)) { TCHAR szFailMessage[512]; //°á°úÁ¤ÀǾȵÇÀÖÀ¸¸é default·ÎÂïÀÚ int iStringCode = ((iResult == 0) ? (eST_SKILL_FAIL_NOT_PROPER_TARGET):(iResult)); g_InterfaceManager.GetInterfaceString(iStringCode,szFailMessage,MAX_PATH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szFailMessage); return FALSE; } } if (pTarget&&pMon&&pMon->CanUseSkill(dwSkillid,TRUE)) { MSG_CG_SUMMON_SKILL_ACTION_SYN Packet; Packet.m_byCategory = CG_SUMMON; Packet.m_byProtocol = CG_SUMMON_SKILL_ACTION_SYN; Packet.m_dwSummonedObjKey=dwId; Packet.m_SkillCode = (SLOTCODE)dwSkillid; //Packet.m_dwClientSerial=pMon->GetCurrentAttackSerial(); Packet.m_dwClientSerial=pMon->GetNextAttackSerial(); Packet.m_wvCurPos=pMon->GetPosition(); Packet.m_wvDestPos=pMon->GetPosition(); Packet.m_dwMainTargetKey=dwTargetId; Packet.m_wvMainTargetPos=pTarget->GetPosition(); Packet.m_byAttackPropensity=lsForceAttack(); // °­Á¦°ø°Ý ¿©ºÎ //ÇÇÄÉÀ̰¡ °¡´É ÇÏÁö ¾ÊÀ¸¸é ²÷´Ù if((GameFramework::GetCurrentScene()&& GameFramework::GetCurrentScene()->IsEnablePkScene()==FALSE)||!g_isPkServer) { Packet.m_byAttackPropensity=ATTACK_PROPENSITY_NORMAL; } if(g_pHero->SendPacket( &Packet, sizeof(MSG_CG_SUMMON_SKILL_ACTION_SYN) )==FALSE ) { return FALSE; } return TRUE; } return FALSE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::InsertSkill(SLOTCODE dwSkillid) { if(!g_pHero) return FALSE; // ½ºÅ³À» Ãß°¡ÇÒ‹š SkillScriptInfo *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillid); #ifdef _NA_008472_20150903_IMPROVED_BALANCE #else // ¸¸¾à »ç¿ëÇÏ·Á´Â ½ºÅ³ÀÌ ¹ß۸®ÀÇ µðÆæ½º ¸ð¼ÇÀ̰í, µðÆæ½º ¸ð¼ÇÀÌ ÀÌ¹Ì Àû¿ëÁßÀ϶§ Ãë¼ÒÇϱâ À§ÇÑ ÇϵåÄÚµù if( SKILL_EFFECT* pSkillEffect = g_pHero->FindSkillEffect( (eCHAR_STATE_TYPE)121 ) ) { // µðÆæ½º ¸ð¼ÇÀÎ ¹öÇÁ(121¹ø »óÅÂ) °¡ ÀÖÀ»‹š »óŸ¦ Ãë¼ÒÇϱâ À§ÇÑ ÆÐŶÀ» ³¯¸®¸ç if ( pInfo && pInfo->m_SkillClassCode == eSKILL_DEFENCE_MOTION ) { MSG_CG_STATUS_DELETE_CHAR_STATE_SYN send_packet; send_packet.m_eCharStateType = (eCHAR_STATE_TYPE)121; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet)); return FALSE; } } #endif // _NA_008472_20150903_IMPROVED_BALANCE #ifdef _NA_000000_20130812_NEW_CHARACTER_HELLROID // ¿À¿À¶ó ½ºÅ³À» »ç¿ëÇÏ·Á°í ÇÒ¶§ // »ç¿ëÇÏ·Á´Â ¿À¿À¶ó ½ºÅ³ÀÇ »óŰ¡ ÀÌ¹Ì ÀÖ´Ù¸é »óŸ¦ Ãë¼ÒÇϰí, ¾øÀ¸¸é ÁøÇàÇÑ´Ù if( pInfo->IsAuraSkill() == true ) { if( g_pHero->CanUseSkillLimitCoolTime( pInfo->m_SkillCode, FALSE ) == TRUE ) { #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE eCHAR_STATE_TYPE StateType = g_pHero->FindToggleSkillState( pInfo->m_SkillClassCode ); #else eCHAR_STATE_TYPE StateType = g_pHero->FindAuraSkillState( pInfo->m_SkillClassCode ); #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE if( StateType != eCHAR_STATE_INVALID ) { MSG_CG_STATUS_DELETE_CHAR_STATE_SYN send_packet; send_packet.m_eCharStateType = StateType; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet)); return FALSE; } #ifdef _NA_008252_20150427_AURASKILL_PACKET_PENDING if (CannotMoveState() == FALSE) { if ((g_pHero->ToggleSkill::GetPacketPending() == FALSE) && (g_pHero->CanUseSkill(pInfo->m_SkillCode, TRUE) == TRUE)) { g_pHero->ToggleSkill::SetPacketPending(); g_pHero->SendUseSkillPacket( pInfo->m_SkillCode ); } } else { // 70535 ÀÌ»ó»óÅ¿¡ °É¸° »óÅ¿¡¼­´Â ÇØ´ç ½ºÅ³À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. TCHAR string[INTERFACE_STRING_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString(70535, string, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, string); } #else g_pHero->SendUseSkillPacket( pInfo->m_SkillCode ); #endif //_NA_008252_20150427_AURASKILL_PACKET_PENDING } return TRUE; } #endif //_NA_000000_20130812_NEW_CHARACTER_HELLROID #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE if ( pInfo->IsToggleSkill() == true ) { if (pInfo->IsPassiveSkill() == true) // Åä±Û ÆÐ½Ãºê ½ºÅ³Àº »ç¿ë ÇÒ ¼ö ¾ø´Ù. return FALSE; if ( g_pHero->CanUseSkillLimitCoolTime( pInfo->m_SkillCode, FALSE ) == TRUE ) { eCHAR_STATE_TYPE StateType = g_pHero->FindToggleSkillState( pInfo->m_SkillClassCode ); if ( StateType != eCHAR_STATE_INVALID ) { MSG_CG_STATUS_DELETE_CHAR_STATE_SYN send_packet; send_packet.m_eCharStateType = StateType; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet)); return FALSE; } #ifdef _NA_008252_20150427_AURASKILL_PACKET_PENDING if (CannotMoveState() == FALSE) { if ((g_pHero->ToggleSkill::GetPacketPending() == FALSE) && (g_pHero->CanUseSkill(pInfo->m_SkillCode, TRUE) == TRUE)) { g_pHero->ToggleSkill::SetPacketPending(); g_pHero->SendUseSkillPacket( pInfo->m_SkillCode ); } } else { // 70535 ÀÌ»ó»óÅ¿¡ °É¸° »óÅ¿¡¼­´Â ÇØ´ç ½ºÅ³À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. TCHAR string[INTERFACE_STRING_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString(70535, string, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, string); } return TRUE; #else // if (g_pHero->CanUseSkill(pInfo->m_SkillCode, TRUE) == TRUE) { g_pHero->SendUseSkillPacket( pInfo->m_SkillCode ); return TRUE; } #endif //_NA_008252_20150427_AURASKILL_PACKET_PENDING } else { eCHAR_STATE_TYPE StateType = g_pHero->FindToggleSkillState( pInfo->m_SkillClassCode ); if ( StateType != eCHAR_STATE_INVALID ) { MSG_CG_STATUS_DELETE_CHAR_STATE_SYN send_packet; send_packet.m_eCharStateType = StateType; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet)); return FALSE; } } } #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE if(GAMEOPTION->GetSkillQueueing()==FALSE) { if(g_pHero->GetCurState()==STATE::SKILL||g_pHero->GetNextState()==STATE::SKILL) return FALSE; } #ifdef SKILL_EDIT // no operation #else if (!g_pHero->CanUseSkillSlotState(dwSkillid, TRUE)) { return FALSE; } #endif if(NULL == pInfo) { #ifdef _DEV_VER GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "Invalid SkillInfo:%d", dwSkillid); #endif //_DEV_VER return FALSE; } if (pInfo->m_byTarget != SKILL_TARGET_ME&&pInfo->m_byTarget != SKILL_TARGET_AREA&&pInfo->m_byTarget != SKILL_TARGET_SUMMON &&pInfo->m_byTarget != SKILL_TARGET_AREA_ENEMY_CORPSE) { if( false == CanAttackInDominationWar() ) return FALSE; } BOOL rt=g_SkillQueue.PushBack(dwSkillid,lsForceAttack()); if(!rt)//±âÁ¸ÀÇ ³ëµå¸¦ »èÁ¦ Çß°í { if(m_ShowTargetAreaPointer) //ÇöÀç ¼³Á¤µÈ°Ô Áö¿ª ÁöÁ¤À̾úÀ¸¸é { m_ShowTargetAreaPointer=FALSE; g_KeyQueueManager.DeleteMsg(eDoType_Area_Pointer); } } return rt; } BOOL HeroActionInput::ProcessTargetClick( Character *pTarget, BOOL bAutoAttack ) { // Ÿ°ÙÀÌ ÀÖ´Ù. ¾×¼Ç! if( IsShootingMode() == FALSE ) { // ÀÏ¹Ý Melee ¾îÅà ŸÀÔ if( FALSE == OnLClickedCharacter( pTarget, GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pTarget,lsForceAttack() ), false ) ) { // ¿¡·¯ return FALSE; } g_InterfaceManager.SetMovePointer( FALSE, NULL ); SetAutoRun(FALSE); SetFollowState( FALSE ); if( m_TargetType == RELATIONKIND::Enemy ) { SetAutoAttack( bAutoAttack ); } } else { if(g_pHero && (g_pHero->IsMoving() == TRUE)) { // 45µµ °¢µµ °Ë»ç WzVector vTarget = pTarget->GetPosition(); WzVector vPos = g_pHero->GetPosition(); WzVector vDiff = vTarget - vPos; float fTargetAngle = Math_GetAngleFromVector(&vDiff); float fAngle = g_pHero->GetAngle(); float fDiff = abs(fTargetAngle - fAngle); float fAnotherDiff = WZ_PI * 2.0f - fDiff; // °¢µµ°¡ 45µµÀÌ»óµÇ¸é ¶ô¿Â Ç®¸² if (min(fDiff,fAnotherDiff) > WZ_PI / 4.0f ) { SetAutoAttack(FALSE); g_pHero->LockOn( 0 ); } else { g_pHero->LockOn( this->GetCurrentTarget() ); // ¼®±Ã ·¹ÀÎÁö ¾îÅà ŸÀÔ if( FALSE == OnValkyrieLClickedCharacter(pTarget) ) { // ¿¡·¯ return FALSE; } } } else { // ¼®±Ã ·¹ÀÎÁö ¾îÅà ŸÀÔ if( FALSE == OnValkyrieLClickedCharacter(pTarget) ) { // ¿¡·¯ return FALSE; } } g_InterfaceManager.SetMovePointer( FALSE, NULL ); SetAutoRun(FALSE); SetFollowState( FALSE ); if( m_TargetType == RELATIONKIND::Enemy ) { SetAutoAttack( bAutoAttack ); } } return TRUE; } BOOL HeroActionInput::ProcessUserAction( SLOTCODE dwSkillid ) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; if( g_pHero == NULL ) { return FALSE; } if(!g_pHero->CanUseAction(dwSkillid)) { //º¯½ÅÁß»ç¿ëºÒ°¡ TCHAR szMessage[MAX_MESSAGE_LENGTH]; g_InterfaceManager.GetInterfaceString(5139, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return FALSE; } #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM if (dwSkillid == 35023) { // ÇöÀç ÆÐŶÀ» ±â´Ù¸®°í ÀÖ´ÂÁö ÆÇ´ÜÇØ¾ß ÇÑ´Ù. uiPerkDialog* perk_dialog_ptr = static_cast(GET_DIALOG( IM_SKILL_MANAGER::SKILL_PERK_DLG )); if ( perk_dialog_ptr ) { if (perk_dialog_ptr->get_is_wait_packet_()) return FALSE; } SkillScriptInfo* skill_script_info_ptr = SkillInfoParser::Instance()->GetSkillInfo(static_cast(dwSkillid)); util::Timer* timer_ptr = xGetCooltimeManager()->GetSkillCooltime(dwSkillid); if (!timer_ptr) return FALSE; // ÄðŸÀÓÀÌ ¾ÆÁ÷ ¾ÈÁö³µÀ¸¸é ¸ø¾´´Ù. if (!timer_ptr->IsExpired(FALSE)) { TCHAR message_string[INTERFACE_STRING_LENGTH] = {0, }; g_InterfaceManager.GetInterfaceString( eST_SKILL_FAIL_COOLTIME_NOT_EXPIRED, message_string, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,message_string); return FALSE; } else { // ÄðŸÀÓ ½ÃÀÛ // ÄðŸÀÓ¿¡ ¾ÆÀÌÅÛÀ̳ª ´Ù¸¥ Á¶°ÇµéÀº ¹Ý¿µÇÏÁö ¾Ê°í Àý´ë°ªÀ¸·Î ¹Ý¿µ xGetCooltimeManager()->StartSkillCooltime( skill_script_info_ptr->m_SkillCode, 0, 0 ); } } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM if( GetFollowState() ) { SetFollowState( FALSE ); } DWORD dwActionCode = dwSkillid - eACTION_START_SKILL_CODE; switch( dwActionCode ) { //-------------------------------------------------------------------------------------- // Ç÷¹ÀÌ¾î °øÅë ¾×¼Ç //-------------------------------------------------------------------------------------- case eACTION_AUTO_ATTACK: { Object *pObj = g_ObjectManager.GetObject( GetCurrentTarget() ); if( pObj ) { Character *pChar = (Character *)pObj; if( GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pChar, lsForceAttack() ) == RELATIONKIND::Enemy) { if( ProcessTargetClick( pChar ) == FALSE ) { return FALSE; } } else { // °ø°ÝÇÒ ¼ö ¾ø´Â ´ë»óÀÔ´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_CANNOT_ATTACK_TARGET, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } else { // ¼±ÅÃµÈ Ç÷¹À̾ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_SELECTED_PLAYER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } break; case eACTION_PICK_ITEM: // ¾ÆÀÌÅÛÀ» ¸ÔÀÚ~ if( FALSE == OnSpacePushItem() ) { // ¿¡·¯ return FALSE; } break; case eACTION_FOLLOW_PLAYER: { DWORD dwTarget = GetCurrentTarget(); if( dwTarget ) { SetFollowState( TRUE, dwTarget ); } else { // ¼±ÅÃµÈ Ç÷¹À̾ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_SELECTED_PLAYER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } break; case eACTION_SIT_AND_STAND: { if( g_pHero->GetCurState() == STATE::SIT ) { MSG_CG_STATUS_CONDITION_CHANGE_SYN Packet; Packet.m_byCategory = CG_STATUS; Packet.m_byProtocol = CG_STATUS_CONDITION_CHANGE_SYN; Packet.m_byConditionType = eCHAR_CONDITION_STANDUP; if( FALSE == g_pHero->SendPacket( &Packet, sizeof(MSG_CG_STATUS_CONDITION_CHANGE_SYN) ) ) { assert(!"¼­±â ÆÐŶ Àü¼Û ½ÇÆÐ"); return FALSE; } GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_CENTER_SHOW, _T("¼­±â ÆÐŶ ³¯·È´Ù!")); } else { if( CanSitState() ) { MSG_CG_STATUS_CONDITION_CHANGE_SYN Packet; Packet.m_byCategory = CG_STATUS; Packet.m_byProtocol = CG_STATUS_CONDITION_CHANGE_SYN; Packet.m_byConditionType = eCHAR_CONDITION_SITDOWN; if( FALSE == g_pHero->SendPacket( &Packet, sizeof(MSG_CG_STATUS_CONDITION_CHANGE_SYN) ) ) { assert(!"¾É±â ÆÐŶ Àü¼Û ½ÇÆÐ"); return FALSE; } GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_CENTER_SHOW, _T("¾É±â ÆÐŶ ³¯·È´Ù!")); #ifdef _NA_008546_20151029_SITTING_PACKET_DELAY_POSITION_SYNC_BUG g_pHero->set_sitting_packet_delay(TRUE); #endif //_NA_008546_20151029_SITTING_PACKET_DELAY_POSITION_SYNC_BUG } } } break; case eACTION_TRADE: { if(g_pHero && (GetCurrentTarget() == g_pHero->GetObjectKey())) { // Àڽſ¡°Ô´Â °Å·¡¸¦ ½ÅûÇÒ ¼ö ¾ø½À´Ï´Ù. : 5370 g_InterfaceManager.GetInterfaceString(eST_CANNOT_TRADE_MYSELF , szMessage , INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice (eOUTPUT_MSG_CHAT, szMessage); break; } else { if (GlobalFunc::IsSSQScene()) { break; } uiTradeMan* tradeMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_TRADE)); assert (tradeMan); if (tradeMan) { Object * pObj = g_ObjectManager.GetObject( GetCurrentTarget() ); if( pObj) { if( pObj->IsKindOfObject( PLAYER_OBJECT ) ) { Player * player = (Player *) pObj; if( player->IsDead() ) { g_InterfaceManager.GetInterfaceString( 6340, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_CHAT, szMessage ); break; } } tradeMan->Ask( pObj->GetName() ); } else { // ¼±ÅÃµÈ Ç÷¹À̾ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_SELECTED_PLAYER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } else { // /°Å·¡ [»ó´ë¹æ ¾ÆÀ̵ð] g_InterfaceManager.GetInterfaceString( eST_GM_TRADE_HELP, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } } break; case eACTION_VENDOR: { if (GameFramework::GetCurScene() == SCENE_TYPE_VILLAGE ) { if(g_pHero->IsRiding()) { g_InterfaceManager.GetInterfaceString( 6439, szMessage); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); break; } else { if ( g_InterfaceManager.IsShowDialog( IM_VENDOR_MANAGER::VENDOR_SELL ) == FALSE && (g_InterfaceManager.IsShowDialog(IM_BANK_MANAGER::BANK_DIALOG) == FALSE) ) { GET_DIALOG( IM_VENDOR_MANAGER::VENDOR_SELL )->ShowWindow(TRUE); } } } else { // °³ÀÎ »óÁ¡ °³¼³Àº ¸¶À»¿¡¼­¸¸ °¡´ÉÇÕ´Ï´Ù. const int c_iPRIVATE_TRADE = 70399; g_InterfaceManager.GetInterfaceString( c_iPRIVATE_TRADE, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } break; case eACTION_GUILD_INVITE: { #ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER GuildSystem::Function::InviteTargetPlayer(); #else uiGuildMan* guildMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUILD)); if (guildMan) { guildMan->Invite(NULL); } #endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER } break; case eACTION_PARTY_LEAVE: { if ( g_pHero->IsParty() ) { uiPartyLeavePopup * partyLeavePopup = GET_CAST_DIALOG( uiPartyLeavePopup, IM_PARTY_MANAGER::PARTY_LEAVE_POPUP ); if( partyLeavePopup ) { if( ( GameFramework::GetCurScene() == SCENE_TYPE_VILLAGE ) || ( GameFramework::GetCurScene() == SCENE_TYPE_FIELD ) ) partyLeavePopup->LeaveParty(); else partyLeavePopup->ShowInterface(TRUE); } } else { // ÆÄƼ¿¡ ¼ÓÇØ ÀÖÁö ¾Ê½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_EXIST_PARTY, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } break; case eACTION_NORMAL_ATTACK: { Object *pObj = g_ObjectManager.GetObject( GetCurrentTarget() ); if( pObj ) { Character *pChar = (Character *)pObj; if( GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pChar, lsForceAttack() ) == RELATIONKIND::Enemy) { if( ProcessTargetClick( pChar, FALSE ) == FALSE ) { return FALSE; } } else { // °ø°ÝÇÒ ¼ö ¾ø´Â ´ë»óÀÔ´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_CANNOT_ATTACK_TARGET, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } else { // ¼±ÅÃµÈ Ç÷¹À̾ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_SELECTED_PLAYER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } break; case eACTION_FRIEND_ADD: { if (GlobalFunc::IsSSQScene()) { break; } Object *pObj = g_ObjectManager.GetObject( GetCurrentTarget() ); if( pObj ) { Character *pChar = (Character *)pObj; if(pObj->IsKindOfObject(PLAYER_OBJECT))//À¯Àú´Â ¸ðµÎ Ãß°¡ ÇÒ¼ö ÀÖ´Ù. { _CallBack_Friend_Add(true, pChar->GetName()); } else { // Ä£±¸·Î Ãß°¡ÇÒ ¼ö ¾ø´Â ´ë»óÀÔ´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_CANNOT_ADD_FRIEND, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } else { // ¼±ÅÃµÈ Ç÷¹À̾ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_SELECTED_PLAYER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } break; case eACTION_PARTY_MEMBER_SUMMON://ÆÄƼÀåÀÌ ¸É¹ö¸¦ ¼Òȯ ÇÒ¶§ { BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillid); util::Timer *pTimer =NULL; if(pInfo) { pTimer = xGetCooltimeManager()->GetSkillCooltime(pInfo->m_SkillCode); } if ( pTimer&&g_pHero&&!g_pHero->CanUseSkillLimitCoolTime(dwSkillid,TRUE) ) { break; } if( pTimer&&!GENERALPARAM->IsNet() ) pTimer->Reset(); #ifdef SKILL_EDIT // no operation #else if (GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_CHUNTING) { g_InterfaceManager.GetInterfaceString( eST_PARTY_SUMMON_MSG, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage); break; } #endif uiPartyMan* partyMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PARTY)); //ÆÄƼ ¸Þ´ÏÁ® ¾ò±â if(partyMan&&partyMan->IsLeader()) { // Character *pTarget = (Character *)g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget()); if(pTarget) { if(pTarget->GetObjectKey()!=g_pHero->GetObjectKey()&&partyMan->IsPartyMember(pTarget->GetObjectKey())) { MSG_CG_PARTY_MEMBER_SUMMON_REQ_SYN sync; sync.m_byCategory = CG_PARTY; sync.m_byProtocol = CG_PARTY_MEMBER_SUMMON_REQ_SYN; sync.m_dwObjKey=pTarget->GetObjectKey(); g_pHero->SendPacket(&sync,sizeof(sync)); if(pTimer) pTimer->Reset(); } else { // ¼±ÅÃµÈ Ç÷¹À̾ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_SELECTED_PLAYER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } else { // ¼±ÅÃµÈ Ç÷¹À̾ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_SELECTED_PLAYER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } else { // 65002 ÆÄƼÀåÀÌ ¾Æ´Õ´Ï´Ù. g_InterfaceManager.GetInterfaceString( 65002 , szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } } break; case eACTION_PARTY_MEMBER_WARP://¸â¹ö°¡ ÆÄƼÀå¿¡°Ô °¥¶§ { BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillid); util::Timer *pTimer =NULL; if(pInfo) { pTimer = xGetCooltimeManager()->GetSkillCooltime(pInfo->m_SkillCode); } if ( pTimer&&g_pHero&&!g_pHero->CanUseSkillLimitCoolTime(dwSkillid,TRUE) ) { g_InterfaceManager.GetInterfaceString(eST_SKILL_FAIL_COOLTIME_NOT_EXPIRED, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage); break; } if( pTimer&&!GENERALPARAM->IsNet() ) pTimer->Reset(); #ifdef SKILL_EDIT // no operation #else if ((GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_CHUNTING) #ifdef _NA_006826_20130722_DOMINATION_RENEWAL //&& (GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_DOMINATION) #endif //_NA_006826_20130722_DOMINATION_RENEWAL ) { g_InterfaceManager.GetInterfaceString( eST_USE_ONLY_HUNTTING, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage); break; } #endif uiPartyMan* partyMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PARTY)); //ÆÄƼ¿ø Àϰæ¿ì if (partyMan && (partyMan->GetPartyNum() >= 2) && (partyMan->IsLeader() == FALSE)) { uicPartyMemberInfoPlus *pInfo = const_cast(partyMan->GetPartyLeader()); if (pInfo) { //ÀÚ½ÅÀ» ¼±ÅÃÇÑ°Ô ¾Æ´Ï°í ÆÄƼ¿ø Àϰæ¿ì CG_PARTY_MEMBER_WARP_REQ_SYN ³¯¸®±â _PARTY_MEMBER_INFO memInfo = pInfo->Get(); if ((memInfo.m_dwMemberKey != g_pHero->GetObjectKey()) && partyMan->IsPartyMember(memInfo.m_dwMemberKey)) { #ifdef _NA_006826_20130722_DOMINATION_RENEWAL if (GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_DOMINATION) { // Á¡·ÉÀü¿¡¼± ÆÄƼÀåÀÌ ¾Æ±ºÀÏ ¶§ »ç¿ëÇÏ´É Player *party_leader = static_cast(g_ObjectManager.GetObject(memInfo.m_dwMemberKey)); if (party_leader) { //RELATIONKIND::TYPE type = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter(); if (party_leader->GetGuildRenderInfo().m_RelationType != eGUILD_RELATION_ALLIENCE) { // 6173 µ¿¸Í°ü°è°¡ ¾Æ´Õ´Ï´Ù. g_InterfaceManager.GetInterfaceString(6173, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage); break; } } } #endif //_NA_006826_20130722_DOMINATION_RENEWAL MSG_CG_PARTY_MEMBER_WARP_REQ_SYN sync; sync.m_byCategory = CG_PARTY; sync.m_byProtocol = CG_PARTY_MEMBER_WARP_REQ_SYN; g_pHero->SendPacket(&sync, sizeof(sync)); if (pTimer) { pTimer->Reset(); } } else { g_InterfaceManager.GetInterfaceString(eST_SKILL_FAIL_NOT_PROPER_TARGET, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } } } else { g_InterfaceManager.GetInterfaceString(eST_SKILL_FAIL_NOT_PROPER_TARGET, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } } break; //case 13: // ¾î½Ã½ºÆ® case eACTION_ASSIST: // ¾î½Ã½ºÆ® { TargetDialog* targetDlg = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); if (!targetDlg) break; uiPartyMan* partyMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PARTY)); if(partyMan) { if (partyMan->IsPartyMember(targetDlg->GetTargetKey())) { Character* pChar = (Character *)g_ObjectManager.GetObject(targetDlg->GetTargetKey()); if (!pChar) break; Character* pTargetChar = (Character *)pChar->GetTargetObject(); if (!pTargetChar) break; Monster *pMonster = (Monster *)g_ObjectManager.GetObject(pTargetChar->GetObjectKey()); if (pMonster) { // ¾Æ¹«°³ const int c_iPartyMemberName = 70395; g_InterfaceManager.GetInterfaceString( c_iPartyMemberName, szMessage, INTERFACE_STRING_LENGTH ); util::_tstring strPartyMemberName = szMessage; // ¹«¾ùÀΰ¡ const int c_iTargetMonsterName = 70396; g_InterfaceManager.GetInterfaceString( c_iTargetMonsterName, szMessage, INTERFACE_STRING_LENGTH ); util::_tstring strTargetMonsterName = szMessage; strTargetMonsterName = pMonster->GetName(); strPartyMemberName = pChar->GetName(); // 5922 '%s'ÀÇ Å¸°ÙÀ» ¾î½Ã½ºÆ®ÇÕ´Ï´Ù. TCHAR szTemp[INTERFACE_STRING_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString(5922, szTemp, INTERFACE_STRING_LENGTH); Sprintf (szMessage, szTemp, strPartyMemberName.c_str()); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); g_HeroInput.SetCurrentTarget(pTargetChar->GetObjectKey()); } } } } break; //case 14: // ¾î½Ã½ºÆ® + °ø°Ý case eACTION_ASSIST_AND_ATTACK: // ¾î½Ã½ºÆ® + °ø°Ý { TargetDialog* targetDlg = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); if (!targetDlg) break; uiPartyMan* partyMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PARTY)); if(partyMan) { if (partyMan->IsPartyMember(targetDlg->GetTargetKey())) { Character* pChar = (Character *)g_ObjectManager.GetObject(targetDlg->GetTargetKey()); if (!pChar) break; Character* pTargetChar = (Character *)pChar->GetTargetObject(); if (!pTargetChar) break; Monster *pMonster = (Monster *)g_ObjectManager.GetObject(pTargetChar->GetObjectKey()); if (pMonster) { // ¾Æ¹«°³ const int c_iPartyMemberName = 70395; g_InterfaceManager.GetInterfaceString( c_iPartyMemberName, szMessage, INTERFACE_STRING_LENGTH ); util::_tstring strPartyMemberName = szMessage; // ¹«¾ùÀΰ¡ const int c_iTargetMonsterName = 70396; g_InterfaceManager.GetInterfaceString( c_iTargetMonsterName, szMessage, INTERFACE_STRING_LENGTH ); util::_tstring strTargetMonsterName = szMessage; strTargetMonsterName = pMonster->GetName(); strPartyMemberName = pChar->GetName(); // 5922 '%s'ÀÇ Å¸°ÙÀ» ¾î½Ã½ºÆ®ÇÕ´Ï´Ù. TCHAR szTemp[INTERFACE_STRING_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString(5922, szTemp, INTERFACE_STRING_LENGTH); Sprintf (szMessage, szTemp, strPartyMemberName.c_str()); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); RELATIONKIND::TYPE RelationType = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pTargetChar, lsForceAttack() ); g_HeroInput.OnLClickedCharacter( pTargetChar, RelationType, false ); } } } } break; case eACTION_TRADE_IN_CHAT_DLG: //15 { uiTradeMan* tradeMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_TRADE)); assert (tradeMan); if (tradeMan && FALSE == GlobalFunc::IsSSQScene()) { ChatPersonalOption* pDlg = GET_CAST_DIALOG(ChatPersonalOption, IM_CHAT_MANAGER::CHAT_PERSONAL_OPTION);//(ChatPersonalOption*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_CHAT_PERSONAL_OPTION_DIALOG); if(pDlg && pDlg->IsVisibleWindow()) { TCHAR szVal[INTERFACE_STRING_LENGTH+1] = {0,}; pDlg->GetClickedCharName(szVal); if('0' != szVal[0]) tradeMan->Ask(szVal); } } } break; case eACTION_FRIEND_ADD_IN_CHAT_DLG: //16 { ChatPersonalOption* pDlg = GET_CAST_DIALOG(ChatPersonalOption, IM_CHAT_MANAGER::CHAT_PERSONAL_OPTION);//ChatPersonalOption* pDlg = (ChatPersonalOption*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_CHAT_PERSONAL_OPTION_DIALOG); if(pDlg && pDlg->IsVisibleWindow() && FALSE == GlobalFunc::IsSSQScene()) { TCHAR szVal[INTERFACE_STRING_LENGTH+1] = {0,}; pDlg->GetClickedCharName(szVal); if('0' != szVal[0]) _CallBack_Friend_Add( true, szVal); } } break; // ¿¡Å׸®¾Æ ÃßÃâ ¾×¼Ç case eACTION_ETHERIA_EXTRACT: { } break; //ÇϳªÀÇ ¹öưÀ¸·Î Create/Destroy case eACTION_CRYSTAL_WARP_CREATE: //17 case eACTION_CRYSTAL_WARP_DESTROY: //18 { #ifdef _NA_006826_20130722_DOMINATION_RENEWAL //3341 ¿öÇÁ¼öÁ¤À» ¼ÒȯÇÒ ¼ö ¾ø´Â Áö¿ªÀÔ´Ï´Ù. TCHAR message[INTERFACE_STRING_LENGTH + 1] = {0,}; g_InterfaceManager.GetInterfaceString(3341, message); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message); break; #endif //_NA_006826_20130722_DOMINATION_RENEWAL if(NULL == g_pHero) break; Object* pObject = g_ObjectManager.GetObject(GetCurrentTarget()); if(pObject && pObject->IsKindOfObject(MONSTER_OBJECT)) { Monster* pMonster = (Monster*)pObject; //¼öÁ¤¿öÇÁ ¿ÀºêÁ§Æ®°¡ ¼±ÅõǾî ÀÖ´Ù¸é ¿ÀºêÁ§Æ® Á¦°Å if(eNPC_CRYSTAL_WARP == pMonster->GetMonsterInfo()->m_byGrade) { if( (g_pHero->GetGuildRenderInfo().m_GuildGuid!=INVALID_GUILDGUID) && g_pHero->GetPlayerGuildID() != pMonster->GetMasterGuildID()) { #ifdef _DEV_VER GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "Hero::GuildID:%d, Crystal::GuildID:%d", g_pHero->GetPlayerGuildID(), pMonster->GetMasterGuildID()); #endif break; } if(RELATIONKIND::Friend == GameFramework::GetCurrentScene()->GetRelationKindOfCharacter((Character*)pMonster, lsForceAttack())) { InsertSkill(eACTION_CRYSTAL_WARP_DESTROY + eACTION_START_SKILL_CODE); } } else { InsertSkill(eACTION_CRYSTAL_WARP_CREATE + eACTION_START_SKILL_CODE); } } else { InsertSkill(eACTION_CRYSTAL_WARP_CREATE + eACTION_START_SKILL_CODE); } } break; case eACTION_IDENTIFY_SOCKET: { MouseHandler::Instance()->SetSocketIdentifyState(); // 6483:¼ÒÄÏ µî±ÞÀ» È®ÀÎÇÏ°í ½ÍÀº ¾ÆÀÌÅÛÀ» Ŭ¸¯Çϼ¼¿ä g_InterfaceManager.GetInterfaceString(6483, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); MouseHandler::Instance()->SetPendingUseChargeItemPos(INVALID_POSTYPE_VALUE); MouseHandler::Instance()->RollbackItemAtHand(); } break; #ifdef _NA_008016_20150202_OLD_RANKING_SYSTEM #if defined(_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM) case eACTION_RANKING_SYSTEM_LOAD: { // ·©Å· ½Ã½ºÅÛÀ» ¿©±â¼­ ºÒ·¯¿Â´Ù. uiMissionRankMan2* rank_manager_ptr2 = GET_DIALOG_MANAGER( uiMissionRankMan2, UIMAN_MISSION_RANK ); uiBase* rank_list_ptr2 = GET_DIALOG( IM_MISSION_RANK_MANAGER::MissionRankList ); if ( rank_manager_ptr2 && rank_list_ptr2 ) { rank_manager_ptr2->ShowRankList( TRUE ); } } break; #endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM #endif // _NA_008016_20150202_OLD_RANKING_SYSTEM #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM case eACTION_PERK_GROUP_CHANGE: { // Ä¿½ºÅÒ ÆÐ½Ãºê¸¦ ±×·ìÀ¸·Î ±³Ã¼ ÇÕ´Ï´Ù. uiPerkDialog* perk_dialog_ptr = static_cast(GET_DIALOG( IM_SKILL_MANAGER::SKILL_PERK_DLG )); if ( perk_dialog_ptr ) { perk_dialog_ptr->PerkGroupChange_On(); } } break; #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM case eACTION_ITEM_CRYSTALIZATION: { InventoryDialog* inventory_dialog_ptr = static_cast(GET_DIALOG( IM_INVENTORY_MANAGER::INVEN_DLG )); if ( inventory_dialog_ptr ) { inventory_dialog_ptr->HideWindowProcess(); } MouseHandler::Instance()->SetCrystalizationState(); // 2165 : °áÁ¤È­ ÇÒ ¾ÆÀÌÅÛÀ» Ŭ¸¯Çϼ¼¿ä g_InterfaceManager.GetInterfaceString(2165, szMessage); if ( inventory_dialog_ptr ) { inventory_dialog_ptr->ImpossibleCrystalizationItemIconDeActiveRender(); } GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); MouseHandler::Instance()->SetPendingUseChargeItemPos(INVALID_POSTYPE_VALUE); MouseHandler::Instance()->RollbackItemAtHand(); } break; default: return FALSE; break; } return TRUE; } //------------------------------------------------------------------------------ // Method : ProcessUserEmoticon // Returns :BOOL // Parameter : SLOTCODE dwSkillid // [2010-1-26 by i4u4me] ¼öÁ¤ // 1. ÇÔ¼ö ³»·Î À̵¿ // if(g_pHero->IsMove()) // g_pHero->SendStopMovePacket(); // 2. ÇÔ¼ö³» ¼­ºê È£Ãâ ÇÔ¼öµé ¼ø¼­ ¹Ù²Þ return false ÇÒ¼ö ÀÖ´Â ºÎºÐ ¸ÕÀú 󸮼ö ¸í·É ½ÃÇà // 3. assert ==> SUN_ASSERT ·Î º¯°æ //------------------------------------------------------------------------------ BOOL HeroActionInput::ProcessUserEmoticon(SLOTCODE dwSkillid) { if (g_pHero == NULL) { return FALSE; } if ((g_pHero->IsRiding()) || (g_pHero->GetCurState() == STATE::SUMMON_RIDER) || (g_pHero->GetCurState() == STATE::WINGS_SPREAD) || (g_pHero->is_spread_wings()) || (g_pHero->IsMove())) { //6439 ÇØ´ç ±â´ÉÀ» »ç¿ëÇÒ¼ö¾ø½À´Ï´Ù. TCHAR szMessage[INTERFACE_STRING_LENGTH] = {NULL,}; g_InterfaceManager.GetInterfaceString(6439, szMessage); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); return FALSE; } if(g_pHero->IsTransForm()) { //º¯½ÅÁß»ç¿ëºÒ°¡ TCHAR szMessage[MAX_MESSAGE_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString(5139, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); return FALSE; } // °¨Á¤ Ç¥ÇöÀ» ÇÒ¼ö ¾ø´Â »óÅÂÀÎÁö¸¦ Ã¼Å©ÇØ¼­ if (g_pHero->CannotAction()) { return FALSE; } if (GetFollowState()) { SetFollowState(FALSE); } if (GENERALPARAM->IsNet()==FALSE) { BASE_SKILLINFO* pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillid); if(pInfo) { g_pHero->SetEmotion(pInfo->m_wzidAnimationCode[0].id); g_pHero->SetNextState(STATE::EMOTICON, g_CurTime); } } else { //À̸ð¼ÇÁß¿¡´Â ´Ù¸¥ À̸ð¼ÇÀÇ ÆÐŶÀ» º¸³»Áö ¾Ê´Â´Ù. if(g_pHero->GetCurState() == STATE::EMOTICON) { return FALSE; } MSG_CG_STATUS_EMOTION_SYN SendPacket; ZeroMemory(&SendPacket,sizeof(SendPacket)); SendPacket.m_byCategory = CG_STATUS; SendPacket.m_byProtocol = CG_STATUS_EMOTION_SYN; SendPacket.m_byEmotionType = BYTE(dwSkillid - eEMOTION_START_CODE); if (FALSE == g_pHero->SendPacket(&SendPacket, sizeof(MSG_CG_STATUS_EMOTION_SYN))) { SUN_ASSERT(!"À̸ð¼Ç ÆÐŶ Àü¼Û ½ÇÆÐ"); return FALSE; } } return TRUE; } //------------------------------------------------------------------------------ /** Todo:½ºÅ³ Å¥¿¡ ¸Õ°¡ ÀÖ´Ù¸é ó¸® »ç¿ë Á¶°Ç¿¡ ½ÇÆÐ Çϸé Å¥¸¦ ºñ¿î´Ù. */ BOOL HeroActionInput::ProcessQueueSkill() { if( g_pHero == NULL ) return FALSE; #ifdef _DEBUG int SkillQueueCount = g_SkillQueue.Size(); SkillQueueCount = SkillQueueCount; #endif //_DEBUG TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; DWORD dwSkillID=g_SkillQueue.GetFrontSkillID(); BOOL bForceAttack=g_SkillQueue.GetFrontForceAttack(); // ÇöÀç ½ºÅ³ »ç¿ëÁßÀÌ¸é ±â´Ù¸°´Ù. if( g_pHero->GetCurState() == STATE::SKILL) { return FALSE; } SetAutoRun(FALSE); //½ºÅ³ »ç¿ë ÇÏ¸é ¿ÀÅä·± ²ö´Ù SetFollowState( FALSE ); BASE_SKILLINFO* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillID); if( pSkillInfo == NULL ) { g_SkillQueue.Pop(); // Å¥¿¡¼­ Á¦°ÅÇÏ°í ³¡³½´Ù return TRUE; } //º¯½Å Ãë¼Ò Àΰ¡? º¯½Å ½ºÅ³ Àç»ç¿ëÀ¸·Î ÇØÁ¦ if(g_pHero->IsCancelTransForm(pSkillInfo->m_SkillClassCode)) { return TRUE; } // Ÿ°ÙÁöÁ¤ ½ºÅ³Àΰæ¿ì Ÿ°ÙÁöÁ¤ ¸ðµå·Î º¯°æ if( pSkillInfo->m_byTarget == SKILL_TARGET_AREA || pSkillInfo->m_byTarget == SKILL_TARGET_REACHABLE_ME ) { if( m_ShowTargetAreaPointer == FALSE ) { m_TargetAreaSkillID = (SLOTCODE)dwSkillID; m_IsClickedTargetArea = FALSE; // Áö¿ª ÁöÁ¤½ºÅ³!! Áö¿ªÀ» Ŭ¸¯Çϼ¼¿ä!! const int c_iClickArea = 70269; g_InterfaceManager.GetInterfaceString( c_iClickArea, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.ShowMessageBox(szMessage, 3000, NULL, 0); SetAreaSkill(TRUE); #ifdef _20220411_AUTO_AIM if (m_bAutoAim) { WzVector ClickedPosition = {0}; if (GameFunc::GetClickedPosition(&ClickedPosition)) { OnLClickedPosition(&ClickedPosition); } } #endif } } // Ÿ°ÙÁöÁ¤ ¸ðµåÀΰæ¿ì, ÇÇÅ·ÇÏÁö ¾ÊÀ¸¸é ¹«Á¶°Ç FALSE if( m_ShowTargetAreaPointer == TRUE || m_IsClickedTargetArea == TRUE ) { if( UseAreaSkill() == FALSE) { SetAreaSkill(FALSE); m_IsClickedTargetArea = FALSE; g_SkillQueue.Pop(); return TRUE; } } else { if( UseSkill(dwSkillID,bForceAttack) == FALSE ) { SetAreaSkill(FALSE); g_SkillQueue.Pop(); return TRUE; } } if(m_QueueAction.ActionID!=ACTION_SKILL) return FALSE; if(m_QueueAction.SKILL.dwSkillID != dwSkillID ) return FALSE; if (g_pHero->CanDoQueueAction(&m_QueueAction)) { BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)m_QueueAction.SKILL.dwSkillID); // ½ºÅ³À» »ç¿ëÇÒ ±âº»ÀûÀÎ Á¶°ÇÀÌ ¾ÈµÇ¸é ¸®ÅÏ if (pInfo==NULL||!g_pHero->CanUseSkill(m_QueueAction.SKILL.dwSkillID)) { SetAreaSkill(FALSE); g_SkillQueue.Pop(); return TRUE; } util::Timer *pTimer = NULL; if( (eACTION_CRYSTAL_WARP_DESTROY + eACTION_START_SKILL_CODE) == pInfo->m_SkillCode ) { pTimer = xGetCooltimeManager()->GetSkillCooltime(eACTION_CRYSTAL_WARP_CREATE + eACTION_START_SKILL_CODE); } else { pTimer = xGetCooltimeManager()->GetSkillCooltime(pInfo->m_SkillCode); } if (!pTimer) { SetAreaSkill(FALSE); g_SkillQueue.Pop(); return TRUE; } // ¼¦µô·¹ÀÌÁß¿¡´Â ½ºÅ³ ¸ø¾¸ if (IsShootingMode()) { if (g_pHero->GetValkyrieShotDelay() > 30) { return FALSE;//µô·¹ÀÌ´Â ±â´Ù¸°´Ù } } // Á¦ÀÚ¸®¿¡¼­ ¹Ù·Î »ç¿ëÇÏ´Â ½ºÅ³Àϰæ¿ì,ƯÁ¤ Áö¿ªÀ» Ŭ¸¯Çؼ­ »ç¿ëÇÏ´Â °æ¿ì if (pInfo->m_byTarget == SKILL_TARGET_ME||pInfo->m_byTarget == SKILL_TARGET_SUMMON || pInfo->m_byTarget == SKILL_TARGET_AREA_ENEMY_CORPSE) { g_pHero->DoAction(&m_QueueAction); SetAreaSkill(FALSE); g_SkillQueue.Pop(); return TRUE; } else if(pInfo->m_byTarget ==SKILL_TARGET_AREA) { PLAYER_ACTION skillaction; ZeroMemory(&skillaction,sizeof(skillaction)); skillaction.ActionID = ACTION_SKILL; skillaction.SKILL.dwSkillID = m_TargetAreaSkillID; skillaction.SKILL.dwTargetID = this->GetCurrentTarget(); skillaction.SKILL.vTargePos = m_TargetAreaPosition; skillaction.SKILL.bForceAttack=bForceAttack; m_QueueAction = skillaction; float fLength = GetActionLength(m_QueueAction); WzVector vTargetPos = m_TargetAreaPosition; WzVector vDistance = vTargetPos - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if (fDistance <= fLength) { g_pHero->DoAction(&m_QueueAction); SetAreaSkill(FALSE); m_IsClickedTargetArea = FALSE; g_SkillQueue.Pop(); return TRUE; } return FALSE; } else if(pInfo->m_byTarget ==SKILL_TARGET_FRIEND_CORPSE)//ÆÄƼ¿øÀÇ ½ÃüÀ϶§ { float fLength = GetActionLength(m_QueueAction); Character* pChr = (Character *)g_ObjectManager.GetObject(m_QueueAction.SKILL.dwTargetID); if (pChr) { WzVector vTargetPos = pChr->GetPosition(); WzVector vDistance = vTargetPos - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if (fDistance <= fLength) { g_pHero->DoAction(&m_QueueAction); SetAreaSkill(FALSE); g_SkillQueue.Pop(); return TRUE; } } } else if(pInfo->m_byTarget ==SKILL_TARGET_ENEMY_CORPSE)//Àû±º½ÃüÀ϶§ { float fLength = GetActionLength(m_QueueAction); Character* pChr = (Character *)g_ObjectManager.GetObject(m_QueueAction.SKILL.dwTargetID); if (pChr) { WzVector vTargetPos = pChr->GetPosition(); WzVector vDistance = vTargetPos - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if (fDistance <= fLength) { g_pHero->DoAction(&m_QueueAction); SetAreaSkill(FALSE); g_SkillQueue.Pop(); return TRUE; } } } // ¸ñÇ¥°¡ ÀÖ´Â °æ¿ì else { float fLength = GetActionLength(m_QueueAction); Character* pChr = (Character *)g_ObjectManager.GetObject(m_QueueAction.SKILL.dwTargetID); if (pChr&&!pChr->CanBeAttackTarget()) { SetAreaSkill(FALSE); g_SkillQueue.Pop(); return TRUE; } if (pChr) { WzVector vTargetPos = pChr->GetPosition(); WzVector vDistance = vTargetPos - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if (fDistance <= fLength) { //// ¸ñÇ¥ ±îÁö ½ÇÁ¦·Î À̵¿ÇؾßÇÏ´Â ½ºÅ³Àϰæ¿ì SKILLMOVE ÁÂÇ¥¸¦ µ¤¾î½áÁØ´Ù. //// Áö±ÝÀº Àӽ÷ΠÇϵåÄÚµù //if (pInfo->m_SkillClassCode == eSKILL_ASSAULT ) //{ // WzVector vDest; // // // ³Ê¹« ¸Ö¸é Á¢±Ù // // 1.0fÀº Àӽ÷Π³Ö¾î³õÀº °ª // if (fDistance > 1.0f) // { // WzVector vDirection; // VectorNormalize(&vDirection,&vDistance); // // vDest = vTargetPos + (vDirection * -0.9f); // } // else // { // vDest = g_pHero->GetPosition(); // } // m_QueueAction.SKILL.vDestPos.wvPos = vDest; // m_QueueAction.SKILL.vDestPos.wTile = -1; // m_QueueAction.SKILL.bForceAttack=bForceAttack; //} //if (pInfo->m_SkillClassCode == eSKILL_EXPLOZEN_ATTACK ) //{ // WzVector vDest; // // ³Ê¹« ¸Ö¸é Á¢±Ù // // 1.0fÀº Àӽ÷Π³Ö¾î³õÀº °ª // if (fDistance > 1.0f) // { // WzVector vDirection; // VectorNormalize(&vDirection,&vDistance); // vDest = vTargetPos + (vDirection * -0.9f); // } // else // { // vDest = g_pHero->GetPosition(); // } // m_QueueAction.SKILL.vDestPos.wvPos = vDest; // m_QueueAction.SKILL.vDestPos.wTile = -1; // m_QueueAction.SKILL.bForceAttack=bForceAttack; //} //if (pInfo->m_SkillClassCode == eSKILL_MACHSLASH) //{ // WzVector vDest; // // WzVector vDirection; // VectorNormalize(&vDirection,&vDistance); // float fLen=pInfo->m_wSkillRange/10.0f; // fLen+=1.0f; // vDest = g_pHero->GetPosition() + (vDirection *fLen); //»ç°Å¸® ¸¸Å­ À̵¿Çضó. // // m_QueueAction.SKILL.vDestPos.wvPos = vDest; // m_QueueAction.SKILL.vDestPos.wTile = -1; // m_QueueAction.SKILL.bForceAttack=bForceAttack; //} // if (/*pInfo->m_SkillClassCode == eSKILL_DARK_STUN || */ ///*pInfo->m_SkillClassCode == eSKILL_DARK_BREAK || */ //pInfo->m_SkillClassCode == eSKILL_TACKLE || ///*pInfo->m_SkillClassCode == eSKILL_CHARGE_ATTACK */ ////|| pInfo->m_SkillClassCode == eSKILL_DASH //) // { // WzVector vDest; // WzVector vDirection; // WzVector vOffset; // VectorNormalize(&vDirection,&vDistance); // vOffset = vDirection * 2.f; // vDest = g_pHero->GetPosition() + (vDistance - vOffset); // m_QueueAction.SKILL.vDestPos.wvPos = vDest; // m_QueueAction.SKILL.vDestPos.wTile = -1; // m_QueueAction.SKILL.bForceAttack=bForceAttack; // } g_pHero->DoAction(&m_QueueAction); SetAreaSkill(FALSE); g_SkillQueue.Pop(); return TRUE; } } else { return TRUE; } } } return FALSE; } //------------------------------------------------------------------------------ /** Ŭ·¡½º ¾ÆÀ̵ð·Î ÇöÀç Àκ¥ÀÇ ½ºÅ³ Äڵ带 ¾ò´Â´Ù. */ DWORD HeroActionInput::GetSkillCode(DWORD dwClassId,BOOL & bActive,float &fDistance) { if( SkillData* skill_data = xGetSkillData()->GetSkillDataBySkillClassCode(dwClassId) ) { if( SkillScriptInfo* skill_info = skill_data->GetCurSkillInfo() ) { if( skill_data->GetState() == SLOT_RENDER_STATE_ACTIVATED) { bActive = TRUE; } else { bActive = FALSE; } fDistance = GetSkillRange(skill_info); //fDistance = static_cast(skill_info->m_wSkillRange / 10.0f); return skill_info->m_SkillCode; } } return 0; } //------------------------------------------------------------------------------ /** ¹ß۸® Űº¸µå À̵¿ */ BOOL HeroActionInput::ProcessValkyrieKeyboardMove() { // ¿ÀÅä ¾îÅà Ç÷¡±×°¡ ÄÑÁø »óÅ·Π°ø°ÝÇÏ·¯ ¶Ù¾î°¡´ø Áß, Űº¸µå À̵¿À» ´­·¶´Ù¸¦ üũÇϱâ À§ÇÑ Ç÷¡±× m_bKeyBoardMoveCheck = FALSE; DWORD dwCurTick = g_pSunRenderer->x_Clock.GetCurrentTick(); m_KeyboardState.UpdateSpecialMove2( dwCurTick ); Character* pChar = (Character*)g_ObjectManager.GetObject( GetCurrentTarget() ); BOOL bRange = FALSE; if( pChar != NULL ) { WzVector vPos = g_pHero->GetPosition(); WzVector vDest = pChar->GetPosition(); WzVector vDiff = vDest - vPos; float fLength = VectorLength(&vDiff); if( fLength <= GetAttackActionLength() + pChar->GetBodyRadius() ) { bRange = TRUE; } } BOOL bUse = TRUE; #ifdef _NA_000000_20160315_ETHERWEAPON_SPECIALMOVE #else if (g_pHero->GetWeaponKind() == eWEAPONTYPE_ETHERWEAPON) { bUse=FALSE; } #endif //_NA_000000_20160315_ETHERWEAPON_SPECIALMOVE RELATIONKIND::TYPE RelationType = RELATIONKIND::None; if( pChar ) { RelationType = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pChar, lsForceAttack() ); } //°ø°ÝÁßÀ̰ųª °ø°ÝÇÒ °¡´É¼ºÀÌ ÀÖÀ»¶© Ư¼ö À̵¿ÀÌ´Ù. if (bUse && ((g_pHero->GetCurState() == STATE::ATTACK) || (g_pHero->GetNextState() == STATE::ATTACK) || (m_bAutoAttack && pChar && (RelationType == RELATIONKIND::Enemy) && (pChar->IsDead() == FALSE) && bRange))) { if( m_KeyboardState.GetSpecialMoveLeftStep() ) { CancelSkillQueue(); m_QueueAction.ActionID = ACTION_SPECIAL_MOVE; m_QueueAction.SPECIALMOVE.bType = CMS_TUMBLING_LEFT; return FALSE; } else if( m_KeyboardState.GetSpecialMoveRightStep() ) { CancelSkillQueue(); m_QueueAction.ActionID = ACTION_SPECIAL_MOVE; m_QueueAction.SPECIALMOVE.bType = CMS_TUMBLING_RIGHT; return FALSE; } else if( m_KeyboardState.GetSpecialMoveFoward() ) { CancelSkillQueue(); m_QueueAction.ActionID = ACTION_SPECIAL_MOVE; m_QueueAction.SPECIALMOVE.bType = CMS_TUMBLING_FRONT; return FALSE; } else if( m_KeyboardState.GetSpecialMoveBackword() ) { CancelSkillQueue(); m_QueueAction.ActionID = ACTION_SPECIAL_MOVE; m_QueueAction.SPECIALMOVE.bType = CMS_TUMBLING_BACK; return FALSE; } if( m_KeyboardState.GetLeftTurnPressed() == TRUE || m_KeyboardState.GetRightTurnPressed() == TRUE ) { SetAutoAttack(FALSE); g_pHero->StopMove(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } return FALSE; } if( m_QueueAction.ActionID == ACTION_SPECIAL_MOVE ) return TRUE; if( GetAutoRun() == TRUE ) { if( m_KeyboardState.GetFowardPressed() == TRUE || m_KeyboardState.GetBackwardPressed() == TRUE ) { SetAutoRun(FALSE); } } if( m_KeyboardState.IsKeyboardPressed() ) { //SetAutoAttack(FALSE); SetFollowState(FALSE); // ¸ðµç ¿¹¾àµÈ ÀÛ¾÷ Ãë¼Ò. InitTerm(); CancelSkillQueue(); m_bKeyBoardMoveCheck = TRUE; if (IsIdleState() || g_pHero->GetCurState() == STATE::MOVE ) { g_pHero->StopMove(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } else if(STATE::COLLECT == g_pHero->GetCurState()) { MapObject* pMapObj = (MapObject*)g_ObjectManager.GetObject(g_pHero->GetCollectObjKey()); if(pMapObj) { TCHAR* debug_message = NULL; #ifdef _DEV_VER debug_message = _T("MSG_CG_COLLECT_CANCEL_SYN[Move]"); #endif StateCollect::SendCollectCancelSyn(debug_message); } g_pHero->StopMove(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } if( m_KeyboardState.GetLeftTurnPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_LEFTTURN); } else if( m_KeyboardState.GetRightTurnPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_RIGHTTURN); } if( m_KeyboardState.GetFowardPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_FOWARD); } else if( m_KeyboardState.GetBackwardPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_BACKWARD); } #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX if (bIsRotateL) { // ¸¶¿ì½º Ŭ¸¯À¸·Î È­¸é °íÁ¤ »óÅ + ÀüÁøorÈÄÁø À̵¿, Á¿ìŰ´Â ¹«½Ã if (g_pHero->CheckMoveFlag(KEYBOARDMOVE_FOWARD) || g_pHero->CheckMoveFlag(KEYBOARDMOVE_BACKWARD)) { g_pHero->RemoveMoveFlag(KEYBOARDMOVE_LEFTTURN); g_pHero->RemoveMoveFlag(KEYBOARDMOVE_RIGHTTURN); } } #endif //_NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX if (!g_bObserverMode) { if( m_KeyboardState.GetRightStepPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_RIGHTSTEP); } else if( m_KeyboardState.GetLeftStepPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_LEFTSTEP); } } return TRUE; } return FALSE; } BOOL HeroActionInput::ProcessDefaultKeyboardMove() { // ¿ÀÅä ¾îÅà Ç÷¡±×°¡ ÄÑÁø »óÅ·Π°ø°ÝÇÏ·¯ ¶Ù¾î°¡´ø Áß, Űº¸µå À̵¿À» ´­·¶´Ù¸¦ üũÇϱâ À§ÇÑ Ç÷¡±× m_bKeyBoardMoveCheck = FALSE; // ÀÚµ¿´Þ¸®±âÁßÀ϶§ ÀüÁø ÈÄÁøÀ» ´©¸£¸é Ãë¼Ò if( GetAutoRun() == TRUE ) { if( m_KeyboardState.GetFowardPressed() || m_KeyboardState.GetBackwardPressed() ) { SetAutoRun(FALSE); } } // Űº¸µå À̵¿À» ÇѰæ¿ì if( m_KeyboardState.IsKeyboardPressed() ) { // µû¶ó°¡±â, ÀÚµ¿°ø°ÝÀ» Ãë¼Ò SetFollowState(FALSE); SetAutoAttack(FALSE); // ¸ðµç ¿¹¾àµÈ ÀÛ¾÷ Ãë¼Ò. InitTerm(); CancelSkillQueue(); m_bKeyBoardMoveCheck = TRUE; if (IsIdleState() || g_pHero->GetCurState() == STATE::MOVE ) { if(g_pHero->IsMoving()) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } else if( StateSkill* pSkillState = g_pHero->GetCurSkillState() ) { if( pSkillState->GetSkillClassCode() == eSKILL_HP_SUCTION || pSkillState->GetSkillClassCode() == eSKILL_MP_SUCTION ) { g_pHero->SendStopMovePacket(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } #ifdef _NA_000000_20130812_NEW_CHARACTER_HELLROID else if( pSkillState->GetSkillClassCode() == eSKILL_HELLROID_1015 ) { // Çï·ÎÀÌµå ½ºÇÉ SkillStateHellroidSpin* pState = (SkillStateHellroidSpin*)pSkillState; if( m_KeyboardState.GetLeftTurnPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_LEFTTURN); } else if( m_KeyboardState.GetRightTurnPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_RIGHTTURN); } if( m_KeyboardState.GetFowardPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_FOWARD); } else if( m_KeyboardState.GetBackwardPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_BACKWARD); } #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX if (bIsRotateL) { // ¸¶¿ì½º Ŭ¸¯À¸·Î È­¸é °íÁ¤ »óÅ + ÀüÁøorÈÄÁø À̵¿, Á¿ìŰ´Â ¹«½Ã if (g_pHero->CheckMoveFlag(KEYBOARDMOVE_FOWARD) || g_pHero->CheckMoveFlag(KEYBOARDMOVE_BACKWARD)) { g_pHero->RemoveMoveFlag(KEYBOARDMOVE_LEFTTURN); g_pHero->RemoveMoveFlag(KEYBOARDMOVE_RIGHTTURN); } } #endif //_NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX if ( g_bObserverMode == FALSE ) { if( m_KeyboardState.GetRightStepPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_RIGHTSTEP); } else if( m_KeyboardState.GetLeftStepPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_LEFTSTEP); } } pState->SetHeroKeyboardMove(); return TRUE; } #endif //_NA_000000_20130812_NEW_CHARACTER_HELLROID } else if(STATE::COLLECT == g_pHero->GetCurState()) { MapObject* pMapObj = (MapObject*)g_ObjectManager.GetObject(g_pHero->GetCollectObjKey()); if(pMapObj) { TCHAR* debug_message = NULL; #ifdef _DEV_VER debug_message = _T("MSG_CG_COLLECT_CANCEL_SYN[Move]"); #endif StateCollect::SendCollectCancelSyn(debug_message); } g_pHero->StopMove(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } if( m_KeyboardState.GetLeftTurnPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_LEFTTURN); } else if( m_KeyboardState.GetRightTurnPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_RIGHTTURN); } if( m_KeyboardState.GetFowardPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_FOWARD); } else if( m_KeyboardState.GetBackwardPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_BACKWARD); } #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX if (bIsRotateL) { // ¸¶¿ì½º Ŭ¸¯À¸·Î È­¸é °íÁ¤ »óÅ + ÀüÁøorÈÄÁø À̵¿, Á¿ìŰ´Â ¹«½Ã if (g_pHero->CheckMoveFlag(KEYBOARDMOVE_FOWARD) || g_pHero->CheckMoveFlag(KEYBOARDMOVE_BACKWARD)) { g_pHero->RemoveMoveFlag(KEYBOARDMOVE_LEFTTURN); g_pHero->RemoveMoveFlag(KEYBOARDMOVE_RIGHTTURN); } } #endif //_NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX if ( g_bObserverMode == FALSE ) { if( m_KeyboardState.GetRightStepPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_RIGHTSTEP); } else if( m_KeyboardState.GetLeftStepPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_LEFTSTEP); } } return TRUE; } return FALSE; } //------------------------------------------------------------------------------ /** ¿¤¸®¸àÅ»¸®½ºÆ® Űº¸µå À̵¿ */ BOOL HeroActionInput::ProcessElementalistKeyboardMove() { // ¿ÀÅä ¾îÅà Ç÷¡±×°¡ ÄÑÁø »óÅ·Π°ø°ÝÇÏ·¯ ¶Ù¾î°¡´ø Áß, Űº¸µå À̵¿À» ´­·¶´Ù¸¦ üũÇϱâ À§ÇÑ Ç÷¡±× m_bKeyBoardMoveCheck = FALSE; DWORD dwCurTick = g_pSunRenderer->x_Clock.GetCurrentTick(); m_KeyboardState.UpdateSpecialMove( dwCurTick ); // Åö¼öÀ̵¿ if( m_KeyboardState.GetSpecialMoveLeftStep() ) { WzVector vFoward = g_pHero->GetDirection(); WzVector vLeft; vLeft.x = -vFoward.y; vLeft.y = vFoward.x; vLeft.z = 0.0f; ProcessTeleportMoveSkill(vLeft); return FALSE; } else if( m_KeyboardState.GetSpecialMoveRightStep() ) { WzVector vFoward = g_pHero->GetDirection(); WzVector vRight; vRight.x = vFoward.y; vRight.y = -vFoward.x; vRight.z = 0.0f; ProcessTeleportMoveSkill(vRight); return FALSE; } else if( m_KeyboardState.GetSpecialMoveFoward() ) { WzVector vFoward = g_pHero->GetDirection(); ProcessTeleportMoveSkill(vFoward); return FALSE; } else if( m_KeyboardState.GetSpecialMoveBackword() ) { WzVector vFoward = g_pHero->GetDirection(); ProcessTeleportMoveSkill(-vFoward); return FALSE; } // ÀÚµ¿´Þ¸®±âÁßÀ϶§ ÀüÁø ÈÄÁøÀ» ´©¸£¸é Ãë¼Ò if( GetAutoRun() == TRUE ) { if( m_KeyboardState.GetFowardPressed() || m_KeyboardState.GetBackwardPressed() ) { SetAutoRun(FALSE); } } // Űº¸µå À̵¿À» ÇѰæ¿ì if( m_KeyboardState.IsKeyboardPressed() ) { // µû¶ó°¡±â, ÀÚµ¿°ø°ÝÀ» Ãë¼Ò SetFollowState(FALSE); SetAutoAttack(FALSE); // ¸ðµç ¿¹¾àµÈ ÀÛ¾÷ Ãë¼Ò. InitTerm(); CancelSkillQueue(); m_bKeyBoardMoveCheck = TRUE; if (IsIdleState() || g_pHero->GetCurState() == STATE::MOVE ) { g_pHero->StopMove(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } else if(STATE::COLLECT == g_pHero->GetCurState()) { MapObject* pMapObj = (MapObject*)g_ObjectManager.GetObject(g_pHero->GetCollectObjKey()); if(pMapObj) { TCHAR* debug_message = NULL; #ifdef _DEV_VER debug_message = _T("MSG_CG_COLLECT_CANCEL_SYN[Move]"); #endif StateCollect::SendCollectCancelSyn(debug_message); } g_pHero->StopMove(); g_pHero->SetNextState(STATE::KEYBOARDMOVE,g_CurTime); } if( m_KeyboardState.GetLeftTurnPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_LEFTTURN); } else if( m_KeyboardState.GetRightTurnPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_RIGHTTURN); } if( m_KeyboardState.GetFowardPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_FOWARD); } else if( m_KeyboardState.GetBackwardPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_BACKWARD); } #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX if (bIsRotateL) { // ¸¶¿ì½º Ŭ¸¯À¸·Î È­¸é °íÁ¤ »óÅ + ÀüÁøorÈÄÁø À̵¿, Á¿ìŰ´Â ¹«½Ã if (g_pHero->CheckMoveFlag(KEYBOARDMOVE_FOWARD) || g_pHero->CheckMoveFlag(KEYBOARDMOVE_BACKWARD)) { g_pHero->RemoveMoveFlag(KEYBOARDMOVE_LEFTTURN); g_pHero->RemoveMoveFlag(KEYBOARDMOVE_RIGHTTURN); } } #endif //_NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX if ( g_bObserverMode == FALSE ) { if( m_KeyboardState.GetRightStepPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_RIGHTSTEP); } else if( m_KeyboardState.GetLeftStepPressed() ) { g_pHero->AddMoveFlag(KEYBOARDMOVE_LEFTSTEP); } } return TRUE; } return FALSE; } void HeroActionInput::ProcessTeleportMoveSkill(WzVector teleport_direction) { if( g_pHero->IsPolymorph() == TRUE ) return; SetAutoRun(FALSE); SetFollowState( FALSE ); SetAutoAttack(FALSE); DWORD move_skill_class_code = 0; if( g_pHero->GetClass() == eCHAR_ELEMENTALIST ) { move_skill_class_code = eSKILL_TELEPORT; } else if( g_pHero->GetClass() == eCHAR_MYSTIC ) { move_skill_class_code = eSKILL_MYSTIC_921; } BOOL is_active = FALSE; float teleport_distance; DWORD skill_id = GetSkillCode(move_skill_class_code, is_active, teleport_distance); TCHAR szMessage[INTERFACE_STRING_LENGTH] = {'\0',}; if (skill_id != 0) { if (is_active == TRUE) { // 1. ½ºÅ³°Å¸®¸¸Å­ ¹Ð¾î¼­ °¥ ¼ö ÀÖ´ÂÁö üũ(¹Ð¾î¼­ °¥ ¼ö ÀÖ´Ù¸é ´Ù¸¥ üũ´Â ÇÊ¿ä¾øÀ½) // 2. ¹Ð¾î¼­ °¥ ¼ö ¾ø´Ù¸é, PTA_ONLY_JUMP, PTA_NO_WALK, PTA_EXTRA_TILE µîÀÇ Å¸ÀÏÁ¦ÇÑÀ» ÇÏ¿© °æ·Î Ž»ö WzVector source_position = g_pHero->GetPosition(); WzVector destination_position = source_position + (teleport_direction * teleport_distance * 0.85f); static int spline_num = 10; destination_position = GetCanTeleportPosition(destination_position, spline_num); destination_position.z += 1.0f; //m_PickingPosition = destination_position; if ((VectorLength(&destination_position) == 0.0f) || (abs(destination_position.z - source_position.z) > 10.0f)) { // ÅÚ·¹Æ÷Æ®·Î À̵¿ÇÒ ¼ö ¾ø´Â Áö¿ªÀÔ´Ï´Ù. g_InterfaceManager.GetInterfaceString(eST_NOT_USE_TELEPORT_SKILL, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); return; } //m_TargetAreaSkillID = (SLOTCODE)skill_id; m_bSpecialMove = TRUE; UseSpecialMoveSkill( skill_id, destination_position); } else { // ÅÚ·¹Æ÷Æ® ½ºÅ³À» ¹è¿ö¾ß ÇÕ´Ï´Ù. static DWORD ms_LastOutputTime = 0; DWORD CurrentTime = GetCurrentTime(); // 2ÃÊ À̳»¿¡´Â Ç¥½ÃÇÏÁö ¾Ê´Â´Ù if( ms_LastOutputTime == 0 || ms_LastOutputTime + 2000 < CurrentTime ) { int message_code = move_skill_class_code == eSKILL_TELEPORT ? eST_NOT_LEARN_TELEPORT : eST_NOT_LEARN_BLINK; GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, g_InterfaceManager.GetInterfaceString( message_code ) ); ms_LastOutputTime = CurrentTime; } } } else { // ÅÚ·¹Æ÷Æ® ½ºÅ³ÀÌ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString(eST_NOT_EXIST_TELEPORT_SKILL, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } } //------------------------------------------------------------------------------ /** À̵¿ °¡´ÉÇÑ À§Ä¡¸¦ ¾ò´Â´Ù. */ WzVector HeroActionInput::GetCanTeleportPosition(WzVector vDest, int iSplineNum/* = 10*/) { iSplineNum = max(iSplineNum, 5); iSplineNum = min(iSplineNum, 100); WzVector vSrc = g_pHero->GetPosition(); WzVector vTemp; float fRate = 0.0f; float fRateModify = 1.0f / static_cast(iSplineNum); int iTileFocussing = -1; float fDistance = 0.0f; //ÃÖ´ë 10ȸ±îÁö¸¸ ã´Â´Ù for (int i = 0; i < 10; ++i) { vTemp = vDest * (1.0f - fRate) + vSrc * (fRate); iTileFocussing = g_pSunTerrain->x_pPathFinder->GetTileToStand(vTemp, &fDistance, 10.0f, 10.0f); if(iTileFocussing >= 0) { vTemp.z -= fDistance; g_pSunTerrain->PathExp_Reset(g_pPathExplorer, &vSrc, -1); // ¸ñÇ¥À§Ä¡±îÁö ¹Ð¾îÁö¸é ¼º°ø WzVector wzThrustDirection = vDest - vSrc; ENUM_FINDPATH_RESULT eFindpathResult = g_pSunTerrain->PathExp_Thrust(g_pPathExplorer, &wzThrustDirection, PTA_ONLY_JUMP | PTA_NO_WALK); if (eFindpathResult == EFR_SUCCESS) { g_pSunTerrain->PathExp_Progress(g_pPathExplorer, 1000000); vTemp = g_pPathExplorer->GetPos(); return vTemp; } // ÀÌÈÄ ¸ñÇ¥À§Ä¡±îÁö °æ·ÎŽ»öÇÏ¿© üũ WORD wTileAttribute = g_pMap->GetWorldBase()->x_pPathFinder->GetAttribute(iTileFocussing); if (wTileAttribute & (PTA_ONLY_JUMP | PTA_NO_WALK)) { // ¸ñÇ¥À§Ä¡°¡ °¥ ¼ö ¾ø´Â ŸÀÏÀÌ¸é ¾ÈµÊ } else { // ÅÚ·¹Æ÷Æ®ÀÇ °æ·Î Ž»öÀÇ °æ¿ì PTA_EXTRA_TILE ŸÀÏ ¼Ó¼ºµµ Á¦ÇÑÇÑ´Ù. // ¼º¹® µî°ú °°Àº ±æ¸ñ¿¡ ŸÀϼӼºÀ» ºÎ¿©ÇÏ¿© ¾È/¹ÛÀ¸·Î ÅÚ·¹Æ÷Æ®ÇÏ´Â °ÍÀ» Á¦ÇÑ wTileAttribute = PTA_ONLY_JUMP | PTA_NO_WALK | PTA_EXTRA_TILE; ENUM_FINDPATH_RESULT eFindpathResult = g_pSunTerrain->PathExp_FindPath(g_pPathExplorer, vTemp, iTileFocussing, wTileAttribute, MAX_NODE_FOR_PATHFIND); if (eFindpathResult == EFR_SUCCESS) { return vTemp; } } // ¿©±â±îÁö ¿À¸é ÇØ´çÀ§Ä¡·Î ÅÚ·¹Æ÷Æ®ÇÒ ¼ö ¾øÀ½, ¸ñÇ¥À§Ä¡ Ž»ö } fRate += fRateModify; iTileFocussing = -1; fDistance = 0.0f; } // ¸ñÇ¥À§Ä¡¸¦ ãÀ» ¼ö ¾øÀ¸¸é ¹Ð¾î¹ö¸®°í ³¡³½´Ù. g_pSunTerrain->PathExp_Reset(g_pPathExplorer, &vSrc, -1); WzVector wzThrustDirection = vDest - vSrc; g_pSunTerrain->PathExp_Thrust(g_pPathExplorer,&wzThrustDirection, PTA_NO_WALK); g_pSunTerrain->PathExp_Progress(g_pPathExplorer, 1000000); vDest = g_pPathExplorer->GetPos(); return vDest; } //------------------------------------------------------------------------------ /** ij¸¯ÅÍ Á¡ÇÁ ó¸® */ BOOL HeroActionInput::ProcessKeyboardJump() { if( CannotMoveState() == TRUE ) { return FALSE; } if( g_pHero->IsGravityZoneState() || g_pHero->IsPolymorph() ) { return FALSE; } #ifdef _YJ_FISHING_SYSTEM_000933 if( g_InterfaceManager.IsShowDialog(InterfaceManager::DIALOG_FISHING_ACTION) == TRUE ) { //°ÔÀÌÁö ¸ØÃç¶ó. } else { if ((g_Input.IsPressAnyExtKey() == FALSE) && (g_Input.GetState(DIK_SPACE, KS_KEY) != FALSE)) { set_jump_key_pressed(true); } } #else //_YJ_FISHING_SYSTEM_000933 if (is_spread_wing_key_pressed() == true) { if (ProcessSpreadWing() == TRUE) { return TRUE; } } if ((g_pHero->is_spread_wings() == true) || ((g_pHero->IsRiding() == TRUE) && (g_pHero->rider() != NULL) && (g_pHero->rider()->is_spread() == true))) { // ³¯°³¸¦ Æì°í Àְųª, ³ª´Â Å»°ÍÀ» Ÿ°í ³¯°í ÀÖÀ¸¸é Á¡ÇÁ´Â ¾ÈµÊ return FALSE; } ////////////////////////////////////////////////////////////////////////// #endif //_YJ_FISHING_SYSTEM_000933 //if (bJumpPressed) if (is_jump_key_pressed() == true) { // ¸ðµç ¿¹¾àµÈ ÀÛ¾÷ Ãë¼Ò. InitTerm(); CancelSkillQueue(); SetFollowState( FALSE ); SetAutoAttack(FALSE); //Á¡ÇÁ Áß¿¡´Â º¯°æ ¾ÈµÈ´Ù. //if (bJumpPressed&&(IsIdleState() || g_pHero->GetCurState() == STATE::MOVE || g_pHero->GetCurState() == STATE::KEYBOARDMOVE)) if (IsIdleState() || g_pHero->GetCurState() == STATE::MOVE || g_pHero->GetCurState() == STATE::KEYBOARDMOVE) { if( m_KeyboardState.GetFowardPressed() ) { g_pHero->m_JumpData.m_JumpFlag.AddForward(); } else if( m_KeyboardState.GetBackwardPressed() ) { g_pHero->m_JumpData.m_JumpFlag.AddBackward(); } if( m_KeyboardState.GetRightStepPressed() ) { g_pHero->m_JumpData.m_JumpFlag.AddRightStep(); } else if( m_KeyboardState.GetLeftStepPressed() ) { g_pHero->m_JumpData.m_JumpFlag.AddLeftStep(); } if(g_pHero->m_JumpData.m_JumpFlag.GetMoveFlag() == 0 ) { if(m_bAutoRun||g_pHero->IsMoving()) { g_pHero->m_JumpData.m_JumpFlag.AddForward(); } } //¾É±â Áß¿¡ Á¡ÇÁ µé¾î¿À¸é Ǭ´Ù. if(g_pHero->GetCurState() == STATE::SIT) { MSG_CG_STATUS_CONDITION_CHANGE_SYN Packet; Packet.m_byCategory = CG_STATUS; Packet.m_byProtocol = CG_STATUS_CONDITION_CHANGE_SYN; Packet.m_byConditionType = eCHAR_CONDITION_STANDUP; if( FALSE == g_pHero->SendPacket( &Packet, sizeof(MSG_CG_STATUS_CONDITION_CHANGE_SYN) ) ) { assert(!"¼­±â ÆÐŶ Àü¼Û ½ÇÆÐ"); return FALSE; } } g_pHero->SetNextState(STATE::KEYBOARDJUMP,g_CurTime); return TRUE; } } return FALSE; } BOOL HeroActionInput::ProcessSpreadWing() { if ((g_pHero->IsTransForm() == FALSE) && (g_pHero->IsRiding() == TRUE) && (g_pHero->rider() != NULL) && (GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_SSQ) #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM && (GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_SPA) #endif //_NA_008069_20150210_ADD_SPA_SYSTEM ) { StateBase* rider_spread_state = g_pHero->GetStateInstance(STATE::RIDER_SPREAD); if ((g_pHero->rider()->is_spread() == true) && (g_pHero->GetCurState() != STATE::RIDER_FURL) && (g_pHero->GetNextState() != STATE::RIDER_FURL)) { g_pHero->SetNextState(STATE::RIDER_FURL, g_CurTime); } else if ( g_pHero->rider() && (g_pHero->rider()->is_spread() == false) && (g_pHero->rider()->is_possible_fly() == true) && (g_pHero->GetCurState() != STATE::RIDER_SPREAD) && (g_pHero->GetNextState() != STATE::RIDER_SPREAD) && (rider_spread_state != NULL) && (rider_spread_state->CanTransite(g_pHero->GetCurStateInstance()) == true)) { g_pHero->SetNextState(STATE::RIDER_SPREAD, g_CurTime); return TRUE; } } else if ((g_pHero->IsTransForm() == FALSE) && (g_pHero->IsRiding() == FALSE) && (GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_SSQ) #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM && (GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_SPA) #endif //_NA_008069_20150210_ADD_SPA_SYSTEM ) { StateBase* wing_summon_state = g_pHero->GetStateInstance(STATE::WINGS_SPREAD); if ((g_pHero->is_spread_wings() == true) && (g_pHero->GetCurState() != STATE::WINGS_FURL) && (g_pHero->GetNextState() != STATE::WINGS_FURL)) { g_pHero->SetNextState(STATE::WINGS_FURL, g_CurTime); } else if ((g_pHero->is_wing_equip(NULL) == true) && (g_pHero->is_spread_wings() == false) && (g_pHero->GetCurState() != STATE::WINGS_SPREAD) && (g_pHero->GetNextState() != STATE::WINGS_SPREAD) && (wing_summon_state != NULL) && (wing_summon_state->CanTransite(g_pHero->GetCurStateInstance()) == true)) { if (g_pHero->GetCurState() == STATE::SIT) { g_pHero->SendStandUp(); } g_pHero->SetNextState(STATE::WINGS_SPREAD, g_CurTime); return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** 2006.1.15 Ư¼ö À̵¿ Á¶ÀÛ º¯°æ ½ÃÀÛ-Áö¿Ï */ BOOL HeroActionInput::ProcessKeyboardMove() { // ¾Æ¹ÙŸ°¡ ¾øÀ¸¸é 󸮾ÈÇÔ // ÀÌÈÄ ¾ÈÂÊ¿¡¼­´Â g_pHero¿¡ Á¸ÀçÀ¯¹«¿¡´ëÇØ üũÇÒÇÊ¿ä¾øÀ½. if( g_pHero == NULL ) { return FALSE; } if( BattleScene::IsWaitEnterSync() == TRUE ) { //! Player_enter Á¤º¸¸¦ ¹ÞÁö ¾ÊÀº»óÅÂ(·Îµù»óÅÂ)¿¡¼­´Â Űº¸µå ó¸® ÇÏÁö ¾Ê´Â´Ù. SetAutoRun(FALSE); SetFollowState( FALSE ); return FALSE; } eCHAR_TYPE charType = g_pHero->GetClass(); if( ProcessKeyboardJump() ) { return TRUE; } g_pHero->ResetMoveFlag(); if( CannotMoveState() == TRUE ) { SetAutoRun(FALSE); SetFollowState( FALSE ); return FALSE; } if( charType == eCHAR_VALKYRIE ) { return ProcessValkyrieKeyboardMove(); } else if( charType == eCHAR_ELEMENTALIST || charType == eCHAR_MYSTIC ) { return ProcessElementalistKeyboardMove(); } else { return ProcessDefaultKeyboardMove(); } return FALSE; } //------------------------------------------------------------------------------ /** */ VOID HeroActionInput::InitTerm() { ZeroMemory(&m_QueueAction,sizeof(m_QueueAction)); m_QueueAction.ActionID = ACTION_IDLE; if( IsShootingMode() == FALSE ) { SetAutoAttack(FALSE); } m_bKeyboardQueueAttack = FALSE; } //------------------------------------------------------------------------------ /** */ void HeroActionInput::PickingForShowMonsterName() { if( GAMEOPTION->GetDisplayMonterInfo() == FALSE ) return; if (VectorLength2(&g_wrMouseRay.m_wvDirection) <= 0.04f) return; Character* pPickedObj = GetPickedCharacter(); g_pCurrentPickedObject = pPickedObj; if( pPickedObj && ( pPickedObj->GetObjectKey() != g_pHero->GetObjectKey() ) ) { Object * pTargetObject = g_ObjectManager.GetObject( pPickedObj->GetObjectKey() ); Object * pCurrentTargetObj = g_ObjectManager.GetObject( GetCurrentTarget() ); if( pTargetObject ) { if( pTargetObject->IsKindOfObject( MONSTER_OBJECT ) ) { Monster * pMonster = static_cast(pTargetObject); if( pCurrentTargetObj == pTargetObject ) { pMonster->SetShowName( FALSE ); return; } pMonster->SetShowName( TRUE ); } } } else { g_pCurrentPickedObject = NULL; } } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::ProcessValkyrieMouse() { if (!g_pHero) { return FALSE; } if( g_Input.GetState( MOUSE_LBUTTON, IKS_MOUSE_DOWN )) { GetCursorPos( &m_MousePoint ); } if( g_Input.GetState( MOUSE_RBUTTON, IKS_MOUSE_DOWN )) { GetCursorPos( &m_MousePoint ); } static BOOL bIsLButtonDown = FALSE; static BOOL bIsRButtonDown = FALSE; #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX #else static BOOL bIsRotateL = FALSE; #endif //#ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX static BOOL bIsRotateR = FALSE; // ÁÖÀΰø ȸÀü Á¤º¸ ÃʱâÈ­ g_pHero->SetHeroTurnState( g_Camera.GetCameraTurnState() ); if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_DOWN )) { bIsRotateL = FALSE; bIsLButtonDown = TRUE; GetCursorPos( &m_MousePoint ); } else if ( bIsRotateL == FALSE && g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_KEY) && g_Camera.IsRotate() == TRUE ) { // óÀ½ ȸÀü ½ÃÀÛ bIsRotateL = TRUE; if( m_bAutoAttack == FALSE && g_pHero->IsDead() == FALSE ) { if( g_pHero->GetCurState() == STATE::IDLE || g_pHero->GetCurState() == STATE::KEYBOARDMOVE ) { // ÁÖÀΰø ȸÀü Á¤º¸ ¼³Á¤ g_pHero->SetHeroTurnState( g_Camera.GetCameraTurnState() ); g_pHero->SetDirection( g_Camera.GetCameraTo(), g_Camera.GetCameraFrom(), FALSE ); } } // óÀ½ Ŭ¸¯ÇÒ ¶§ÀÇ ¸¶¿ì½º ÁÂÇ¥ ÀúÀå if( m_bIsMousePointHide == FALSE ) { // ¸¶¿ì½º ȸÀüÇÒ ¶§´Â ¸¶¿ì½º Æ÷ÀÎÅ͸¦ °¨Ãá´Ù. m_bIsMousePointHide = TRUE; } } else if (bIsRotateL == TRUE && g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_KEY) && g_Camera.IsRotate() == TRUE ) { // °è¼Ó ȸÀü Áß if( m_bAutoAttack == FALSE && g_pHero->IsDead() == FALSE ) { if( g_pHero->GetCurState() == STATE::IDLE || g_pHero->GetCurState() == STATE::KEYBOARDMOVE ) { // ÁÖÀΰø ȸÀü Á¤º¸ ¼³Á¤ g_pHero->SetHeroTurnState( g_Camera.GetCameraTurnState() ); g_pHero->SetDirection( g_Camera.GetCameraTo(), g_Camera.GetCameraFrom(), FALSE ); } } } if( g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_DOWN )) { bIsRotateR = FALSE; bIsRButtonDown = TRUE; GetCursorPos( &m_MousePoint ); } else if ( bIsRotateR == FALSE && g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_KEY) && g_Camera.IsRotate() == TRUE ) { // óÀ½ ȸÀü ½ÃÀÛ bIsRotateR = TRUE; // óÀ½ Ŭ¸¯ÇÒ ¶§ÀÇ ¸¶¿ì½º ÁÂÇ¥ ÀúÀå if( m_bIsMousePointHide == FALSE ) { // ¸¶¿ì½º ȸÀüÇÒ ¶§´Â ¸¶¿ì½º Æ÷ÀÎÅ͸¦ °¨Ãá´Ù. m_bIsMousePointHide = TRUE; } } else if (bIsRotateR == TRUE && g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_KEY) && g_Camera.IsRotate() == TRUE ) { // °è¼Ó ȸÀüÁß } // ¸¶¿ì½º Æ÷ÀÎÅÍ Ç¥½Ã if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_UP )) { if( bIsLButtonDown == TRUE || m_bIsMousePointHide ) { m_bIsMousePointHide = FALSE; } } else if( g_Input.GetState( MOUSE_LBUTTON, IKS_MOUSE_UP )) { if( bIsLButtonDown == TRUE || m_bIsMousePointHide ) { m_bIsMousePointHide = FALSE; } } if( g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_UP )) { if( bIsRButtonDown == TRUE || m_bIsMousePointHide ) { m_bIsMousePointHide = FALSE; SetCursorPos( m_MousePoint.x, m_MousePoint.y ); MouseCursor::Instance()->ShowCursor( TRUE ); } } else if( g_Input.GetState( MOUSE_RBUTTON, IKS_MOUSE_UP )) { if( bIsRButtonDown == TRUE || m_bIsMousePointHide ) { m_bIsMousePointHide = FALSE; } } // µÎ ¹öư µ¿½Ã¿¡ ´©¸£´Â°Ç ¾ø´Ù. if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_UP )) { if( bIsLButtonDown == TRUE ) { bIsLButtonDown = FALSE; if( bIsRotateL == FALSE ) { // ¸¶¿ì½º Ŭ¸¯ WzVector ClickedPosition; SetAutoRun(FALSE); SetFollowState( FALSE ); SetAutoAttack(FALSE); InitTerm(); if (!g_pHero->CanValkyrieAction()) { return FALSE; } Character* pPickedObj = GetPickedCharacter(); if(pPickedObj) { if (OnValkyrieLClickedCharacter(pPickedObj)) { g_InterfaceManager.SetMovePointer( FALSE, NULL ); return TRUE; } } g_pHero->LockOn(0); Item * pPickItem = GetPickedItem(); if (pPickItem) { // ¿­·ÁÀÖÁö ¾ÊÀº »óÀÚ¸¸ Ŭ¸¯ °¡´ÉÇÏ´Ù~ if (!pPickItem->IsOpened() && MouseHandler::Instance()->IsExistItemAtHand() == FALSE ) { if (OnLClickedItem(pPickItem)) { return TRUE; } } } if (GameFunc::GetClickedPosition(&ClickedPosition)) { if (OnLClickedPosition(&ClickedPosition)) { #ifdef PERF_AUTO_MOVE_TEST if(m_bAutoMove) { m_vDestPos=g_pHero->GetVisiblePos(); m_vSrcPos=ClickedPosition; } #endif return TRUE; } } else { return TRUE; } } else { bIsRotateL = FALSE; } } // if( bIsLButtonDown == TRUE ) } if( g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_UP )) { if( bIsRotateR == FALSE ) { Character* pPickedObj = GetPickedCharacter(); if(pPickedObj && (pPickedObj->GetObjectKey() != g_pHero->GetObjectKey()) ) { SetCurrentTarget( pPickedObj->GetObjectKey() ); if (g_pHero->GetCurState() == STATE::IDLE) { g_pHero->SetDirection(pPickedObj->GetPosition()); } } else { SetAutoAttack(FALSE); SetCurrentTarget( 0 ); if( g_pHero->GetCurState() != STATE::MOVE && g_pHero->GetCurState() != STATE::KEYBOARDMOVE && g_pHero->GetCurState() != STATE::SPECIALMOVE&& g_pHero->GetCurState() != STATE::KEYBOARDJUMP) { PLAYER_ACTION action; action.ActionID = ACTION_IDLE; m_QueueAction = action; g_pHero->SetNextState(STATE::IDLE,g_CurTime); } } // Ÿ°Ù ´ÙÀ̾ó·Î±× ¼³Á¤ ProcessTargeting(); } else { bIsRotateR = FALSE; } } return FALSE; } BOOL HeroActionInput::ProcessMouse() { // ¾Æ¹ÙŸ°¡ ¾øÀ¸¸é 󸮾ÈÇÔ // ÀÌÈÄ ¾ÈÂÊ¿¡¼­´Â g_pHero¿¡ Á¸ÀçÀ¯¹«¿¡´ëÇØ üũÇÒÇÊ¿ä¾øÀ½. if (!g_pHero) { return FALSE; } if(GetCurrentTarget()) { Object *pObj=g_ObjectManager.GetObject(GetCurrentTarget()); if(pObj) { if(pObj->IsKindOfObject(CHARACTER_OBJECT)) { Character *pChr=(Character *)pObj; if(pChr->IsObserverMode()) this->SetCurrentTarget(0); } } } m_bPicking = FALSE; if( g_Input.GetState( MOUSE_LBUTTON, IKS_MOUSE_DOWN )||g_Input.GetState( MOUSE_RBUTTON, IKS_MOUSE_DOWN )) { GetCursorPos( &m_MousePoint ); } static BOOL bIsLButtonDown = FALSE; static BOOL bIsRButtonDown = FALSE; #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX #else //static BOOL bIsRotateL = FALSE; #endif //_NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX static BOOL bIsRotateR = FALSE; // ÁÖÀΰø ȸÀü Á¤º¸ ÃʱâÈ­ g_pHero->SetHeroTurnState( g_Camera.GetCameraTurnState() ); if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_DOWN )) { bIsRotateL = FALSE; bIsLButtonDown = TRUE; GetCursorPos( &m_MousePoint ); } else if ( bIsRotateL == FALSE && g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_KEY) && g_Camera.IsRotate() == TRUE ) { // óÀ½ ȸÀü ½ÃÀÛ bIsRotateL = TRUE; if( m_bAutoAttack == FALSE && IsShootingMode() == FALSE && g_pHero->IsDead() == FALSE ) { if( IsIdleState() || g_pHero->GetCurState() == STATE::KEYBOARDMOVE || g_pHero->GetCurState() == STATE::MOVE) { if(IsIdleState() && g_pHero->IsRiding()) { if(g_pHero->GetCurState()==STATE::RIDER_TURN) { g_pHero->SetNextState(STATE::IDLE,g_CurTime); } } else { // ÁÖÀΰø ȸÀü Á¤º¸ ¼³Á¤ g_pHero->SetHeroTurnState( g_Camera.GetCameraTurnState() ); g_pHero->StopMove(); g_pHero->SetDirection( g_Camera.GetCameraTo(), g_Camera.GetCameraFrom(), TRUE ); if (g_pHero->GetCurState() == STATE::MOVE)//À̵¿Áß¿¡´Â ½ÌÅ© ¸ÂÃß±â { g_pHero->SendStopMovePacket(); } } } else if( g_pHero->GetCurState() == STATE::KEYBOARDJUMP) { g_pHero->SetDirection( g_Camera.GetCameraTo(), g_Camera.GetCameraFrom(), TRUE ); } } // óÀ½ Ŭ¸¯ÇÒ ¶§ÀÇ ¸¶¿ì½º ÁÂÇ¥ ÀúÀå if( m_bIsMousePointHide == FALSE ) { MouseCursor::Instance()->ShowCursor( FALSE ); // ¸¶¿ì½º ȸÀüÇÒ ¶§´Â ¸¶¿ì½º Æ÷ÀÎÅ͸¦ °¨Ãá´Ù. m_bIsMousePointHide = TRUE; } } else if ( bIsRotateL == TRUE && g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_KEY) && g_Camera.IsRotate() == TRUE) { // °è¼Ó ȸÀü Áß if( m_bAutoAttack == FALSE && IsShootingMode() == FALSE && g_pHero->IsDead() == FALSE ) { if( (IsIdleState() && !g_pHero->IsRiding()) || g_pHero->GetCurState() == STATE::KEYBOARDMOVE) { // ÁÖÀΰø ȸÀü Á¤º¸ ¼³Á¤ g_pHero->SetHeroTurnState( g_Camera.GetCameraTurnState() ); g_pHero->SetDirection( g_Camera.GetCameraTo(), g_Camera.GetCameraFrom()); } else if( g_pHero->GetCurState() == STATE::KEYBOARDJUMP) { g_pHero->SetDirection( g_Camera.GetCameraTo(), g_Camera.GetCameraFrom(), TRUE ); } } } else { if(g_InterfaceManager.IsLockDlg()) { //¿¹¿Üó¸®:¶ô°É·ÈÀ»¶© ¸Þ½ÃÁö¸¦¹«½ÃÇÑ´Ù ¸¶¿ì½º°¡ ¾Èº¸ÀϼöµµÀֱ⿡ Ç®¾îÁØ´Ù if(!MouseCursor::Instance()->IsShowCursor()) { MouseCursor::Instance()->ShowCursor(TRUE); m_bIsMousePointHide = TRUE; } } } if( g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_DOWN )) { bIsRotateR = FALSE; bIsRButtonDown = TRUE; GetCursorPos( &m_MousePoint ); } else if (bIsRotateR == FALSE && g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_KEY) && g_Camera.IsRotate() == TRUE ) { // óÀ½ ȸÀü ½ÃÀÛ bIsRotateR = TRUE; // óÀ½ Ŭ¸¯ÇÒ ¶§ÀÇ ¸¶¿ì½º ÁÂÇ¥ ÀúÀå if( m_bIsMousePointHide == FALSE ) { MouseCursor::Instance()->ShowCursor( FALSE ); // ¸¶¿ì½º ȸÀüÇÒ ¶§´Â ¸¶¿ì½º Æ÷ÀÎÅ͸¦ °¨Ãá´Ù. m_bIsMousePointHide = TRUE; } } else if (bIsRotateR == TRUE && g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_KEY) && g_Camera.IsRotate() == TRUE ) { // °è¼Ó ȸÀü Áß } if (GlobalFunc::BeforeLoadingInputLock()) { return TRUE; } // ¸¶¿ì½º Æ÷ÀÎÅÍ Ç¥½Ã if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_UP )) { if( bIsLButtonDown == TRUE || m_bIsMousePointHide ) { m_bIsMousePointHide = FALSE; SetCursorPos( m_MousePoint.x, m_MousePoint.y ); MouseCursor::Instance()->ShowCursor( TRUE ); } } else if( g_Input.GetState( MOUSE_LBUTTON, IKS_MOUSE_UP )) { if( bIsLButtonDown == TRUE || m_bIsMousePointHide ) { m_bIsMousePointHide = FALSE; SetCursorPos( m_MousePoint.x, m_MousePoint.y ); MouseCursor::Instance()->ShowCursor( TRUE ); } } if( g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_UP )) { if( bIsRButtonDown == TRUE || m_bIsMousePointHide ) { m_bIsMousePointHide = FALSE; SetCursorPos( m_MousePoint.x, m_MousePoint.y ); MouseCursor::Instance()->ShowCursor( TRUE ); } } else if( g_Input.GetState( MOUSE_RBUTTON, IKS_MOUSE_UP )) { if( bIsRButtonDown == TRUE || m_bIsMousePointHide ) { m_bIsMousePointHide = FALSE; SetCursorPos( m_MousePoint.x, m_MousePoint.y ); MouseCursor::Instance()->ShowCursor( TRUE ); } } if( g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_UP )) { if( bIsRButtonDown ) { bIsRButtonDown = FALSE; if( bIsRotateR == FALSE ) { Character* pPickedObj = GetPickedCharacter(); if(pPickedObj && (pPickedObj->GetObjectKey() != g_pHero->GetObjectKey()) ) { SetCurrentTarget( pPickedObj->GetObjectKey() ); if( g_pHero->GetCurState() == STATE::IDLE ) { g_pHero->SetDirection(pPickedObj->GetPosition()); } RELATIONKIND::TYPE RelationType = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pPickedObj, lsForceAttack() ); if( RelationType == RELATIONKIND::Assistant) { uiHelpMan* helpMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_HELP)); if (helpMan) { helpMan->CheckHelpMessage(eHK_CLICK_NPC); } uiGuideSystemMan* guide_manager = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUIDE_SYSTEM)); if (guide_manager) { NPC* npc = static_cast(pPickedObj); DWORD monster_code = npc->GetMonsterInfo()->m_MonsterCode; guide_manager->CheckHelpMessage(TotalGuideNotice::kNpcClick, monster_code); } } } else { SetAutoAttack(FALSE); SetCurrentTarget( 0 ); if( g_pHero->GetCurState() != STATE::MOVE && g_pHero->GetCurState() != STATE::KEYBOARDMOVE && g_pHero->GetCurState() != STATE::SPECIALMOVE && g_pHero->GetCurState() != STATE::SIT && g_pHero->GetCurState() != STATE::KEYBOARDJUMP && g_pHero->GetCurState() != STATE::EMOTICON && g_pHero->GetCurState() != STATE::COLLECT && g_pHero->GetCurState() != STATE::SKILL #ifdef _YJ_FISHING_SYSTEM_000933 && g_pHero->GetCurState() != STATE::FISHING_THROW && g_pHero->GetCurState() != STATE::FISHING_STAND && g_pHero->GetCurState() != STATE::FISHING_BITE && g_pHero->GetCurState() != STATE::FISHING_SUCCESS && g_pHero->GetCurState() != STATE::FISHING_FAILED #endif //_YJ_FISHING_SYSTEM_000933 && (g_pHero->GetCurState() != STATE::SUMMON_RIDER) ) { PLAYER_ACTION action; action.ActionID = ACTION_IDLE; m_QueueAction = action; g_pHero->SetNextState(STATE::IDLE,g_CurTime); } } Item * pPickItem = GetPickedItem(); if (pPickItem) { // ¿­·ÁÀÖÁö ¾ÊÀº »óÀÚ¸¸ Ŭ¸¯ °¡´ÉÇÏ´Ù~ if (!pPickItem->IsOpened() && MouseHandler::Instance()->IsExistItemAtHand() == FALSE ) { if (OnLClickedItem(pPickItem)) { return TRUE; } } } // Ÿ°Ù ´ÙÀ̾ó·Î±× ¼³Á¤ ProcessTargeting(); #ifdef MAP_EDIT_MODE MapObject *pMapObject = GetPickedMapObject(); if (pMapObject) { if (OnRClickedMapObject(pMapObject)) { return TRUE; } else if(OnRClickedTile()) { return TRUE; } } else if(OnRClickedTile()) { return TRUE; } #endif } else { bIsRotateR = FALSE; } } } // ¾ÆÀÌÅÛ ¶³±¸´Â°Í¸¸ ´Ù¸£°Ô ó¸®ÇÔ. if (MouseHandler::Instance()->IsExistItemAtHand() && ((!g_Input.GetMouseChange() && g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_UP ) ) || (g_Input.GetMouseChange() && g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_UP )) ) ) { WzVector ClickedPosition; if( GameFunc::GetClickedPosition(&ClickedPosition) == FALSE ) return TRUE; if (OnLClickedPositionWithItem(&ClickedPosition)) { return TRUE; } } else // µÎ ¹öư µ¿½Ã¿¡ ´©¸£´Â°Ç ¾ø´Ù. ¿ÞÂÊ ¹öư -> °ø°Ý if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_UP )) { if( bIsLButtonDown == TRUE ) { bIsLButtonDown = FALSE; if( bIsRotateL == FALSE ) { // ¸¶¿ì½º Ŭ¸¯ SetAutoAttack(FALSE); SetAutoRun(FALSE); SetFollowState( FALSE ); Character* pPickedObj = GetPickedCharacter(); // Űº¸µå À̵¿½Ã¿£ ÀüºÎ ¹«½Ã if( m_bIsHeroKeyboardMove ) { if( pPickedObj ) { SetCurrentTarget( pPickedObj->GetObjectKey() ); } return FALSE; } InitTerm();//m_QueueActionÀ» idle »óÅ·Πº¯°æ // Áö¿ªÁöÁ¤ »óŰ¡ ¾Æ´Ñ°æ¿ì¿¡¸¸ if( m_ShowTargetAreaPointer == FALSE ) { if(pPickedObj) { RELATIONKIND::TYPE RelationType = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pPickedObj, lsForceAttack() ); if( OnLClickedCharacter( pPickedObj, RelationType, false ) ) { g_InterfaceManager.SetMovePointer( FALSE, NULL ); return TRUE; } } // À̰ſ¡ ´ëÇØ¼­ ´õ »ý°¢Çغ¸ÀÚ. Item * pPickItem = GetPickedItem(); if (pPickItem) { // ¿­·ÁÀÖÁö ¾ÊÀº »óÀÚ¸¸ Ŭ¸¯ °¡´ÉÇÏ´Ù~ if (!pPickItem->IsOpened() && MouseHandler::Instance()->IsExistItemAtHand() == FALSE ) { if (OnLClickedItem(pPickItem)) { return TRUE; } } } MapObject *pMapObject = GetPickedMapObject(); if (pMapObject && pMapObject->GetShow()) { if(STATE::COLLECT != g_pHero->GetCurState()) { if(TRUE == OnLClickedMapObject(pMapObject)) //UP { return TRUE; } } } } WzVector ClickedPosition; if( GameFunc::GetClickedPosition(&ClickedPosition) == FALSE ) return TRUE; if (OnLClickedPosition(&ClickedPosition)) { #ifdef PERF_AUTO_MOVE_TEST if(m_bAutoMove) { m_vSrcPos=g_pHero->GetVisiblePos(); m_vDestPos=ClickedPosition; } #endif return TRUE; } } else { // Ä«¸Þ¶ó ȸÀü bIsRotateL = FALSE; } } // if( bIsLButtonDown == TRUE ) #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX else if ((bIsLButtonDown == FALSE) && (bIsRotateL == TRUE)) { // Ŭ¸¯ ´Ù¿îÀÌ ¾ø¾ú´Âµ¥ ȸÀüÀº ÄÑÀÖ´Â °æ¿ì? { // [SUNJP-1711] 2016.1.22 / naklu / À̵¿ Ű ¼³Á¤ÀÌ Á¤»óÀûÀ¸·Î ±â´ÉÇÏÁö ¾Ê´Â Çö»ó ¼öÁ¤ // ui À§Ä¡À̵¿ µå·¡±×·Î È­¸é ¹ÛÀ¸·Î ¸¶¿ì½º°¡ ³ª°£ °æ¿ì bIsRotateL ÀÌ ÄÑÁö´Âµ¥ // ´Ù½Ã È­¸é ³»ºÎ·Î ¸¶¿ì½º À̵¿Çؼ­ Ŭ¸¯ ¾÷À» ÇßÀ» °æ¿ì, bIsRotateL °¡ ¾È²¨Á®¼­ ¸¶¿ì½º ±»´Â Çö»ó ¼öÁ¤ bIsRotateL = FALSE; } } #endif //_NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX } else if(g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_DOWN )) { if(STATE::COLLECT != g_pHero->GetCurState()) { MapObject *pMapObject = GetPickedMapObject(); if(pMapObject && (pMapObject->IsDominationObject() == FALSE)) { if(TRUE == OnLClickedMapObject(pMapObject, false)) { g_pHero->SetDirection( pMapObject->GetVisiblePos() ); return TRUE; } } } } #ifdef _NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX else if( g_Input.GetState( MOUSE_LBUTTON, IKS_MOUSE_UP )) { // ¸¶¿ì½º¸¦ uiÀ§¿¡¼­ ¶ª ¶§ È­¸é°íÁ¤ »óŰ¡ ¾ÈÇ®¸®´ø Çö»ó ¼öÁ¤ bIsRotateL = FALSE; bIsLButtonDown = FALSE; } #endif //_NA_000000_20150609_CHARACTER_ROTATE_RUNNING_BUG_FIX return FALSE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::ProcessMouseWhenKeyboardMove() { // Ŭ¸¯Çϸé ij¸¯Å͸¸ °ñ¶óº»´Ù. if(g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_DOWN)) { Character* pPickedObj = GetPickedCharacter(); if(pPickedObj && (pPickedObj->GetObjectKey() != g_pHero->GetObjectKey()) ) { SetCurrentTarget(pPickedObj->GetObjectKey()); return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** ¸¶¿ì½º ¹öưÀ» ´­·¯ ij¸¯Å͸¦ ÇÇÅ· ÇßÀ»¶§ */ BOOL HeroActionInput::OnLClickedCharacter(Character* pTarget, RELATIONKIND::TYPE relationKind, bool move_nearest) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; if(m_iMoveDelay>0) { return FALSE; } if(!pTarget) return FALSE; SetCurrentTarget(pTarget->GetObjectKey()); if(!g_pHero) return FALSE; float fDistance; PLAYER_ACTION action; WzVector vPlayerPos = g_pHero->GetPosition(); WzVector vOffset; WzVector vTargetPos; ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_IDLE;//¾×¼Ç »óÅ ÃʱâÈ­ #ifdef _NA_007113_SHADOW_PATCH_UNTARGET_MONSTER_DIE // ¼Ò¿ï ÄÁÆ®·ÑÀ» ¹è¿üÀ»°æ¿ì¿¡¸¸ ½Ãü¸¦ Ÿ°ÙÆÃÇϵµ·Ï ÇÑ´Ù if (relationKind == RELATIONKIND::Enemy ) { if( pTarget->GetCurState() == STATE::DEATH ) { if( xGetSkillData()->GetSkillDataBySkillClassCode( eSKILL_SOUL_CONTROL ) != NULL ) { SetCurrentTarget( pTarget->GetObjectKey() ); return TRUE; } } } #endif //_NA_007113_SHADOW_PATCH_UNTARGET_MONSTER_DIE // ÇØ¾ßÇÒ ÇൿÀ» °áÁ¤ÇÑ´Ù! if (relationKind == RELATIONKIND::Enemy) { if (!pTarget->CanBeAttackTarget())//Ÿ°ÙÀÌ µÉ¼ö ÀÖ´Â »óÅÂÀΰ¡ { return FALSE; } if (CannotAttack(pTarget)) { return FALSE; } if( false == CanAttackInDominationWar() ) return FALSE; ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_ATTACK; //°ø°Ý action.ATTACK.dwTargetID = pTarget->GetObjectKey();//´ë»ó action.ATTACK.bForceAttack =lsForceAttack(); // ÀÚµ¿ °ø°Ý ÄÔ SetAutoAttack(TRUE); SetCurrentTarget( pTarget->GetObjectKey() ); vTargetPos = pTarget->GetPosition(); } else if (relationKind == RELATIONKIND::Assistant) { if (g_pHero) { if(!ChoaCanUse()) { // Ä«¿À »óÅ¿¡¼­´Â ÀÌ¿ëÀÌ °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù. 5375 g_InterfaceManager.GetInterfaceString(eST_CHAO_IS_INAVALIBLE_STATUS , szMessage , INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } if ( g_pHero->GetBeHaveState() == PLAYER_BEHAVE_IDLE_STATE ) { if ((pTarget->IsKindOfObject(NPC_OBJECT) == TRUE) && (pTarget->IsKindOfObject(MONSTER_OBJECT) == FALSE)) { NPC* pNPC = static_cast(pTarget); if ((pNPC != NULL) && (pNPC->GetExtraInfo()->m_eNPCTYPE == eNPC_TYPE_PROTECTS)) { // ÇØ´ç NPCŸÀÔÀº Ç÷¹À̾îÀÇ Å¬¸¯¿¡ ¹ÝÀÀÇÏÁö ¾Ê°í, ÁöÇüÇÈÅ·ÀÌ µÇÁö ¾Ê´Â´Ù. return TRUE; } } vTargetPos = pTarget->GetPosition(); ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_NPCMEET; action.NPCMEET.dwNPCKey = pTarget->GetObjectKey(); // ÀÚµ¿ °ø°Ý ²ô±â SetAutoAttack(FALSE); } uiHelpMan* helpMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_HELP)); if (helpMan) { helpMan->CheckHelpMessage(eHK_CLICK_NPC); } uiGuideSystemMan* guide_manager = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUIDE_SYSTEM)); if (guide_manager) { NPC* npc = static_cast(pTarget); DWORD monster_code = npc->GetMonsterInfo()->m_MonsterCode; guide_manager->CheckHelpMessage(TotalGuideNotice::kNpcClick, monster_code); } } } else if (relationKind == RELATIONKIND::Vendor) { if(g_pHero) { if(!ChoaCanUse()) { // Ä«¿À »óÅ¿¡¼­´Â ÀÌ¿ëÀÌ °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù. 5375 g_InterfaceManager.GetInterfaceString(eST_CHAO_IS_INAVALIBLE_STATUS , szMessage , INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } vTargetPos = pTarget->GetPosition(); ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_VENDORMEET; action.VENDORMEET.dwTargetID = pTarget->GetObjectKey(); // ÀÚµ¿ °ø°Ý ²ô±â SetAutoAttack(FALSE); if( pTarget->IsKindOfObject(PLAYER_OBJECT)) { Player * pSaler = (Player * ) pTarget; if (pSaler) { switch (pSaler->GetBeHaveState()) { case PLAYER_BEHAVE_VENDOR_ESTABLISHER_STATE: { uiVendorMan * puiVendorMan = GET_DIALOG_MANAGER(uiVendorMan, UIMAN_VENDOR); if (puiVendorMan) { puiVendorMan->SetPendingSaler( pTarget->GetObjectKey() ); } } break; default: break; } } } } } else if (relationKind == RELATIONKIND::Friend) { #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE if (pTarget->IsKindOfObject(STATUE_PLAYER_OBJECT)) { if (g_pHero) { if ( g_pHero->GetBeHaveState() == PLAYER_BEHAVE_IDLE_STATE ) { StatuePlayer* bronze_player = static_cast(pTarget); vTargetPos = pTarget->GetPosition(); ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_STATUE_PLAYER_MEET; action.STATUEMEET.dwStatuePlayerKey = pTarget->GetObjectKey(); // ÀÚµ¿ °ø°Ý ²ô±â SetAutoAttack(FALSE); } } } else { vTargetPos = pTarget->GetPosition(); ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_PLAYERMEET; action.PLAYERMEET.dwTargetID = pTarget->GetObjectKey(); // ÀÚµ¿ °ø°Ý ²ô±â SetAutoAttack(FALSE); } #else vTargetPos = pTarget->GetPosition(); ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_PLAYERMEET; action.PLAYERMEET.dwTargetID = pTarget->GetObjectKey(); // ÀÚµ¿ °ø°Ý ²ô±â SetAutoAttack(FALSE); #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE } // ÇØ¾ßÇÒÇൿÀÌ ¾øÀ¸¸é ‹š·ÁÄ£´Ù. if (action.ActionID == ACTION_IDLE) { return FALSE; } vOffset = vTargetPos - vPlayerPos; fDistance = VectorLength( &vOffset ); m_QueueAction = action; // °ø°ÝÀÎ °æ¿ì BodyRadius ¸¦ »©ÁØ´Ù if( action.ActionID == ACTION_ATTACK ) { fDistance -= pTarget->GetBodyRadius(); } // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ if( fDistance > GetActionLength(m_QueueAction) ) { g_pHero->SetStartMoveTime( g_CurTime ); if( MoveToAction(vTargetPos, move_nearest) == FALSE ) { // Ÿ°ÙÀÌ NPCÀϰæ¿ì¿Í µ¿»ó¸¸ ´Ù½Ã Çѹø ´õ °è»ê #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE if (relationKind == RELATIONKIND::Assistant || pTarget->GetObjectType() == STATUE_PLAYER_OBJECT ) #else if (relationKind == RELATIONKIND::Assistant) #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE { // NPC¿Í ³ª »çÀÌÀÇ ¸¸³¯ ¼ö ÀÖ´Â ÃÖ´ë °Å¸®º¸´Ù ¾à°£ ´õ °£ À§Ä¡¸¦ ³Ñ°ÜÁ༭ ´Ù½Ã Çѹø ´õ °è»ê WzVector vDir = g_pHero->GetPosition() - vTargetPos; VectorNormalize( &vDir, &vDir ); #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE WzVector TargetPos; if ( pTarget->GetObjectType() == STATUE_PLAYER_OBJECT ) { const float legnth_statue = 18.0f; TargetPos = vTargetPos + ( vDir * (legnth_statue * DISTANCE_NPC_MEET_EXT) ); } else { // NPC¸¦ ¸¸³¯ ¼ö ÀÖ´Â °Å¸®( DISTANCE_NPC_MEET - 6¹ÌÅÍ )ÀÇ 70% // ÀÌ °ÍÀº NPC¸¦ ¸¸³¯ ¼ö ÀÖ´Â °Å¸®º¸´Ù 30% °Å¸®¸¸Å­ ´õ ´Ù°¡°£´Ù´Â ÀǹÌÀÌ´Ù. TargetPos = vTargetPos + ( vDir * (DISTANCE_NPC_MEET * DISTANCE_NPC_MEET_EXT) ); } #else WzVector TargetPos = vTargetPos + ( vDir * (DISTANCE_NPC_MEET * DISTANCE_NPC_MEET_EXT) ); #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE CPathExplorer *pPE = NULL; pPE = ( CPathExplorer* )Func_ContactTerrain( CT_NEW_PATH_EXPLORER, 0 ); if( pPE ) { g_pSunTerrain->PathExp_Reset( pPE, &TargetPos, -1); if( MoveToAction(TargetPos, move_nearest ) == FALSE ) { if(pPE) { // ±æÃ£±â ±â´É ÆÄ±« Func_ContactTerrain( CT_DELETE_PATH_EXPLORER, pPE ); pPE = NULL; } return TRUE; } #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE if ( pTarget->GetObjectType() == STATUE_PLAYER_OBJECT ) { m_QueueAction.ActionID = ACTION_STATUE_PLAYER_MEET; } else { m_QueueAction.ActionID = ACTION_NPCMEET; } #else m_QueueAction.ActionID = ACTION_NPCMEET; #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE if(pPE) { // ±æÃ£±â ±â´É ÆÄ±« Func_ContactTerrain( CT_DELETE_PATH_EXPLORER, pPE ); pPE = NULL; } } } } return TRUE; } return TRUE; } //------------------------------------------------------------------------------ /** ´ë»ó ¿ÀºêÁ§Æ®·Î À̵¿ÇÑ ÈÄ ¾×¼ÇÀ» ÃëÇÑ´Ù. */ BOOL HeroActionInput::MoveToMapObjectWithAction(MapObject* pObj, bool bKeyUp ) { if( pObj == NULL || g_pHero == NULL ) return FALSE; #ifdef _NA_000000_20160308_ATTACK_RATE_RISE_BUG if( IsIdleState() == FALSE && g_pHero->GetCurState() != STATE::MOVE ) { return FALSE; } #endif // _NA_000000_20160308_ATTACK_RATE_RISE_BUG // 1. ¾×¼Ç ¼³Á¤ PLAYER_ACTION action; ZeroMemory(&action,sizeof(action)); if(pObj->IsTriggerObj()) { action.ActionID = ACTION_USE_OBJECT; action.USEOBJECT.dwTargetID = pObj->GetObjectKey(); } else if(pObj->IsWayPointObj()) { action.ActionID = ACTION_WAYPOINT_MEET; action.WAYPOINTMEET.dwTargetID = pObj->GetObjectKey(); g_SoundEffect.PlayUI( UI_SOUND_DEFAULT_CLICK ); } else if (pObj->IsAirShipObject()) { action.ActionID = ACTION_AIRSHIP_MEET; action.AIRSHIP.target_object = pObj->GetObjectKey(); g_SoundEffect.PlayUI(UI_SOUND_DEFAULT_CLICK); } else if(INVALID_WZID != pObj->GetCollectionID()) { ////Å»°Íź»óÅ¿¡¼­´Â ÀÚµ¿ÇØÁ¦ //g_pHero->SendRiderReleasePacket(false); //g_pHero->SendWingsControlByAccessory(false, false); const CollectionInfo* pCI = CollectionParser::Instance()->FindCollectionInfo(pObj->GetCollectionID()); if(NULL != pCI) { const DWORD collect_condition = pCI->m_Condition[CollectionInfo::STAMP]; if (((collect_condition == CollectionInfo::OBJ_COLLECT) && (true == bKeyUp)) || ((collect_condition == CollectionInfo::OBJ_STAMP) && (false == bKeyUp)) || ((collect_condition == CollectionInfo::OBJ_STAMP_USE_GUILD_MASTER) && (false == bKeyUp) #ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND || ((collect_condition == CollectionInfo::OBJ_BATTLE_GROUND_STRONGPOINT) && (true == bKeyUp)) #endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #ifdef _NA_008334_20150608_SONNENSCHEIN || ((collect_condition == CollectionInfo::OBJ_SONNENSCHEIN_STAMP) && (false == bKeyUp)) #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION || ((collect_condition == CollectionInfo::OBJ_ONEDYSGUILDMISSION_STAMP) && (true == bKeyUp)) #endif //_NA_008543_20151027_ONE_DAYS_GUILD_MISSION ) ) { action.ActionID = ACTION_COLLECTION_OBJECT; action.COLLECTOBJECT.dwTargetID = pObj->GetObjectKey(); } } } else if (pObj->IsDominationObject()) { action.ActionID = ACTION_DOMINATION_OBJECT; action.DOMINATIONOBJECT.dwTargetID = pObj->GetObjectKey(); } else { // À̵¿ if( MoveToPosition( pObj->GetPosition(), true ) ) { // ¼­¹ö¿¡ ³»°¡ °è»êÇÑ À̵¿ ÆÐŶ º¸³½´Ù. MSG_CG_SYNC_MOVE_SYN SendPacket; ZeroMemory(&SendPacket,sizeof(SendPacket)); SendPacket.m_byCategory = CG_SYNC; SendPacket.m_byProtocol = CG_SYNC_MOVE_SYN; // MakePathPacketÀÌ ½ÇÆÐÇß´Ù¸é ¹Ù·Î ¸ØÃâ ¿¹Á¤ÀÌ´Ï Æ¯º°È÷ º¸³¾ÇÊ¿ä¾ø´Ù. if( g_pHero->MakePathPacket( &SendPacket ) == FALSE) { assert(!"¼­¹ö¿¡ º¸³¾ À̵¿·çÆ®¸¦ °è»êÇÒ¼ö ¾ø½À´Ï´Ù"); } else { SendPacket.Encode(); g_pHero->SendPacket( &SendPacket, SendPacket.GetPacketSize() ); } #ifdef _POSITION_DEBUG TCHAR temp[512]; Sprintf( temp, _T("¼­¹ö·Î move ÆÐŶ º¸³¿:%f,%f,%f"),SendPacket.wvCurPos.x, SendPacket.wvCurPos.y, SendPacket.wvCurPos.z); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, temp); #endif return TRUE; } return FALSE; } // ÀÚµ¿ °ø°Ý ²ô±â SetAutoAttack( FALSE ); WzVector vOffset = pObj->GetPosition() - g_pHero->GetPosition(); float fDistance = VectorLength( &vOffset ); m_QueueAction = action; // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ if( fDistance > GetActionLength( m_QueueAction ) ) { // À̵¿ÀÌ ½ÇÆÐÇßÀ¸¸é if( MoveToAction(pObj->GetPosition(), false) == FALSE ) { // ±Ùó·Î¶óµµ À̵¿½Ãµµ! WzVector vDest2; float fAngle = 0.0f; while( fAngle <= WZ_PI * 2.0f ) { for (float add_distance = 1.0f; add_distance <= 2.5f; add_distance += 0.5f) { if( GetSidePosNoNearTileCheck( pObj, fAngle, &vDest2 ,add_distance) ) { if( vDest2 != pObj->GetPosition() ) { if( MoveToAction( vDest2, false ) == TRUE ) { m_QueueAction = action; return TRUE; } } } } fAngle += (WZ_PI / 6.0f); } if( g_pHero ) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } } else { return TRUE; } } return TRUE; } //------------------------------------------------------------------------------ /** ¸¶¿ì½º ¹öưÀ» ´­·¯ ij¸¯Å͸¦ ÇÇÅ· ÇßÀ»¶§ */ BOOL HeroActionInput::OnLClickedMapObject( MapObject* pObj , bool bKeyUp /*= true*/) { if( m_iMoveDelay > 0 ) { return FALSE; } if( pObj == NULL ) { return FALSE; } if( pObj->IsAirShipObject() || pObj->IsTriggerObj() || pObj->IsWayPointObj() || pObj->GetCollectionID() != INVALID_WZID || pObj->IsDominationObject() ) { return MoveToMapObjectWithAction( pObj, bKeyUp ); } return FALSE; } #ifdef MAP_EDIT_MODE //------------------------------------------------------------------------------ /** ÁöÇü ¿ÀºêÁ§Æ® edit¿ë */ BOOL HeroActionInput::OnRClickedMapObject(MapObject* pObj) { if (g_Input.GetState(DIK_LCONTROL, KS_KEY)) { if (pObj && pObj->IsTerrain()) { m_dwEditMapObjKey=pObj->GetObjectKey(); g_mapEditScene.SetSelectObject(m_dwEditMapObjKey); return TRUE; } } return FALSE; } void HeroActionInput::SetEditMapObjKey(DWORD dwKey) { m_dwEditMapObjKey=dwKey; } TerrainObject *HeroActionInput::GetTargetTerrainObject() { Object *pObj=g_ObjectManager.GetObject(m_dwEditMapObjKey); if(pObj&&pObj->IsKindOfObject(MAP_OBJECT)) { MapObject *pMapObj=(MapObject *)pObj; if(pMapObj->IsTerrain()) { return (TerrainObject *)pMapObj; } } return NULL; } BOOL HeroActionInput::OnRClickedTile() { // mouse ray¸¦ À߸ø³Ö¾î¼­ »¶³ªÁö ¾Êµµ·Ï. if (VectorLength2(&g_wrMouseRay.m_wvDirection) <= 0.04f) { return FALSE; } WzVector vPos; BOOL bPickTerrain = GameFunc::GetClickedPosition(&vPos); if (bPickTerrain) { int iTile = g_pSunTerrain->x_pPathFinder->GetTileToStand( vPos, NULL, -1.0f, 100.0f ); if(iTile!=-1 && iTilex_pPathFinder->GetNumPathTile()) { TerrainObject *pTerrainObj=GetTargetTerrainObject(); if(pTerrainObj) { if(!pTerrainObj->AddTileIndex(iTile)) { pTerrainObj->DeleteTileIndex(iTile); } return TRUE; } } } return FALSE;; } DWORD HeroActionInput::GetEditMapObjKey() { return m_dwEditMapObjKey; } #endif //------------------------------------------------------------------------------ /** ¸¶¿ì½º ¹öưÀ» ´­·¯ ij¸¯Å͸¦ ÇÇÅ· ÇßÀ»¶§ */ BOOL HeroActionInput::OnShiftLClickedCharacter(Character* pObj, RELATIONKIND::TYPE relationKind) { if(!pObj) return FALSE; SetCurrentTarget(pObj->GetObjectKey()); if (g_pHero) { if (g_pHero->GetShow()) { GET_DIALOG(IM_TARGET_MANAGER::TARGET_DIALOG)->ShowWindow(TRUE); } } return TRUE; } BOOL HeroActionInput::OnLDragedCharacter(Character* pObj, RELATIONKIND::TYPE relationKind) { if(!pObj) return FALSE; if(!g_pHero) return FALSE; if (relationKind == RELATIONKIND::Enemy) { float fDistance; PLAYER_ACTION action; WzVector vPlayerPos = g_pHero->GetPosition(); WzVector vOffset; WzVector vTargetPos; ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_IDLE;//¾×¼Ç »óÅ ÃʱâÈ­ SetCurrentTarget(pObj->GetObjectKey()); if (g_pHero) { if (g_pHero->GetShow()) { GET_DIALOG(IM_TARGET_MANAGER::TARGET_DIALOG)->ShowWindow(TRUE); } } if (!pObj->CanBeAttackTarget())//Ÿ°ÙÀÌ µÉ¼ö ÀÖ´Â »óÅÂÀΰ¡ { return FALSE; } ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_ATTACK; //°ø°Ý action.ATTACK.dwTargetID = pObj->GetObjectKey();//´ë»ó action.ATTACK.bForceAttack =lsForceAttack(); vTargetPos = pObj->GetPosition(); vOffset = vTargetPos - vPlayerPos; fDistance = VectorLength( &vOffset ); m_QueueAction = action; // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ if( fDistance > GetActionLength(m_QueueAction) ) { MoveToAction(vTargetPos, false); return TRUE; } return TRUE; } return FALSE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnSpacePushItem( BOOL bAllPickup) { if(m_iMoveDelay>0) { return FALSE; } Item *pObj; Object *pObject; SCObject SCObj; GET_ITEM_vector vectorItem; GET_ITEM_vector vector_Item_another; GET_ITEM_vector* vector_Item_pointer; // Àüü ¿ÀºêÁ§Æ® Áß, ¾ÆÀÌÅÛ¸¸ »Ì¾Æ³»¼­ °Å¸® °è»ê ÈÄ Àӽà ¸®½ºÆ®¿¡ µî·Ï Object_Map_Itr itr = g_ObjectManager.GetBegin(); for( itr = g_ObjectManager.GetBegin() ; itr != g_ObjectManager.GetEnd() ; ++itr ) { pObject = static_cast(itr->second); if (0 == pObject) { assert(!"Object Is NULL!!"); return FALSE; } // ¾ÆÀÌÅÛÀΰ¡? SCObj = (itr->second)->GetSCObject(); if( SCObj.GetObjectType() == ITEM_OBJECT ) { pObj = (Item *)pObject; #ifdef _YMS_AUTOBOT_GAME if (Autobot::Instance()->IsPossiblePickup(*pObj) == false) { continue; } #endif //_YMS_AUTOBOT_GAME // ¿­·ÁÀÖÁö ¾ÊÀº »óÀÚ¸¸ Ŭ¸¯ °¡´ÉÇÏ´Ù~ if( pObj->IsOpened() == TRUE ) { continue; } // ¸ÕÀú ¸ÔÀ» ¼ö ÀÖ´Â °Å¸®¿¡ ÀÖ´ÂÁö °Ë»ç // ³Ê¹« ¸Ö¸é °Ë»ç ´ë»ó¿¡¼­ Á¦¿Ü float fDistance; WzVector vPlayerPos = g_pHero->GetPosition(); WzVector vTargetPos = pObj->GetPosition(); WzVector vOffset = vTargetPos - vPlayerPos; fDistance = VectorLength( &vOffset ); // °Å¸®¸¦ ¾ó¸¶·Î ÇÒ °ÍÀÎÁö È®½ÇÇÏ°Ô Á¤ÇÏÀÚ if( fDistance <= DISTANCE_SPACE_GET_ITEM ) { // ¸ÔÀ» ¼ö ÀÖ°Ô²û °¡±õ´Ù GET_ITEM Getitem; Getitem.dwObjectKey = pObj->GetObjectKey(); Getitem.fDistance = fDistance; bool is_can_get; if (pObj->GetItemType() == ITEM_RENDER_INFO::eFIELDITEM_MONEY) { is_can_get = GlobalFunc::CanGetHaim(pObj); } else { is_can_get = GlobalFunc::CanGetItem(pObj); } if (is_can_get) { vectorItem.push_back(Getitem); } else { vector_Item_another.push_back(Getitem); } } } } if( bAllPickup ) { //ÂùÁ¾ : ÀÌ ±â´ÉÀ» ¾²´ÂÁö´Â ¸ð¸£°ÚÁö¸¸ ¾µ¼öµµ ÀÖÀ¸´Ï ¸ðµÎÁݱâ¶ó¸é ¼ÒÀ¯±Ç °ü°è¾øÀÌ ¸ðµÎ Áݵµ·Ï ÇØµÒ vector_Item_pointer = &vectorItem; vector_Item_pointer->insert(vector_Item_pointer->end(),vector_Item_another.begin(),vector_Item_another.end()); GET_ITEM_vector_Itr itr = vector_Item_pointer->begin(); for( ; itr != vector_Item_pointer->end() ; ++itr) { DWORD dwItemKey = (*itr).dwObjectKey; pObj = (Item *) g_ObjectManager.GetObject(dwItemKey); if( pObj) { if( pObj->GetSendPickPacket() == FALSE) { // ¾ÆÀÌÅÛÀ» ¸Ô°Ú´Ù°í ¿äûÇÏ´Â ¾×¼Ç µî·Ï PLAYER_ACTION action; ZeroMemory( &action, sizeof(action) ); // ÇØ¾ßÇÒ ÇൿÀ» °áÁ¤ÇÑ´Ù! // ¸Ô¾î¾ßÁö action.ActionID = ACTION_GETITEM; action.GETITEM.dwItemKey = dwItemKey; m_QueueAction = action; if( ProcessQueueGetItem() ) { m_QueueAction.ActionID = ACTION_IDLE; // ´ÙÀ½µ¿ÀÛ ¼º°ø } } } } return TRUE; } else { // ¸®½ºÆ®¿¡ µî·ÏµÈ ¾ÆÀÌÅÛµéÀº ³»°¡ ¸ÔÀ» ¼ö ÀÖ´Â ¹Ý°æ ¾È¿¡ ÀÖ´Â °ÍµéÀÌ´Ù // ÀÌ Áß¿¡¼­ °¡Àå °¡±î¿î ³ðÀ» ¸Ô´Â´Ù. // ¸ÔÀ» ¶§, ¸Ô°Ú´Ù°í ¼­¹ö¿¡ ¿äûÇÑ ¾ÆÀÌÅÛÀÌ¸é ÆÐ½º~ // °¡±î¿î °Å¸®·Î Á¤·Ä //naklu//¿©¼­ ³»²¨¸ñ·ÏÀÌ Çϳª ÀÌ»ó ÀÖ´ÂÁö º¸°í vectoritem Æ÷ÀÎÅÍ¿¡ ³»²¨¸ñ·ÏÀ̳ª ³²²¨¸ñ·ÏÀ» ¼¼ÆÃ bool is_can_pick = false; if (vectorItem.size() >= 1) { vector_Item_pointer = &vectorItem; is_can_pick = true; } else { vector_Item_pointer = &vector_Item_another; } std::sort(vector_Item_pointer->begin(), vector_Item_pointer->end(), _SortItemByDistance); GET_ITEM_vector_Itr item_itr = vector_Item_pointer->begin(); GET_ITEM_vector_Itr item_itr_end = vector_Item_pointer->end(); if (is_can_pick == false) { if (vector_Item_pointer->size() >= 1) { DWORD item_key = (*item_itr).dwObjectKey; Item *temp_item = static_cast(g_ObjectManager.GetObject(item_key)); temp_item->InitState(STATE::ITEM_DROP_STATE, g_CurTime); } // 5690 : ÁÖº¯¿¡ ¼ÒÀ¯±ÇÀ» °¡Áø ¾ÆÀÌÅÛÀÌ ¾ø½À´Ï´Ù. TCHAR message[INTERFACE_STRING_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString(5690, message, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message ); return TRUE; } for ( ;item_itr != item_itr_end; ++item_itr) { GET_ITEM& item_ref = (*item_itr); pObj = static_cast(g_ObjectManager.GetObject(item_ref.dwObjectKey)); if ((pObj != NULL) && (pObj->GetSendPickPacket() == FALSE)) { // ¸Ô°Ú´Ù°í ¿äûÇÑ Àû ¾ø´Â ¾ÆÀÌÅÛÀ» Áݴ´Ù. ItemManager::Instance()->SendPickUpItemObject(pObj); pObj->SetSendPickPacket(TRUE); break; } } //GET_ITEM Min = { 0, 9999.0f }; //GET_ITEM_vector_Itr it, HeroIt; //bool bPass = false; //for( it = vectorItem.begin() ; it != vectorItem.end() ; ++it ) //{ // pObj = (Item *)g_ObjectManager.GetObject( (*it).dwObjectKey ); // if( pObj ) // { // if( pObj->GetSendPickPacket() == FALSE ) // { // // ¸Ô°Ú´Ù°í ¿äûÇÑ Àû ¾ø´Â ¾ÆÀÌÅÛÀÌ´Ù. °¡Àå °Å¸®°¡ °¡±î¿î ³ðÀ» °ñ¶ó³»ÀÚ // if( Min.fDistance > (*it).fDistance ) // { // Min.dwObjectKey = (*it).dwObjectKey; // Min.fDistance = (*it).fDistance; // } // } // } //} //// À̹ø¿¡ ¸Ô°Ú´Ù°í ¿äûÇÏ´Â ¾ÆÀÌÅÛ µî·Ï( Áߺ¹ ¿äûÀ» ÇÇÇϱâ À§ÇØ ) //pObj = (Item *)g_ObjectManager.GetObject( Min.dwObjectKey ); //if( pObj ) //{ // // ¾ÆÀÌÅÛÀ» ¸Ô°Ú´Ù°í ¿äûÇÏ´Â ¾×¼Ç µî·Ï // PLAYER_ACTION action; // ZeroMemory( &action, sizeof(action) ); // // ÇØ¾ßÇÒ ÇൿÀ» °áÁ¤ÇÑ´Ù! // // ¸Ô¾î¾ßÁö // action.ActionID = ACTION_GETITEM; // action.GETITEM.dwItemKey = Min.dwObjectKey; // m_QueueAction = action; // if( ProcessQueueGetItem() ) // { // m_QueueAction.ActionID = ACTION_IDLE; // ´ÙÀ½µ¿ÀÛ ¼º°ø // return TRUE; // } //} } return TRUE; } //------------------------------------------------------------------------------ /** */ void HeroActionInput::OnSearchTarget(SEARCH_TARGET_TYPE search_type) { BOOL bUpdateTargetList = FALSE; TCHAR szMessage[INTERFACE_STRING_LENGTH] = {'\0', }; // ºí¶óÀεå/È­ÀÌÆ® ºí¶óÀε忡¼­´Â »ç¿ëºÒ°¡ if( g_pHero->IsBlind() || g_pHero->IsBlind2() ) return; // Ÿ°ÙÆÃ ÄÁÆ®·Ñ °øÅë ±â´É ½ÇÇà( Ÿ°ÙÆÃ ¸®½ºÆ® °ü¸® ) // ÀÌ ÇÔ¼ö°¡ ½ÇÆÐÇϸé ۰˻ç ÇÒ ÇÊ¿ä ¾ø´Ù. ÇØ¼­µµ ¾ÈµÈ´Ù. if (UpdateTargetList(15.0f, m_bForwardTargeting ,TRUE) == TRUE) { bUpdateTargetList = TRUE; } else if (UpdateTargetList(20.0f, FALSE ,TRUE) == TRUE) { bUpdateTargetList = TRUE; } else if (UpdateTargetList(DISTANCE_TAB_TARGET_MONSTER, FALSE ,TRUE) == TRUE) { bUpdateTargetList = TRUE; } else { if (GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_VILLAGE) { // ÀÚµ¿ Ÿ°ÔÆÃ ¹üÀ§ ¾È¿¡ ¸ó½ºÅͰ¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. g_InterfaceManager.GetInterfaceString(eST_NOT_EXIST_TARGET, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } } if (bUpdateTargetList == TRUE) { // °¡Àå °¡±î¿î ³ð Ÿ°ÙÆÃ if (search_type == SEARCH_TARGET_NEAREST) { if (m_bFixTarget) { if (FALSE == SetNearestTarget()) { // ¿¡·¯( ±»ÀÌ ¿¡·¯ ó¸®ÇÒ °Ô ÀÖÀ»±î? ) } } else { if (FALSE == OnNextTarget()) { // ¿¡·¯( ±»ÀÌ ¿¡·¯ ó¸®ÇÒ °Ô ÀÖÀ»±î? ) } } } else if (search_type == SEARCH_TARGET_NEXT) { if (FALSE == OnNextTarget()) { // ¿¡·¯( ±»ÀÌ ¿¡·¯ ó¸®ÇÒ °Ô ÀÖÀ»±î? ) } } else if (search_type == SEARCH_TARGET_PREVIOUS) { if (FALSE == OnPrevTarget()) { // ¿¡·¯( ±»ÀÌ ¿¡·¯ ó¸®ÇÒ °Ô ÀÖÀ»±î? ) } } } } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::UpdateTargetList( float fLimitMonsterDistance, BOOL bCheckCameraAngle,BOOL bChekChaoState) { if(!g_pHero) return FALSE; TAB_TARGET_MONSTER_vector_Itr Check_it; g_pHero->m_vectorTargetMonster.clear(); Object *pObject; SCObject SCObj; Character *pChar; // Àüü ¿ÀºêÁ§Æ® Áß, ¸ó½ºÅ͸¸ »Ì¾Æ³»¼­ °Å¸® °è»ê ÈÄ Àӽà ¸®½ºÆ®¿¡ µî·Ï Object_Map_Itr itr = g_ObjectManager.GetBegin(); for( itr = g_ObjectManager.GetBegin() ; itr != g_ObjectManager.GetEnd() ; ++itr ) { pObject = static_cast(itr->second); if (NULL == pObject) { assert(!"Object Is NULL!!"); return FALSE; } if(!pObject->IsKindOfObject(CHARACTER_OBJECT) ) { continue; } // ÀûÀΰ¡? pChar = (Character *)pObject; RELATIONKIND::TYPE RelationType = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pChar, lsForceAttack() ); if( RELATIONKIND::Enemy == RelationType ) { // »ì¾Æ ÀÖ´Â ³ð¸¸ µî·Ï if( pChar->IsDead() == TRUE ) { continue; } #ifdef _YMS_AUTOBOT_GAME if (Autobot::Instance()->IsPossibleTarget(pChar->GetObjectKey()) == false) { continue; } #endif //_YMS_AUTOBOT_GAME if(pChar->IsObserverMode()) { continue; } // ÇÏÀÌµå ½ºÅ³»ç¿ëÁßÀ̶ó¸é Ÿ°ÙÆÃºÒ°¡ if(pChar->GetHideSkill()==HIDE_SKILL_INFO::ALL_HIDE) { continue; } // ¸ÕÀú Ÿ°ÙÆÃ ÇÒ ¼ö ÀÖ´Â °Å¸®ÀÎÁö °Ë»ç // ³Ê¹« ¸Ö¸é °Ë»ç ´ë»ó¿¡¼­ Á¦¿Ü float fMinAngle = pChar->GetAngle(); float fDistance; WzVector vPlayerPos = g_pHero->GetPosition(); WzVector vTargetPos = pChar->GetPosition(); WzVector vOffset = vTargetPos - vPlayerPos; fDistance = VectorLength( &vOffset ); if( fDistance <= fLimitMonsterDistance &&fabs(vOffset.z)<10.0f) { // Ÿ°ÙÆÃ ÇÒ ¼ö ÀÖ´Â °Å¸®ÀÌ´Ù // °Å¸® ¿ì¼± ¿É¼ÇÀ¸·Î µÇ¾î ÀÖÀ¸¸é Ä«¸Þ¶ó ¹æÇ⠾ȵûÁø´Ù if( bCheckCameraAngle ) { WzVector vOffset = g_pHero->GetPosition() - vTargetPos; WzVector vCamDirection = g_pHero->GetPosition() - g_Camera.GetCameraPosition(); float fDotResult = VectorDotProduct(&vCamDirection,&vOffset); if(fDotResult > 0) { continue; } } TAB_TARGET_MONSTER TAB_TargetMonster; TAB_TargetMonster.dwObjectKey = pChar->GetObjectKey(); TAB_TargetMonster.fAngle = fMinAngle; TAB_TargetMonster.fDistance = fDistance; TAB_TargetMonster.wTargetCount = 0; TAB_TargetMonster.wTargetCheck = 1; g_pHero->m_vectorTargetMonster.push_back( TAB_TargetMonster ); } } } if( g_pHero->m_vectorTargetMonster.empty() ) { return FALSE; } // °Å¸®°¡ °¡Àå °¡±î¿î ¼øÀ¸·Î Á¤·Ä sort( g_pHero->m_vectorTargetMonster.begin(), g_pHero->m_vectorTargetMonster.end() ); return TRUE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnTabPushTarget( void ) { if(!g_pHero) return FALSE; if( g_pHero->m_vectorTargetMonster.empty() == true ) { // ºñ¾ú´Ù. return TRUE; } g_pHero->m_CurTargetInfo.wTargetCount = 0; // ¸®½ºÆ®¿¡ µî·ÏµÈ ¸ó½ºÅ͵éÀº Ÿ°ÙÆÃÇÒ ¼ö ÀÖ´Â ¹Ý°æ ¾È¿¡ ÀÖ´Â °ÍµéÀÌ´Ù // ÀÌ Áß¿¡¼­ °¡Àå °¡±î¿î ³ðÀ» Ÿ°ÙÆÃÇÑ´Ù. TAB_TARGET_MONSTER Min = { 0, 99999.0f, 0, 0 }; TAB_TARGET_MONSTER_vector_Itr it; int iCount = 0; for( it = g_pHero->m_vectorTargetMonster.begin() ; it != g_pHero->m_vectorTargetMonster.end() ; ++it ) { // °Å¸®°¡ °¡Àå °¡±î¿î ³ðÀ» °ñ¶ó³»ÀÚ if( Min.fDistance > (*it).fDistance ) { Min.dwObjectKey = (*it).dwObjectKey; Min.fDistance = (*it).fDistance; g_pHero->m_CurTargetInfo.wTargetCount = iCount; } ++iCount; } // Ÿ°Ù ¼³Á¤ SetCurrentTarget( Min.dwObjectKey ); g_pHero->m_CurTargetInfo.dwObjectKey = Min.dwObjectKey; g_pHero->m_CurTargetInfo.fDistance = Min.fDistance; return TRUE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnNextTarget( void ) { if(!g_pHero) return FALSE; if( g_pHero->m_vectorTargetMonster.empty() == true ) { // ºñ¾ú´Ù. return TRUE; } // ¸®½ºÆ®¿¡ µî·ÏµÈ ¸ó½ºÅ͵éÀº Ÿ°ÙÆÃÇÒ ¼ö ÀÖ´Â ¹Ý°æ ¾È¿¡ ÀÖ´Â °ÍµéÀÌ´Ù // ÀÌ Áß¿¡¼­ ·ÎÅ×ÀÌ¼Ç ½ÃŲ´Ù.( ´ÙÀ½ Ÿ°Ù ) TAB_TARGET_MONSTER_vector_Itr it; int iCount = 0; BOOL bFind = FALSE; for( it = g_pHero->m_vectorTargetMonster.begin() ; it != g_pHero->m_vectorTargetMonster.end() ; ++it ) { // °Å¸®°¡ °¡Àå °¡±î¿î ³ðÀ» °ñ¶ó³»ÀÚ if( g_pHero->m_CurTargetInfo.dwObjectKey == (*it).dwObjectKey ) { ++it; if( it == g_pHero->m_vectorTargetMonster.end() ) { it = g_pHero->m_vectorTargetMonster.begin(); } g_pHero->m_CurTargetInfo.dwObjectKey = (*it).dwObjectKey; g_pHero->m_CurTargetInfo.fDistance = (*it).fDistance; g_pHero->m_CurTargetInfo.wTargetCheck = 0; g_pHero->m_CurTargetInfo.wTargetCount = iCount; bFind = TRUE; break; } ++iCount; } if( bFind == FALSE ) { it = g_pHero->m_vectorTargetMonster.begin(); g_pHero->m_CurTargetInfo.dwObjectKey = (*it).dwObjectKey; g_pHero->m_CurTargetInfo.fDistance = (*it).fDistance; g_pHero->m_CurTargetInfo.wTargetCheck = 0; g_pHero->m_CurTargetInfo.wTargetCount = -1; } // Ÿ°Ù ¼³Á¤ SetCurrentTarget( g_pHero->m_CurTargetInfo.dwObjectKey ); return TRUE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnPrevTarget( void ) { if(!g_pHero) return FALSE; if( g_pHero->m_vectorTargetMonster.empty() == true ) { // ºñ¾ú´Ù. return TRUE; } // ¸®½ºÆ®¿¡ µî·ÏµÈ ¸ó½ºÅ͵éÀº Ÿ°ÙÆÃÇÒ ¼ö ÀÖ´Â ¹Ý°æ ¾È¿¡ ÀÖ´Â °ÍµéÀÌ´Ù // ÀÌ Áß¿¡¼­ ·ÎÅ×ÀÌ¼Ç ½ÃŲ´Ù.( ´ÙÀ½ Ÿ°Ù ) TAB_TARGET_MONSTER_vector_Itr it; int iCount = 0; BOOL bFind = FALSE; for( it = g_pHero->m_vectorTargetMonster.begin() ; it != g_pHero->m_vectorTargetMonster.end() ; ++it ) { // °Å¸®°¡ °¡Àå °¡±î¿î ³ðÀ» °ñ¶ó³»ÀÚ if( g_pHero->m_CurTargetInfo.dwObjectKey == (*it).dwObjectKey ) { if( it != g_pHero->m_vectorTargetMonster.begin() ) { --it; } else { it = g_pHero->m_vectorTargetMonster.end(); --it; } g_pHero->m_CurTargetInfo.dwObjectKey = (*it).dwObjectKey; g_pHero->m_CurTargetInfo.fDistance = (*it).fDistance; g_pHero->m_CurTargetInfo.wTargetCheck = 0; g_pHero->m_CurTargetInfo.wTargetCount = iCount - 1; bFind = TRUE; break; } ++iCount; } if( bFind == FALSE ) { it = g_pHero->m_vectorTargetMonster.end(); --it; g_pHero->m_CurTargetInfo.dwObjectKey = (*it).dwObjectKey; g_pHero->m_CurTargetInfo.fDistance = (*it).fDistance; g_pHero->m_CurTargetInfo.wTargetCheck = 0; g_pHero->m_CurTargetInfo.wTargetCount = -1; } // Ÿ°Ù ¼³Á¤ SetCurrentTarget( g_pHero->m_CurTargetInfo.dwObjectKey ); return TRUE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnLClickedItem(Item* pObj) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; if(m_iMoveDelay>0) { return FALSE; } if(!pObj) return FALSE; if (pObj->IsOpened()) { return TRUE; } bool is_can_get; if (pObj->GetItemType() == ITEM_RENDER_INFO::eFIELDITEM_MONEY) { is_can_get = GlobalFunc::CanGetHaim(pObj); } else { is_can_get = GlobalFunc::CanGetItem(pObj); } if (is_can_get == false) { if (uiAreaConquestMan::CanPickACItem(pObj,true) == true) { // ¾ÆÀÌÅÛ¿¡ ´ëÇÑ ¼ÒÀ¯±ÇÀÌ ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NOT_OWNER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } pObj->InitState(STATE::ITEM_DROP_STATE, g_CurTime); return TRUE; } if(!g_pHero) return FALSE; float fDistance; PLAYER_ACTION action; WzVector vPlayerPos = g_pHero->GetPosition(); WzVector vOffset; WzVector vTargetPos; ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_IDLE; // ÇØ¾ßÇÒ ÇൿÀ» °áÁ¤ÇÑ´Ù! // ¸Ô¾î¾ßÁö action.ActionID = ACTION_GETITEM; action.GETITEM.dwItemKey = pObj->GetObjectKey(); // ÇØ¾ßÇÒÇൿÀÌ ¾øÀ¸¸é ‹š·ÁÄ£´Ù. if (action.ActionID == ACTION_IDLE) { return FALSE; } vTargetPos = pObj->GetPosition(); vOffset = vTargetPos - vPlayerPos; fDistance = VectorLength( &vOffset ); m_QueueAction = action; // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ if( fDistance > GetActionLength(m_QueueAction) ) { MoveToAction(vTargetPos, false); return TRUE; } return TRUE; } //------------------------------------------------------------------------------ /** Todo:À̵¿½Ã ½ºÅ³Å¥¸¦ Ç×»ó ºñ¿î´Ù. */ BOOL HeroActionInput::OnLClickedPosition(WzVector* pClickedPosition) { if( g_pHero == NULL ) { return FALSE; } if( CannotMoveState() ) { return FALSE; } // À̵¿Çϱ⠽ÃÀÛÇÑ ½Ã°£ ÀúÀå Object *pObj = g_ObjectManager.GetObject( GetCurrentTarget() ); if( pObj ) { g_pHero->SetStartMoveTime( g_CurTime ); } if(pClickedPosition) { WzVector OldPosition=g_pHero->GetTarGetPosition(); WzVector vTemp=*pClickedPosition-OldPosition; float fLen=VectorLength(&vTemp); //0.5ÃÊ ¾È¿¡ ºñ½ÁÇÑ ÁÂÇ¥°¡ ¿À¸é ¹«½Ã if(fLen<=1.0f&&g_CurTime-m_dwStartPickPosTime<=UPDATE_MOVE_POSITION_TIME) { return FALSE; } } #ifdef _NA_000000_20151125_MOUSECLICK_AREA_SELECT_CANCLE // ¸¶¿ì½º Ŭ¸¯À¸·Î ½ºÅ³ Å¥À× Ç®¸®Áö ¾ÊÀ½ #else if(!m_ShowTargetAreaPointer) g_SkillQueue.ClearAll(); #endif //_NA_000000_20151125_MOUSECLICK_AREA_SELECT_CANCLE if( IsIdleState() || g_pHero->GetCurState() == STATE::MOVE ) { // ¼ø°£À̵¿ ó¸® CTRL+MOUSE_L_BUTTON if (GENERALPARAM->GetSpecialMode()) { WzVector vPos=*pClickedPosition; vPos.z+=2.0f; int iTile = 0; iTile = g_pSunTerrain->x_pPathFinder->GetAllowTileToStand( vPos, NULL, -1.0f, 100.0f ); if(iTile >= 0) { if (GENERALPARAM->IsNet()) { if (g_Input.GetState(DIK_LCONTROL, KS_KEY)) { MSG_CG_MAP_TELEPORT_SYN SendPacket; SendPacket.m_byCategory = CG_MAP; SendPacket.m_byProtocol = CG_MAP_TELEPORT_SYN; SendPacket.vPos = *pClickedPosition; g_pHero->SendPacket( &SendPacket, sizeof(SendPacket) ); m_dwStartPickPosTime=g_CurTime; return TRUE; } } else { if (g_Input.GetState(DIK_LCONTROL, KS_KEY)) { m_dwStartPickPosTime=g_CurTime; g_pHero->SetPosition(*pClickedPosition); return TRUE; } } } } if(m_ShowTargetAreaPointer) { m_bPicking = TRUE; m_IsClickedTargetArea = TRUE; m_TargetAreaPosition = m_PickingPosition; #ifdef _20220411_AUTO_AIM if (m_bAutoAim) { m_TargetAreaPosition = *pClickedPosition; } #endif return TRUE; } if(m_iMoveDelay>0) { return FALSE; } // »óÅ ÀüÀÌ ½Ãµµ!! if(g_pHero->SetNextState( STATE::MOVE,g_CurTime ) ) { // ¼º°ø!! // °ø°Ý¸ñÇ¥´Â ÇØÁ¦ g_pHero->SetTargetID( 0 ); m_dwStartPickPosTime=g_CurTime; WzVector vRet; vRet = *pClickedPosition; FindNearesetPathTile(pClickedPosition,&vRet); // À̵¿½Ãµµ!! // ¼º°ø! if (g_pHero->Move(g_pHero->GetPosition(),vRet,CMS_RUN,FALSE) == TRUE) { // ¼­¹ö¿¡ ³»°¡ °è»êÇÑ À̵¿ ÆÐŶ º¸³½´Ù. MSG_CG_SYNC_MOVE_SYN SendPacket; ZeroMemory(&SendPacket,sizeof(SendPacket)); SendPacket.m_byCategory = CG_SYNC; SendPacket.m_byProtocol = CG_SYNC_MOVE_SYN; // MakePathPacketÀÌ ½ÇÆÐÇß´Ù¸é ¹Ù·Î ¸ØÃâ ¿¹Á¤ÀÌ´Ï Æ¯º°È÷ º¸³¾ÇÊ¿ä¾ø´Ù. if( g_pHero->MakePathPacket( &SendPacket ) == FALSE) { assert(!"¼­¹ö¿¡ º¸³¾ À̵¿·çÆ®¸¦ °è»êÇÒ¼ö ¾ø½À´Ï´Ù"); } SendPacket.Encode(); g_pHero->SendPacket( &SendPacket, SendPacket.GetPacketSize() ); g_InterfaceManager.SetMovePointer(TRUE,pClickedPosition); #ifdef _POSITION_DEBUG TCHAR temp[512]; Sprintf( temp, _T("¼­¹ö·Î move ÆÐŶ º¸³¿:%f,%f,%f"),SendPacket.wvCurPos.x, SendPacket.wvCurPos.y, SendPacket.wvCurPos.z); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, temp); #endif return TRUE; } else { if (g_pHero->GetCurState()==STATE::MOVE) { // STOP g_pHero->SendStopMovePacket(); } // ½ÇÆÐ½Ã g_pHero->SetNextState(STATE::IDLE,g_CurTime); return TRUE; } } } return FALSE; } BOOL HeroActionInput::OnLClickedPositionWithItem(WzVector* pClickedPosition) { if(m_iMoveDelay>0) { return FALSE; } // °¥¼öÀÖ´Â °÷À» Âï¾úÀ»¶§¸¸ À̵¿»óÅ·Π¹Ù²ãÁØ´Ù. // ´ë»ó Tile ¾ò±â WzVector wvTarget = *pClickedPosition; // ±æÃ£±â ŸÀÏÀÌ ¾øÀ»°æ¿ì ÀÔ·Â ¹«½Ã if (g_pSunTerrain->x_pPathFinder->GetTileToStand( wvTarget, NULL, -1.0f, 100.0f ) < 0) { return FALSE; } if (MouseHandler::Instance()->IsExistItemAtHand()) { if (MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx == SI_STYLE) { ItemManager::Instance()->SendQuickStyleRemoveMsg( MouseHandler::Instance()->GetMouseItem()->m_fromPos); return TRUE; } else if (MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx == SI_QUICK) { ItemManager::Instance()->SendQuickItemRemoveMsg( MouseHandler::Instance()->GetMouseItem()->m_fromPos); return TRUE; } else if (MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx == SI_TRADE) { uiTradeMan* tradeMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_TRADE)); if (tradeMan) { tradeMan->TEST_Get(MouseHandler::Instance()->GetMouseItem()->m_fromPos); } return TRUE; } else if (MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx == SI_INVENTORY) { if (MouseHandler::Instance()->GetMouseItem()->m_pRenderUnit) { if (MouseHandler::Instance()->GetMouseItem()->m_pRenderUnit->m_isDiv) { } else { ItemManager::Instance()->SendDropItemMsg( MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx, MouseHandler::Instance()->GetMouseItem()->m_fromPos ); } } else { ItemManager::Instance()->SendDropItemMsg( MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx, MouseHandler::Instance()->GetMouseItem()->m_fromPos ); } return TRUE; } else if (MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx == SI_EQUIPMENT) { BOOL bUnEquip = ItemManager::Instance()->CanMoveUnEquipItem( MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx, MouseHandler::Instance()->GetMouseItem()->m_fromPos, TRUE); if (!bUnEquip) { MouseHandler::Instance()->RollbackItemAtHand(); return FALSE; } // Ŭ¶óÀÌ¾ðÆ®¿¡¼­´Â ¾ÆÀÌÅÛ °Å·¡ ŸÀÔ¿¡ µû¸¥ üũ ¾ÈÇÔ ItemManager::Instance()->SendDropItemMsg( MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx, MouseHandler::Instance()->GetMouseItem()->m_fromPos ); return TRUE; } else if (MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx == SI_AUTOMATIC_INFO) { SLOTIDX slot_idx = MouseHandler::Instance()->GetMouseItem()->m_fromSlotIdx; POSTYPE from_pos = MouseHandler::Instance()->GetMouseItem()->m_fromPos; ItemManager::Instance()->GetContainer(slot_idx)->DeleteSlot(from_pos, NULL); MouseHandler::Instance()->RemoveItemAtHand(); return TRUE; } else { MouseHandler::Instance()->RollbackItemAtHand(); return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnRClickedCharacter(Character* pObj, RELATIONKIND::TYPE relationKind) { return FALSE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnRClickedPosition(WzVector* pClickedPosition) { return FALSE; } //------------------------------------------------------------------------------ /** */ void HeroActionInput::ProcessAutoAttack() { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; if(!g_pHero) return; if( g_pHero->IsDead() && m_bAutoAttack ) { // ÁÖÀΰøÀÌ Á×¾ú´Ù. SetAutoAttack(FALSE); SetCurrentTarget( 0 ); return; } switch (g_pHero->GetCurState()) { case STATE::SKILL: case STATE::DAMAGE: case STATE::KNOCKBACK2: case STATE::DOWN: case STATE::AIR: case STATE::DEATH: case STATE::SIT: case STATE::SPECIALMOVE: case STATE::KEYBOARDJUMP: case STATE::TRANSFORM: { return; } break; } if (m_bAutoAttack && m_ShowTargetAreaPointer == FALSE ) { PLAYER_ACTION action; ZeroMemory(&action,sizeof(action)); WzVector vTargetPos; DWORD dwTarget = GetCurrentTarget(); Character *pChr = (Character *)g_ObjectManager.GetObject(dwTarget); if (pChr) { RELATIONKIND::TYPE RelationType = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pChr, lsForceAttack() ); if( RelationType != RELATIONKIND::Enemy ) { SetAutoAttack(FALSE); return; } if (pChr->IsDead()) { SetAutoAttack(FALSE); return; } if (CannotAttack(pChr)) { SetAutoAttack(FALSE); return; } // Ç÷¹À̾ ¿òÁ÷ À϶§ 0.5Ãʸ¶´Ù Àû À§Ä¡ °»½Å if (GAMEOPTION->GetAutoMove()) { if( g_pHero->IsMoving() && g_pHero->GetCurState() == STATE::MOVE ) { if( (g_CurTime - g_pHero->GetStartMoveTime()) >= UPDATE_MOVE_POSITION_TIME ) { g_pHero->SetStartMoveTime( g_CurTime ); DWORD dwTarget = GetCurrentTarget(); Character *pChr = (Character *)g_ObjectManager.GetObject(dwTarget); if (pChr) { vTargetPos = pChr->GetPosition(); WzVector vDistance = vTargetPos - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if( fDistance > GetActionLength(m_QueueAction) + g_pHero->GetBodyRadius() ) { action.ActionID = ACTION_ATTACK; action.ATTACK.dwTargetID = GetCurrentTarget(); action.ATTACK.bForceAttack =lsForceAttack(); m_QueueAction = action; if (MoveToAction(vTargetPos, false) == FALSE) { // ±Ùó·Î¶óµµ À̵¿½Ãµµ! // ±Ùó·Î¶óµµ À̵¿½Ãµµ! WzVector vSrc=g_pHero->GetPosition(); MoveToAction(pChr->GetNearTargetPos(vSrc), false); } return; } } } } } if( m_QueueAction.ActionID != ACTION_IDLE ) // ´ÙÀ½µ¿ÀÛ ¼º°ø { return; } if( IsShootingMode() == FALSE ) { if( GetCurrentTarget() ) { action.ActionID = ACTION_ATTACK; action.ATTACK.dwTargetID = GetCurrentTarget(); action.ATTACK.bForceAttack =lsForceAttack(); m_QueueAction = action; // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ if (g_pHero->IsRangedNormalAttack()) { vTargetPos = pChr->GetPosition(); } else { vTargetPos = pChr->GetPosition(); } WzVector vDistance = vTargetPos - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if (GAMEOPTION->GetAutoMove()) { if( fDistance > GetActionLength(m_QueueAction) + pChr->GetBodyRadius() ) { if(g_pHero->GetCurState() == STATE::SPECIALMOVE||g_pHero->GetPreState() == STATE::SPECIALMOVE)//Ư¼ö À̵¿Áß¿¡ »ç°Å¸® ¹ù¾î³ª¸é ¿ÀÅä¾îÅà Ãë¼Ò { SetAutoAttack( FALSE ); } else { g_pHero->SetStartMoveTime( g_CurTime ); if (MoveToAction(vTargetPos, false) == FALSE) { // ±Ùó·Î¶óµµ À̵¿½Ãµµ! WzVector vSrc=g_pHero->GetPosition(); MoveToAction(pChr->GetNearTargetPos(vSrc), false); } } return; } } else { // °ø°Ý½Ã ÀÚµ¿À̵¿À» ²°À» °æ¿ì °Å¸®°¡ ¸Ö¸é °ø°Ý¸í·ÉÀ» Ãë¼Ò½ÃŲ´Ù. if( fDistance > GetActionLength(m_QueueAction) ) { SetAutoAttack( FALSE ); // Ÿ°ÙÀÌ »ç°Å¸®¿¡¼­ ¹þ¾î ³µ½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_SKILL_FAIL_NOT_ENOUGH_DISTANCE, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return; } } return; } } else { if (!pChr->CanBeAttackTarget()) { return; } // ÀâÈù³ð ¶ÇŬ¸¯ if ( this->GetCurrentTarget() == pChr->GetObjectKey()) { // µô·¹À̰¡ ³²¾ÒÀ¸¸é ¸ø½ð´Ù. ¿¬»ç·Â if (g_pHero->GetValkyrieShotDelay() > VALKYRIE_SHOT_DELAY_MARGIN) { return; } // °Å¸®°¡ ³Ñ ¸Ö¾îµµ ¸ø½ð´Ù. WzVector vDiff = pChr->GetPosition() - g_pHero->GetPosition(); float fDistance = VectorLength(&vDiff); if ( fDistance >= (g_pHero->GetAttackRange() + pChr->GetBodyRadius())) { if( g_pHero->IsMoving() == FALSE ) { // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ action.ActionID = ACTION_IDLE; action.ATTACK.dwTargetID = GetCurrentTarget(); m_QueueAction = action; if (GAMEOPTION->GetAutoMove()) { g_pHero->SetStartMoveTime( g_CurTime ); if (MoveToAction(pChr->GetPosition(), false) == FALSE) { // ±Ùó·Î¶óµµ À̵¿½Ãµµ! WzVector vSrc=g_pHero->GetPosition(); MoveToAction(pChr->GetNearTargetPos(vSrc), false); } } } else if( m_bKeyBoardMoveCheck == TRUE ) { return; } return; } if( g_pHero->IsMoving() ) { // STOP g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } ValkyrieShot(); return; } } } SetAutoAttack(FALSE); } } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnValkyrieLClickedCharacter(Character* pObj) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; if(!pObj) return FALSE; SetCurrentTarget(pObj->GetObjectKey()); if(!g_pHero) return FALSE; if (g_pHero->GetShow()) { GET_DIALOG(IM_TARGET_MANAGER::TARGET_DIALOG)->ShowWindow(TRUE); } float fDistance = 0.0f; PLAYER_ACTION action; WzVector vPlayerPos = g_pHero->GetPosition(); WzVector vOffset; WzVector vTargetPos; ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_IDLE;//¾×¼Ç »óÅ ÃʱâÈ­ RELATIONKIND::TYPE relationKind = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pObj, lsForceAttack() ); // °ø°Ý »óÅ ¼³Á¤ if (g_pHero->GetCurState() == STATE::SKILL) { return TRUE; } if (relationKind == RELATIONKIND::Enemy) { if (!pObj->CanBeAttackTarget()) { return FALSE; } if (CannotAttack(pObj)) { return FALSE; } // ÀâÈù³ð ¶ÇŬ¸¯ SetCurrentTarget(pObj->GetObjectKey()); if( IsIdleState() ) { g_pHero->SetDirection(pObj->GetPosition(), TRUE); } else if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); g_pHero->SetDirection( pObj->GetPosition(), TRUE); } // ºü¹æ! SetAutoAttack(TRUE); SetCurrentTarget( pObj->GetObjectKey() ); // µô·¹À̰¡ ³²¾ÒÀ¸¸é ¸ø½ð´Ù. ¿¬»ç·Â if (g_pHero->GetValkyrieShotDelay() > VALKYRIE_SHOT_DELAY_MARGIN) { return TRUE; } // °Å¸®°¡ ³Ñ ¸Ö¾îµµ ¸ø½ð´Ù. WzVector vPos = g_pHero->GetPosition(); WzVector vDest = pObj->GetPosition(); WzVector vDiff = vDest - vPos; float fLength = VectorLength(&vDiff); if (GAMEOPTION->GetAutoMove()) { if( fLength > GetAttackActionLength() + pObj->GetBodyRadius() ) { // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ action.ActionID = ACTION_IDLE; action.ATTACK.dwTargetID = GetCurrentTarget(); m_QueueAction = action; g_pHero->SetStartMoveTime( g_CurTime ); MoveToAction(vDest, false); return TRUE; } } else { // °ø°Ý½Ã ÀÚµ¿À̵¿À» ²°À» °æ¿ì °Å¸®°¡ ¸Ö¸é °ø°Ý¸í·ÉÀ» Ãë¼Ò½ÃŲ´Ù. if( fLength > GetAttackActionLength() + pObj->GetBodyRadius()) { SetAutoAttack( FALSE ); action.ActionID = ACTION_IDLE; action.ATTACK.dwTargetID = GetCurrentTarget(); m_QueueAction = action; // Ÿ°ÙÀÌ »ç°Å¸®¿¡¼­ ¹þ¾î ³µ½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_SKILL_FAIL_NOT_ENOUGH_DISTANCE, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return TRUE; } } if( g_pHero->IsMoving() ) { // STOP g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } ValkyrieShot(); return TRUE; } else if (relationKind == RELATIONKIND::Assistant) { vTargetPos = pObj->GetPosition(); ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_NPCMEET; action.NPCMEET.dwNPCKey = pObj->GetObjectKey(); WzVector vDistance = vTargetPos - g_pHero->GetPosition(); fDistance = VectorLength(&vDistance); SetAutoAttack(FALSE); } else if (relationKind == RELATIONKIND::Vendor) { vTargetPos = pObj->GetPosition(); ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_VENDORMEET; action.VENDORMEET.dwTargetID = pObj->GetObjectKey(); WzVector vDistance = vTargetPos - g_pHero->GetPosition(); fDistance = VectorLength(&vDistance); SetAutoAttack(FALSE); } else if (relationKind == RELATIONKIND::Friend) { vTargetPos = pObj->GetPosition(); ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_PLAYERMEET; action.PLAYERMEET.dwTargetID = pObj->GetObjectKey(); // ÀÚµ¿ °ø°Ý ²ô±â SetAutoAttack(FALSE); } // ÇØ¾ßÇÒÇൿÀÌ ¾øÀ¸¸é ‹š·ÁÄ£´Ù. if (action.ActionID == ACTION_IDLE) { return FALSE; } vOffset = vTargetPos - vPlayerPos; fDistance = VectorLength( &vOffset ); if( action.ActionID == ACTION_ATTACK ) { fDistance -= pObj->GetBodyRadius(); } m_QueueAction = action; // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ if( fDistance > GetActionLength(m_QueueAction) ) { g_pHero->SetStartMoveTime( g_CurTime ); if( MoveToAction(vTargetPos, false) == FALSE ) { // Ÿ°ÙÀÌ NPCÀϰæ¿ì¸¸ ´Ù½Ã Çѹø ´õ °è»ê if (relationKind == RELATIONKIND::Assistant) { // NPC¿Í ³ª »çÀÌÀÇ ¸¸³¯ ¼ö ÀÖ´Â ÃÖ´ë °Å¸®º¸´Ù ¾à°£ ´õ °£ À§Ä¡¸¦ ³Ñ°ÜÁ༭ ´Ù½Ã Çѹø ´õ °è»ê WzVector vDir = g_pHero->GetPosition() - vTargetPos; VectorNormalize( &vDir, &vDir ); // NPC¸¦ ¸¸³¯ ¼ö ÀÖ´Â °Å¸®( DISTANCE_NPC_MEET - 6¹ÌÅÍ )ÀÇ 70% // ÀÌ °ÍÀº NPC¸¦ ¸¸³¯ ¼ö ÀÖ´Â °Å¸®º¸´Ù 30% °Å¸®¸¸Å­ ´õ ´Ù°¡°£´Ù´Â ÀǹÌÀÌ´Ù. WzVector TargetPos = vTargetPos + ( vDir * (DISTANCE_NPC_MEET * DISTANCE_NPC_MEET_EXT) ); CPathExplorer *pPE = NULL; pPE = ( CPathExplorer* )Func_ContactTerrain( CT_NEW_PATH_EXPLORER, 0 ); if( pPE ) { g_pSunTerrain->PathExp_Reset( pPE, &TargetPos, -1); if( MoveToAction(TargetPos, false) == FALSE ) { if(pPE) { // ±æÃ£±â ±â´É ÆÄ±« Func_ContactTerrain( CT_DELETE_PATH_EXPLORER, pPE ); pPE = NULL; } return TRUE; } m_QueueAction.ActionID = ACTION_NPCMEET; if(pPE) { // ±æÃ£±â ±â´É ÆÄ±« Func_ContactTerrain( CT_DELETE_PATH_EXPLORER, pPE ); pPE = NULL; } } } } return TRUE; } return TRUE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::OnValkyrieLDragedCharacter(Character* pObj) { if(!pObj) return FALSE; if(!g_pHero) return FALSE; RELATIONKIND::TYPE relationKind = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pObj, lsForceAttack() ); // °ø°Ý »óÅ ¼³Á¤ if (relationKind == RELATIONKIND::Enemy) { if (!pObj->CanBeAttackTarget()) { return FALSE; } // ÀâÈù³ð ¶ÇŬ¸¯ if ( this->GetCurrentTarget() == pObj->GetObjectKey()) { // µô·¹À̰¡ ³²¾ÒÀ¸¸é ¸ø½ð´Ù. ¿¬»ç·Â if (g_pHero->GetValkyrieShotDelay() > VALKYRIE_SHOT_DELAY_MARGIN) { return TRUE; } // °Å¸®°¡ ³Ñ ¸Ö¾îµµ ¸ø½ð´Ù. WzVector vPos = g_pHero->GetPosition(); WzVector vDest = pObj->GetPosition(); WzVector vDiff = vDest - vPos; if (VectorLength(&vDiff) > GetAttackActionLength()) { return FALSE; } ValkyrieShot(); return TRUE; } else { SetCurrentTarget(pObj->GetObjectKey()); if (g_pHero->GetCurState() == STATE::IDLE) { g_pHero->SetDirection(pObj->GetPosition()); } else if (g_pHero->GetCurState() == STATE::MOVE) { g_pHero->StopMove(); g_pHero->SendStopMovePacket(); g_pHero->SetDirection(pObj->GetPosition()); } return TRUE; } } return FALSE; } BOOL HeroActionInput::ProcessQueueTransForm() { if(!g_pHero) return FALSE; PLAYER_ACTION action=m_TransFormActionQueue[0]; if(g_pHero->GetCurState()==STATE::TRANSFORM) { if(g_pHero->GetTransformData().GetTransFormType()==action.TRANSFORM.transFormType) { m_TransFormActionQueue.Erase(0); return TRUE; } } else if( g_pHero->GetCurState() == STATE::REVIVE ) { m_TransFormActionQueue.Erase(0); return TRUE; } else { g_pHero->DoAction(&action); } return FALSE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::ProcessQueueAction() { //Todo: ½ºÅ³ Å¥¸¦ °Ë»ç ¸Õ°¡ ³ëµå°¡ ÀÖ´Ù¸é ½ºÅ³ ÇÁ·Î¼¼½º¸¦ ¼öÇàÇÑ´Ù. BOOL bRet = FALSE; if(!g_pHero) return FALSE; if(g_pHero->IsDead()) { g_SkillQueue.ClearAll(); } if(m_TransFormActionQueue.Size()>0)//º¯½Å °ü·Ã Á¤º¸°¡ ÀÖ´Ù¸é ¸ÕÀú ¼öÇà { bRet = ProcessQueueTransForm(); } else if(g_SkillQueue.Size()>0) //±×´ÙÀ½ ½ºÅ³ { bRet = ProcessQueueSkill(); } else //ÀÏ¹Ý ÀûÀÎ °Íµé { switch(m_QueueAction.ActionID) { case ACTION_SPECIAL_MOVE: bRet = ProcessSpecialMove(); break; case ACTION_ATTACK: bRet = ProcessQueueAttack(); break; case ACTION_NPCMEET: bRet = ProcessQueueNPCMeet(); break; #ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE case ACTION_STATUE_PLAYER_MEET: bRet = ProcessQueueStatuePlayerMeet(); break; #endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_STATUE case ACTION_VENDORMEET: bRet = ProcessQueueVendorMeet(); break; case ACTION_PLAYERMEET: bRet = ProcessQueuePlayerMeet(); break; case ACTION_USE_OBJECT: bRet = ProcessQueueUseObject(); break; case ACTION_COLLECTION_OBJECT: bRet = ProcessQueueCollectObject(); break; case ACTION_GETITEM: bRet = ProcessQueueGetItem(); break; case ACTION_VALKYRIESHOT: bRet = ProcessQueueShot(); break; case ACTION_PLAYERFOLLOW: bRet = ProcessQueuePlayerFollow(); break; case ACTION_WAYPOINT_MEET: bRet = ProcessQueueWayPointMeet(); break; case ACTION_AIRSHIP_MEET: bRet = ProcessQueueAirShipMeet(); break; case ACTION_DOMINATION_OBJECT: bRet = ProcessQueueDominationObject(); break; } } if (bRet) { m_QueueAction.ActionID = ACTION_IDLE; // ´ÙÀ½µ¿ÀÛ ¼º°ø return TRUE; } else { //ÇöÀç »óŰ¡ ±âº»À̰í À̵¿À» ÇØ¾ß Çϰųª,ÇöÀç À̵¿ÁßÀ϶§ °¢ ActionµéÀÌ ÂüÀÌ µÇ±â¸¦ ±â´Ù¸² if ( ( IsIdleState() && g_pHero->GetNextState() == STATE::MOVE) || g_pHero->GetCurState() == STATE::MOVE ) { return FALSE; } //ÀÌ¹Ì °ø°ÝÀ» Çϰí ÀÖ°í ´ÙÀ½ µ¿ÀÛµµ °ø°ÝÀϰæ¿ì ProcessQueueAttack ÂüÀ» ±â´Ù¸² if (g_pHero->GetCurState() == STATE::ATTACK && m_QueueAction.ActionID == ACTION_ATTACK) { return FALSE; } // °ø°ÝÁß¿¡ ½ºÅ³À» ÄÞº¸·Î ³ÖÀ»¼öµµ ÀÖÀ½ if (g_pHero->GetCurState() == STATE::ATTACK && m_QueueAction.ActionID == ACTION_SKILL) { return FALSE; } // °ø°ÝÁß¿¡ ½ºÅ³À» ÄÞº¸·Î ³ÖÀ»¼öµµ ÀÖÀ½ if (g_pHero->GetCurState() == STATE::ATTACK && m_QueueAction.ActionID == ACTION_SPECIAL_MOVE) { return FALSE; } // ¹ß۸® ¼¦ Áß¿¡ ½ºÅ³À» ÄÞº¸·Î ³ÖÀ»¼öÀÖÀ½ if (g_pHero->GetValkyrieShotDelay() > 30 && m_QueueAction.ActionID == ACTION_SKILL) { return FALSE; } // ¹ß۸® ¼¦ Áß¿¡ Ư¼öÀ̵¿ÀÌ¸é ±â´Ù¸°´Ù. if (g_pHero->GetValkyrieShotDelay() > 30 && m_QueueAction.ActionID == ACTION_SPECIAL_MOVE) { return FALSE; } // ±×¿Ü¿¡´Â ´ÙÀ½ µ¿ÀÛÀ» ¹«È¿È­ m_QueueAction.ActionID = ACTION_IDLE; return FALSE; } } //------------------------------------------------------------------------------ /** */ void HeroActionInput::SetComboDelay(int combodelay) { m_iComboDelay = combodelay; } //------------------------------------------------------------------------------ /** */ int HeroActionInput::GetComboDelay() { return m_iComboDelay; } //------------------------------------------------------------------------------ /** */ DWORD HeroActionInput::GetCurrentTarget() { return m_dwSelectedTarget; } //------------------------------------------------------------------------------ /** ¸ñÇ¥ À§Ä¡·Î À̵¿ÇÑ´Ù. */ BOOL HeroActionInput::MoveToPosition( const WzVector& DestPosition, bool move_nearest ) { if( IsIdleState() || g_pHero->GetCurState() == STATE::MOVE ) { STATE::TYPE eOldNextState = g_pHero->GetNextState(); if( g_pHero->SetNextState( STATE::MOVE, g_CurTime ) ) { if( CannotMoveState() == FALSE ) { if( g_pHero->Move( g_pHero->GetPosition(), DestPosition, CMS_RUN, FALSE, -1, -1 ) ) { return TRUE; } else if( move_nearest == true ) { // °¥¼ö Àִµ¥ ±îÁö¸¸ °¡ÀÚ int tile_number; WzVector position = DestPosition; if( GameFunc::FindMoveableNearestTile( g_pHero->GetPosition(), position, tile_number ) ) { if( g_pHero->Move( g_pHero->GetPosition(), position, CMS_RUN, FALSE, -1, tile_number ) ) { return TRUE; } } } } // À̵¿ Ãë¼Ò, ¿ø·¡ÀÇ »óÅ·ΠµÇµ¹¸°´Ù. Űº¸µå À̵¿ÁßÀ̾úÀ¸¸é °è¼Ó Űº¸µåÀ̵¿À» ½ÃÄÑÁØ´Ù. if (eOldNextState != STATE::KEYBOARDMOVE) { g_pHero->SetNextState( STATE::IDLE,g_CurTime ); } else { g_pHero->SetNextState( eOldNextState,g_CurTime ); } } } return FALSE; } //------------------------------------------------------------------------------ /** QueueÀÇ ¾×¼ÇÀ» À§ÇØ À̵¿ÇÑ´Ù. */ BOOL HeroActionInput::MoveToAction(WzVector vDest, bool move_nearest) { // ÀÚµ¿À̵¿±â´ÉÀÌ ²¨Á®ÀÖÀ¸¸é if (!GAMEOPTION->GetAutoMove()) { // °ø°ÝÇൿÀ» À§Çؼ­´Â À̵¿ÇÏÁö ¾Ê´Â´Ù! if (m_QueueAction.ActionID == ACTION_ATTACK) { return FALSE; } } if(!g_pHero) { return FALSE; } if( MoveToPosition( vDest, move_nearest ) ) { if (m_QueueAction.ActionID == ACTION_ATTACK && !g_pHero->IsRangedNormalAttack()) { MSG_CG_SYNC_TARGET_MOVE_SYN SendPacket; ZeroMemory(&SendPacket,sizeof(SendPacket)); SendPacket.m_byCategory = CG_SYNC; SendPacket.m_byProtocol = CG_SYNC_TARGET_MOVE_SYN; SendPacket.m_dwTargetKey = m_QueueAction.ATTACK.dwTargetID; if( g_pHero->MakeTargetPathPacket( &SendPacket ) == FALSE) { assert(!"¼­¹ö¿¡ º¸³¾ À̵¿·çÆ®¸¦ °è»êÇÒ¼ö ¾ø½À´Ï´Ù"); } else { g_pHero->SendPacket( &SendPacket, SendPacket.GetPacketSize() ); } } else { // ¼­¹ö¿¡ ³»°¡ °è»êÇÑ À̵¿ ÆÐŶ º¸³½´Ù. MSG_CG_SYNC_MOVE_SYN SendPacket; ZeroMemory(&SendPacket,sizeof(SendPacket)); SendPacket.m_byCategory = CG_SYNC; SendPacket.m_byProtocol = CG_SYNC_MOVE_SYN; // MakePathPacketÀÌ ½ÇÆÐÇß´Ù¸é ¹Ù·Î ¸ØÃâ ¿¹Á¤ÀÌ´Ï Æ¯º°È÷ º¸³¾ÇÊ¿ä¾ø´Ù. if( g_pHero->MakePathPacket( &SendPacket ) == FALSE) { assert(!"¼­¹ö¿¡ º¸³¾ À̵¿·çÆ®¸¦ °è»êÇÒ¼ö ¾ø½À´Ï´Ù"); } else { SendPacket.Encode(); g_pHero->SendPacket( &SendPacket, SendPacket.GetPacketSize() ); } #ifdef _POSITION_DEBUG TCHAR temp[512]; Sprintf( temp, _T("¼­¹ö·Î move ÆÐŶ º¸³¿:%f,%f,%f"),SendPacket.wvCurPos.x, SendPacket.wvCurPos.y, SendPacket.wvCurPos.z); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, temp); #endif } return TRUE; } else { m_QueueAction.ActionID = ACTION_IDLE; } return FALSE; } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::IsShootingMode() { if (g_pHero && (g_pHero->GetWeaponKind() == eITEMTYPE_ONEHANDCROSSBOW)) { //return TRUE; } return FALSE; } //------------------------------------------------------------------------------ /** */ void HeroActionInput::SetCurrentTarget(DWORD dwID,BOOL bCheck) { m_dwSelectedTarget = dwID; Object* pObj = g_ObjectManager.GetObject( m_dwSelectedTarget ); if(pObj && pObj->IsKindOfObject(CHARACTER_OBJECT)) { Character *pChar = (Character *)pObj; if( pChar ) { m_TargetType = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pChar, lsForceAttack() ); } else { m_TargetType = RELATIONKIND::None; } } else { m_TargetType = RELATIONKIND::None; } if( g_pHero ) { g_pHero->m_CurTargetInfo.dwObjectKey = dwID; if( IsShootingMode() ) { g_pHero->LockOn( m_dwSelectedTarget ); } } } //------------------------------------------------------------------------------ /** */ BOOL HeroActionInput::ProcessQueueShot() { Character * pEnemy = (Character *)g_ObjectManager.GetObject(m_QueueAction.VALKYRIESHOT.dwTargetID); if (pEnemy) { if (!pEnemy->CanBeAttackTarget()) { return FALSE; } if(!g_pHero) return FALSE; WzVector wzVec1 = pEnemy->GetPosition() - g_pHero->GetPosition(); float fLength = VectorLength(&wzVec1); if (fLength <= g_pHero->GetAttackRange()) { if (g_pHero->CanDoQueueAction(&m_QueueAction)) { g_pHero->StopMove(); g_pHero->SetComboCount(m_iComboCount); g_pHero->SetTargetID(pEnemy->GetObjectKey()); g_pHero->SetNextState(STATE::ATTACK,g_CurTime); m_iComboCount++; DWORD dwCurStyle = g_pHero->GetCurrentAttackStyle(); // ±âº»°ø°ÝÀº ¹«Á¶°Ç 2Ÿ if (dwCurStyle == 9999) { if (m_iComboCount >= 2) { m_iComboCount = 0; } } // ½ºÅ¸ÀÏÀÌ ÀÖÀ»¶© 3¿¬Å¸~ else { if (m_iComboCount >= 3) { m_iComboCount = 0; } } return TRUE; } } } else { return FALSE; } return FALSE; } void HeroActionInput::SetCanDoNextAttack(BOOL bFlag) { m_bCanDoNextAttack = bFlag; } BOOL HeroActionInput::CanDoNextAttack() { return m_bCanDoNextAttack; } PLAYER_ACTION HeroActionInput::GetQueueAction() { return m_QueueAction; } BOOL HeroActionInput::UseSpecialMoveSkill( DWORD SkillCode, const WzVector& TargetPosition ) { if(!g_pHero) return FALSE; if( CannotMoveState() == TRUE ) { return FALSE; } if( g_pHero->CanUseSkill( (SLOTCODE)SkillCode, TRUE ) == FALSE ) { return FALSE; } if( BASE_SKILLINFO* pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)SkillCode) ) { float len = GetSkillRange(pInfo); WzVector vDistance = TargetPosition - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if( fDistance > len) { return FALSE; } PLAYER_ACTION skillaction; ZeroMemory(&skillaction,sizeof(skillaction)); skillaction.ActionID = ACTION_SKILL; skillaction.SKILL.dwSkillID = (SLOTCODE)SkillCode; skillaction.SKILL.dwTargetID = this->GetCurrentTarget(); skillaction.SKILL.vTargePos = TargetPosition; m_QueueAction = skillaction; if (g_pHero->CanDoQueueAction(&m_QueueAction)) { // ¼¦µô·¹ÀÌÁß¿¡´Â ¸ø¾¸ if (IsShootingMode()) { if (g_pHero->GetValkyrieShotDelay() > 30) { return FALSE; } } g_pHero->DoAction(&m_QueueAction); } return TRUE; } return FALSE; } BOOL HeroActionInput::UseAreaSkill() //xiaomi ʹÓÃ…^ÓòÐÔ¼¼ÄÜÌŽÀí { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; if( g_pHero == NULL ) return FALSE; if( m_IsClickedTargetArea == FALSE ) return TRUE; //if(!m_bPicking) //ÇÇÅ· ÇÒ¶§±îÁö ±â´Ù¸°´Ù // return TRUE; BASE_SKILLINFO* pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)m_TargetAreaSkillID); if( pInfo == NULL ) { return FALSE; } // ½ºÅ³À» »ç¿ëÇÒ ±âº»ÀûÀÎ Á¶°ÇÀÌ ¾ÈµÇ¸é »ç¿ëÀ» Ãë¼ÒÇÑ´Ù if (!g_pHero->CanUseSkill(m_TargetAreaSkillID,TRUE)) { return FALSE; } // ƯÁ¤ ½ºÅ³Àº À̵¿ÀÌ ºÒ°¡´ÉÇϰųª À̵¿ÀÌ ºÒ°¡´É ÇÑ À§Ä¡·Î´Â »ç¿ëÇÏÁö ¸øÇÑ´Ù if( eSKILL_TELEPORT == pInfo->m_SkillClassCode || eSKILL_TELEPORT2 == pInfo->m_SkillClassCode || eSKILL_CREATE_CRYSTAL_WARP == pInfo->m_SkillClassCode || eSKILL_MYSTIC_915 == pInfo->m_SkillClassCode || // ¸¶¿¤½ºÆ®·Ò eSKILL_MYSTIC_921 == pInfo->m_SkillClassCode // ¹Ì½ºÆ½ºí¸µÅ© #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE || eSKILL_WITCHBLADE_1124 == pInfo->m_SkillClassCode // ƼŸ´Ï¾Æ || eSKILL_WITCHBLADE_1127 == pInfo->m_SkillClassCode // ¹ê½¬ || eSKILL_WITCHBLADE_1130 == pInfo->m_SkillClassCode // ¾¾¿¤¸®½º #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE ) { if( CannotMoveState() == TRUE ) { return FALSE; } if( GameFunc::IsMove(g_pHero->GetPosition(), m_TargetAreaPosition ) == FALSE ) { m_IsClickedTargetArea = FALSE; // 70266 : ÁöÁ¤ ÇÒ¼ö ¾ø´Â Áö¿ª ÀÔ´Ï´Ù. g_InterfaceManager.GetInterfaceString( 70266, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); return TRUE; } } else { // ´ë»ó Tile ¾ò±â int iTileFocussing = g_pSunTerrain->x_pPathFinder->GetTileToStand( m_TargetAreaPosition, NULL, -1.0f, 10.0f ); if( iTileFocussing < 0 ) { // ÁöÁ¤ ÇÒ¼ö ¾ø´Â Áö¿ª ÀÔ´Ï´Ù. const int c_iInvalidArea = 70266; g_InterfaceManager.GetInterfaceString( c_iInvalidArea, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); m_IsClickedTargetArea = FALSE; return TRUE; } } // ½ºÅ³ °Å¸®¸¦ °Ë»ç float len = GetSkillRange(pInfo); WzVector vDistance = m_TargetAreaPosition - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); if( fDistance > len) { static BOOL s_flag = TRUE; if (GAMEOPTION->GetAutoMove() == TRUE && s_flag == TRUE ) { if( m_iMoveToActionTime<=0) { if( MoveToAction(m_TargetAreaPosition, false)) { m_iMoveToActionTime=1000; return TRUE; } else { // »çÁ¤ °Å¸®¸¦ ¹þ¾î ³µ½À´Ï´Ù. const int c_iInvalidDistance = 70267; g_InterfaceManager.GetInterfaceString( c_iInvalidDistance, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.ShowMessageBox( szMessage, 2000, NULL, 0 ); return TRUE; //WzVector vSrc=g_pHero->GetPosition(); //MoveToAction(pTarget->GetNearTargetPos(vSrc),-1,false); } } } else { // »çÁ¤ °Å¸®¸¦ ¹þ¾î ³µ½À´Ï´Ù. const int c_iInvalidDistance = 70267; g_InterfaceManager.GetInterfaceString( c_iInvalidDistance, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.ShowMessageBox( szMessage, 2000, NULL, 0 ); return TRUE; } return TRUE; } else { // »çÁ¤°Å¸® ³»¿¡ µé¾î¿Â °æ¿ì PLAYER_ACTION skillaction; ZeroMemory(&skillaction,sizeof(skillaction)); skillaction.ActionID = ACTION_SKILL; skillaction.SKILL.dwSkillID = m_TargetAreaSkillID; skillaction.SKILL.dwTargetID = this->GetCurrentTarget(); skillaction.SKILL.vTargePos = m_TargetAreaPosition; skillaction.SKILL.bForceAttack=lsForceAttack(); m_QueueAction = skillaction; } return TRUE; } BOOL HeroActionInput::UseSkill(DWORD skillid,BOOL bForceAttack) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)skillid); assert(pInfo); if (!pInfo) { return FALSE; } if (g_pHero) { if (g_pHero->IsLockInput()) { return FALSE; } if( g_pHero->IsPolymorph() ) { return FALSE; } } // ¿ÀÅä ·±À¸·Î ´Þ¸®°í ÀÖÀ¸¸é ½ºÅ³ÀÌ ¸ÔÅëµÇ´Ï IDLE »óÅ·Π¹Ù²ãÁÖÀÚ if( m_bAutoRun == TRUE ) { if( g_pHero ) { SetAutoRun(FALSE); SetFollowState( FALSE ); g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } } if(!g_pHero) return FALSE; switch(pInfo->m_byTarget) { case SKILL_TARGET_REACHABLE_ENEMY: case SKILL_TARGET_REACHABLE_FRIEND: case SKILL_TARGET_REACHABLE_ME: { if( CannotMoveState() == TRUE ) { return FALSE; } } break; } // ÅÚ·¹Æ÷Æ®µµ À̵¿ºÒ°¡¸é ¸ø¾¸ if (pInfo->m_SkillClassCode == eSKILL_TELEPORT||pInfo->m_SkillClassCode == eSKILL_TELEPORT2) { if( CannotMoveState() == TRUE ) { return FALSE; } } DWORD dwTargetID = GetCurrentTarget(); // Ÿ°Ù ÁöÁ¤´ë»óÀÌ ¾Æ±ºÀÏ‹š ÇöÀç ¸ñÇ¥°¡ ¾øÀ¸¸é ÀÚµ¿À¸·Î Àڽſ¡°Ô Ÿ°Ù if (pInfo->m_byTarget == SKILL_TARGET_FRIEND) { if (dwTargetID == 0) { dwTargetID = g_pHero->GetObjectKey(); } } else if(pInfo->m_byTarget == SKILL_TARGET_SUMMON && pInfo->m_byTarget == SKILL_TARGET_AREA_ENEMY_CORPSE) { dwTargetID =0; } Character *pTarget = NULL; pTarget = (Character *)g_ObjectManager.GetObject(dwTargetID); #ifdef _NA_0_20120612_SKILL_DARK_BREAK_IGNORE_PLAYER_TARGET // Ç÷¹À̾îÀÎ °æ¿ì¿¡´Â ´ÙÅ©ºê·¹ÀÌÅ©ÀÇ Å¸°ÙÀÌ µÇÁö ¾Ê´Â´Ù if( pTarget != NULL && skillid == eSKILL_DARK_BREAK ) { if( pTarget->IsKindOfObject(PLAYER_OBJECT) ) { TCHAR szFailMessage[512] = {0,}; ZeroMemory(&szFailMessage,sizeof(szFailMessage)); g_InterfaceManager.GetInterfaceString(eST_SKILL_FAIL_NO_TARGET,szFailMessage,MAX_PATH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szFailMessage); PlayNoTargetSound(); return FALSE; } } #endif // _NA_0_20120612_SKILL_DARK_BREAK_IGNORE_PLAYER_TARGET if (CannotAttack(pTarget)) { return FALSE; } // ½ºÅ³À» »ç¿ëÇÒ ±âº»ÀûÀÎ Á¶°ÇÀÌ ¾ÈµÇ¸é ¸®ÅÏ if (!g_pHero->CanUseSkill((SLOTCODE)skillid,TRUE)) { return FALSE; } // µå·¡°ï Eye·ùÀÇ Nonstop ½ºÅ³°°Àº°æ¿ì ½ÇÁúÀûÀ¸·Î ActionÀ» ÃëÇÏÁö ¾Ê´Â´Ù ÆÐŶ¸¸ ¹Ù·ÎÀü¼Û! if (pInfo->IsNonStopSkill()) { MSG_CG_SKILL_ACTION_SYN Packet; Packet.m_byCategory = CG_SKILL; Packet.m_byProtocol = CG_SKILL_ACTION_SYN; Packet.m_SkillCode = (SLOTCODE)skillid; Packet.m_wvCurPos = g_pHero->GetPosition(); Packet.m_wvDestPos = g_pHero->GetPosition(); Packet.m_dwClientSerial = g_pHero->GetCurrentAttackSerial(); Packet.m_byAttackPropensity = bForceAttack; DWORD dwAtt=g_pHero->GetCurrentTileAtt(FALSE); //ÇÇÄÉÀ̰¡ °¡´É ÇÏÁö ¾ÊÀ¸¸é ²÷´Ù if((GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->IsEnablePkScene()==FALSE)||!g_isPkServer) { Packet.m_byAttackPropensity=ATTACK_PROPENSITY_NORMAL; } // Ÿ°Ù ¾øÀ½ if (pInfo->m_byAttRangeform == SKILL_TARGET_NONE) { Packet.m_dwMainTargetKey = g_pHero->GetObjectKey(); Packet.m_wvMainTargetPos = g_pHero->GetPosition(); } else { if (pInfo->m_byTarget == SKILL_TARGET_ME) { Packet.m_dwMainTargetKey = g_pHero->GetObjectKey(); Packet.m_wvMainTargetPos = g_pHero->GetPosition(); } else if( pInfo->m_byTarget ==SKILL_TARGET_AREA)//Áö¿ª ÁöÁ¤ ½ºÅ³Àº ÇÇÅ· ÁÂÇ¥ ³Ö¾îÁØ´Ù. { assert("Target ÁöÁ¤½ºÅ³À» Nonstop½ºÅ³ÀÌ µÉ¼ö ¾ø½À´Ï´Ù!"); } else { if (pTarget) { Packet.m_dwMainTargetKey = pTarget->GetObjectKey(); Packet.m_wvMainTargetPos = pTarget->GetPosition(); } else { return FALSE; } if (pInfo->m_byAttRangeform == 5) { // ±×³É °üÅëÇü½ºÅ³ÀÏ °æ¿ì ¸ñÇ¥ ÁÂÇ¥¸¦ ³Ö¾îÁØ´Ù. WzVector vDir = g_pHero->GetDirection(); WzVector vDest = g_pHero->GetPosition() + vDir * GetSkillRange(pInfo); Packet.m_wvMainTargetPos = vDest; } } } Packet.Encode(); g_pHero->SendPacket(&Packet,sizeof(MSG_CG_SKILL_ACTION_SYN)); return FALSE; } TCHAR szFailMessage[512] = {0,}; ZeroMemory(&szFailMessage,sizeof(szFailMessage)); PLAYER_ACTION skillaction; ZeroMemory(&skillaction,sizeof(skillaction)); skillaction.ActionID = ACTION_SKILL; skillaction.SKILL.dwSkillID = (SLOTCODE)skillid; skillaction.SKILL.dwTargetID = dwTargetID; skillaction.SKILL.bForceAttack=bForceAttack; // ÀÚ½ÅÀÌ Å¸°ÙÀÎ ½ºÅ³ÀÌ¸é ¹Ù·Î »ç¿ë °¡´ÉÇÏ´Ù! if (pInfo->m_byTarget == SKILL_TARGET_ME|| pInfo->m_byTarget == SKILL_TARGET_SUMMON|| pInfo->m_byTarget == SKILL_TARGET_AREA_ENEMY_CORPSE) { m_QueueAction = skillaction; return TRUE; } else { if (!pTarget) { g_InterfaceManager.GetInterfaceString(eST_SKILL_FAIL_NO_TARGET,szFailMessage,MAX_PATH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szFailMessage); PlayNoTargetSound(); return FALSE; } // ¸ñÇ¥°¡ Àû´çÇÏÁö ¾ÊÀ¸¸é ¸®ÅÏ int iResult = 0; //¿Ö½ÇÆÐÇß´ÂÁö ±¸Ã¼ÀûÀ¸·Î ¾ò±âÀ§ÇѺ¯¼ö if (!CanBeSkillTarget(skillid,pTarget,bForceAttack,iResult)) { //°á°úÁ¤ÀǾȵÇÀÖÀ¸¸é default·ÎÂïÀÚ int iStringCode = ((iResult == 0) ? (eST_SKILL_FAIL_NOT_PROPER_TARGET):(iResult)); g_InterfaceManager.GetInterfaceString(iStringCode,szFailMessage,MAX_PATH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szFailMessage); return FALSE; } m_QueueAction = skillaction; WzVector vDest = pTarget->GetPosition(); WzVector vDistance = vDest - g_pHero->GetPosition(); float fDistance = VectorLength(&vDistance); // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ if( fDistance > GetActionLength(m_QueueAction) ) { if (GAMEOPTION->GetAutoMove()) { if(m_iMoveToActionTime<=0) { if(MoveToAction(vDest, false)) { m_iMoveToActionTime=1000; } else { WzVector vSrc=g_pHero->GetPosition(); MoveToAction(pTarget->GetNearTargetPos(vSrc), false); } } } else { // °Å¸®°¡ ³Ê¹« ¸Ù´Ï´Ù. g_InterfaceManager.GetInterfaceString(eST_TOO_FAR,szMessage,INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); PlayTargetTooFarSound(); return FALSE; } } return TRUE; } return FALSE; } BOOL HeroActionInput::CanBeSkillTarget(DWORD dwSkillID,Character *pTarget,BOOL bForceAttack,int &iResult) { if (!pTarget) { return FALSE; } BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillID); assert(pInfo); if (!pInfo) { return FALSE; } switch(pInfo->m_byTarget) { case SKILL_TARGET_ENEMY_PLAYER: // Àû Ç÷¹À̾ °ø°Ý °¡´É { // ÀϹÝÀûÀÎ ½ºÅ³¿¡ ¸ñÇ¥°¡ µÉ¼öÀÖ´ÂÁö È®ÀÎÇÑ´Ù. if (!pTarget->CanBeAttackTarget()) { return FALSE; } if( pTarget->IsKindOfObject(PLAYER_OBJECT) ) { RELATIONKIND::TYPE type = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pTarget, bForceAttack ); if (type == RELATIONKIND::Enemy) { return TRUE; } else { return FALSE; } } else { return FALSE; } } case SKILL_TARGET_ENEMY : case SKILL_TARGET_REACHABLE_ENEMY : case SKILL_TARGET_ENEMY_AND_ME: { // ÀϹÝÀûÀÎ ½ºÅ³¿¡ ¸ñÇ¥°¡ µÉ¼öÀÖ´ÂÁö È®ÀÎÇÑ´Ù. if (!pTarget->CanBeAttackTarget()) { return FALSE; } // ÀûÀÏ °æ¿ì¿¡¸¸ ¼º¸³ RELATIONKIND::TYPE type = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pTarget, bForceAttack ); if (type == RELATIONKIND::Enemy) { return TRUE; } else { return FALSE; } } break; case SKILL_TARGET_FRIEND : case SKILL_TARGET_REACHABLE_FRIEND : { // ÀϹÝÀûÀÎ ½ºÅ³¿¡ ¸ñÇ¥°¡ µÉ¼öÀÖ´ÂÁö È®ÀÎÇÑ´Ù. if (!pTarget->CanBeAttackTarget()) { return FALSE; } // ¾Æ±ºÀÏ °æ¿ì¿¡¸¸ ¼º¸³ RELATIONKIND::TYPE type = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pTarget, bForceAttack ); if (type == RELATIONKIND::Friend) { if(pTarget->IsKindOfObject(MONSTER_OBJECT)) { Monster* pMon = (Monster*)pTarget; if( MONSTER_TYPE_SETTING_MAPOBJECT == pMon->GetMonsterType() ) return FALSE; else return TRUE; } else { return TRUE; } } else { return FALSE; } } break; case SKILL_TARGET_FRIEND_CORPSE : { // ½Ãü°¡ ¾Æ´Ï¸é ½ÇÆÐ if (!pTarget->IsDead()) { return FALSE; } #ifdef _NA_006826_20130722_DOMINATION_RENEWAL // ÆÄƼ¿øÀÌ ¾Æ´Ï¸é ½ÇÆÐ uiPartyMan* partyMan = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY); if (partyMan->IsPartyMember(pTarget->GetObjectKey()) == FALSE ) { return FALSE; } // ¾Æ±ºÇ÷¹À̾ ¾Æ´Ï¸é ½ÇÆÐ RELATIONKIND::TYPE type = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pTarget, bForceAttack ); if (type != RELATIONKIND::Friend) { return FALSE; } #else // ÆÄƼ¿øÀÌ ¾Æ´Ï¸é ½ÇÆÐ uiPartyMan* partyMan = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY); if (partyMan->IsPartyMember(pTarget->GetObjectKey()) == FALSE ) { return FALSE; } #endif //_NA_006826_20130722_DOMINATION_RENEWAL return TRUE; } break; case SKILL_TARGET_ME : case SKILL_TARGET_REACHABLE_ME: case SKILL_TARGET_AREA : { assert(!"CanBeSkillTarget() ÀڽŠ¶Ç´Â Áö¿ªÀ» ¸ñÇ¥·Î Àâ´Â ½ºÅ³Àº ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϸé¾ÈµÊ!"); return FALSE; } break; case SKILL_TARGET_ENEMY_CORPSE: { // Àû±º½Ãü°¡ ¾Æ´Ï¸é ½ÇÆÐ if (!pTarget->IsDead()) { return FALSE; } RELATIONKIND::TYPE type = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pTarget, bForceAttack ); if(type == RELATIONKIND::Enemy) { //¼Ò¿ïÄÁÆ®·Ñ¿¡ÇÑ¿¡¼­¸¸ ó¸® //ÃßÈÄ´Ù¸¥½ºÅ³µµ SKILL_TARGET_ENEMY_CORPSEÀÇÇØ ¾²Àδٸé À̰÷¿¡¼­ ó¸®Çϼ¼¿ä return CheckSoulControl(pTarget,dwSkillID ,iResult); } else { return FALSE; } } default: { assert(!"CanBeSkillTarget() 󸮵ÇÁö ¾ÊÀº ¸ñÇ¥ÁöÁ¤ ¹æ½Ä"); return FALSE; } break; } return FALSE; } //------------------------------------------------------------------------------ /** ¼Ò¿ïÄÁÆ®·Ñ Á¶°Çüũ(Ŭ¶ó¿¡¼­ ¹Ì¸®Ã¼Å©Çؼ­ º¸³»ÀÚ) iResult°ª¿¡ ½ÇÆÐ¿¡´ëÇÑ ½ºÆ®¸µÄڵ带 »ðÀÔÇØÁØ´Ù. */ BOOL HeroActionInput::CheckSoulControl(Character* pTarget,DWORD dwSkillID,int &iResult) { if(!pTarget->IsKindOfObject(MONSTER_OBJECT)) { return FALSE; } Monster *pMon = static_cast(pTarget); BYTE byGrade = pMon->GetMonsterInfo()->m_byGrade; //º¸½º³ª, ·°Å°, ĸƾÀº ¼ÒȯÀÌ ºÒ°¡´É ÇÏ´Ù. #ifdef _NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL if (byGrade == 9 || byGrade == 7 || byGrade == 8) #else if( byGrade == 5 || byGrade == 9 || byGrade == 7 || byGrade == 4 || byGrade == 8) #endif //_NA_007113_20140324_SHADOW_SKILL_BALLANCE_RENEWAL { //5631:ÇØ´ç¸ó½ºÅÍ´Â ¼ÒȯÇÒ¼ö¾ø½À´Ï´Ù. iResult = 5631; return FALSE; } SkillScriptInfo* skill_info = (SkillScriptInfo*)SkillInfoParser::Instance()->GetSkillInfo((WORD)dwSkillID); if (!skill_info) { return FALSE; } BASE_ABILITYINFO* skill_ablity = skill_info->GetAbilityInfo( eABILITY_SUMMON_DEAD_MONSTER ); if ((skill_ablity) && (g_pHero->GetSummonSize() >= skill_ablity->m_iParam[0])) { //5632:´õÀÌ»ó ¼ÒȯÇÒ¼ö¾ø½À´Ï´Ù. iResult = 5632; return FALSE; } return TRUE; } //------------------------------------------------------------------------------ /** INPUT ASSIST TARGET * ¿ì¼± °ø°Ý ´ë»ó ÁöÁ¤ (Primary Targetting) - Shift + Á Ŭ¸¯ : ´ë»ó ÁöÁ¤ + ÆÄƼÀåÀº »ó´ë¸¦ ÇâÇØ À̵¿ÇÏ¿© °ø°Ý - Shift + ¿ì Ŭ¸¯ : ´ë»ó ÁöÁ¤ + ÆÄƼÀåÀº »ó´ë ŸÄÏÆÃ * ÇÁ¸® Ÿ°ÙÆÃ - ¾î½Ã½ºÆ® ¹öư (¶Ç´Â ctrl + tab)À» Ŭ¸¯ÇÏ¸é ÆÄÆ¼ÀåÀÌ ÁöÁ¤ÇÑ »ó´ë ¶Ç´Â ´Ù¸¥ ÆÄƼ¿øÀÌ °ø°Ý (Ÿ°ÙÆÃ) ÁßÀÌ ´ë»óÀ» ÀÚµ¿À¸·Î Ÿ°ÙÆÃÇÑ´Ù. * ÆÄƼÀå ÁöÁ¤ »ó´ë ŸÄÏÆÃ ('°¡' ¿Í ¿¬µ¿) (Tanker assist) - ¾î½Ã½ºÆ® ¹öư (shift + tab)À» Ŭ¸¯ÇÏ¸é ÆÄÆ¼ÀåÀÌ '¿ì¼± °ø°Ý ´ë»ó ÁöÁ¤ - ÆÄƼÀå Àü¿ë' ±â´ÉÀ» »ç¿ëÇÏ¿© ÁöÁ¤ÇÑ ÀûÀ» Ÿ°ÙÆÃÇÑ´Ù. - ÆÄƼÀåÀÌ ÁöÁ¤ÇÑ ÀûÀÌ ¾øÀ» °æ¿ì¿¡´Â ±â´ÉÀÌ µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. = Ÿ°ÙÀÌ µÇ°Å³ª º¯µ¿ÇÏÁö ¾Ê´Â´Ù. */ #define INP_AT_PRIMARY_TARGETTING_TYPE_A (g_Input.GetState(DIK_LSHIFT, KS_DOWN) && g_Input.GetState(MOUSE_LBUTTON, KS_MOUSE_DOWN)) #define INP_AT_PRIMARY_TARGETTING_TYPE_B (g_Input.GetState(DIK_LSHIFT, KS_DOWN) && g_Input.GetState(MOUSE_RBUTTON, KS_MOUSE_DOWN)) #define INP_AT_FREE_TARGETTING (g_Input.GetState(DIK_LCONTROL, KS_DOWN) && g_Input.GetState(DIK_TAB, KS_DOWN) ) #define INP_AT_TANKER_ASSIST (g_Input.GetState(DIK_LSHIFT, KS_DOWN) && g_Input.GetState(DIK_TAB, KS_DOWN) ) void HeroActionInput::ProcessAssistTarget() { } //------------------------------------------------------------------------------ /** ±âº»ÀûÀÎ ¿É¼Ç۵é */ void HeroActionInput::ProcessBaseOptionKey() { //´ÜÃàŰ Á¤º¸Ã¢(HŰ) if (g_Input.IsPressAnyExtKey() == FALSE && g_Input.GetState(DIK_H, KS_DOWN)) { #ifdef MAP_EDIT_MODE // no operation #else #endif } // ½Ì±Û¸ðµå½Ã ¸ó½ºÅÍ À̵¿ ¹× ½ºÅ³ º¸±â ±â´É if ((GENERALPARAM->IsNet()==FALSE) && GENERALPARAM->GetSpecialMode()) { if( g_Input.IsPressAnyExtKey() == FALSE && g_Input.GetState(DIK_P, KS_DOWN )) { static BOOL bHelpToggle = FALSE; bHelpToggle ^= TRUE; uiHelpMan* helpMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_HELP)); if(helpMan) helpMan->ShowHelpMonsterInfo(bHelpToggle); } } } //------------------------------------------------------------------------------ /** ¿É¼ÇŰ ó¸® */ void HeroActionInput::ProcessOptionKey() { if(!g_pHero)return; TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; //#ifdef _DH_BATTLEZONE2_ //#else //#ifndef _JAPAN // if (g_Input.GetState(DIK_F11, KS_DOWN) && g_Input.IsPressAnyExtKey() == FALSE) // { // m_bIgnorePlayer ^= TRUE; // } //#endif //#endif//_DH_BATTLEZONE2_ if( g_Input.GetState( DIK_RALT, KS_UP ) ) { if ( GAMEOPTION->GetNotifyDropItem() ) { g_InterfaceManager.SetDiplayDropItem( TRUE ); } else { g_InterfaceManager.SetShowItemName(!g_InterfaceManager.ShowItemName()); } } ProcessBaseOptionKey(); } void HeroActionInput::ToggleChangeSlotSize() { uiQuickContainerMan* pContainerMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_QUICKCONTAINER)); assert(pContainerMan); pContainerMan->ToggleChangeSlotSize(); } void HeroActionInput::PressQuickSlotKey() { uiQuickContainerMan* pContainerMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_QUICKCONTAINER)); assert(pContainerMan); if (pContainerMan) { pContainerMan->ToggleSlot(); } } float HeroActionInput::GetAttackActionLength() { // ¹Ì²ø¾îÁ® µé¾î°¡´Â °Å¸® const float SWIPE_RANGE = 0.2f; // ±Ù°Å¸®¹«±â¶û ¿ø°Å¸® ¹«±â¸¦ ±¸ºÐÇÑ´Ù!!! // ±Ù°Å¸® if (!g_pHero->IsRangedNormalAttack()) { return g_pHero->GetAttackRange() + SWIPE_RANGE; } else { return g_pHero->GetAttackRange(); } } void HeroActionInput::ProcessComboDelay(DWORD dwTick) { if (m_iComboDelay > 0) { if(g_pHero) { if (g_pHero->GetCurState() != STATE::ATTACK) { m_iComboDelay -= dwTick; } if (m_iComboDelay <= 0) { m_iComboDelay = 0; m_iComboCount = 0; g_pHero->SetComboCount(0); } } } if (m_iKeyboardQueueAttackDelay > 0) { m_iKeyboardQueueAttackDelay -= dwTick; if (m_iKeyboardQueueAttackDelay <= 0) { m_iKeyboardQueueAttackDelay = 0; m_bKeyboardQueueAttack = FALSE; } } } void HeroActionInput::ProcessTargeting() { // Ÿ°ÙÀÌ Á¸ÀçÇÏÁö ¾Ê°Å³ª Á×¾úÀ¸¸é Ç®¸°´Ù. if ( GetCurrentTarget()) { Character *pTarget = (Character *)g_ObjectManager.GetObject( this->GetCurrentTarget()); if (!pTarget) { uiPartyMan* partyMan = GET_DIALOG_MANAGER( uiPartyMan, UIMAN_PARTY ); assert(partyMan); if(partyMan->IsPartyMember(this->GetCurrentTarget())==FALSE) SetCurrentTarget(0); } else { if (g_pHero->IsBlind()) { SetCurrentTarget(0); } if (pTarget->IsKindOfObject(MONSTER_OBJECT)) { Monster* pMonster = (Monster*)pTarget; if (pTarget->GetCurState() == STATE::DEATH) { bool can_target_death_monster = false; if( g_pHero->GetClass() == eCHAR_SHADOW ) { if( SkillData* pSkillData = xGetSkillData()->GetSkillDataBySkillClassCode( eSKILL_SOUL_CONTROL ) ) { if( pSkillData->IsActive() == true ) { can_target_death_monster = true; } } } if( can_target_death_monster == false ) { SetCurrentTarget(0); } ////¼¨µµ¿ì´Â ½Ãüµµ ŸÄÏÆÃÇÒ¼öÀÖ´Ù //if (g_pHero->GetClass() != eCHAR_SHADOW) //{ // SetCurrentTarget(0); //} if (eNPC_DOMINATION_MAPOBJECT_NPC == pMonster->GetMonsterInfo()->m_byGrade) { SetCurrentTarget(0); } } if (pMonster->GetMonsterInfo() && (pMonster->GetMonsterInfo()->m_byGrade == 10)) { SetCurrentTarget(0); } #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE if (pMonster->IsWitchBladeSummon() == TRUE) { SetCurrentTarget(0); } #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE } else if (pTarget->IsKindOfObject(PLAYER_OBJECT)) { //ÇÏÀ̵åµÈ°ÍÀº Ÿ°ÙÇÒ¼ö¾ø´Ù. if (pTarget->GetHideSkill() == HIDE_SKILL_INFO::ALL_HIDE) SetCurrentTarget(0); } } } if (GetCurrentTarget()) { Object * pObj = g_ObjectManager.GetObject( GetCurrentTarget() ); BOOL bShow = FALSE; if(pObj) { if( pObj->IsKindOfObject( PLAYER_OBJECT ) || pObj->IsKindOfObject( MONSTER_OBJECT ) ) { bShow = TRUE; } } else { uiPartyMan* partyMan = GET_DIALOG_MANAGER( uiPartyMan, UIMAN_PARTY ); assert(partyMan); //ÆÄƼ¿øÀº ¿ÀºêÁ§Æ®¿¡ ¾ø¾îµµ ¸â¹öâÀ» ÅëÇØ ŸÄÏÆÃÇÒ¼öÀÖ´Ù if(partyMan->IsPartyMember(this->GetCurrentTarget())) { bShow = TRUE; } } if (GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_SSQ) { bShow = FALSE; } //ŸÄÏÆÃâ ¿­¾îÁÖ±â if (bShow) { TargetDialog* pTargetDlg = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); if (pTargetDlg) { if (pTargetDlg->GetTargetKey() != GetCurrentTarget()) { pTargetDlg->SetTargetKey(this->GetCurrentTarget()); //´«»ç¶÷¸ÊÀ̺¥Æ®¿¡¼­´Â Ÿ°Ùâ¿­¼ö¾øÀ½! if (g_pMap->IsSnowManEventMap()) { bShow = FALSE; } pTargetDlg->ShowWindow(bShow); } } } } else { TargetDialog* pTargetDlg = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); if (pTargetDlg) { SetAutoAttack(FALSE); pTargetDlg->SetTargetKey(0); if (pTargetDlg->IsVisibleWindow()) { pTargetDlg->ShowWindow(FALSE); } } } } //---------------------------------------------------------------------------- /** */ void HeroActionInput::ProcessCursor() { if ( IsAttackSkillArea()) { CursorChangeTransact::Instance()->ChangeTranaction( MouseCursor::eMouseCursor_Magic_Scope ); return; } if ( !g_Input.GetInterfaceInputMouseFlag() ) { if( Object* pPickedObject = GetPickedObject() ) { BOOL bRet = GameFunc::UpdateCursorByPickedObject( pPickedObject ); if ( bRet ) { return; } else { CursorChangeTransact::Instance()->ChangeTranaction( MouseCursor::eMouseCursor_Cursor_Cancle ); } } else { if ( CanMoveToPickedPos() == FALSE ) { CursorChangeTransact::Instance()->ChangeTranaction( MouseCursor::eMouseCursor_DO_NOT_GO_TILE ); } else { CursorChangeTransact::Instance()->ChangeTranaction( MouseCursor::eMouseCursor_Cursor_Cancle ); } } } } void HeroActionInput::SetEnableInput(BOOL bFlag) { this->m_bEnableInput = bFlag; } BOOL HeroActionInput::IsEnableInput() { return this->m_bEnableInput; } void HeroActionInput::ValkyrieShot() { if (g_pHero) { if(g_pHero->GetCurState()!=STATE::SPECIALMOVE && g_pHero->GetNextState()!=STATE::SPECIALMOVE && g_SkillQueue.Size()==0) { if (g_pHero->GetBulletCount() > 0) { g_pHero->DecreaseBulletCount(); MSG_CG_BATTLE_VKR_ATTACK_SYN packet; packet.dwTargetKey = this->GetCurrentTarget(); packet.dwClientSerial = g_pHero->GetNextAttackSerial(); g_pHero->SendPacket(&packet,sizeof(packet)); g_pHero->AddNextAttackSerial(); g_pHero->ValkyrieShot(packet.dwClientSerial); } // ¸®·ÎµåÇÏ»ï else { ValkyrieReload(); } } } } void HeroActionInput::ValkyrieReload() { if (!IsShootingMode()) { return; } if(!g_pHero) return; BOOL PlayAnimation = TRUE; switch(g_pHero->GetCurState()) { case STATE::SIT: case STATE::EMOTICON: PlayAnimation = FALSE; break; case STATE::MOVE: case STATE::IDLE: case STATE::KEYBOARDMOVE: PlayAnimation = TRUE; break; default: return; break; } if (g_pHero->GetValkyrieShotDelay() > (VALKYRIE_SHOT_DELAY_MARGIN - 5)) { return; } MSG_CG_BATTLE_VKR_RELOAD_SYN packet; g_pHero->SendPacket(&packet,sizeof(packet)); g_pHero->ValkyrieReload( PlayAnimation ); g_pHero->SetBulletCount(20); } BOOL HeroActionInput::IsAutoAttackMode( void ) { return m_bAutoAttack; } DWORD HeroActionInput::FindNearestTarget() { DWORD dwTarget = 0; DWORD dwPickingOption = PICKING_IGNORE_CORPSE; //#ifdef _DH_BATTLEZONE2_ // m_bIgnorePlayer = (CGameOption::Instance()->GetPickingFriend() == FALSE); //#endif //_DH_BATTLEZONE2_ BOOL IgnorePlayer = (CGameOption::Instance()->GetPickingFriend() == FALSE); if (IgnorePlayer) { dwPickingOption |= PICKING_IGNORE_FRIEND; } WzRay ray; ray.m_wvOrigin = g_pHero->GetVisiblePos(); ray.m_wvOrigin.z += 1; ray.m_wvDirection = g_pHero->GetDirection(); if (g_pMap) { Character *pChr = g_pMap->GetPickedCharacter(&ray,dwPickingOption); if (pChr) { dwTarget = pChr->GetObjectKey(); } } return dwTarget; } BOOL HeroActionInput::AttackNearestTarget() { if(!g_pHero) return FALSE; if( g_pHero->IsDead() && m_bAutoAttack ) { return FALSE; } Object *pTarget =g_ObjectManager.GetObject(FindNearestTarget()); if (CannotAttack(pTarget)) { return FALSE; } switch(g_pHero->GetCurState()) { case STATE::IDLE: case STATE::SIT: case STATE::EMOTICON: case STATE::MOVE: case STATE::KEYBOARDMOVE: break; case STATE::ATTACK: { m_bKeyboardQueueAttack = TRUE; m_iKeyboardQueueAttackDelay = 100; return FALSE; } break; default: return FALSE; break; } if ( m_ShowTargetAreaPointer == FALSE ) { PLAYER_ACTION action; ZeroMemory(&action,sizeof(action)); DWORD dwTarget = FindNearestTarget(); if( dwTarget ) { action.ActionID = ACTION_ATTACK; action.ATTACK.dwTargetID = dwTarget; action.ATTACK.bForceAttack =lsForceAttack(); m_QueueAction = action; m_bKeyboardQueueAttack = FALSE; Character *pTarget = (Character *)g_ObjectManager.GetObject(dwTarget); if(pTarget) { WzVector vTarget = pTarget->GetPosition(); WzVector vOffset = g_pHero->GetPosition() - vTarget; float fDistance = VectorLength( &vOffset ); // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ if( fDistance > GetActionLength(m_QueueAction) ) { MoveToAction(vTarget, false); } return TRUE; } } } return FALSE; } void HeroActionInput::ProcessObserverModeKey(DWORD dwTick) { using namespace nsSSQ; using namespace nsSSQ::Observer; if (g_bObserverMode == FALSE) { return; } static DWORD Tick = 0; static BOOL bCheck = FALSE; BOOL bPress = FALSE; Tick += dwTick; if (bCheck && (Tick >= 3000)) { Tick = 0; bCheck = FALSE; } if(bCheck == TRUE) { return; } if (g_Input.GetState(DIK_E, KS_UP)) { g_ObserverKey = Info::eKeyCmd_E; bPress = TRUE; } else if (g_Input.GetState(DIK_Q, KS_UP)) { g_ObserverKey = Info::eKeyCmd_Q; bPress = TRUE; } else if (g_Input.GetState(DIK_W, KS_UP)) { g_ObserverKey = Info::eKeyCmd_W; bPress = TRUE; } if (bPress) { StartLeaveFieldCastTimer(eDoType_ObserverMode_ChangePos, 3000); bCheck = TRUE; Tick = 0; } } void HeroActionInput::ProcessKeyboardAttack() { if (GENERALPARAM->GetSpecialMode() == eSPECIAL_MODE_STEP3) { if( IsShootingMode() == FALSE ) { if( m_bKeyboardQueueAttack ) { if (AttackNearestTarget()) { return; } } if (g_Input.GetState(DIK_SPACE, KS_DOWN )) { if (AttackNearestTarget()) { return; } } } } } void HeroActionInput::PlayLimitUseSound() { if( GAMEOPTION->GetSystemVoice() == FALSE ) { return; } // ÇØ´çÀ½¼ºÀÇ µô·¹À̰¡ °è¼ÓµÇ°íÀÖÀ¸¸é Ç÷¹ÀÌÇÏÁö¾ÊÀ½ if (m_dwUIVoice == UI_VOICE_LIMIT_USE) { return; } m_dwUIVoice = UI_VOICE_LIMIT_USE; m_iUIVoiceDelay = UI_VOICE_DELAY; DWORD dwClass = 0; if (g_pHero != NULL) { #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT dwClass = HeroVoiceInfoParser::GetVoiceInfoKeyCode(g_pHero->GetClass(), g_pHero->GetGender()); #else dwClass = g_pHero->GetClass(); #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT } BASE_HeroVoiceInfo *pInfo = HeroVoiceInfoParser::Instance()->GetHeroVoiceInfo(dwClass); if (pInfo) { g_SoundEffect.PlayUI(pInfo->m_LimitUse.dwVoiceID); } } void HeroActionInput::PlayNoTargetSound() { if( GAMEOPTION->GetSystemVoice() == FALSE ) { return; } if (m_dwUIVoice == UI_VOICE_NO_TARGET) { return; } m_dwUIVoice = UI_VOICE_NO_TARGET; m_iUIVoiceDelay = UI_VOICE_DELAY; DWORD dwClass = 0; if (g_pHero) { #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT dwClass = HeroVoiceInfoParser::GetVoiceInfoKeyCode(g_pHero->GetClass(), g_pHero->GetGender()); #else dwClass = g_pHero->GetClass(); #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT } BASE_HeroVoiceInfo *pInfo = HeroVoiceInfoParser::Instance()->GetHeroVoiceInfo(dwClass); if (pInfo) { if (rand() & 1) { g_SoundEffect.PlayUI(pInfo->m_NoTarget1.dwVoiceID); } else { g_SoundEffect.PlayUI(pInfo->m_NoTarget1.dwVoiceID); } } } void HeroActionInput::PlayTargetTooFarSound() { if( GAMEOPTION->GetSystemVoice() == FALSE ) { return; } if (m_dwUIVoice == UI_VOICE_TARGET_TOO_FAR) { return; } m_dwUIVoice = UI_VOICE_TARGET_TOO_FAR; m_iUIVoiceDelay = UI_VOICE_DELAY; DWORD dwClass = 0; if (g_pHero) { #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT dwClass = HeroVoiceInfoParser::GetVoiceInfoKeyCode(g_pHero->GetClass(), g_pHero->GetGender()); #else dwClass = g_pHero->GetClass(); #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT } BASE_HeroVoiceInfo *pInfo = HeroVoiceInfoParser::Instance()->GetHeroVoiceInfo(dwClass); if (pInfo) { g_SoundEffect.PlayUI(pInfo->m_FarTarget1.dwVoiceID); } } void HeroActionInput::PlayNotEnoughMoneySound() { if( GAMEOPTION->GetSystemVoice() == FALSE ) { return; } if (m_dwUIVoice == UI_VOICE_NOT_ENOUGH_MONEY) { return; } m_dwUIVoice = UI_VOICE_NOT_ENOUGH_MONEY; m_iUIVoiceDelay = UI_VOICE_DELAY; DWORD dwClass = 0; if (g_pHero) { #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT dwClass = HeroVoiceInfoParser::GetVoiceInfoKeyCode(g_pHero->GetClass(), g_pHero->GetGender()); #else dwClass = g_pHero->GetClass(); #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT } BASE_HeroVoiceInfo *pInfo = HeroVoiceInfoParser::Instance()->GetHeroVoiceInfo(dwClass); if (pInfo) { g_SoundEffect.PlayUI(pInfo->m_LackMon.dwVoiceID); } } void HeroActionInput::PlayNotEnoughManaSound() { if( GAMEOPTION->GetSystemVoice() == FALSE ) { return; } if (m_dwUIVoice == UI_VOICE_NOT_ENOUGH_MANA) { return; } m_dwUIVoice = UI_VOICE_NOT_ENOUGH_MANA; m_iUIVoiceDelay = UI_VOICE_DELAY; DWORD dwClass = 0; if (g_pHero) { #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT dwClass = HeroVoiceInfoParser::GetVoiceInfoKeyCode(g_pHero->GetClass(), g_pHero->GetGender()); #else dwClass = g_pHero->GetClass(); #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT } BASE_HeroVoiceInfo *pInfo = HeroVoiceInfoParser::Instance()->GetHeroVoiceInfo(dwClass); if (pInfo) { switch (dwClass) { case eCHAR_BERSERKER: case eCHAR_DRAGON: g_SoundEffect.PlayUI(pInfo->m_LackSP.dwVoiceID); break; default: g_SoundEffect.PlayUI(pInfo->m_LackMP.dwVoiceID); break; } } } #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE void HeroActionInput::PlayNotEnoughFPSound() { if( GAMEOPTION->GetSystemVoice() == FALSE ) { return; } if (m_dwUIVoice == UI_VOICE_NOT_ENOUGH_FP ) { return; } m_dwUIVoice = UI_VOICE_NOT_ENOUGH_FP; m_iUIVoiceDelay = UI_VOICE_DELAY; DWORD dwClass = 0; if (g_pHero) { dwClass = HeroVoiceInfoParser::GetVoiceInfoKeyCode(g_pHero->GetClass(), g_pHero->GetGender()); } BASE_HeroVoiceInfo *pInfo = HeroVoiceInfoParser::Instance()->GetHeroVoiceInfo(dwClass); if (pInfo) { g_SoundEffect.PlayUI(pInfo->lack_fp_.dwVoiceID); } } #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE void HeroActionInput::PlayNotEnoughPointSound() { if( GAMEOPTION->GetSystemVoice() == FALSE ) { return; } if (m_dwUIVoice == UI_VOICE_NOT_ENOUGH_POINT ) { return; } m_dwUIVoice = UI_VOICE_NOT_ENOUGH_POINT; m_iUIVoiceDelay = UI_VOICE_DELAY; DWORD dwClass = 0; if (g_pHero) { #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT dwClass = HeroVoiceInfoParser::GetVoiceInfoKeyCode(g_pHero->GetClass(), g_pHero->GetGender()); #else dwClass = g_pHero->GetClass(); #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT } BASE_HeroVoiceInfo *pInfo = HeroVoiceInfoParser::Instance()->GetHeroVoiceInfo(dwClass); if (pInfo) { g_SoundEffect.PlayUI(pInfo->m_LackPoint.dwVoiceID); } } void HeroActionInput::PlayNoRepairableSound() { if( GAMEOPTION->GetSystemVoice() == FALSE ) { return; } if (m_dwUIVoice == UI_VOICE_NO_REPAIRABLE) { return; } m_dwUIVoice = UI_VOICE_NO_REPAIRABLE; m_iUIVoiceDelay = UI_VOICE_DELAY; DWORD dwClass = 0; if (g_pHero) { #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT dwClass = HeroVoiceInfoParser::GetVoiceInfoKeyCode(g_pHero->GetClass(), g_pHero->GetGender()); #else dwClass = g_pHero->GetClass(); #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT } BASE_HeroVoiceInfo *pInfo = HeroVoiceInfoParser::Instance()->GetHeroVoiceInfo(dwClass); if (pInfo) { g_SoundEffect.PlayUI(pInfo->m_NOREPItem.dwVoiceID); } } void HeroActionInput::ProcessVoiceDelay(DWORD dwTick) { if (m_iUIVoiceDelay > 0) { m_iUIVoiceDelay -= dwTick; if (m_iUIVoiceDelay <= 0) { m_iUIVoiceDelay = 0; m_dwUIVoice = 0; } } } BOOL HeroActionInput::CannotAttack(Object* pTargetObject) { if( g_pHero == NULL ) return TRUE; if( g_pHero->IsImpossible() ) return TRUE; if( pTargetObject != NULL ) { if( pTargetObject->IsKindOfObject(MONSTER_OBJECT) ) { Monster* pMonster = (Monster*)pTargetObject; if(MONSTER_TYPE_SETTING_MAPOBJECT == pMonster->GetMonsterType()) //¼³Ä¡Çü ¸ó½ºÅͶó¸é { Object* pTemp = g_ObjectManager.GetObject(MAP_OBJECT_KEY + pMonster->GetMapObjectKey()); if(pTemp && pTemp->IsKindOfObject(MAP_OBJECT)) { //ÇØ´ç ¼³Ä¡Çü ¸ó½ºÅÍ¿Í ¿«¿©ÀÖ´Â ¸Ê¿ÀºêÁ§Æ®°¡ ¶§¸±¼ö ¾ø´Â »óŶó¸é MapObject* pMapObj = (MapObject*)pTemp; if(pMapObj->GetbCanHit() == false ) return TRUE; } } } else if( pTargetObject->IsKindOfObject(PLAYER_OBJECT) == FALSE ) { return FALSE; } } return m_bCannotAttack; } bool HeroActionInput::CanAttackInDominationWar() { Object* pObj = g_ObjectManager.GetObject(GetCurrentTarget()); if(NULL == pObj) return true; if (SCENE_TYPE_DOMINATION == GameFramework::GetCurrentScene()->GetType() #ifdef _NA_008334_20150608_SONNENSCHEIN || SCENE_TYPE_SONNENSCHEIN == GameFramework::GetCurrentScene()->GetType() #endif //_NA_008334_20150608_SONNENSCHEIN ) { if(STATE::KEYBOARDJUMP == g_pHero->GetCurState()) return false; #ifdef _NA_007115_20140313_MONDSCHIEN_RENEWAL const sDOMINATION_INFO* domination_info = DominationInfoParser::Instance()->GetDominationInfo(g_pMap->GetCurrentFieldID()); if (domination_info && domination_info->m_DominationType == DOMINATION_TYPE_MONDSCHIEN) { // ¸óÆ®»þÀÎ ÀÏ °æ¿ì¿¡´Â if(TRUE == pObj->IsKindOfObject(MONSTER_OBJECT)) { Monster* pMon = (Monster*)pObj; //eNPC_DOMINATION_MAPOBJECT_NPC´Â ¸ø°¡´Â ŸÀÏÀ§¿¡ À־ °ø°Ý°¡´ÉÇÏ´Ù. if( eNPC_DOMINATION_MAPOBJECT_NPC != pMon->GetMonsterInfo()->m_byGrade ) { if(FALSE == GameFunc::IsMove(g_pHero->GetPosition(), pObj->GetPosition(), TRUE, 200/*MAX_TILE_NODE_CNT_IN_DOMINATION*/)) { return false; } } } else if(TRUE == pObj->IsKindOfObject(PLAYER_OBJECT)) { float height = pObj->GetVisiblePos().z - g_pHero->GetVisiblePos().z; if(!(-MAX_ATTACK_HEIGHT_IN_DOMINATION > height || MAX_ATTACK_HEIGHT_IN_DOMINATION < height)) { if(FALSE == GameFunc::IsMove(g_pHero->GetPosition(), pObj->GetPosition(), TRUE, 200/*MAX_TILE_NODE_CNT_IN_DOMINATION*/)) { return false; } } } } else { // ÀÏ¹Ý Á¡·ÉÀü //Áö¿ª Á¡·ÉÀü ÀÏ °æ¿ì 4.5M ÀÌ»ó/ÀÌÇÏ ÀÏ °æ¿ì °ø°ÝÇÏÁö ¸øÇÑ´Ù. float fHeight = pObj->GetVisiblePos().z - g_pHero->GetVisiblePos().z; if(-MAX_ATTACK_HEIGHT_IN_DOMINATION > fHeight || MAX_ATTACK_HEIGHT_IN_DOMINATION < fHeight) return false; if(TRUE == pObj->IsKindOfObject(MONSTER_OBJECT)) { Monster* pMon = (Monster*)pObj; //eNPC_DOMINATION_MAPOBJECT_NPC´Â ¸ø°¡´Â ŸÀÏÀ§¿¡ À־ °ø°Ý°¡´ÉÇÏ´Ù. if( eNPC_DOMINATION_MAPOBJECT_NPC != pMon->GetMonsterInfo()->m_byGrade ) { if(FALSE == GameFunc::IsMove(g_pHero->GetPosition(), pObj->GetPosition(), TRUE, 200/*MAX_TILE_NODE_CNT_IN_DOMINATION*/)) { return false; } } } else if(TRUE == pObj->IsKindOfObject(PLAYER_OBJECT)) { if(FALSE == GameFunc::IsMove(g_pHero->GetPosition(), pObj->GetPosition(), TRUE, 200/*MAX_TILE_NODE_CNT_IN_DOMINATION*/)) { return false; } } } #else //Áö¿ª Á¡·ÉÀü ÀÏ °æ¿ì 4.5M ÀÌ»ó/ÀÌÇÏ ÀÏ °æ¿ì °ø°ÝÇÏÁö ¸øÇÑ´Ù. float fHeight = pObj->GetVisiblePos().z - g_pHero->GetVisiblePos().z; if(-MAX_ATTACK_HEIGHT_IN_DOMINATION > fHeight || MAX_ATTACK_HEIGHT_IN_DOMINATION < fHeight) return false; if(TRUE == pObj->IsKindOfObject(MONSTER_OBJECT)) { Monster* pMon = (Monster*)pObj; //eNPC_DOMINATION_MAPOBJECT_NPC´Â ¸ø°¡´Â ŸÀÏÀ§¿¡ À־ °ø°Ý°¡´ÉÇÏ´Ù. if( eNPC_DOMINATION_MAPOBJECT_NPC != pMon->GetMonsterInfo()->m_byGrade ) { if(FALSE == GameFunc::IsMove(g_pHero->GetPosition(), pObj->GetPosition(), TRUE, 200/*MAX_TILE_NODE_CNT_IN_DOMINATION*/)) { return false; } } } else if(TRUE == pObj->IsKindOfObject(PLAYER_OBJECT)) { if(FALSE == GameFunc::IsMove(g_pHero->GetPosition(), pObj->GetPosition(), TRUE, 200/*MAX_TILE_NODE_CNT_IN_DOMINATION*/)) { return false; } } #endif // _NA_007115_20140313_MONDSCHIEN_RENEWAL } return true; } BOOL HeroActionInput::SetFollowState( BOOL bFlag, DWORD dwPlayerKey ) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; TCHAR szText[INTERFACE_STRING_LENGTH] = {0,}; BOOL preState = m_bFollowPlayer; m_bFollowPlayer = bFlag; if( preState && m_bFollowPlayer == FALSE ) { // µû¶ó´Ù´Ï±â¸¦ ¸ØÃä´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_SET_FOLLOWPLAYER_STOP, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } if( dwPlayerKey ) { Object *pObj = g_ObjectManager.GetObject( dwPlayerKey ); if( pObj ) { Character *pChar = (Character *)pObj; RELATIONKIND::TYPE type = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter( pChar, lsForceAttack() ); if( type == RELATIONKIND::Friend ) { m_dwFollowPlayerKey = dwPlayerKey; m_dwFollowPlayerTime = g_CurTime; SetCurrentTarget( m_dwFollowPlayerKey ); // %s ´ÔÀ» µû¶ó´Ù´Õ´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_SET_FOLLOWPLAYER_START, szText, INTERFACE_STRING_LENGTH ); Sprintf( szMessage, szText, pChar->GetName() ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } else { // µû¶ó´Ù´Ò ¼ö ¾ø´Â ´ë»óÀÔ´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_CANNOT_FOLLOW_OBJECT, szText, INTERFACE_STRING_LENGTH ); Sprintf( szMessage, szText, pChar->GetName() ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); m_bFollowPlayer = FALSE; return FALSE; } } } return TRUE; } void HeroActionInput::ProcessFollow( void ) { if( g_pHero && GetFollowState() ) { if( (g_CurTime - m_dwFollowPlayerTime) >= FOLLOW_DELAY_TIME ) { m_dwFollowPlayerTime = g_CurTime; Character *pChar = (Character *)g_ObjectManager.GetObject( GetFollowPlayer() ); if( pChar ) { PLAYER_ACTION action; ZeroMemory(&action,sizeof(action)); action.ActionID = ACTION_PLAYERFOLLOW; action.PLAYERMEET.dwTargetID = pChar->GetObjectKey(); m_QueueAction = action; // ÀÚµ¿ °ø°Ý ²ô±â SetAutoAttack(FALSE); SetAutoRun(FALSE); // °Å¸®°¡ ³Ê¹«¸Ö¸é À̵¿~ WzVector vTargetPos = pChar->GetPosition(); WzVector vOffset = g_pHero->GetPosition() - vTargetPos; float fDistance = VectorLength( &vOffset ); if( fDistance > DISTANCE_FOLLOW_PLAYER ) { MoveToAction(vTargetPos, false); } } } } } void HeroActionInput::SetHeroTurnState() { if(g_pHero) { if( g_pHero->GetCurState() == STATE::IDLE || g_pHero->GetCurState() == STATE::KEYBOARDMOVE ) { // ÁÖÀΰø ȸÀü Á¤º¸ ¼³Á¤ g_pHero->SetHeroTurnState( g_Camera.GetCameraTurnState() ); g_pHero->SetDirection( g_Camera.GetCameraTo(), g_Camera.GetCameraFrom(), FALSE ); } } } BOOL HeroActionInput::IsActionState() { if(!g_pHero) return FALSE; if(g_pHero->GetCurState() != STATE::MOVE && g_pHero->GetCurState() != STATE::KEYBOARDMOVE&& g_pHero->GetCurState() != STATE::SPECIALMOVE&& g_pHero->GetCurState() != STATE::KEYBOARDJUMP&& g_pHero->GetCurState() != STATE::SIT && g_pHero->GetCurState() != STATE::EMOTICON) return TRUE; else return FALSE; } BOOL HeroActionInput::CanSitState() { if (!g_pHero) { return FALSE; } if( g_pHero->IsPolymorph() == TRUE ) { return FALSE; } return BOOL((g_pHero->GetCurState() != STATE::SIT) && (g_pHero->IsRiding() == FALSE ) && (g_pHero->is_spread_wings() == false) && (g_pHero->GetCurState() != STATE::SUMMON_RIDER) && (g_pHero->GetCurState() != STATE::ETHERIA_EXTRACT) && (g_pHero->GetCurState() != STATE::ATTACK) && (g_pHero->GetCurState() != STATE::MOVE) && (g_pHero->GetCurState() != STATE::KEYBOARDMOVE) && (g_pHero->GetCurState() != STATE::COLLECT) && (FALSE == IsAutoAttackMode())); } void HeroActionInput::SetFixTarget(BOOL bFixTarget) { m_bFixTarget = bFixTarget; } BOOL HeroActionInput::SetNearestTarget() { if(!g_pHero) return FALSE; if( g_pHero->m_vectorTargetMonster.empty() == true ) { // ºñ¾ú´Ù. return TRUE; } // ¸®½ºÆ®¿¡ µî·ÏµÈ ¸ó½ºÅ͵éÀº Ÿ°ÙÆÃÇÒ ¼ö ÀÖ´Â ¹Ý°æ ¾È¿¡ ÀÖ´Â °ÍµéÀÌ´Ù // ÀÌ Áß¿¡¼­ ·ÎÅ×ÀÌ¼Ç ½ÃŲ´Ù.( ´ÙÀ½ Ÿ°Ù ) TAB_TARGET_MONSTER_vector_Itr it; int iCount = 0; BOOL bFind = FALSE; TAB_TARGET_MONSTER_vector_Itr near_pos = g_pHero->m_vectorTargetMonster.begin(); g_pHero->m_CurTargetInfo.dwObjectKey = (*near_pos).dwObjectKey; g_pHero->m_CurTargetInfo.fDistance = (*near_pos).fDistance; g_pHero->m_CurTargetInfo.wTargetCheck = 0; g_pHero->m_CurTargetInfo.wTargetCount = iCount; if( bFind == FALSE ) { it = g_pHero->m_vectorTargetMonster.begin(); g_pHero->m_CurTargetInfo.dwObjectKey = (*it).dwObjectKey; g_pHero->m_CurTargetInfo.fDistance = (*it).fDistance; g_pHero->m_CurTargetInfo.wTargetCheck = 0; g_pHero->m_CurTargetInfo.wTargetCount = -1; } // Ÿ°Ù ¼³Á¤ SetCurrentTarget( g_pHero->m_CurTargetInfo.dwObjectKey ); return TRUE; } BOOL HeroActionInput::GetFixTarget() { return m_bFixTarget; } void HeroActionInput::SetForwardTargeting(BOOL val) { m_bForwardTargeting = val; } BOOL HeroActionInput::GetForwardTargeting() { return m_bForwardTargeting; } BOOL HeroActionInput::CanGetItem(DWORD dwObjectKey) { // ¼ÒÀ¯±Ç üũ ¾ÈÇÔ return TRUE; } //------------------------------------------------------------------------------------------- /** */ BOOL HeroActionInput::CannotMoveState() const { if ( !g_pHero ) { return TRUE; } if ( g_pHero->CannotMove() == TRUE ) { return TRUE; } if ( g_pHero->GetCurState() == STATE::DOWN ) { return TRUE; } if ( g_pHero->GetCurState() == STATE::SIT && g_pHero->GetSitState() == false ) { return TRUE; } #ifdef _NA_008546_20151029_SITTING_PACKET_DELAY_POSITION_SYNC_BUG if (g_pHero->sitting_packet_delay() == TRUE) { return TRUE; } #endif //_NA_008546_20151029_SITTING_PACKET_DELAY_POSITION_SYNC_BUG return FALSE; } void HeroActionInput::ShowCanNotMoveReason(DWORD dwReason) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; if(dwReason!=m_OldReason) { switch(dwReason) { case eCHAR_STATE_SLEEP: { // ½½¸³ »óÅÂÀÔ´Ï´Ù. 5521 g_InterfaceManager.GetInterfaceString(eST_CHAR_STATE_SLIP , szMessage ,INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } break; case eCHAR_STATE_STUN: { // ½ºÅÏ »óÅÂÀÔ´Ï´Ù. 5522 g_InterfaceManager.GetInterfaceString(eST_CHAR_STATE_STUN , szMessage ,INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage); } break; case eCHAR_STATE_FROZEN: { // ÇÁ·ÎÁð »óÅÂÀÔ´Ï´Ù. 5523 g_InterfaceManager.GetInterfaceString(eST_CHAR_STATE_FROZEN , szMessage ,INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } break; case eCHAR_STATE_DELAY: { // µô·¹ÀÌ »óÅÂÀÔ´Ï´Ù. 5524 g_InterfaceManager.GetInterfaceString(eST_CHAR_STATE_DELAY , szMessage ,INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } break; case eCHAR_STATE_STONE: { // ½ºÅæ »óÅÂÀÔ´Ï´Ù. 5525 g_InterfaceManager.GetInterfaceString(eST_CHAR_STATE_STONE , szMessage ,INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } break; case eCHAR_STATE_SUMMON: case eCHAR_STATE_HOLDING: { // Ȧµù »óÅÂÀÔ´Ï´Ù. 5526 g_InterfaceManager.GetInterfaceString(eST_CHAR_STATE_HOLDING , szMessage ,INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } break; default: { // ¾îºô¸®Æ¼ ±âŸ»çÀ¯·Î À̵¿ºÒ°¡ 5527 g_InterfaceManager.GetInterfaceString(eST_CHAR_STATE_ABILITY_ETC_RESON , szMessage ,INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage); } break; } } m_OldReason=dwReason; } BOOL HeroActionInput::FindNearesetPathTile(WzVector *pClickedPos,WzVector *pRet) { int iTileFocussing = -1; // ´ë»ó Tile ¾ò±â iTileFocussing = g_pSunTerrain->x_pPathFinder->GetTileToStand( *pClickedPos, NULL, -1.0f, 100.0f ); if(!g_pMap) return FALSE; if( iTileFocussing >= 0 ) { WORD attribute = g_pMap->GetWorldBase()->x_pPathFinder->GetAttribute( iTileFocussing ); WORD condition = PTA_ONLY_JUMP | PTA_NO_WALK; if( !( attribute & condition ) ) { *pRet = *pClickedPos; return TRUE; } } WzVector vPos = g_pHero->GetPosition(); g_pMap->GetWorldBase()->PathExp_Reset(g_pPathExplorer, &vPos, -1); if (g_pPathExplorer->GetTile() == -1) { return FALSE; } WzVector vOffset = *pClickedPos - vPos; WzVector oldPos=g_pPathExplorer->GetPos(); g_pSunTerrain->PathExp_Thrust(g_pPathExplorer,&vOffset,PTA_NO_WALK); g_pSunTerrain->PathExp_Progress(g_pPathExplorer, 1000000,NULL); WzVector curPos=g_pPathExplorer->GetPos(); if (curPos!=oldPos ) { WzVector vDiff = curPos- oldPos; float fDiffLength = VectorLength(&vDiff); if(fDiffLength>=1.0f) { *pRet = g_pPathExplorer->GetPos(); return TRUE; } } return FALSE; } void HeroActionInput::SetCameraBaseMove(BOOL val) { m_bCameraBaseMove = val; } BOOL HeroActionInput::GetCameraBaseMove() { return m_bCameraBaseMove; } //------------------------------------------------------------------------------ BOOL HeroActionInput::ToggleShowPetInfo(void) { uiPetGauge* pet_dialog = GET_CAST_DIALOG(uiPetGauge, IM_PET_MANAGER::PET_GAUGE_DLG); if (pet_dialog) { pet_dialog->NextShowType(); } return TRUE; } #ifdef _NA_007192_20140428_CLIENT_LUA_MACRO_SYSTEM void HeroActionInput::ForceAreaSkillPosition(DWORD skill_code, WzVector target_position) { // Áö¿ªÁöÁ¤ °úÁ¤À» ÆÐ½º m_TargetAreaSkillID = static_cast(skill_code); m_ShowTargetAreaPointer = TRUE; m_IsClickedTargetArea = TRUE; m_TargetAreaPosition = target_position; } #endif //_NA_007192_20140428_CLIENT_LUA_MACRO_SYSTEM //------------------------------------------------------------------------------ /** ÆÄƼ¸â¹ö¸¦ Ŭ¸¯ÇßÀ»½Ã ŸÄϰª¼ÂÆÃ */ void HeroActionInput::ClickPartyMember(DWORD dwObjKey) { g_pHero->m_CurTargetInfo.dwObjectKey = dwObjKey; m_dwSelectedTarget= dwObjKey; m_TargetType = RELATIONKIND::Friend; } BOOL HeroActionInput::IsIdleState( void ) { if( g_pHero ) { return ( g_pHero->GetCurState() == STATE::IDLE || g_pHero->GetCurState() == STATE::SIT || g_pHero->GetCurState() == STATE::RIDER_TURN || g_pHero->GetCurState() == STATE::EMOTICON ); } return FALSE; } #ifdef _NA_20100307_BETAKEY_SYSTEM BOOL HeroActionInput::IsUseableNPCBetakey(BASE_NPCINFO* pNPCInfo) { if (pNPCInfo) { uiLoginMan* login_manager = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_LOGIN)); if (login_manager) { if (login_manager->CanAbilityContent(pNPCInfo->m_BeytaKey)) { return TRUE; } } } return FALSE; } #endif//_NA_20100307_BETAKEY_SYSTEM BOOL HeroActionInput::lsForceAttack() { #ifdef _YJ_PK_OPTION_001120 if (GAMEOPTION->GetPKWithoutCtrlKey() == TRUE ) { return ATTACK_PROPENSITY_FORCE; } #endif //_YJ_PK_OPTION_001120 return ATTACK_PROPENSITY_NORMAL; } void HeroActionInput::CancelSkillQueue() { #ifdef _NA_004923_120618_SKILL_QUEUE_MOVE_CANCEL g_SkillQueue.SkillQueueMoveCancle(); m_IsClickedTargetArea = FALSE; #else g_SkillQueue.ClearAll(); SetAutoTarget(FALSE); #endif //_NA_004923_120618_SKILL_QUEUE_MOVE_CANCEL }