409 lines
12 KiB
C++
409 lines
12 KiB
C++
#include "stdafx.h"
|
|
#include "Resource.h"
|
|
#include "Logger.h"
|
|
#include "HealItemsTable.h"
|
|
#include "GameClient.h"
|
|
#include "Dlg_FindInDB.h"
|
|
|
|
extern HINSTANCE g_radardll_hinst;
|
|
extern class GameClient *g_game_client; // in main.cpp
|
|
|
|
INT_PTR CALLBACK SelfHealSetup_DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
|
|
|
HWND RadarSetupDlg_SelfHeal_Create( HWND hWndParent )
|
|
{
|
|
return CreateDialogParam( g_radardll_hinst, MAKEINTRESOURCE(IDD_SR_SELFHEAL),
|
|
hWndParent, SelfHealSetup_DlgProc, 0 );
|
|
}
|
|
|
|
HealItemsTable *rssh_hit;
|
|
int rssh_cur_sel;
|
|
//HWND SelfHealSetup_saveHWND;
|
|
|
|
void SelfHealSetup_Init( HWND hDlg );
|
|
void SelfHealSetup_OnDestroy( HWND hDlg );
|
|
void SelfHealSetup_OnCombo1Event( HWND hDlg, WPARAM wParam, LPARAM lParam );
|
|
void SelfHealSetup_fillList( HWND hDlg );
|
|
void SelfHealSetup_OnApply( HWND hDlg );
|
|
void SelfHealSetup_OnAdd( HWND hDlg );
|
|
void SelfHealSetup_OnDel( HWND hDlg );
|
|
void SelfHealSetup_OnEdit( HWND hDlg );
|
|
|
|
INT_PTR CALLBACK EditHealItem_DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
|
HealItem *RS_StartHealItemAdd( HWND hWndParent );
|
|
BOOL RS_StartHealItemEdit( HWND hWndParent, HealItem *current );
|
|
|
|
INT_PTR CALLBACK SelfHealSetup_DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG: SelfHealSetup_Init( hDlg ); break;
|
|
case WM_DESTROY: { SelfHealSetup_OnDestroy( hDlg ); return FALSE; } break;
|
|
case WM_COMMAND:
|
|
{
|
|
switch( LOWORD(wParam) )
|
|
{
|
|
case IDC_COMBO1: SelfHealSetup_OnCombo1Event( hDlg, wParam, lParam ); break;
|
|
case IDC_APPLY: SelfHealSetup_OnApply( hDlg ); break;
|
|
case IDC_DEL: SelfHealSetup_OnDel( hDlg ); break;
|
|
case IDC_ADD: SelfHealSetup_OnAdd( hDlg ); break;
|
|
case IDC_EDIT: SelfHealSetup_OnEdit( hDlg ); break;
|
|
}
|
|
} break;
|
|
default: return FALSE; break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void SelfHealSetup_Init( HWND hDlg )
|
|
{
|
|
//log_error( LOG_OK, "init\n" );
|
|
//SelfHealSetup_saveHWND = hDlg;
|
|
//
|
|
rssh_hit = new HealItemsTable();
|
|
rssh_hit->clear();
|
|
rssh_hit->LoadFromFile( "L2Detect_healItems.ini" );
|
|
//
|
|
HWND h = GetDlgItem( hDlg, IDC_COMBO1 );
|
|
SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("HP Healing") );
|
|
SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("MP Healing") );
|
|
SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("CP Healing") );
|
|
SendMessage( h, CB_SETCURSEL, 0, 0 );
|
|
rssh_cur_sel = 0;
|
|
//
|
|
h = GetDlgItem( hDlg, IDC_LISTITEMS );
|
|
DWORD dwLvExStyle = LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
|
|
SendMessage( h, LVM_SETEXTENDEDLISTVIEWSTYLE, (WPARAM)dwLvExStyle, (LPARAM)dwLvExStyle );
|
|
int i = 0;
|
|
TCHAR text[256] = {0};
|
|
LVCOLUMN lvc;
|
|
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
|
lvc.cx = 180;
|
|
lvc.fmt = LVCFMT_LEFT;
|
|
lvc.iSubItem = i;
|
|
lvc.pszText = text;
|
|
lstrcpy( text, TEXT("Item name") );
|
|
SendMessage( h, LVM_INSERTCOLUMN, i++, (LPARAM)&lvc );
|
|
lvc.cx = 55;
|
|
lvc.iSubItem = i;
|
|
lvc.pszText = text;
|
|
lstrcpy( text, TEXT("itemID") );
|
|
SendMessage( h, LVM_INSERTCOLUMN, i++, (LPARAM)&lvc );
|
|
lvc.cx = 40;
|
|
lvc.iSubItem = i;
|
|
lvc.pszText = text;
|
|
lstrcpy( text, TEXT("pri") );
|
|
SendMessage( h, LVM_INSERTCOLUMN, i++, (LPARAM)&lvc );
|
|
lvc.cx = 50;
|
|
lvc.iSubItem = i;
|
|
lvc.pszText = text;
|
|
lstrcpy( text, TEXT("% use") );
|
|
SendMessage( h, LVM_INSERTCOLUMN, i++, (LPARAM)&lvc );
|
|
SelfHealSetup_fillList( hDlg );
|
|
lvc.cx = 70;
|
|
lvc.iSubItem = i;
|
|
lvc.pszText = text;
|
|
lstrcpy( text, TEXT("delay,ms") );
|
|
SendMessage( h, LVM_INSERTCOLUMN, i++, (LPARAM)&lvc );
|
|
SelfHealSetup_fillList( hDlg );
|
|
}
|
|
|
|
//void SelfHealSetup_OnOK( HWND hDlg )
|
|
//{
|
|
// EndDialog( hDlg, IDOK );
|
|
//}
|
|
//
|
|
//void SelfHealSetup_OnCancel( HWND hDlg )
|
|
//{
|
|
// log_error( LOG_OK, "cancel\n" );
|
|
// EndDialog( hDlg, IDCANCEL );
|
|
//}
|
|
|
|
void SelfHealSetup_OnDestroy( HWND hDlg )
|
|
{
|
|
UNREFERENCED_PARAMETER(hDlg);
|
|
rssh_hit->clear();
|
|
delete rssh_hit;
|
|
rssh_hit = NULL;
|
|
//log_error( LOG_OK, "close\n" );
|
|
}
|
|
|
|
void SelfHealSetup_OnCombo1Event( HWND hDlg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
HWND h = GetDlgItem( hDlg, IDC_COMBO1 );
|
|
int ctrlCode = LOWORD(wParam);
|
|
int evt = HIWORD(wParam);
|
|
if( (ctrlCode == IDC_COMBO1) && (evt == CBN_SELCHANGE) )
|
|
{
|
|
rssh_cur_sel = (int)SendMessage( h, CB_GETCURSEL, 0, 0 );
|
|
//log_error( LOG_OK, "CBN_SELCHANGE %d\n", rssh_cur_sel );
|
|
SelfHealSetup_fillList( hDlg );
|
|
}
|
|
}
|
|
|
|
void SelfHealSetup_fillList( HWND hDlg )
|
|
{
|
|
//CheckDlgButton( hDlg, IDC_C_ENABLED, 0 );
|
|
switch( rssh_cur_sel )
|
|
{
|
|
case 0: CheckDlgButton( hDlg, IDC_C_ENABLED, rssh_hit->enableHealHP ); break;
|
|
case 1: CheckDlgButton( hDlg, IDC_C_ENABLED, rssh_hit->enableHealMP ); break;
|
|
case 2: CheckDlgButton( hDlg, IDC_C_ENABLED, rssh_hit->enableHealCP ); break;
|
|
}
|
|
HWND h;
|
|
h = GetDlgItem( hDlg, IDC_LISTITEMS );
|
|
SendMessage( h, LVM_DELETEALLITEMS, 0, 0 );
|
|
HealItem hi;
|
|
int i;
|
|
bool bLoop = true;
|
|
i = 0;
|
|
LVITEM lvi;
|
|
int added_item;
|
|
TCHAR text[256] = {0};
|
|
lvi.iItem = 0;
|
|
lvi.iSubItem = 0;
|
|
lvi.lParam = 0;
|
|
lvi.mask = LVIF_TEXT | LVIF_PARAM;
|
|
lvi.pszText = text;
|
|
while( bLoop )
|
|
{
|
|
if( rssh_cur_sel == 0 ) bLoop = rssh_hit->getHPItem( i, hi );
|
|
if( rssh_cur_sel == 1 ) bLoop = rssh_hit->getMPItem( i, hi );
|
|
if( rssh_cur_sel == 2 ) bLoop = rssh_hit->getCPItem( i, hi );
|
|
if( !bLoop ) break;
|
|
//
|
|
#ifdef UNICODE
|
|
hi.GetItemNameW( text );
|
|
#else
|
|
lstrcpy( text, hi.itemName );
|
|
#endif
|
|
lvi.mask = LVIF_TEXT | LVIF_PARAM;
|
|
lvi.pszText = text;
|
|
lvi.iItem = 999;
|
|
lvi.iSubItem = 0;
|
|
lvi.lParam = i;
|
|
added_item = (int)SendMessage( h, LVM_INSERTITEM, 0, (LPARAM)&lvi );
|
|
//
|
|
lvi.mask = LVIF_TEXT;
|
|
wsprintf( text, TEXT("%u"), hi.itemID );
|
|
lvi.lParam = 0;
|
|
lvi.pszText = text;
|
|
lvi.iItem = added_item;
|
|
lvi.iSubItem = 1;
|
|
SendMessage( h, LVM_SETITEM, 0, (LPARAM)&lvi );
|
|
//
|
|
wsprintf( text, TEXT("%d"), hi.priority );
|
|
lvi.pszText = text;
|
|
lvi.iItem = added_item;
|
|
lvi.iSubItem = 2;
|
|
SendMessage( h, LVM_SETITEM, 0, (LPARAM)&lvi );
|
|
//
|
|
wsprintf( text, TEXT("%d"), hi.percentUse );
|
|
lvi.pszText = text;
|
|
lvi.iItem = added_item;
|
|
lvi.iSubItem = 3;
|
|
SendMessage( h, LVM_SETITEM, 0, (LPARAM)&lvi );
|
|
//
|
|
wsprintf( text, TEXT("%u"), hi.reuseDelayMsec );
|
|
lvi.pszText = text;
|
|
lvi.iItem = added_item;
|
|
lvi.iSubItem = 4;
|
|
SendMessage( h, LVM_SETITEM, 0, (LPARAM)&lvi );
|
|
//
|
|
i++;
|
|
}
|
|
}
|
|
|
|
void SelfHealSetup_OnApply( HWND hDlg )
|
|
{
|
|
//log_error( LOG_OK, "SelfHealSetup_OnApply\n" );
|
|
int enabled = IsDlgButtonChecked( hDlg, IDC_C_ENABLED );
|
|
switch( rssh_cur_sel )
|
|
{
|
|
case 0: rssh_hit->enableHealHP = enabled; break;
|
|
case 1: rssh_hit->enableHealMP = enabled; break;
|
|
case 2: rssh_hit->enableHealCP = enabled; break;
|
|
}
|
|
switch( rssh_cur_sel )
|
|
{
|
|
case 0: g_game_client->ai.setEnableHealHP( enabled ); break;
|
|
case 1: g_game_client->ai.setEnableHealMP( enabled ); break;
|
|
case 2: g_game_client->ai.setEnableHealCP( enabled ); break;
|
|
}
|
|
rssh_hit->SaveToFile( "L2Detect_healItems.ini" );
|
|
g_game_client->ai.setHealItemsTable( rssh_hit );
|
|
}
|
|
|
|
void SelfHealSetup_OnAdd( HWND hDlg )
|
|
{
|
|
HealItemsTable::HEALITEM_TYPE hi_type;
|
|
switch( rssh_cur_sel )
|
|
{
|
|
case 0: hi_type = HealItemsTable::HIT_HP; break;
|
|
case 1: hi_type = HealItemsTable::HIT_MP; break;
|
|
case 2: hi_type = HealItemsTable::HIT_CP; break;
|
|
default: return; break;
|
|
}
|
|
HealItem *hi = RS_StartHealItemAdd( hDlg );
|
|
if( hi )
|
|
{
|
|
hi->lastUseTime = GetTickCount() - hi->reuseDelayMsec - 1000; // :)
|
|
rssh_hit->addHealItem( hi_type, hi ); // TODO!
|
|
SelfHealSetup_fillList( hDlg );
|
|
delete hi;
|
|
}
|
|
}
|
|
|
|
void SelfHealSetup_OnDel( HWND hDlg )
|
|
{
|
|
HWND hwndLV = GetDlgItem( hDlg, IDC_LISTITEMS );
|
|
int cur_sel = ListView_GetNextItem( hwndLV, -1, LVNI_SELECTED );
|
|
if( cur_sel == -1 ) return;
|
|
LVITEM lvi;
|
|
lvi.iItem = cur_sel;
|
|
lvi.iSubItem = 0;
|
|
lvi.mask = LVIF_PARAM;
|
|
lvi.lParam = 0;
|
|
ListView_GetItem( hwndLV, &lvi );
|
|
ListView_DeleteItem( hwndLV, cur_sel );
|
|
if( rssh_cur_sel == 0 ) rssh_hit->delItemFromTable( HealItemsTable::HIT_HP, lvi.lParam );
|
|
if( rssh_cur_sel == 1 ) rssh_hit->delItemFromTable( HealItemsTable::HIT_MP, lvi.lParam );
|
|
if( rssh_cur_sel == 2 ) rssh_hit->delItemFromTable( HealItemsTable::HIT_CP, lvi.lParam );
|
|
SelfHealSetup_fillList( hDlg );
|
|
}
|
|
|
|
void SelfHealSetup_OnEdit( HWND hDlg )
|
|
{
|
|
HealItemsTable::HEALITEM_TYPE hi_type;
|
|
switch( rssh_cur_sel )
|
|
{
|
|
case 0: hi_type = HealItemsTable::HIT_HP; break;
|
|
case 1: hi_type = HealItemsTable::HIT_MP; break;
|
|
case 2: hi_type = HealItemsTable::HIT_CP; break;
|
|
default: return; break;
|
|
}
|
|
HWND hwndLV = GetDlgItem( hDlg, IDC_LISTITEMS );
|
|
int cur_sel = ListView_GetNextItem( hwndLV, -1, LVNI_SELECTED );
|
|
if( cur_sel == -1 ) return;
|
|
LVITEM lvi;
|
|
lvi.iItem = cur_sel;
|
|
lvi.iSubItem = 0;
|
|
lvi.mask = LVIF_PARAM;
|
|
lvi.lParam = 0;
|
|
ListView_GetItem( hwndLV, &lvi );
|
|
int idx = lvi.lParam;
|
|
HealItem current;
|
|
switch( rssh_cur_sel )
|
|
{
|
|
case 0: rssh_hit->getHPItem( idx, current ); break;
|
|
case 1: rssh_hit->getMPItem( idx, current ); break;
|
|
case 2: rssh_hit->getCPItem( idx, current ); break;
|
|
}
|
|
if( RS_StartHealItemEdit( hDlg, ¤t ) )
|
|
{
|
|
rssh_hit->setHealItem( hi_type, idx, ¤t );
|
|
SelfHealSetup_fillList( hDlg );
|
|
}
|
|
}
|
|
|
|
struct RS_HealItemEditStruct
|
|
{
|
|
BOOL edit_mode;
|
|
HealItem *toEdit;
|
|
};
|
|
|
|
HealItem *RS_StartHealItemAdd( HWND hWndParent )
|
|
{
|
|
HealItem *current = new HealItem();
|
|
RS_HealItemEditStruct st;
|
|
st.edit_mode = FALSE;
|
|
st.toEdit = current;
|
|
INT_PTR ret = DialogBoxParam( g_radardll_hinst, MAKEINTRESOURCE(IDD_SR_SELFHEAL_EDITOR),
|
|
hWndParent, EditHealItem_DlgProc, (LPARAM)&st );
|
|
if( ret == IDOK ) return current;
|
|
delete current;
|
|
return NULL;
|
|
}
|
|
|
|
BOOL RS_StartHealItemEdit( HWND hWndParent, HealItem *current )
|
|
{
|
|
RS_HealItemEditStruct st;
|
|
st.edit_mode = TRUE;
|
|
st.toEdit = current;
|
|
INT_PTR ret = DialogBoxParam( g_radardll_hinst, MAKEINTRESOURCE(IDD_SR_SELFHEAL_EDITOR),
|
|
hWndParent, EditHealItem_DlgProc, (LPARAM)&st );
|
|
if( ret == IDOK ) return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
INT_PTR CALLBACK EditHealItem_DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
SetWindowLongPtr( hDlg, GWLP_USERDATA, (LONG_PTR)lParam );
|
|
struct RS_HealItemEditStruct *st = (struct RS_HealItemEditStruct *)lParam;
|
|
if( st )
|
|
{
|
|
if( st->edit_mode )
|
|
{
|
|
SetWindowText( hDlg, TEXT("Edit item") );
|
|
SetDlgItemTextA( hDlg, IDC_E_ITEMNAME, st->toEdit->itemName );
|
|
SetDlgItemInt( hDlg, IDC_E_ITEMID, st->toEdit->itemID, FALSE );
|
|
SetDlgItemInt( hDlg, IDC_E_ITEMPRI, st->toEdit->priority, TRUE );
|
|
SetDlgItemInt( hDlg, IDC_E_PERCENTUSE, st->toEdit->percentUse, TRUE );
|
|
SetDlgItemInt( hDlg, IDC_E_REUSEDELAY, st->toEdit->reuseDelayMsec, TRUE );
|
|
}
|
|
else
|
|
{
|
|
SetWindowText( hDlg, TEXT("Add item") );
|
|
}
|
|
}
|
|
} break;
|
|
case WM_COMMAND:
|
|
{
|
|
switch( LOWORD( wParam ) )
|
|
{
|
|
case IDCANCEL: EndDialog( hDlg, IDCANCEL ); break;
|
|
case IDOK:
|
|
{
|
|
struct RS_HealItemEditStruct *st =
|
|
(struct RS_HealItemEditStruct *)GetWindowLongPtr( hDlg, GWLP_USERDATA );
|
|
if( !st )
|
|
{
|
|
EndDialog( hDlg, IDCANCEL );
|
|
}
|
|
else
|
|
{
|
|
GetDlgItemTextA( hDlg, IDC_E_ITEMNAME, st->toEdit->itemName,
|
|
sizeof(st->toEdit->itemName)-1 );
|
|
st->toEdit->itemName[sizeof(st->toEdit->itemName)-1] = 0;
|
|
st->toEdit->itemID = GetDlgItemInt( hDlg, IDC_E_ITEMID, NULL, FALSE );
|
|
st->toEdit->priority = GetDlgItemInt( hDlg, IDC_E_ITEMPRI, NULL, TRUE );
|
|
st->toEdit->percentUse = GetDlgItemInt( hDlg, IDC_E_PERCENTUSE, NULL, TRUE );
|
|
st->toEdit->reuseDelayMsec = GetDlgItemInt( hDlg, IDC_E_REUSEDELAY, NULL, FALSE );
|
|
EndDialog( hDlg, IDOK );
|
|
}
|
|
} break;
|
|
case IDC_FIND:
|
|
{
|
|
Dlg_FindInDB *dlg = new Dlg_FindInDB( Dlg_FindInDB::MODE_ITEM );
|
|
if( dlg->runDialog( hDlg ) )
|
|
{
|
|
//TCHAR tstr[256];
|
|
//wsprintf( tstr, TEXT("%u: %s"), dlg->itemID, dlg->itemNameW );
|
|
//MessageBox( hDlg, tstr, TEXT("Result"), 0 );
|
|
SetDlgItemTextA( hDlg, IDC_E_ITEMNAME, dlg->itemName );
|
|
SetDlgItemInt( hDlg, IDC_E_ITEMID, dlg->itemID, FALSE );
|
|
}
|
|
delete dlg;
|
|
} break;
|
|
}
|
|
} break;
|
|
default: return FALSE; break;
|
|
}
|
|
return TRUE;
|
|
}
|