l2-unlegits/l2detect/RadarSetupDlg_QuickTarget.cpp
2012-02-01 05:25:08 +00:00

284 lines
10 KiB
C++
Raw Blame History

#include "stdafx.h"
#include "Resource.h"
#include "Logger.h"
#include "GameClient.h"
#include "DlgPressKey.h"
#include "windowUtils.h"
#include "RadarSetupDlg_QuickTarget_distPri.h"
extern HINSTANCE g_radardll_hinst;
extern class GameClient *g_game_client; // in main.cpp
INT_PTR CALLBACK QuickTarget_DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
HWND RadarSetupDlg_QuickTarget_Create( HWND hWndParent )
{
return CreateDialogParam( g_radardll_hinst, MAKEINTRESOURCE(IDD_SR_QUICKTARGET),
hWndParent, QuickTarget_DlgProc, 0 );
}
// =========================================================
void QuickTarget_Init( HWND hDlg );
void QuickTarget_OnDestroy( HWND hDlg );
void QuickTarget_OnApply( HWND hDlg );
void QuickTarget_OnNotify( HWND hDlg, LPARAM lParam );
void QuickTarget_OnLvBeginLabelEdit( HWND hDlg, LPNMHDR pnmh );
void QuickTarget_OnLvEndLabelEdit( HWND hDlg, LPNMHDR pnmh );
void QuickTarget_OnLvDoubleClick( HWND hDlg, LPNMHDR pnmh );
void QuickTarget_OnLvColumnClick( HWND hDlg, LPNMHDR pnmh );
void QuickTarget_FillClassList( HWND hDlg );
void QuickTarget_DisplayKey( HWND hDlg, int vkey );
void QuickTarget_SetKey( HWND hDlg );
INT_PTR CALLBACK QuickTarget_DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER(lParam);
switch( uMsg )
{
case WM_INITDIALOG: QuickTarget_Init( hDlg ); break;
case WM_DESTROY: { QuickTarget_OnDestroy( hDlg ); return FALSE; } break;
case WM_NOTIFY: QuickTarget_OnNotify( hDlg, lParam ); break;
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDC_APPLY: QuickTarget_OnApply( hDlg ); break;
case IDC_B_SET_TARGET_KEY: QuickTarget_SetKey( hDlg ); break;
case IDC_B_DISTANCE_SETUP: RadarSetupDlg_QuickTarget_SetupDistancePriorities( hDlg ); break;
}
} break;
default: return FALSE; break;
}
return TRUE;
}
void QuickTarget_Init( HWND hDlg )
{
// force UserAI to reload config file
g_game_client->ai.cfgQuickTarg.loadFromFile( "L2Detect_quickTarg.ini" );
// init class pri list view
HWND hWndClassList = GetDlgItem( hDlg, IDC_CLASSLIST );
WULV_SetExtStyle( hWndClassList, true, true );
WULV_InsertColumn( hWndClassList, TEXT("class"), 120, 0 );
WULV_InsertColumn( hWndClassList, TEXT("pri"), 35, 1 );
// init tab
HWND hwndTab = GetDlgItem( hDlg, IDC_TAB1 );
WUTab_InsertItem( hwndTab, TEXT("PC list"), 0 );
WUTab_InsertItem( hwndTab, TEXT("Enemy list"), 1 );
//
QuickTarget_FillClassList( hDlg );
QuickTarget_DisplayKey( hDlg, g_game_client->ai.cfgQuickTarg.getKey() );
SetDlgItemInt( hDlg, IDC_E_MAXDIST, g_game_client->ai.cfgQuickTarg.getMaxDist(), FALSE );
CheckDlgButton( hDlg, IDC_C_SHOUT_TARGET_IN_PARTY_CHAT, g_game_client->ai.cfgQuickTarg.getAnnounceTargetInPartyChat() );
//CheckDlgButton( hDlg, IDC_C_DONT_TARGET_DEAD, g_game_client->ai.cfgQuickTarg.opt_dontTargetDead() );
//CheckDlgButton( hDlg, IDC_C_DONT_TARGET_PARTY, g_game_client->ai.cfgQuickTarg.opt_dontTargetParty() );
//CheckDlgButton( hDlg, IDC_C_DONT_TARGET_CLAN, g_game_client->ai.cfgQuickTarg.opt_dontTargetClan() );
//CheckDlgButton( hDlg, IDC_C_DONT_TARGET_ALLY, g_game_client->ai.cfgQuickTarg.opt_dontTargetAlly() );
//CheckDlgButton( hDlg, IDC_C_TARGET_ONLY_CW, g_game_client->ai.cfgQuickTarg.opt_targetOnlyCW() );
//CheckDlgButton( hDlg, IDC_C_TARGET_ALSO_PK, g_game_client->ai.cfgQuickTarg.opt_allowTargetPK() );
//CheckDlgButton( hDlg, IDC_C_TARGET_ALSO_FLAGGED, g_game_client->ai.cfgQuickTarg.opt_allowTargetFlagged() );
}
void QuickTarget_OnDestroy( HWND hDlg )
{
UNREFERENCED_PARAMETER(hDlg);
}
void QuickTarget_OnApply( HWND hDlg )
{
HWND hWndClassList = GetDlgItem( hDlg, IDC_CLASSLIST );
// apply class priorities
ClassPriorities *pri = g_game_client->ai.cfgQuickTarg.getClassPriorities();
wchar_t spri[32];
int iItem = -1;
iItem = ListView_GetNextItem( hWndClassList, iItem, LVNI_ALL );
while( iItem != -1 )
{
int classId = WULV_GetItemLPARAM( hWndClassList, iItem );
*((int *)(&spri[0])) = 0;
WULV_GetItemText( hWndClassList, iItem, 1, spri, 31 );
int ipri = 0;
swscanf( spri, L"%d", &ipri );
pri->setPriForClass( classId, ipri );
iItem = ListView_GetNextItem( hWndClassList, iItem, LVNI_ALL );
}
// apply hotkey
int hotkey_vcode = 0;
GetDlgItemText( hDlg, IDC_E_KEY, spri, 31 );
swscanf( spri, L"%d", &hotkey_vcode );
g_game_client->ai.cfgQuickTarg.setKey( hotkey_vcode );
// apply max dist
g_game_client->ai.cfgQuickTarg.setMaxDist( (int)GetDlgItemInt( hDlg, IDC_E_MAXDIST, NULL, FALSE ) );
// apply shout in party
g_game_client->ai.cfgQuickTarg.setAnnounceTargetInPartyChat( (int)GetDlgItemInt( hDlg, IDC_C_SHOUT_TARGET_IN_PARTY_CHAT, NULL, FALSE ) );
// apply "don't" checks
/*g_game_client->ai.cfgQuickTarg.setTargetParams(
IsDlgButtonChecked( hDlg, IDC_C_DONT_TARGET_DEAD ),
IsDlgButtonChecked( hDlg, IDC_C_DONT_TARGET_PARTY ),
IsDlgButtonChecked( hDlg, IDC_C_DONT_TARGET_CLAN ),
IsDlgButtonChecked( hDlg, IDC_C_DONT_TARGET_ALLY ),
IsDlgButtonChecked( hDlg, IDC_C_TARGET_ONLY_CW ),
IsDlgButtonChecked( hDlg, IDC_C_TARGET_ALSO_PK ),
IsDlgButtonChecked( hDlg, IDC_C_TARGET_ALSO_FLAGGED ),
IsDlgButtonChecked( hDlg, IDC_C_SHOUT_TARGET_IN_PARTY_CHAT )
);*/
// save config to file
g_game_client->ai.cfgQuickTarg.saveToFile( "L2Detect_quickTarg.ini" );
}
void QuickTarget_FillClassList( HWND hDlg )
{
HWND hWndClassList = GetDlgItem( hDlg, IDC_CLASSLIST );
SendMessage( hWndClassList, LVM_DELETEALLITEMS, 0, 0 ); // clear LV
ClassPriorities *pri = g_game_client->ai.cfgQuickTarg.getClassPriorities();
int i;
for( i=0; i<L2MaxClasses; i++ )
{
const char *acn = L2Data_getClass( i );
if( acn )
{
wchar_t wcn[128]; wcn[0] = 0;
MultiByteToWideChar( CP_ACP, 0, acn, -1, wcn, 127 );
int ipri = pri->getPriForClass( i );
if( ipri >= 0 )
{
int added_item_index = WULV_InsertItem( hWndClassList, wcn, 999, (LPARAM)i );
swprintf( wcn, 127, L"%d", ipri );
WULV_SetItem( hWndClassList, wcn, added_item_index, 1 );
}
}
}
}
void QuickTarget_DisplayKey( HWND hDlg, int vkey )
{
wchar_t sz[64];
wchar_t szz[32];
swprintf( sz, 63, L"%d ", vkey ); // vkey code
if( ( (vkey>='A') && (vkey<='Z') ) || ( (vkey>='0') && (vkey<='9') ) )
{
swprintf( szz, 31, _T("'%c'"), vkey );
wcscat( sz, szz );
}
else
{
switch( vkey )
{
case VK_ESCAPE: wcscat( sz, L"Esc" ); break;
case VK_OEM_3: wcscat( sz, L"~" ); break;
case VK_SNAPSHOT: wcscat( sz, L"PrtScr" ); break;
case VK_SCROLL: wcscat( sz, L"ScrollLock" ); break;
case VK_PAUSE: wcscat( sz, L"Pause" ); break;
case VK_RETURN: wcscat( sz, L"Enter" ); break;
case VK_SPACE: wcscat( sz, L"Spacebar" ); break;
// TODO: other key codes... <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
}
}
SetDlgItemTextW( hDlg, IDC_E_KEY, sz );
}
void QuickTarget_SetKey( HWND hDlg )
{
int vkey = DlgPressKey_InputPressKey( hDlg );
if( vkey <= 0 ) return;
QuickTarget_DisplayKey( hDlg, vkey );
}
void QuickTarget_OnNotify( HWND hDlg, LPARAM lParam )
{
LPNMHDR pnmh = (LPNMHDR)lParam;
HWND hwndLV = GetDlgItem( hDlg, IDC_CLASSLIST );
if( hwndLV == pnmh->hwndFrom ) // if notification from ClassList ListView
{
switch( pnmh->code )
{
case LVN_BEGINLABELEDIT: QuickTarget_OnLvBeginLabelEdit( hDlg, pnmh ); break;
case LVN_ENDLABELEDIT: QuickTarget_OnLvEndLabelEdit( hDlg, pnmh ); break;
case NM_DBLCLK: QuickTarget_OnLvDoubleClick( hDlg, pnmh ); break;
case LVN_COLUMNCLICK: QuickTarget_OnLvColumnClick( hDlg, pnmh ); break;
}
}
}
void QuickTarget_OnLvBeginLabelEdit( HWND hDlg, LPNMHDR pnmh )
{
HWND hwndLV = GetDlgItem( hDlg, IDC_CLASSLIST );
HWND hwndEdit = (HWND)SendMessage( hwndLV, LVM_GETEDITCONTROL, 0, 0 );
if( !hwndEdit ) return;
NMLVDISPINFO *pnmlvdispinfo = (NMLVDISPINFO *)pnmh;
int iItem = pnmlvdispinfo->item.iItem;
wchar_t pri_text[128] = {0};
WULV_GetItemText( hwndLV, iItem, 1, pri_text, 127 );
DWORD dwOldEditStyle = GetWindowLong( hwndEdit, GWL_STYLE );
SetWindowLong( hwndEdit, GWL_STYLE, dwOldEditStyle | ES_NUMBER ); // allow only number input
SetWindowText( hwndEdit, pri_text );
}
void QuickTarget_OnLvEndLabelEdit( HWND hDlg, LPNMHDR pnmh )
{
HWND hwndLV = GetDlgItem( hDlg, IDC_CLASSLIST );
NMLVDISPINFO *pnmlvdispinfo = (NMLVDISPINFO *)pnmh;
int iItem = pnmlvdispinfo->item.iItem;
wchar_t *newText = pnmlvdispinfo->item.pszText;
if( !newText ) return;
int new_pri = 0;
swscanf( newText, L"%d", &new_pri );
wchar_t ttext[32];
swprintf( ttext, 31, L"%d", new_pri );
WULV_SetItem( hwndLV, ttext, iItem, 1 );
}
void QuickTarget_OnLvDoubleClick( HWND hDlg, LPNMHDR pnmh )
{
UNREFERENCED_PARAMETER(hDlg);
NMITEMACTIVATE *p = (NMITEMACTIVATE *)pnmh;
ListView_EditLabel( pnmh->hwndFrom, p->iItem );
}
int CALLBACK QuickTarget_LVCompareFunc1( LPARAM iItem1, LPARAM iItem2, LPARAM lpHWND );
int CALLBACK QuickTarget_LVCompareFunc2( LPARAM iItem1, LPARAM iItem2, LPARAM lpHWND );
void QuickTarget_OnLvColumnClick( HWND hDlg, LPNMHDR pnmh )
{
UNREFERENCED_PARAMETER(hDlg);
int iCol = ((NMLISTVIEW *)pnmh)->iSubItem;
switch( iCol )
{
case 0: ListView_SortItemsEx( pnmh->hwndFrom, QuickTarget_LVCompareFunc1, (LPARAM)pnmh->hwndFrom ); break;
case 1: ListView_SortItemsEx( pnmh->hwndFrom, QuickTarget_LVCompareFunc2, (LPARAM)pnmh->hwndFrom ); break;
}
}
// sort by class name A -> Z
int CALLBACK QuickTarget_LVCompareFunc1( LPARAM iItem1, LPARAM iItem2, LPARAM lpHWND )
{
HWND hwndLV = (HWND)lpHWND;
TCHAR text1[256], text2[256];
text1[0] = text2[0] = 0;
WULV_GetItemText( hwndLV, iItem1, 0, text1, 255 );
WULV_GetItemText( hwndLV, iItem2, 0, text2, 255 );
return _tcscmp( text1, text2 );
}
// sort by priority 999 -> 0
int CALLBACK QuickTarget_LVCompareFunc2( LPARAM iItem1, LPARAM iItem2, LPARAM lpHWND )
{
HWND hwndLV = (HWND)lpHWND;
TCHAR text1[256], text2[256];
text1[0] = text2[0] = 0;
WULV_GetItemText( hwndLV, iItem1, 1, text1, 255 );
WULV_GetItemText( hwndLV, iItem2, 1, text2, 255 );
int pri1 = 0, pri2 = 0;
_stscanf( text1, _T("%d"), &pri1 );
_stscanf( text2, _T("%d"), &pri2 );
if( pri1 == pri2 ) return 0;
if( pri1 > pri2 ) return -1;
return 1;
}