Files
Client/Tools/LauncherMY/RYLLoginDlg.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

1570 lines
37 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// RYLLoginDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RYLLogin.h"
#include "RYLLoginDlg.h"
#include "RenderOption.h"
#include "InitValue.h"
#include "../LoginRes/Resource.h"
#include <process.h>
#include <Network/Clientnetwork/ClientEventHandler.h>
#include <Network/Packet/PacketBase.h>
#include <SoundLib/SoundBuffer.h>
#include <SoundLib/SoundManager.h>
#include <mmsystem.h>
#include ".\ryllogindlg.h"
#pragma comment(lib, "winmm")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define WM_RYL_LAUNCHER_SHUTDOWN (WM_USER+0x7777)
#ifdef SAFE_DELETE
#undef SAFE_DELETE
#endif
#ifdef SAFE_DELETE_ARRAY
#undef SAFE_DELETE_ARRAY
#endif
#define SAFE_DELETE(p) { if(p) { delete (p); (p) = 0; } }
#define SAFE_DELETE_ARRAY(p) { if(p) { delete [] (p); (p) = 0; } }
class CLauncherEventHandler : public ClientNet::CClientEventHandler
{
public:
CLauncherEventHandler(CRYLLoginDlg& rylLoginDlg) : m_RylLoginDlg(rylLoginDlg) { }
virtual int OnDispatch(PktBase* lpPktBase, INET_Addr& peerAddr);
virtual int OnOpen(int iErrorCode);
virtual int OnClose();
private:
CRYLLoginDlg& m_RylLoginDlg;
};
class CDelayedConnectCmd : public ILoginDlgCommand
{
public:
static CDelayedConnectCmd* Create(CRYLLoginDlg& rylLoginDlg, DWORD dwDelayMilliseconds)
{ return new CDelayedConnectCmd(rylLoginDlg, dwDelayMilliseconds); }
virtual bool IsProcessNow(DWORD dwCurrentTime)
{ return m_dwDelayMilliseconds + m_dwStartTime < dwCurrentTime; }
virtual bool ProcessCommand()
{ return m_RylLoginDlg.ConnectToLoginServer(); }
virtual ~CDelayedConnectCmd() { }
private:
CDelayedConnectCmd(CRYLLoginDlg& rylLoginDlg, DWORD dwDelayMilliseconds)
: m_RylLoginDlg(rylLoginDlg),
m_dwDelayMilliseconds(dwDelayMilliseconds),
m_dwStartTime(timeGetTime())
{
}
CRYLLoginDlg& m_RylLoginDlg;
DWORD m_dwDelayMilliseconds;
DWORD m_dwStartTime;
};
bool GetHostIPByDomain(IN_ADDR &Addr, const char *szDomain)
{
PHOSTENT pHost = gethostbyname(szDomain);
if(NULL == pHost)
{
return false;
}
memcpy(&(Addr.S_un.S_addr), pHost->h_addr_list[0], sizeof(IN_ADDR));
return true;
}
// CRYLLoginDlg message handlers
unsigned _stdcall UpdateProgress( void *p )
{
CRYLLoginDlg *lpLogin = reinterpret_cast<CRYLLoginDlg*>(p);
if (lpLogin->IsServerClosed())
{
/*
#ifdef _NATION_KR_
if( IDNO ==AfxMessageBox(
"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.\n<><6E>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>մϴ<D5B4>.\n"
"<22><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>Ͻðڽ<C3B0><DABD>ϱ<EFBFBD>?",
MB_YESNO ) )
{
PostQuitMessage(0);
lpLogin->EndDialog(0);
}
#else
if( IDNO ==AfxMessageBox(
"Login Server is currently unavailable. But enable to patch. Patch now?",
MB_YESNO ) )
{
PostQuitMessage(0);
lpLogin->EndDialog(0);
}
#endif
*/
return 0;
}
DWORD dwWaitResult = lpLogin->WaitForWebPageCreated();
switch(dwWaitResult)
{
case WAIT_FAILED:
case WAIT_TIMEOUT:
case WAIT_ABANDONED:
// TODO : make error message
break;
case WAIT_OBJECT_0:
if (!lpLogin->UpdateFile())
{
AfxMessageBox(
RYLLoginGetMessage(LOGIN_MSG_FAIL_TO_APPLY_PATCH),
MB_OK|MB_ICONERROR);
PostQuitMessage(0);
}
lpLogin->SetPatchComplete(true);
lpLogin->SetLoginDisplayText(
RYLLoginGetMessage(LOGIN_MSG_CONNECTED_TO_LOGIN_SERVER_SUCCESSFULLY));
break;
}
return 0;
}
unsigned _stdcall FileCheckProcess(void *p)
{
CRYLLoginDlg *lpLogin = static_cast<CRYLLoginDlg*>(p);
if (!lpLogin->UpdateFile(true))
{
AfxMessageBox(
RYLLoginGetMessage( LOGIN_MSG_FAIL_TO_FILE_CHECK ),
MB_OK|MB_ICONERROR );
lpLogin->SetPatchComplete(true);
PostQuitMessage(0);
}
return 0;
}
CRYLLoginDlg::CRYLLoginDlg(CWnd* pParent /*=NULL*/)
: CDialog(CRYLLoginDlg::IDD, pParent),
m_szVersionSignature(STR_VERSION_SIGNATURE),
m_dwLocalClientVersion(0),
m_pLoginSocket(0)
{
m_bServerClosed = false;
m_bFileCheck = false;
#ifdef _NATION_GM_
m_TMsgDlg = NULL;
#endif
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pStreamSound = NULL;
m_hWebPageCreated = CreateEvent(0, TRUE, FALSE, NULL);
m_fBlueProgressPercentage = 0.0f;
m_fRedProgressPercentage = 0.0f;
m_nFade = 0;
m_bUpdating = FALSE;
m_nUpdateAni = 0;
m_nUpdateLogoAni = 0;
m_pLoginSocket = new LoginSocket;
m_bShowServerSelectDlg = FALSE;
m_nShowRateServerSelectDlg = 0;
m_bCheckSetup = FALSE;
m_bCheckSucLoginData = FALSE;
m_nServerClass = 1; // 0: InHouseServer // 1 : TestServer //2: RealServer //3: Taiwan <20><> <20><><EFBFBD><EFBFBD>
m_strLoginServerAddrFromRegistry = "";
m_strPatchUrlFromRegistry = "";
m_strDefaultLoginServerAddr = "";
m_ConnectionState = CS_IDLE;
}
void CRYLLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON_NEWACC, m_btnNewAcc);
DDX_Control(pDX, IDC_BUTTON_PSW, m_btnPsw);
DDX_Control(pDX, IDC_BUTTON_SETUP, m_btnSetup);
DDX_Control(pDX, IDC_BUTTON_FILECHECK, m_btnFileCheck);
DDX_Control(pDX, IDC_BUTTON_START,m_btnServerStart);
DDX_Control(pDX, IDC_BUTTON_MUSIC, m_btnMusic);
DDX_Control(pDX, IDC_BUTTON_END, m_btnEnd);
DDX_Control(pDX, IDC_STATIC_LOGINTEXT, m_stcLoginDisplay);
DDX_Control(pDX, IDC_STATIC_VERSIONVIEW, m_stcVersionView);
DDX_Control(pDX, IDC_LIST_SERVER2, m_ServerList);
}
BEGIN_MESSAGE_MAP(CRYLLoginDlg, CDialog)
//{{AFX_MSG_MAP(CRYLLoginDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_NEWACC, OnBnClickedButtonNewacc)
ON_BN_CLICKED(IDC_BUTTON_PSW, OnBnClickedButtonPsw)
ON_BN_CLICKED(IDC_BUTTON_END, OnBnClickedButtonEnd)
ON_WM_MOVE()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_ERASEBKGND()
ON_WM_CTLCOLOR()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON_MUSIC, OnBnClickedButtonMusic)
ON_BN_CLICKED(IDC_BUTTON_FILECHECK, OnBnClickedButtonFilecheck)
ON_BN_CLICKED(IDC_BUTTON_SETUP, OnBnClickedButtonSetup)
ON_MESSAGE(WM_RYL_LAUNCHER_SHUTDOWN, OnRylLauncherShutdown)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON_START, OnBnClickedButtonStart)
ON_LBN_SELCHANGE(IDC_LIST_SERVER2, OnLbnSelchangeListServer)
ON_LBN_DBLCLK(IDC_LIST_SERVER2, OnLbnDblclkListServer)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CRYLLoginDlg::OnInitDialog()
{
// RZipRapper::FileCompress( "C:\\Dev\\RYL\\Launcher\\PatchInfo", "C:\\Dev\\RYL\\Launcher\\PatchInfo.zip" );
/*#ifdef _NATION_JP_
// <20>Ϻ<EFBFBD> G-CIA <20><>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> üũ
HWND hGCIA = ::FindWindow( NULL, "G-CIA" );
if( NULL == hGCIA )
{
MessageBox( "Please run G-CIA launcher", "Error!", MB_ICONERROR|MB_OK );
PostQuitMessage(0);
EndDialog(0);
}
#endif // _NATION_JP_*/
CDialog::OnInitDialog();
InitClientFoloder();
RYLLoginInitMessage(m_strRYLFolder);
char szClassName[MAX_PATH];
char szWindowTitle[MAX_PATH];
::GetClassName(*this, szClassName, MAX_PATH);
szClassName[MAX_PATH - 1] = 0;
GetWindowText(szWindowTitle, MAX_PATH);
szWindowTitle[MAX_PATH - 1] = 0;
CWnd *lpCheckSelfWnd= FindWindow( szClassName, "Login" );
if (lpCheckSelfWnd)
{
AfxMessageBox( RYLLoginGetMessage(LOGIN_MSG_LAUNCHER_ALREADY_RUNNING) );
PostQuitMessage(0);
}
m_ConnectionState = CS_START;
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
#ifdef _NATION_GM_
m_TMsgDlg = new CMSGDialog();
#endif
// TODO: Add extra initialization here
InitInterface();
PlayBGM();
Sleep(1050);
m_dlgSplash.DoModal();
SetTimer( WM_FADETIMER, 10, NULL );
SetTimer( WM_ANITIMER, 75, NULL );
SetTimer( WM_LOGOANITIMER, 100, NULL );
SetTimer( WM_EVENT_HANDLER_TIMER, 100, NULL);
//PlayBGM();
m_bPatchComplete = false;
m_nLoginProcess = 0;
m_stcLoginDisplay.SetCenterText(FALSE);
SetWindowText("Login");
#ifdef _NATION_GM_
if(m_TMsgDlg)
{
int iReturn = m_TMsgDlg->DoModal();
if(iReturn == IDCANCEL)
{
PostQuitMessage(0);
return FALSE;
}
}
#endif
ConnectToLoginServer();
return TRUE; // return TRUE unless you set the focus to a control
}
void CRYLLoginDlg::OnDestroy()
{
SAFE_DELETE(m_pLoginSocket);
SAFE_DELETE(m_pBoldFont);
#ifdef _NATION_GM_
SAFE_DELETE(m_TMsgDlg);
#endif
LoginDlgCommandList::iterator pos = m_LoginDlgCommandList.begin();
LoginDlgCommandList::iterator end = m_LoginDlgCommandList.end();
for(; pos != end; ++pos)
{
ILoginDlgCommand* lpLoginDlgCommand = *pos;
SAFE_DELETE(lpLoginDlgCommand);
}
m_LoginDlgCommandList.clear();
if (CS_IDLE == m_ConnectionState ||
CS_SERVERSELECT == m_ConnectionState)
{
if (0 != m_hWebPageCreated)
{
CloseHandle(m_hWebPageCreated);
m_hWebPageCreated = 0;
}
CDialog::OnDestroy();
}
else
{
m_UpdateManager.Terminate();
return; // update manager<65><72> <20>ߴܵǸ鼭 <20><>ġ<EFBFBD><C4A1><EFBFBD>н<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD>
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CRYLLoginDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
// kidleon@kronet.net
//dc.DrawIcon(x, y, m_hIcon);
}
else
{
CRect rect;
GetClientRect(&rect);
CMemDC pDC( &dc, rect);
RenderBack( pDC, m_btmBase, 0, 0 );
BITMAP bmInfo;
m_btmFILE.GetBitmap(&bmInfo);
int nPixelSize = (int)( bmInfo.bmWidth * ( m_fBlueProgressPercentage * 0.01f ) );
if( m_ConnectionState == CS_SERVERSELECT )
{
RenderBack( pDC, m_btmFILE, 31, 408 );
}
else
{
RenderBack( pDC, m_btmFILE, 31, 408, nPixelSize, bmInfo.bmHeight );
}
m_btmFTP.GetBitmap(&bmInfo);
nPixelSize = (int)( bmInfo.bmWidth * ( m_fRedProgressPercentage * 0.01f ) );
if( m_ConnectionState == CS_SERVERSELECT )
{
RenderBack( pDC, m_btmFTP, 31, 427 );
}
else
{
RenderBack( pDC, m_btmFTP, 31, 427, nPixelSize, bmInfo.bmHeight );
}
RenderAni( pDC, m_btmAlarmAni, 499, 408, 34, 34, m_nUpdateAni );
CDialog::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CRYLLoginDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CRYLLoginDlg::RenderBack( CDC &rDC, CBitmap &rBitmap, int Px, int Py , int SizeX, int SizeY )
{
CDC memDC;
memDC.CreateCompatibleDC(&rDC);
CBitmap *pOldBitmap = memDC.SelectObject(&rBitmap);
CSize sBitmap = rBitmap.GetBitmapDimension();
BITMAP bmInfo;
rBitmap.GetBitmap(&bmInfo);
if( SizeX == -1 && SizeY == -1 )
{
rDC.BitBlt(Px,Py,bmInfo.bmWidth,bmInfo.bmHeight,&memDC,0,0,SRCCOPY);
}
else
{
rDC.BitBlt(Px,Py,SizeX,SizeY,&memDC,0,0,SRCCOPY);
}
memDC.SelectObject(pOldBitmap);
}
void CRYLLoginDlg::OnBnClickedButtonNewacc()
{
// TODO: Add your control notification handler code here
#ifdef _NATION_JP_
AfxMessageBox( "Not available now." );
return;
#endif
ShellExecute(NULL, "open", STR_NEW_ACCOUNT_URL, NULL, NULL, SW_SHOWNORMAL);
}
void CRYLLoginDlg::OnBnClickedButtonPsw()
{
// TODO: Add your control notification handler code here
#ifdef _NATION_JP_
AfxMessageBox( "Not available now." );
return;
#endif
ShellExecute(NULL, "open", STR_CHANGE_PASSWORD_URL, NULL, NULL, SW_SHOWNORMAL);
}
void CRYLLoginDlg::OnBnClickedButtonEnd()
{
// TODO: Add your control notification handler code here
OnOK();
}
LRESULT CRYLLoginDlg::OnRylLauncherShutdown(WPARAM,LPARAM)
{
return SendMessage( WM_CLOSE );
}
void CRYLLoginDlg::PlayBGM(void)
{
CString strSoundName;
try
{
strSoundName = m_strRYLFolder + "/lc2.ogg";
CSoundManager::GetInstance().Create( GetSafeHwnd() );
ISoundObject &sndBuf = CSoundManager::GetInstance().GetBuffer(
strSoundName , false, true, 1, 0x0004000 );
sndBuf.Play( true );
m_bBGMPlay = TRUE;
m_pStreamSound = &sndBuf;
}
catch( exception & e )
{
MessageBox( e.what(), STR_PLAY_BGM_ERROR );
m_pStreamSound = NULL;
}
}
void CRYLLoginDlg::InitClientFoloder(void)
{
HKEY hMPClientReg = 0;
char strPath[MAX_PATH]="";
if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, STR_CLIENT_REGISTRY_SUBKEY,
0, KEY_READ, &hMPClientReg) == ERROR_SUCCESS)
{
DWORD dwReadType = 0;
DWORD dwReadLens = MAX_PATH;
if (RegQueryValueEx(hMPClientReg, STR_CLIENT_REGISTRY_VALUE_NAME, 0,
&dwReadType, reinterpret_cast<unsigned char*>(strPath), &dwReadLens) == ERROR_SUCCESS)
{
strPath[MAX_PATH - 1] = 0;
m_strRYLFolder.SetString(strPath);
}
dwReadLens = MAX_PATH;
if (RegQueryValueEx(hMPClientReg, "Server", 0, &dwReadType,
reinterpret_cast<unsigned char*>(strPath), &dwReadLens) == ERROR_SUCCESS)
{
strPath[MAX_PATH - 1] = 0;
m_strLoginServerAddrFromRegistry.SetString(strPath);
}
dwReadLens = MAX_PATH;
if (RegQueryValueEx(hMPClientReg, "PatchServer", 0, &dwReadType,
reinterpret_cast<unsigned char*>(strPath), &dwReadLens) == ERROR_SUCCESS)
{
strPath[MAX_PATH - 1] = 0;
m_strPatchUrlFromRegistry.SetString(strPath);
}
RegCloseKey(hMPClientReg);
}
else
{
MessageBox(RYLLoginGetMessage(LOGIN_MSG_CLIENT_NOT_INSTALLED));
}
}
void CRYLLoginDlg::InitInterface(void)
{
SetWindowPos( NULL, 0,0, 662, 580, SWP_NOMOVE | SWP_NOZORDER );
// HINSTANCE hDefault = AfxGetResourceHandle();
// m_hResDll = LoadLibrary( "LoginRes.dll" );
SetDllResource();
m_btmBase.LoadBitmap(IDB_BITMAP_BACK);
m_btmFILE.LoadBitmap(IDB_BITMAP_PROGRESSFILE);
m_btmFTP.LoadBitmap(IDB_BITMAP_PROGRESSTOTAL);
m_btmAlarmAni.LoadBitmap(IDB_BITMAP_ALARMANI);
BOOL bRet = m_btmPatching.LoadBitmap(IDB_BITMAP_PATCHING);
bRet = m_btmComplete.LoadBitmap(IDB_BITMAP_ALARM);
bRet = m_btmLoging.LoadBitmap(IDB_BITMAP_LOGINING);
m_btnNewAcc.SetBitmap(IDB_BITMAP_NEWACC0, IDB_BITMAP_NEWACC1, IDB_BITMAP_NEWACC2);
m_btnPsw.SetBitmap(IDB_BITMAP_PSW0, IDB_BITMAP_PSW1, IDB_BITMAP_PSW2);
m_btnSetup.SetBitmap(IDB_BITMAP_SETUP0, IDB_BITMAP_SETUP1, IDB_BITMAP_SETUP2);
m_btnFileCheck.SetBitmap(IDB_BITMAP_FILECHECK0, IDB_BITMAP_FILECHECK1, IDB_BITMAP_FILECHECK2);
m_btnServerStart.SetBitmap(IDB_BITMAP_START0, IDB_BITMAP_START1, IDB_BITMAP_START2);
m_btnMusic.SetBitmap(IDB_BITMAP_MUSIC0, IDB_BITMAP_MUSIC1, IDB_BITMAP_MUSIC2);
m_btnEnd.SetBitmap(IDB_BITMAP_END0, IDB_BITMAP_END1, IDB_BITMAP_END2);
srand(time(NULL));
switch(rand() % 3)
{
case 0: m_dlgSplash.m_btmSplash.LoadBitmap(IDB_BITMAP_BANNER1); break;
case 1: m_dlgSplash.m_btmSplash.LoadBitmap(IDB_BITMAP_BANNER2); break;
case 2: m_dlgSplash.m_btmSplash.LoadBitmap(IDB_BITMAP_BANNER3); break;
}
#ifdef _NATION_GM_
if(m_TMsgDlg)
m_TMsgDlg->InitInterface();
#endif
// AfxSetResourceHandle( hDefault );
SetDefaultResource();
m_ServerList.SetWindowPos( NULL, 510, 55, 135, 260, SWP_NOZORDER );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ư <20><>ǥ
m_btnNewAcc.SetWindowPos(NULL, 20, 542, m_btnNewAcc.GetSizeX(), m_btnNewAcc.GetSizeY() , SWP_NOZORDER);
m_btnPsw.SetWindowPos(NULL, 134, 542, m_btnPsw.GetSizeX(), m_btnPsw.GetSizeY(), SWP_NOZORDER) ;
m_btnSetup.SetWindowPos(NULL, 245, 542, m_btnSetup.GetSizeX(), m_btnSetup.GetSizeY(), SWP_NOZORDER);
m_btnFileCheck.SetWindowPos(NULL, 319, 542, m_btnFileCheck.GetSizeX(), m_btnFileCheck.GetSizeY(), SWP_NOZORDER);
m_btnServerStart.SetWindowPos(NULL, 520, 320, m_btnServerStart.GetSizeX(), m_btnServerStart.GetSizeY(), SWP_NOZORDER);
m_btnMusic.SetWindowPos(NULL, 429, 542, m_btnMusic.GetSizeX(), m_btnMusic.GetSizeY(), SWP_NOZORDER);
m_btnEnd.SetWindowPos(NULL, 595, 542, m_btnEnd.GetSizeX(), m_btnEnd.GetSizeY(), SWP_NOZORDER);
SetWindowText( "R.O.W Online" );
m_pBoldFont = new CFont;
m_pBoldFont->CreateFont(
16,0,0,0,500,0,0,0,0,0,0,ANTIALIASED_QUALITY,0,"Arial");
m_stcLoginDisplay.SetWindowPos( NULL, 34, 387, 494 - 41, 403 - 387, SWP_NOZORDER );
m_stcLoginDisplay.SetFont(m_pBoldFont);
m_stcLoginDisplay.SetCenterText();
m_stcLoginDisplay.SetColor(RGB(29,29,29));
m_stcLoginDisplay.SetGradientColor(RGB( 29,29, 29));
m_stcLoginDisplay.SetTextColor(RGB(255,255,255));
m_stcLoginDisplay.SetCenterText( FALSE );
m_stcLoginDisplay.SetWindowText( RYLLoginGetMessage(LOGIN_MSG_CONNECTING_TO_LOGIN_SERVER) );
m_stcVersionView.SetWindowPos( NULL, 16, 7, 20 * 6, 16, SWP_NOZORDER );
m_stcVersionView.SetFont(m_pBoldFont);
m_stcVersionView.SetCenterText();
m_stcVersionView.SetColor(RGB(0xFF,0xFF,0xFF));
m_stcVersionView.SetGradientColor(RGB( 0xDF,0xDF, 0xFF));
m_stcVersionView.SetTextColor(RGB(55,55,55));
//m_stcVersionView.SetCenterText( FALSE );
m_stcVersionView.SetWindowText( "Client ver. : TEST" );
}
void CRYLLoginDlg::InitWebBrowser(void)
{
m_WebPage.Create(NULL, NULL, (WS_CHILD | WS_VISIBLE ),
CRect(15, 30, 492, 369), this, IDR_WEBVIEW, NULL);
m_WebPage.Navigate(m_strRYLFolder + "/Notice/default.html");
SetEvent(m_hWebPageCreated);
}
void CRYLLoginDlg::OnMove(int x, int y)
{
//Invalidate( FALSE );
CDialog::OnMove(x, y);
}
void CRYLLoginDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y) );
CDialog::OnLButtonDown(nFlags, point);
}
void CRYLLoginDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnMouseMove(nFlags, point);
}
// patch <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CRYLLoginDlg::UpdateFile( bool bFileCheck )
{
//#if defined _NATION_JP_
// m_ConnectionState = CS_SERVERSELECT;
// return true;
//#endif
m_bUpdating = TRUE;
m_ConnectionState = CS_FILEINFOGATHERING;
m_UpdateManager.SetRootPath( m_strRYLFolder );
if( m_strPatchUrlFromRegistry != "" )
{
m_UpdateManager.m_strServerPath = m_strPatchUrlFromRegistry;
}
else
{
m_UpdateManager.m_strServerPath = m_strPatchUrlFromLoginServer;
}
m_UpdateManager.SetProgressInfo(
&m_fBlueProgressPercentage, &m_fRedProgressPercentage,
&m_stcLoginDisplay, this );
m_UpdateManager.Init();
if( !bFileCheck )
{
#if (defined(_NATION_MY_) && defined(_P1_)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̽þƸ<C3BE> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Notice <20>ٿ<EFBFBD><D9BF>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؿܴ<D8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> notice)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( false == m_UpdateManager.ProcessNoticeFiles() )
{
return false;
}
#endif
m_WebPage.Navigate( m_strRYLFolder + "/Notice/default.html" );
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> patchinfo <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20><> <20>ε<EFBFBD>
if( false == m_UpdateManager.LoadServerPatchInfo() )
{
return false;
}
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> patchinfo <20>ε<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
// if( false == m_UpdateManager.LoadLocalPatchInfoCache() )
// {
// return false;
// }
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> patchinfo <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۹޾ƾ<DEBE> <20><> <20><>Ű<EFBFBD><C5B0> <20><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD> <20><><EFBFBD><EFBFBD>
if( false == m_UpdateManager.CollectDownloadFileList(bFileCheck) )
{
return false;
}
m_ConnectionState = CS_PATCHDOWN;
// <20><><EFBFBD>۹<EFBFBD><DBB9><EFBFBD> <20><>Ű<EFBFBD><C5B0> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ٿ<EFBFBD><D9BF>ε<EFBFBD>
if( false == m_UpdateManager.DownloadUpdateFile() )
{
return false;
}
// <20><><EFBFBD>۹<EFBFBD><DBB9><EFBFBD> <20><>Ű<EFBFBD><C5B0> <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>
if( false == m_UpdateManager.ExtractPatchFiles() )
{
return false;
}
m_UpdateManager.CleanUp();
CRect rcUpdate;
rcUpdate.left = 12;
rcUpdate.right = 655;
rcUpdate.top = 381;
rcUpdate.bottom = 528;
InvalidateRect( rcUpdate, FALSE );
if( m_UpdateManager.m_bUpdateLogin != TRUE )
{
m_ConnectionState = CS_SERVERSELECT;
}
InvalidateRect( rcUpdate, FALSE );
m_bUpdating = FALSE;
int nVersion = m_UpdateManager.GetVersion(); // <20><>ġ<EFBFBD>ĹǷ<C4B9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3> PatchInfoV2 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǿ<EFBFBD><C7BE><EFBFBD>
if( nVersion != -1 )
{
#ifdef _P1_ // By Belldandy(2005.02.02) <20><>Ʈ1<C6AE><31> <20><>Ʈ2 <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD>
nVersion -= 100;
#endif
SetClientVer( nVersion );
}
m_bCheckSetup = TRUE;
if( m_UpdateManager.m_bUpdateLogin == TRUE )
{
AfxMessageBox( RYLLoginGetMessage(LOGIN_MSG_LAUNCHER_RESTART) );
PostQuitMessage(0);
EndDialog(0);
}
if( m_bFileCheck )
{
AfxMessageBox( RYLLoginGetMessage(LOGIN_MSG_FILE_CHECK_FINISHED) );
}
return true;
}
BOOL CRYLLoginDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
//return CDialog::OnEraseBkgnd(pDC);
}
void CRYLLoginDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch( nIDEvent )
{
case WM_FADESERVERSELECT:
{
}
break;
case WM_FADETIMER:
{
m_nFade+=3;
if( m_nFade >= 100 )
{
KillTimer( nIDEvent );
InitWebBrowser();
}
}
break;
case WM_ANITIMER:
{
if( m_bUpdating == TRUE )
{
m_nUpdateAni++;
if( m_nUpdateAni == 21 )
{
m_nUpdateAni = 0;
}
/*m_nUpdateLogoAni++;
if( m_nUpdateLogoAni == 21 )
{
m_nUpdateLogoAni = 0;
}*/
}
else
{
}
CRect rcUpdate;
// <20><><EFBFBD><EFBFBD><E2B1B8>-_-<2D>ִ<EFBFBD>
rcUpdate.left = 499;
rcUpdate.top = 408;
rcUpdate.right = 499 + 32;
rcUpdate.bottom = 408 + 32;
InvalidateRect( rcUpdate, FALSE );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
rcUpdate.left = 31;
rcUpdate.top = 408;
rcUpdate.right = 31 + 464;
rcUpdate.bottom = 408 + 16;
InvalidateRect( rcUpdate, FALSE );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD>
rcUpdate.left = 31;
rcUpdate.top = 427;
rcUpdate.right = 31 + 464;
rcUpdate.bottom = 427 + 16;
InvalidateRect( rcUpdate, FALSE );
// <20><><EFBFBD>ϴ<EFBFBD> <20>ΰ<EFBFBD> <20>ִ<EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//rcUpdate.left = 23;
//rcUpdate.top = 446;
//rcUpdate.right = 23 + 163;
//rcUpdate.bottom = 446 + 94;
//InvalidateRect( rcUpdate, FALSE );
}
break;
case WM_LOGOANITIMER:
{
m_nUpdateLogoAni++;
if( m_nUpdateLogoAni >= 21 )
m_nUpdateLogoAni = 0;
}
case WM_EVENT_HANDLER_TIMER:
if (0 != m_pLoginSocket)
{
m_pLoginSocket->HandleEvents(30);
}
{
LoginDlgCommandList::iterator pos = m_LoginDlgCommandList.begin();
LoginDlgCommandList::iterator end = m_LoginDlgCommandList.end();
DWORD dwCurrentTime = timeGetTime();
for(; pos != end; )
{
ILoginDlgCommand* lpLoginDlgCommand = *pos;
if (0 == lpLoginDlgCommand)
{
pos = m_LoginDlgCommandList.erase(pos);
}
else if (lpLoginDlgCommand->IsProcessNow(dwCurrentTime))
{
lpLoginDlgCommand->ProcessCommand();
delete lpLoginDlgCommand;
pos = m_LoginDlgCommandList.erase(pos);
}
else
{
++pos;
}
}
}
break;
}
CDialog::OnTimer(nIDEvent);
}
void CRYLLoginDlg::OnBnClickedButtonMusic()
{
// TODO: Add your control notification handler code here
if( m_bBGMPlay == TRUE && m_pStreamSound )
{
m_bBGMPlay = FALSE;
m_pStreamSound->Stop( 1 );
}
else if( m_pStreamSound )
{
m_bBGMPlay = TRUE;
m_pStreamSound->Play( true );
}
}
void CRYLLoginDlg::OnBnClickedButtonFilecheck()
{
//#if defined _NATION_JP_
// return;
//#endif
// TODO: Add your control notification handler code here
if( m_bCheckSucLoginData == FALSE )
return;
if( m_bUpdating )
{
AfxMessageBox( RYLLoginGetMessage(LOGIN_MSG_CANNOT_FILECHECK_PATCH_IN_PROGRESS) );
}
else
{
// CString strChecker;
// strChecker = m_strRYLFolder + "/FileChecker.exe";
// Execute( strChecker , FALSE );
if( IDOK == AfxMessageBox( RYLLoginGetMessage(LOGIN_MSG_CONFIRM_FILECHECK), MB_ICONQUESTION|MB_OKCANCEL ) )
{
// CString strPatchInfoCache;
// strPatchInfoCache = m_strRYLFolder + "\\PatchInfo.cache";
// DeleteFile( strPatchInfoCache );
DWORD dwThread;
unsigned ThreadID;
m_bFileCheck = true; // <20><><EFBFBD><EFBFBD>üũ<C3BC><C5A9><EFBFBD><EFBFBD>
dwThread = _beginthreadex( NULL, 0, FileCheckProcess, this, 0, &ThreadID );
SetPatchComplete(false);
}
}
}
void CRYLLoginDlg::OnBnClickedButtonSetup()
{
// TODO: Add your control notification handler code here
CString strSetup;
strSetup = m_strRYLFolder + "\\clientsetup.exe";
Execute( strSetup , TRUE );
}
void CRYLLoginDlg::Execute( CString strExec , BOOL bWait )
{
if( m_bUpdating )
return;
STARTUPINFO si={sizeof(STARTUPINFO),0,};
PROCESS_INFORMATION pi;
BOOL bReturn = CreateProcess( strExec,NULL, NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
//if( r == FALSE )
// CreateProcess( "Clientsetup.exe",NULL, NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
if( bReturn == TRUE && bWait == TRUE)
WaitForSingleObject( pi.hProcess, INFINITE );
}
void CRYLLoginDlg::RenderAni( CDC &rDC, CBitmap &rBitmap, int Px, int Py , int SizeX, int SizeY, int nAniNum )
{
CBitmap *pOldBitmap;
CDC memDC;
memDC.CreateCompatibleDC(&rDC);
pOldBitmap=memDC.SelectObject(&rBitmap);
CSize sBitmap=rBitmap.GetBitmapDimension();
BITMAP bmInfo;
rBitmap.GetBitmap(&bmInfo);
int nAniX = bmInfo.bmWidth / SizeX;
int nAniY = bmInfo.bmHeight / SizeY;
int nSX = ( nAniNum % nAniX ) * SizeX;
int nSY = ( nAniNum / nAniX ) * SizeY;
rDC.BitBlt( Px, Py, SizeX, SizeY, &memDC, nSX, nSY, SRCCOPY );
memDC.SelectObject(pOldBitmap);
}
DWORD CRYLLoginDlg::GetLocalClientVersion()
{
if (0 == m_dwLocalClientVersion)
{
CString strVerFile(m_strRYLFolder);
strVerFile.Append("/versioninfo.dat");
FILE *fp = fopen(strVerFile.GetBuffer(0), "r");
if (0 != fp)
{
fscanf(fp, "%ul", &m_dwLocalClientVersion);
#ifdef _P1_ // By Belldandy (2005.02.02) <20><>Ʈ1<C6AE><31> <20><>Ʈ2 <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD>
m_dwLocalClientVersion += 100;
#endif
fclose(fp);
}
}
return m_dwLocalClientVersion;
}
void CRYLLoginDlg::SetClientVer(DWORD dwVer)
{
CString strVerFile(m_strRYLFolder);
strVerFile.Append("/versioninfo.dat");
FILE *fp = fopen(strVerFile.GetBuffer(0), "w");
if (fp)
{
fprintf(fp, "%ul", dwVer);
fclose(fp);
}
}
void CRYLLoginDlg::ExecuteClient( int nServer )
{
#ifdef _P1_
CString strSetupFilename;
strSetupFilename = m_strRYLFolder + "\\MP.Ini";
FILE *fp = fopen( strSetupFilename.GetBuffer( 0 ), "rb" );
if( fp == NULL )
{
m_bCheckSetup = TRUE;
}
else
{
fclose( fp );
}
strSetupFilename = m_strRYLFolder + "\\RenderOption.dat";
fp = fopen( strSetupFilename.GetBuffer( 0 ), "rb" );
if( fp == NULL )
{
m_bCheckSetup = TRUE;
}
else
{
fclose( fp );
}
#else
HKEY hKey = NULL;
if(
RegOpenKeyEx( HKEY_LOCAL_MACHINE, STR_CLIENT_REGISTRY_SUBKEY, 0, KEY_READ, &hKey ) !=
ERROR_SUCCESS )
{
MessageBox( RYLLoginGetMessage(LOGIN_MSG_CLIENT_NOT_INSTALLED) );
PostQuitMessage(0);
EndDialog(0);
}
else
{
CInitValue ci;
ci.Init();
if( false == ci.Load( hKey ) )
{
m_bCheckSetup = TRUE;
}
if( false == CRenderOption::Load( hKey ) )
{
m_bCheckSetup = TRUE;
}
}
#endif
if( m_bCheckSetup )
{
OnBnClickedButtonSetup();
}
if( m_bBGMPlay == TRUE && m_pStreamSound )
{
m_bBGMPlay = FALSE;
m_pStreamSound->Stop( 1 );
}
#if defined(_NATION_KR_)
CString strDRParam;
STARTUPINFO dr_si={sizeof(STARTUPINFO),0,};
PROCESS_INFORMATION dr_pi;
// strDRParam.Format( "\"%s\\DumpReporter.exe\" %s %d",
// m_strRYLFolder.GetBuffer(0),
strDRParam.Format( "\"%s\" %s %d",
m_strRYLFolder+"\\DumpReporter.exe",
#if defined(_TEST_)
"0",
#elif defined(_REGULAR_)
"1",
#elif defined(_BG_)
"2",
#endif
GetLocalClientVersion());
#if defined(_TEST_)
// DumpReporter <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD>
/*BOOL bDRRet = CreateProcess( m_strRYLFolder + "\\DumpReporter.exe", strDRParam.GetBuffer( 0 ), NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,m_strRYLFolder,&dr_si,&dr_pi);
if( bDRRet == TRUE )
{
WaitForSingleObject( dr_pi.hProcess, INFINITE );
}*/
//system( strDRParam.GetBuffer(0) );
#endif // defined(_TEST_)
#endif // defined(_NATION_KR_)
CString strParam;
STARTUPINFO si={sizeof(STARTUPINFO),0,};
PROCESS_INFORMATION pi;
strParam.Format( "%s %d %s",
inet_ntoa(m_ServerListData.m_ServerGroup[nServer].m_Address),
m_ServerListData.m_ServerGroup[nServer].m_Group,
AfxGetApp()->m_lpCmdLine);
BOOL bRet = CreateProcess( m_strRYLFolder + "\\Client.exe",
strParam.GetBuffer( 0 ), NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
DWORD dwErr = GetLastError();
}
static CString s_strMessage[ LOGIN_MSG_MAX_COUNT ];
void RYLLoginInitMessage(const char* szFolder)
{
s_strMessage[ LOGIN_MSG_SELECT_SERVER ]
#ifdef _NATION_KR_
= "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD>.";
#else
= "Select a server.";
#endif
s_strMessage[ LOGIN_MSG_LAUNCHER_ALREADY_RUNNING ]
#ifdef _NATION_KR_
= "<EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.";
#else
= "Launcher is already running.";
#endif
s_strMessage[ LOGIN_MSG_LAUNCHER_RESTART ]
#ifdef _NATION_KR_
= "<EFBFBD><EFBFBD>ó <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>.";
#else
= "Please restart launcher in order to update.";
#endif
s_strMessage[ LOGIN_MSG_FAIL_TO_CONNECT_TO_LOGIN_SERVER ]
#ifdef _NATION_KR_
= "<EFBFBD>α<EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>ٽ<EFBFBD> <20>õ<EFBFBD><C3B5>Ͻðڽ<C3B0><DABD>ϱ<EFBFBD>?";
#else
= "Failed to connect to login server. Try again ?";
#endif
s_strMessage[ LOGIN_MSG_FAIL_TO_GET_PATCHINFO ]
#ifdef _NATION_KR_
= "<EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.";
#else
= "Failed to get Patchinfo file.";
#endif
s_strMessage[ LOGIN_MSG_CLIENT_NOT_INSTALLED ]
#ifdef _NATION_KR_
= "ROW Online<6E><65> <20><>ġ<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.";
#else
= "Program is not installed correctly.";
#endif
s_strMessage[ LOGIN_MSG_CANNOT_FILECHECK_PATCH_IN_PROGRESS ]
#ifdef _NATION_KR_
= "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD>Դϴ<D4B4>. <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>˻縦 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽñ<D6BD> <20>ٶ<EFBFBD><D9B6>ϴ<EFBFBD>.";
#else
= "Cannot perform filecheck. File check in progress.";
#endif
s_strMessage[ LOGIN_MSG_CONFIRM_FILECHECK ]
#ifdef _NATION_KR_
= "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻縦 <20><><EFBFBD><EFBFBD><EFBFBD>Ͻðڽ<C3B0><DABD>ϱ<EFBFBD>?";
#else
= "Proceed file check ?";
#endif
s_strMessage[ LOGIN_MSG_CONNECTING_TO_LOGIN_SERVER ]
= "Connecting to Login Server";
s_strMessage[ LOGIN_MSG_CONNECTED_TO_LOGIN_SERVER_SUCCESSFULLY ]
= "Connected to Login Server successfully";
s_strMessage[ LOGIN_MSG_FAIL_TO_GET_SERVER_LIST ]
= "Failed to Get Server List";
s_strMessage[ LOGIN_MSG_LOADING_PATCHINFO_CACHE ]
= "Reading Patch info cache";
s_strMessage[ LOGIN_MSG_FAIL_TO_APPLY_PATCH ]
#ifdef _NATION_KR_
= "<EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.";
#else
= "Failed to apply patch. Error occured during patch process.";
#endif
s_strMessage[ LOGIN_MSG_FAIL_TO_GET_NOTICEINFO ]
#ifdef _NATION_KR_
= "NoticeInfo.dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۹޴µ<DEB4> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.";
#else
= "Failed to receive NoticeInfo.dat";
#endif
s_strMessage[ LOGIN_MSG_FAIL_TO_FILE_CHECK ]
#ifdef _NATION_KR_
= "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻翡 <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.";
#else
= "Error occured during file check.";
#endif
s_strMessage[ LOGIN_MSG_FILE_CHECK_FINISHED ]
#ifdef _NATION_KR_
= "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻簡 <20>Ϸ<EFBFBD><CFB7>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.";
#else
= "File check completed successfully.";
#endif
CString strMessageFilename;
strMessageFilename.Format( "%s%s", szFolder, "\\Message.dat" );
FILE *fp = fopen( strMessageFilename.GetBuffer( 0 ), "r" );
char strBuffer[ 1024 ];
if( fp )
{
for( int i=0; i < LOGIN_MSG_MAX_COUNT; i++ )
{
strBuffer[0] = '\0';
fgets( strBuffer, 1024, fp );
s_strMessage[ i ] = strBuffer;
}
}
}
const CString &RYLLoginGetMessage(int nMessage)
{
return s_strMessage[ nMessage ];
}
bool CRYLLoginDlg::ConnectToLoginServer()
{
char szAddress[MAX_PATH];
memset(szAddress, 0, sizeof(char) * MAX_PATH);
if( m_strLoginServerAddrFromRegistry != "" )
{
strncpy(szAddress, m_strLoginServerAddrFromRegistry, MAX_PATH);
}
else
{
#ifdef _INHOUSE_SERVER_
strncpy(szAddress, "220.73.177.155", MAX_PATH);
#else
IN_ADDR LoginAddress;
if (GetHostIPByDomain(LoginAddress, m_strDefaultLoginServerAddr))
{ strncpy(szAddress, inet_ntoa(LoginAddress), MAX_PATH); }
#endif
}
szAddress[MAX_PATH - 1] = 0;
CLauncherEventHandler* lpHandler = new CLauncherEventHandler(*this);
if (!m_pLoginSocket->ConnectToLoginServer(lpHandler, szAddress))
{
delete lpHandler;
return false;
}
return true;
}
bool CRYLLoginDlg::RequestServerList()
{
return (0 != m_pLoginSocket)
? m_pLoginSocket->ServerList(GetLocalClientVersion()) : false;
}
bool CRYLLoginDlg::ProcessServerList(DWORD dwClientVersionFromServer,
const char* szPatchAddressFromLoginServer, const SERVER_LIST& serverList)
{
m_ServerListData = serverList;
m_bServerClosed = (0 == m_ServerListData.m_ServerNum); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_strPatchUrlFromLoginServer.SetString(szPatchAddressFromLoginServer);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>ޱ⿡ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bCheckSucLoginData = TRUE;
// <20><>ġ <20>ޱ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> update manager<65><72> <20><><EFBFBD><EFBFBD>
DWORD dwLocalClientVersion = GetLocalClientVersion();
m_UpdateManager.SetVersion(dwLocalClientVersion);
for(int nServer = 0; nServer < m_ServerListData.m_ServerNum; ++nServer)
{
m_ServerList.AddString(
m_ServerListData.m_ServerGroup[nServer].m_Name);
}
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (dwLocalClientVersion < dwClientVersionFromServer)
{
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -> <20><>ġ <20><><EFBFBD><EFBFBD>
m_dwServerClientVersion = dwClientVersionFromServer;
// <20>ڵ<EFBFBD><DAB5><EFBFBD>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_bFileCheck = false;
unsigned int ThreadID = 0;
DWORD dwThread = _beginthreadex( NULL, 0, UpdateProgress, this, 0, &ThreadID );
}
else
{
// <20><>ġ <20><><EFBFBD>ʿ<EFBFBD> -> <20>ִϸ<D6B4><CFB8>̼ǵ<CCBC> <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_ConnectionState = CS_SERVERSELECT;
InvalidateRect(CRect(12, 655, 381, 528), FALSE);
SetPatchComplete(true);
}
m_pLoginSocket->Disconnect();
return true;
}
int CLauncherEventHandler::OnOpen(int iErrorCode)
{
if( 0 != iErrorCode)
{
// <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽõ<D3BD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
m_RylLoginDlg.SetLoginDisplayText("Connect to Login Server Failed");
if( IDCANCEL ==
AfxMessageBox( RYLLoginGetMessage(LOGIN_MSG_FAIL_TO_CONNECT_TO_LOGIN_SERVER), MB_OKCANCEL ) )
{
// edith
// PostQuitMessage(0);
}
else
{
// TODO : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>õ<EFBFBD>. Ÿ<≯<EFBFBD> ť<><C5A5> <20>ٲٴ<D9B2> <20>۾<EFBFBD><DBBE><EFBFBD> <20>ؾ<EFBFBD> <20><>.
m_RylLoginDlg.PutCommand(CDelayedConnectCmd::Create(m_RylLoginDlg, 5000));
}
}
else
{
LoginSocket* lpLoginSocket = m_RylLoginDlg.GetLoginSocket();
if(0 != lpLoginSocket)
{
lpLoginSocket->SetHandler(this);
}
m_RylLoginDlg.SetLoginDisplayText(
RYLLoginGetMessage(LOGIN_MSG_CONNECTED_TO_LOGIN_SERVER_SUCCESSFULLY));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD>մϴ<D5B4>.
m_RylLoginDlg.RequestServerList();
}
return 0;
}
int CLauncherEventHandler::OnClose()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>մϴ<D5B4>.
LoginSocket* lpLoginSocket = m_RylLoginDlg.GetLoginSocket();
if(0 != lpLoginSocket)
{
lpLoginSocket->ResetHandler(this);
}
return 0;
}
int CLauncherEventHandler::OnDispatch(PktBase* lpPktBase, INET_Addr& peerAddr)
{
if( lpPktBase->GetCmd() == 0x56 )
{
char szPatchURLFromLoginServer[MAX_PATH];
memset(szPatchURLFromLoginServer, 0, sizeof(char) * MAX_PATH);
SERVER_LIST serverList;
memset(&serverList, 0, sizeof(SERVER_LIST));
DWORD dwClientVersionFromServer = 0;
DWORD dwError = LoginSocket::HandleServerList(lpPktBase,
&dwClientVersionFromServer, szPatchURLFromLoginServer, &serverList);
if (0 == dwError && 0 != dwClientVersionFromServer)
{
szPatchURLFromLoginServer[MAX_PATH - 1] = 0;
m_RylLoginDlg.ProcessServerList(dwClientVersionFromServer,
szPatchURLFromLoginServer, serverList);
}
else if (10 == dwError)
{
// edith
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.
// AfxMessageBox( "Login Server is currently unavailable. \nPlease visit http://www.returnofwarrior.com for more information.");
// PostQuitMessage(0);
m_RylLoginDlg.SetLoginDisplayText(RYLLoginGetMessage(LOGIN_MSG_FAIL_TO_GET_SERVER_LIST));
}
else
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>ޱ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_RylLoginDlg.SetLoginDisplayText(RYLLoginGetMessage(LOGIN_MSG_FAIL_TO_GET_SERVER_LIST));
}
}
return 0;
}
void CRYLLoginDlg::OnBnClickedButtonStart()
{
if( m_ServerList.GetCurSel() == -1 )
{
AfxMessageBox( RYLLoginGetMessage( 0 ) );
return;
}
// <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ް<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
if(GetPatchComplete())
{
ShowWindow( SW_HIDE );
ExecuteClient( m_ServerList.GetCurSel() );
}
}
void CRYLLoginDlg::OnLbnDblclkListServer()
{
if( m_ServerList.GetCurSel() == -1 )
{
AfxMessageBox( RYLLoginGetMessage( 0 ) );
return;
}
// <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ް<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>.
if(GetPatchComplete())
{
ShowWindow( SW_HIDE );
ExecuteClient( m_ServerList.GetCurSel() );
}
}
void CRYLLoginDlg::OnLbnSelchangeListServer()
{
m_ServerList.Invalidate(FALSE);
m_ServerList.SetWindowPos( NULL, 510, 55, 135, 260, SWP_NOZORDER );
CRect rt;
rt.left = 510;
rt.right = 510+135;
rt.top = 55;
rt.bottom = 55+260;
InvalidateRect(&rt, FALSE);
}
HBRUSH CRYLLoginDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch(nCtlColor)
{
case CTLCOLOR_LISTBOX:
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB( 200,200,200 ));
return (HBRUSH)GetStockObject(NULL_BRUSH);
break;
}
return hbr;
}