#pragma once class SGameObject; class KViewportObject; class KUIWndManager; class SUIWnd; class SUICharacterWnd; class SGameManager; class KMsgBoxBtnInfo; class SUIDropItemWnd; class SUIGaugeWnd; //#include "KSortVector.h" #include "KObject.h" #include #include "KTypes.h" #include "SGameMessage.h" //#include "SGameMessageUI.h" const int MSG_DEFAULT_TIMER = 15000; typedef SIMSG_TOGGLE_UIWINDOW TOGGLE_WINDOW; class cMsgControlCustomizer; class KUIMsgControl; using std::string; class SGameInterface : public KObject { public: SGameInterface(); virtual ~SGameInterface(); virtual void ProcConsole( struct SGameMessage* pGameMsg ); void Initialize( SGameManager* pGameManager ); void* Perform( KID id, KArg& msg ); void ProcMsgAtStatic( SGameMessage * pMsg ); void Process( DWORD dwTime, int nGameRef = -1 ); void Render( KViewportObject* pViewport, bool bLoading=false,bool isFront=false ); void RefeshAllWndPos(); void RelocationWnd(); bool IsShow( int nWinID ); void SetShowGuage( AR_HANDLE handle, bool bEnter ); /// 재 초기화 void ReSet(); void onDeviceLost(); #ifdef _KUI_INVALIDATION // { [sonador] void InvalidateAllWnd(); void ValidateAllWnd(); void DeviceLostAllWnd(); // } #endif bool CreateWnd( SUIWnd* pWindow, KPoint& point, TOGGLE_WINDOW::_UIWINDOW_TYPE window_id, bool bIsDynamicWnd = false, string strUIName = "" ); void InitWorldGameInterface(); //gmpbigsun( 20130507 ) : 최초로딩시 모든 UI를 로딩하는 멍청한 짖을 피하고 필수적인것은 로딩하고 나머진 필요할때 로딩하자 BOOL CreateGameInterface( TOGGLE_WINDOW::_UIWINDOW_TYPE eWnd_id ); void SetShowEffectFocusWnd( bool bFlag ); void SetShowProtectSolutionWnd( bool bFlag ); void SetShowEndingWnd( bool bFlag ); void SetShowLoadingWnd( bool bFlag, unsigned int warpx, unsigned int warpy ); void SetShowInitGameguardWnd( bool bFlag ); void SetShowFadeInOutWnd( bool bFlag ); //void UpdateLoadingProgress(float fPercent); void UpdateAddLoadingProcess(float fAddPercent); void InitLoadingBar(); void ViewWaitOpenURL(); bool IsOpenDynamicWnd(); bool IsUIWindowOpened( int nWindowID ); class KUIWndManager* GetWndManager(); void ResetDefaultWinPos(); void SetWindowPos(BOOL bDeviceReset = FALSE); //servantes 2010.12.10 : BOOL bDeviceReset 추가 void MoveWindow( int nWinIndex, int x, int y, BOOL bDeviceReset = FALSE ); //servantes 2010.12.10 : BOOL bDeviceReset 추가 void MoveWindow( int nWinIndex ); //servantes 2010.11.26 // 옵션을 저장하지 않은 UI들의 위치를 조정할 때 사용하자 int IsFriend( AR_HANDLE Handle, unsigned char& rType ); void SetChattingFocus( KID id, KArg& msg ); bool IsShowLoadingWnd(); bool IsShowFadeInOutWnd(); bool IsEndFadeInOutWnd(); bool IsShowEndingWnd(); bool IsShowProtectSolutionWnd(); void InitializeAddonScript(); void ReloadAddonScript(); void CreateNewAddOnWindow( SIMSG_UI_WINDOW_ADDON* pMsg ); bool IsWebPageWndOpened(); SUIWnd* GetUIWindow( int nWindowID ); // 선택한 UI의 번호를 저장 - 영혼력 충전 / 소울 스톤 / 조합 int GetCurrentSelectUI() { return m_nCurrentSelectUI; } //servantes 2010.11.29 void SetCurrentSelectUI(int _id) { m_nCurrentSelectUI = _id; } //servantes 2010.12.13 int getCharacterWndMarkStatus(AR_HANDLE handle); /// 2011.01.17 - prodongi /// 2011.11.09 파업 리스트 추가 = prodongi void addPopupList(int id); bool IsEnemyUnit( AR_HANDLE handle, unsigned char type ); // 2012. 6. 5 - marine bool IsAttack( AR_HANDLE handle ); // 전투지역인지(아레나, 시즈..) void SetCreatureNamePanel(AR_HANDLE playerHandlen,unsigned type); // 2012. 6. 11 - marine (플레이어의 크리쳐 네임판넬 변경) public: KUIWndManager* m_pUIWndManager; private: bool ChatFocusOnKey( DWORD dwKey ); /// 아바타,몬스터 등의 머리위에 띄우는 정보창 struct CHARWINDOW { SUICharacterWnd* pWnd; bool bImmeditelyPosUpdate; CHARWINDOW( SUICharacterWnd* _pWnd, bool _bImmeditelyPosUpdate ) : pWnd( _pWnd ), bImmeditelyPosUpdate( _bImmeditelyPosUpdate ) { } }; bool addSUIWnd( int nWinID, SUIWnd* pWnd ); void destroySUIWnd(); SUIWnd* getSUIWnd( int nWinID ); SGameManager* m_pGameManager; DWORD m_dwTime; class SUIDisplayInfo* m_pDisplayInfo; ///< 윈도우 표시정보를 모아두는 객체 bool m_bWarping; ///< 인터페이스 on/off std::vector m_vecOpenWindowList; //// UI윈도우들 //typedef std::map UIWINDOWMAP; //UIWINDOWMAP m_UIWindowMap; KHash< SUIWnd*, hashPr_mod_int > m_hashUIWindowMap; KSortVector< SUIWnd* > m_sortUIWindowMap; KHash< SUIDropItemWnd*, hashPr_mod_int > m_hashDropItemWind; KSortVector< SUIDropItemWnd* > m_sortDropItemWind; KHash< SUIGaugeWnd *, hashPr_mod_int > m_hashGaugeWind; KSortVector< SUIGaugeWnd * > m_sortGaugeWind; bool addCharacterWnd( AR_HANDLE handle, CHARWINDOW & wnd ); void delCharacterWnd( AR_HANDLE handle ); void destroyCharacterWnd(); CHARWINDOW* getCharacterWnd( AR_HANDLE handle ); bool addDropItemWnd( AR_HANDLE handle, SUIDropItemWnd* pWnd ); void delDropItemWnd( AR_HANDLE handle ); void destroyDropItemWnd(); SUIDropItemWnd* getDropItemWnd( AR_HANDLE handle ); void ShowDropItemWnd(bool nShow); bool addGaugeWnd( AR_HANDLE handle, SUIGaugeWnd* pWnd ); void delGaugeWnd( AR_HANDLE handle ); void destroyGaugeWnd(); SUIGaugeWnd* getGaugeWnd( AR_HANDLE handle ); // typedef std::map CHARWINDOWMAP; // CHARWINDOWMAP m_CharacterWindowMap; KHash< CHARWINDOW*, hashPr_mod_basic > m_hashCharacterWindow; KSortVector< CHARWINDOW* > m_sortCharacterWindow; // typedef std::map CHARWINDOWMAP; KHash< CHARWINDOW*, hashPr_mod_basic > m_hashTempCharacterWindow; ///< 투명 지원 KSortVector< CHARWINDOW* > m_sortTempCharacterWindow; //gmpbigsun std::set< int > m_setFailedWndID; AR_HANDLE m_hOldTarget; bool m_bShowCharWindow; bool m_bIsActive_Display_Process; bool m_bBattleAccept; SUIWnd* CreateProtectSolutionWnd(); SUIWnd* CreateEndingWnd(); SUIWnd* CreateLoadingWnd(); SUIWnd* CreateEffectWnd(); SUIWnd* CreateNoticeWnd(); SUIWnd* CreateChinaWarringWnd(); SUIWnd* CreateWebGameSutDownWnd(); SUIWnd* CreateNotifyWnd(); SUIWnd* CreateCreatureWnd(); SUIWnd* CreateDevOutputWnd(); SUIWnd* CreateFadeInOutWnd(); SUIWnd* CreateTestWnd(); // SUIWnd* GetUIWindow( int nWindowID ); public 으로 이동. class SUILocalSignWnd * m_pLocalSignWnd; void OnToggleUIWindow( int nWindowID ); void OnShowUIWindow( int nWindowID, bool bShow, bool bFocus ); void OnShowUIWindowModal( int nWindowID, bool bShow ); void ProcMsgToUIWindow( int nWindowID, SGameMessage* pMsg ); void ProcRefreshWindow( SGameMessage* pMsg ); void OnRefreshWindow( int nWindowID, SGameMessage* pMsg ); void OnUpdateWindow( int nWindowID ); void OnUpdateState( int nWindowID ); void addDynamicWnd( int nDynamicWndID, SUIWnd* pWnd ); void delDynamicWnd( int nDynamicWndID ); void alldelDynamicWnd(); public: // 2011.05.16 - servantes //MessageBox /// 2012.06.26 customizer추가로 인해서 입력 변수가 더 늘어 났다, 지금은 어쩔 수 없다.. - prodongi KUIMsgControl* OpenMessageBox( SIMSG_REQ_OPEN_MSGBOX::_MSGBOXTYPE Type, SIMSG_REQ_OPEN_MSGBOX::_MSGBOXID MsgBoxID, bool bClose, int nTextID, const std::string& rText = "", DWORD dwWaitTime = 0/*MSG_DEFAULT_TIMER*/, bool bModal=true, const char* lpValue=NULL ); // 2011. 11. 29 - marine 외부에서 메세지 박스를 닫을 때... void CloseMessgeBoxWithID(SIMSG_REQ_OPEN_MSGBOX::_MSGBOXID MsgBoxID); // 2012. 2. 21 - marine 새로운 UI를 열기전에 열려있으면 안되는 UI가 열려 있는지 확인 bool IsAgainstUiOpen(); void CloseAgainstUi(); // 2012. 2. 21 - marine 닫혀야 할 UI 일괄 처리 void ShowInterfacePartyState(); void WarpInterface( bool bShow ); void ShowInterface( bool bShow ); private: // 2011.05.16 - servantes void CloseMessageBox( const std::string& rMsgBoxID ); const char* GetMsgBoxID( SIMSG_REQ_OPEN_MSGBOX::_MSGBOXID MsgBoxID ); void RefreshManuMenuButtonToggle( int nWindowID, bool bShow ); /// NPC 윈도우 bool CanCloseNPCDialog(); bool CloseAllNPCContactedWindows(); void CloaseAllSecurityWindows(); /// 캐릭터 이름 void CreateCharacterWindow( AR_HANDLE handle, int nObjType, bool bPlayer, const char* szName, const char* szNameColorTag = NULL ); void RemoveCharacterWindow( AR_HANDLE handle ); void MoveCharacterWindow( AR_HANDLE handle, int nX, int nY, int nX_Mid, int nY_Mid, float fCamDistance, bool bVisible, float fAlpha = 1.0f ); void SetChatMsgToCharacterWindow( AR_HANDLE handle, const char* szMessage ); void SetTargetToCharacterWindow( AR_HANDLE handle, bool bTarget ); void SetForceShowCharacterWindow( AR_HANDLE handle, bool bShow ); //투명 관련 void SetActiveCharacterWindow( AR_HANDLE handle, int nActiveType ); void SetDamageToCharacterWindow( const SMSG_DAMAGE* pDamageMsg ); /// 소환수 이름 void UpdateSummonName( AR_HANDLE handle, const char* szName, const char* szNameEffect ); void ShowAllCharacterWindows( bool bShow, bool bForce = false ); /// 아이템 팁 표시 void CreateDropItemWindow( AR_HANDLE handle, int nItemCode, count_t nItemCount, const char* szName, const char* szNameColorTag = NULL ); void RemoveDropItemWindow( AR_HANDLE handle ); void MoveDropItemWindow( AR_HANDLE handle, int nX, int nY, float fCamDistance, bool bVisible, float fAlpha = 1.0f ); /// Gauge Wnd void CreateGaugeWindow( AR_HANDLE handle, bool bAddBow = false ); void RemoveGaugeWindow( AR_HANDLE handle ); void MoveGaugeWindow( AR_HANDLE handle, int nX, int nY, float fCamDistance, bool bVisible, float fAlpha = 1.0f ); void add_ui_state( struct SMSG_STATE * pStateMsg ); void changeChattingWndFocus( class SUIChattingWnd* pChattingWnd ); void pumpUpMessageToPopup(KArg& msg); ////////////////////////////////////////////////////////////////////////// /// 인터페이스 생성 ////////////////////////////////////////////////////////////////////////// void InitInterface(); // { [sonador] #ifdef _KUI_INVALIDATION void initGUIViewport(); #endif // } int GetDeltaX( int nValue ); int GetDeltaY( int nValue ); bool IsEnableSize( int nX, int nY, KRect kt ); void UpdateWndMovePos(); void UpdateWindowAbleMove(); void CheckInterfaceManager(); void KillChatFocus(); void initArenaWnds(); /// 2012.04.26 각 아레나 윈도우들 생성 - prodongi void recvMsgResultBattleArenaJoinQueue(int result); void recvMsgResultBattleArenaLeave(int result); void recvMsgResultBattleArenaAbsenceRequest(int result); void recvMsgResultBattleArenaEnterWhileCountdown(int result); void recvMsgResultBattleArenaExerciseReady(int result); void recvMsgResultBattleArenaExerciseStart(int result); void recvMsgResultBattleArenaChangeAlias(SGameMessage* msg); void recvMsgBattleArenaJoinQueue(SGameMessage* msg); void recvMsgBattleArenaLeave(SGameMessage* msg); void recvMsgBattleArenaBattleInfo(SGameMessage* msg); void recvMsgBattleArenaBattleStatus(SGameMessage* msg); void recvMsgBattleArenaBattleScore(SGameMessage* msg); void recvMsgBattleArenaJoinBattle(SGameMessage* msg); void recvMsgBattleArenaDisconnectBattle(SGameMessage* msg); void recvMsgBattleArenaReconnectBattle(SGameMessage* msg); void recvMsgBattleArenaResult(SGameMessage* msg); void recvMsgBattleArenaAbsenceCheck(SGameMessage* msg); void recvMsgBattleArenaPenaltyInfo(SGameMessage* msg); void recvMsgBattleArenaUpdateWaitUserCount(SGameMessage* msg); void recvMsgBattleArenaExerciseReadyStatus(SGameMessage* msg); void recvMsgBattleArenaPromote(SGameMessage* msg); void setArenaJoinSituation(char const* string, int ways = 1); void isValidArenaJoinSituationAtBattleInfo(); /// 모든 아레나 wnd를 닫는다 void hideAllBattleArenaWnd(); void updatePlayerName(); void InitAwakeningWnd( void ); void InitDecomposeWnd( void ); void InitTargetWnds( void ); template SUIWnd* createWindow(TOGGLE_WINDOW::_UIWINDOW_TYPE type) { T* wnd = new T(m_pGameManager); if (!CreateWnd(wnd, KPoint(0, 0), type)) { SAFE_DELETE(wnd); return NULL; } return wnd; } ////////////////////////////////////////////////////////////////////////// /// 인터페이스 위치 저장 ////////////////////////////////////////////////////////////////////////// void SetWinPos( SUIWnd* pUIWin, int x, int y, int OldResolutionX, int OldResolutionY ); void SetWinPosCenter( SUIWnd* pUIWin ); void SetWinPosLeft( SUIWnd* pUIWin ); void SetWinPosRight( SUIWnd* pUIWin ); void SaveUIPos(); /// 2012.04.04 패스워드 틀린 횟수가 최대 개수를 넘기면 Disconnect 에러메세지를 출력한다. bool checkPasswordCount(); void _refreshOpenURL( struct SMSG_OPEN_URL* pMsg ); void SetShowKoreaWarring( int nType, bool bShow = false ); void UpdateShowWindowList( SUIWnd* pUIWin ); std::list< SUIWnd* > m_ShowWindowList; std::vector< SUIWnd* > m_EscHotKeyWinList; struct DYNAMIC_WND_INFO { int nDynamicID; SUIWnd* pWnd; }; std::vector< DYNAMIC_WND_INFO > m_vDynamicWndList; int m_nDynamicWndCount; int m_nHeapMsgBox; std::string m_strShowWindowTrigger; ///< ShowWindow Trigger std::string m_strShowWindowArgument; ///< 상급던전ID. kappamind, 2010.02.10 std::string m_strShowWindowRecallTrigger; ///< 유료화 소환 아이템 트리거 std::string m_strShowWindowRecallArgument; //open url 대기 struct SMSG_OPEN_URL* m_pWaitOpenURL; SUIWnd* m_pProtectSolutionWnd; SUIWnd* m_pEndingWnd; SUIWnd* m_pLoadingWnd; SUIWnd* m_pEffectFocusWnd; enum KOREA_WARRING_TYPE { KOREA_WARRING_NONE = 0, KOREA_WARRING_GRADE_15, KOREA_WARRING_GRADE_18, }; SUIWnd* m_pKoreaWarringGrade_15; SUIWnd* m_pKoreaWarringGrade_18; SUIWnd* m_pKoreaWarringVioLan; DWORD m_dwShowKoreaWarringTime; DWORD m_dwShowKoreaWarringLeaveTime; class SUIFadeInOutEffectWnd* m_pFadeInOutEffectWnd; int m_nCurrentLocation; unsigned int m_nAddonWndRef; int m_nCurrentSelectUI; //servantes 2010.11.29 std::vector m_popupList; /// 2011.11.09 팝업 윈도우 리스트 /// 2012.01.06 공격을 취소 했을 때, 날라오는 SMSG_ATTACK::attack_flag가 공격취소한 무기에 대한 flag가 아니고, 현재 무기에 대한 flag인 값 같다. /// 무기를 스왑했을 때, 특별한 타이밍에 발생되는 문제이고, 서버에서도 확인이 필요할거 같지만, 클라이언트에서 특정한 조건일 때, 무기 스왑을 막도록 처리를 했기때문에 /// 서버에서 확인이 힘들 것 같아서, 활 취소가 와야되는데, 오지 않았을 때, 활 취소를 시켜주도록 처리함. - prodongi struct sBowAttackEventBuffer { sBowAttackEventBuffer() : m_attackAction(0), m_attackFlag(0), m_attacker(0) {} int m_attackAction; int m_attackFlag; AR_HANDLE m_attacker; }; sBowAttackEventBuffer m_bowAttackEventBuffer; sPasswordCount<> m_passwordCount; std::string m_strHttpLink; };