Files
Leviathan/Client/Game/game/Main/SGameInterface.h
T
2026-06-01 12:46:52 +02:00

429 lines
15 KiB
C++

#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 <mmo/ArType.h>
#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<int> m_vecOpenWindowList;
//// UI윈도우들
//typedef std::map<int, SUIWnd*> 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<AR_HANDLE, CHARWINDOW> CHARWINDOWMAP;
// CHARWINDOWMAP m_CharacterWindowMap;
KHash< CHARWINDOW*, hashPr_mod_basic<AR_HANDLE> > m_hashCharacterWindow;
KSortVector< CHARWINDOW* > m_sortCharacterWindow;
// typedef std::map<AR_HANDLE, CHARWINDOW> CHARWINDOWMAP;
KHash< CHARWINDOW*, hashPr_mod_basic<AR_HANDLE> > 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 <typename T> 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<int> 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;
};