382 lines
11 KiB
C++
382 lines
11 KiB
C++
#include "stdafx.h"
|
|
#include "Resource.h"
|
|
#include "AccountDlg.h"
|
|
#include "Tabs.h"
|
|
#include "MainWindow.h"
|
|
#include "ScriptEngine.h"
|
|
#include "GlobalMapImages.h"
|
|
#include "DBLayer.h"
|
|
#include "SEH_global.h"
|
|
#include "HWID.h"
|
|
#include "bot_interaction/BotIPC.h"
|
|
|
|
#ifdef _DEBUG
|
|
#include "Logger.h"
|
|
#endif
|
|
|
|
#define MAX_LOADSTRING 256
|
|
|
|
// Ãëîáàëüíûå ïåðåìåííûå:
|
|
HINSTANCE g_hInst; // òåêóùèé ýêçåìïëÿð
|
|
HWND g_hWnd; // ãëàâíîå îêíî ïðèëîæåíèÿ
|
|
HWND g_hWndTab; // TabControl ïðèëîæåíèÿ
|
|
TCHAR szTitle[MAX_LOADSTRING]; // Òåêñò ñòðîêè çàãîëîâêà
|
|
TCHAR szWindowClass[MAX_LOADSTRING]; // èìÿ êëàññà ãëàâíîãî îêíà
|
|
GlobalMapImages g_mapImg; // êàðòû
|
|
|
|
// Îòïðàâèòü îáúÿâëåíèÿ ôóíêöèé, âêëþ÷åííûõ â ýòîò ìîäóëü êîäà:
|
|
ATOM MyRegisterClass( HINSTANCE hInstance );
|
|
BOOL InitInstance( HINSTANCE, int );
|
|
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
|
|
INT_PTR CALLBACK About( HWND, UINT, WPARAM, LPARAM );
|
|
|
|
// ôóíêöèè îáðàáîòêè ñîîáùåíèé îêíà
|
|
LRESULT OnCreate();
|
|
LRESULT OnClose();
|
|
LRESULT OnDestroy();
|
|
LRESULT OnCommand( WPARAM wParam, LPARAM lParam );
|
|
LRESULT OnNotify( WPARAM wParam, LPARAM lParam );
|
|
LRESULT OnPaint();
|
|
LRESULT OnSize( WPARAM wParam, LPARAM lParam );
|
|
|
|
int APIENTRY _tWinMain( HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPTSTR lpCmdLine,
|
|
int nCmdShow )
|
|
{
|
|
UNREFERENCED_PARAMETER( hPrevInstance );
|
|
UNREFERENCED_PARAMETER( lpCmdLine );
|
|
MSG msg;
|
|
HACCEL hAccelTable;
|
|
//
|
|
#ifdef _DEBUG
|
|
FILE *error_logger_file = fopen( "L2OOGHelper.log", "wt" );
|
|
ErrorLogger_Init();
|
|
ErrorLogger_SetWarnMessageLevel( LOG_DEBUG );
|
|
ErrorLogger_SetAutoPrependErrorType( true );
|
|
ErrorLogger_Enable( true );
|
|
ErrorLogger_SetLogFile( error_logger_file );
|
|
log_error( LOG_OK, "L2OOGHelper: Debug build start\n" );
|
|
#endif // _DEBUG
|
|
|
|
// init Comctl32.dll
|
|
InitCommonControls();
|
|
|
|
#ifdef USE_SEH
|
|
// set default error mode and global exception handler
|
|
SetErrorMode(0); // Use the system default, which is to display all error dialog boxes.
|
|
SetUnhandledExceptionFilter( GlobalUnhandledExceptionFilter );
|
|
#ifdef _DEBUG
|
|
SEH_loadMap();
|
|
#endif
|
|
#endif // USE_SEH
|
|
|
|
#ifdef CHAT_USE_RICHEDIT // åñëè îïðåäåëåíî, çàãðóæàåò Riched20.dll (Äëÿ RichEdit êîíòðîëà)
|
|
HINSTANCE hInstDllRichEdit = LoadLibrary( TEXT("Riched20") );
|
|
if( !hInstDllRichEdit )
|
|
{
|
|
#ifdef _DEBUG
|
|
log_error( LOG_ERROR, "_tWinMain: cannot load Riched20.dll!" );
|
|
#endif
|
|
MessageBox( NULL, TEXT("RichEdit control class DLL cannot be loaded\n")
|
|
TEXT("(Riched20.dll not found)"),
|
|
TEXT("L2OogHelper: FATAL ERROR"), MB_ICONSTOP );
|
|
return -1;
|
|
}
|
|
#ifdef _DEBUG
|
|
log_error( LOG_DEBUG, "_tWinMain: Riched20.dll loaded OK\n" );
|
|
#endif
|
|
#endif // CHAT_USE_RICHEDIT
|
|
|
|
// verify HWID
|
|
if( !verifyHWID() ) return 0;
|
|
if( !verifyTimeLimit() ) return 0;
|
|
|
|
// init WinSock
|
|
WSADATA wsadata;
|
|
WSAStartup( MAKEWORD(2,0), &wsadata );
|
|
|
|
// init L2Packets
|
|
L2PNet_InitDefault();
|
|
L2PacketNames_Init();
|
|
L2Data_init();
|
|
L2Data_SM_init();
|
|
// init caching database layer (based on L2Packets L2Data_*)
|
|
DBLayer_init();
|
|
|
|
// init global map images maps directory
|
|
char aCurDir[256] = {0};
|
|
GetCurrentDirectoryA( 255, aCurDir );
|
|
strcat( aCurDir, "\\maps" );
|
|
g_mapImg.setMapsDir( aCurDir );
|
|
// init recipe data
|
|
L2Data_InitRecipes();
|
|
|
|
// init Bot interprocess communications
|
|
BotIPC::getInstance();
|
|
|
|
// Èíèöèàëèçàöèÿ ãëîáàëüíûõ ñòðîê
|
|
LoadString( hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING );
|
|
LoadString( hInstance, IDC_L2OOGHELPER, szWindowClass, MAX_LOADSTRING );
|
|
MyRegisterClass( hInstance );
|
|
// Âûïîëíèòü èíèöèàëèçàöèþ ïðèëîæåíèÿ:
|
|
if( !InitInstance( hInstance, nCmdShow ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
hAccelTable = LoadAccelerators( hInstance, MAKEINTRESOURCE(IDC_L2OOGHELPER) );
|
|
// Öèêë îñíîâíîãî ñîîáùåíèÿ:
|
|
while( GetMessage( &msg, NULL, 0, 0) )
|
|
{
|
|
if( !TranslateAccelerator( msg.hwnd, hAccelTable, &msg ) )
|
|
{
|
|
//if( !IsDialogMessage( msg.hwnd, &msg ) ) // êîñÿ÷îê òóòà, íî ìîãóò áûòü ïðîáëåìû ñ äî÷åðíèìè äèàëîãàìè
|
|
//{
|
|
TranslateMessage( &msg );
|
|
DispatchMessage( &msg );
|
|
//}
|
|
}
|
|
}
|
|
|
|
BotIPC::getInstance()->delAllMyProcessBots(); // safe cleanup
|
|
BotIPC::freeInstance();
|
|
|
|
L2Data_SM_free();
|
|
DBLayer_free();
|
|
|
|
WSACleanup();
|
|
|
|
g_mapImg.unloadAllSquares();
|
|
if( g_mapImg.getLoadedCount() > 0 )
|
|
{
|
|
MessageBox( NULL, TEXT("GlobalMapImages: not all images are unloaded!"),
|
|
TEXT("Warning! Potential memory leaks!"), MB_ICONWARNING );
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
log_error( LOG_OK, "Closing log; last message... Bye!\n" );
|
|
ErrorLogger_SetLogFile( stdout );
|
|
ErrorLogger_Enable( false );
|
|
if( error_logger_file ) fclose( error_logger_file );
|
|
error_logger_file = NULL;
|
|
#endif
|
|
|
|
return (int)msg.wParam;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// ÔÓÍÊÖÈß: MyRegisterClass()
|
|
//
|
|
// ÍÀÇÍÀ×ÅÍÈÅ: ðåãèñòðèðóåò êëàññ îêíà.
|
|
//
|
|
// ÊÎÌÌÅÍÒÀÐÈÈ:
|
|
//
|
|
// Ýòà ôóíêöèÿ è åå èñïîëüçîâàíèå íåîáõîäèìû òîëüêî â ñëó÷àå, åñëè íóæíî, ÷òîáû äàííûé êîä
|
|
// áûë ñîâìåñòèì ñ ñèñòåìàìè Win32, íå èìåþùèìè ôóíêöèè RegisterClassEx'
|
|
// êîòîðàÿ áûëà äîáàâëåíà â Windows 95. Âûçîâ ýòîé ôóíêöèè âàæåí äëÿ òîãî,
|
|
// ÷òîáû ïðèëîæåíèå ïîëó÷èëî "êà÷åñòâåííûå" ìåëêèå çíà÷êè è óñòàíîâèëî ñâÿçü
|
|
// ñ íèìè.
|
|
//
|
|
ATOM MyRegisterClass( HINSTANCE hInstance )
|
|
{
|
|
WNDCLASSEX wcex;
|
|
wcex.cbSize = sizeof(WNDCLASSEX);
|
|
wcex.style = CS_OWNDC; // | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
|
|
wcex.lpfnWndProc = WndProc;
|
|
wcex.cbClsExtra = 0;
|
|
wcex.cbWndExtra = 0;
|
|
wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_L2OOGHELPER) );
|
|
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
|
|
wcex.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
|
|
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_L2OOGHELPER);
|
|
wcex.lpszClassName = szWindowClass;
|
|
wcex.hIconSm = LoadIcon( wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL) );
|
|
return RegisterClassEx( &wcex );
|
|
}
|
|
|
|
//
|
|
// ÔÓÍÊÖÈß: InitInstance(HINSTANCE, int)
|
|
//
|
|
// ÍÀÇÍÀ×ÅÍÈÅ: ñîõðàíÿåò îáðàáîòêó ýêçåìïëÿðà è ñîçäàåò ãëàâíîå îêíî.
|
|
//
|
|
// ÊÎÌÌÅÍÒÀÐÈÈ:
|
|
//
|
|
// Â äàííîé ôóíêöèè äåñêðèïòîð ýêçåìïëÿðà ñîõðàíÿåòñÿ â ãëîáàëüíîé ïåðåìåííîé, à òàêæå
|
|
// ñîçäàåòñÿ è âûâîäèòñÿ íà ýêðàí ãëàâíîå îêíî ïðîãðàììû.
|
|
//
|
|
BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
|
|
{
|
|
HWND hWnd;
|
|
g_hInst = hInstance; // Ñîõðàíèòü äåñêðèïòîð ýêçåìïëÿðà â ãëîáàëüíîé ïåðåìåííîé
|
|
hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT, 0, 960 /*CW_USEDEFAULT*/, 695, NULL, NULL, hInstance, NULL );
|
|
if( !hWnd ) return FALSE;
|
|
ShowWindow( hWnd, nCmdShow );
|
|
UpdateWindow( hWnd );
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT OnCreate()
|
|
{
|
|
RECT r;
|
|
GetClientRect( g_hWnd, &r );
|
|
// init common controls :)
|
|
INITCOMMONCONTROLSEX icex;
|
|
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
|
icex.dwICC = ICC_TAB_CLASSES | ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES |
|
|
ICC_BAR_CLASSES | ICC_STANDARD_CLASSES | ICC_PROGRESS_CLASS;
|
|
InitCommonControlsEx( &icex );
|
|
// create tab control
|
|
g_hWndTab = CreateWindowEx( 0, WC_TABCONTROL, NULL,
|
|
WS_CHILD | WS_VISIBLE | TCS_MULTILINE | TCS_TABS,
|
|
0, 0, r.right - r.left, r.bottom - r.top, g_hWnd, NULL, g_hInst, NULL );
|
|
//
|
|
Tabs_Init();
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnClose()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnDestroy()
|
|
{
|
|
PostQuitMessage( 0 );
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnCommand( WPARAM wParam, LPARAM lParam )
|
|
{
|
|
int wmId, wmEvent;
|
|
wmId = LOWORD( wParam );
|
|
wmEvent = HIWORD( wParam );
|
|
switch( wmId )
|
|
{
|
|
case IDM_ABOUT:
|
|
DialogBox( g_hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), g_hWnd, About );
|
|
break;
|
|
case IDM_EXIT:
|
|
PostMessage( g_hWnd, WM_CLOSE, 0, 0 );
|
|
break;
|
|
case IDM_LINEAGE_ADD_ACC:
|
|
{
|
|
AccountDlg *dlg = new AccountDlg();
|
|
if( dlg->run( g_hWnd ) )
|
|
{
|
|
Account acc = dlg->getAccount();
|
|
Tabs_AddAccount( &acc );
|
|
}
|
|
delete dlg;
|
|
} break;
|
|
#ifdef _DEBUG
|
|
case ID_DEBUG_ENABLECON: ErrorLogger_EnableLoggingToConsole( true ); break;
|
|
case ID_DEBUG_DISABLECON: ErrorLogger_EnableLoggingToConsole( false ); break;
|
|
case ID_LOGLEVEL_OK: ErrorLogger_SetWarnMessageLevel( LOG_OK ); break;
|
|
case ID_LOGLEVEL_ERROR: ErrorLogger_SetWarnMessageLevel( LOG_ERROR ); break;
|
|
case ID_LOGLEVEL_WARN: ErrorLogger_SetWarnMessageLevel( LOG_WARNING ); break;
|
|
case ID_LOGLEVEL_USERAI: ErrorLogger_SetWarnMessageLevel( LOG_USERAI ); break;
|
|
case ID_LOGLEVEL_PACKETNAME: ErrorLogger_SetWarnMessageLevel( LOG_PACKETNAME ); break;
|
|
case ID_LOGLEVEL_DEBUG: ErrorLogger_SetWarnMessageLevel( LOG_DEBUG ); break;
|
|
case ID_LOGLEVEL_DEBUGDUMP: ErrorLogger_SetWarnMessageLevel( LOG_DEBUGDUMP ); break;
|
|
/*case ID_DEBUG_RUNTESTSCRIPT:
|
|
{
|
|
ScriptEngine se;
|
|
se.init();
|
|
se.startScript( "test.lua" );
|
|
se.deinit();
|
|
} break;*/
|
|
#endif
|
|
default:
|
|
return DefWindowProc( g_hWnd, WM_COMMAND, wParam, lParam );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnNotify( WPARAM wParam, LPARAM lParam )
|
|
{
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
LPNMHDR lpnmhdr = (LPNMHDR)lParam;
|
|
switch( lpnmhdr->code )
|
|
{
|
|
case TCN_SELCHANGING: Tabs_OnSelChanging( lpnmhdr ); break;
|
|
case TCN_SELCHANGE: Tabs_OnSelChange( lpnmhdr ); break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnPaint()
|
|
{
|
|
//RECT wr;
|
|
//GetWindowRect( hWnd, &wr );
|
|
//TCHAR tstr[256];
|
|
//wsprintf( tstr, TEXT("%d x %d"), wr.right - wr.left, wr.bottom - wr.top );
|
|
PAINTSTRUCT ps;
|
|
HDC hdc;
|
|
hdc = BeginPaint( g_hWnd, &ps );
|
|
// TODO: äîáàâüòå ëþáîé êîä îòðèñîâêè...
|
|
//TextOut( hdc, 0, 0, tstr, lstrlen(tstr) );
|
|
EndPaint( g_hWnd, &ps );
|
|
Tabs_OnPaint();
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnSize( WPARAM wParam, LPARAM lParam )
|
|
{
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
/*lParam:
|
|
The low-order word of lParam specifies the new width of the client area.
|
|
The high-order word of lParam specifies the new height of the client area.*/
|
|
int w = LOWORD( lParam );
|
|
int h = HIWORD( lParam );
|
|
// resize tab
|
|
MoveWindow( g_hWndTab, 0, 0, w, h, TRUE );
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnMyDeleteTab( LPARAM lParam )
|
|
{
|
|
Tabs_DeleteTab( (int)lParam );
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( message )
|
|
{
|
|
case WM_CREATE:
|
|
{
|
|
g_hWnd = hWnd;
|
|
return OnCreate();
|
|
} break;
|
|
case WM_COMMAND: return OnCommand( wParam, lParam ); break;
|
|
case WM_PAINT: return OnPaint(); break;
|
|
case WM_DESTROY: return OnDestroy(); break;
|
|
case WM_SIZE: return OnSize( wParam, lParam ); break;
|
|
case WM_NOTIFY: return OnNotify( wParam, lParam ); break;
|
|
case WMMY_DELETETAB: return OnMyDeleteTab( lParam ); break;
|
|
}
|
|
return DefWindowProc( hWnd, message, wParam, lParam );
|
|
}
|
|
|
|
// Îáðàáîò÷èê ñîîáùåíèé äëÿ îêíà "Î ïðîãðàììå".
|
|
INT_PTR CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
switch( message )
|
|
{
|
|
case WM_INITDIALOG: return (INT_PTR)TRUE;
|
|
case WM_COMMAND:
|
|
if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL )
|
|
{
|
|
EndDialog( hDlg, LOWORD(wParam) );
|
|
return (INT_PTR)TRUE;
|
|
}
|
|
break;
|
|
}
|
|
return (INT_PTR)FALSE;
|
|
}
|