l2-unlegits/l2ooghelper/UserInvTabDlg.cpp
2012-02-01 05:25:08 +00:00

296 lines
9.1 KiB
C++

#include "stdafx.h"
#include "Resource.h"
#include "windowUtils.h"
#include "UserInventory.h"
#include "IL2Client.h"
#include "logger.h"
#include "windowUtils.h"
extern HINSTANCE g_hInst;
INT_PTR CALLBACK UserInvTabDlg_Proc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
HWND UserInvTabDlg_Create( HWND hWndParent, IL2Client *pcl )
{
HWND hDlg = CreateDialogParam( g_hInst, MAKEINTRESOURCE(IDD_USERINV),
hWndParent, UserInvTabDlg_Proc, 0 );
SetWindowLongPtr( hDlg, GWLP_USERDATA, (LONG_PTR)pcl );
return hDlg;
}
long long int UserInv_RequestItemCount( HWND hDlg, UserInventoryItem *it );
int UserInv_RequestDropDir( HWND hDlg );
INT_PTR CALLBACK UserInvTabDlg_Proc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
TCHAR text[128] = {0};
switch( uMsg )
{
case WM_INITDIALOG:
{
HWND hwndLV = GetDlgItem( hDlg, IDC_LIST1 );
WULV_SetExtStyle( hwndLV, true, true );
WULV_InsertColumn( hwndLV, TEXT("Ïðåäìåò"), 160, 0 );
WULV_InsertColumn( hwndLV, TEXT("ê-âî"), 40, 1 );
WULV_InsertColumn( hwndLV, TEXT("info"), 40, 2 );
WULV_InsertColumn( hwndLV, TEXT("itemID"), 40, 3 );
} break;
case WM_USER:
{
UserInventory *inv = (UserInventory *)lParam;
if( !inv ) return TRUE;
wsprintf( text, TEXT("%d / %d"), inv->itemCount, inv->invSize );
SetDlgItemText( hDlg, IDC_ST_INVSIZE, text );
HWND hwndLV = GetDlgItem( hDlg, IDC_LIST1 );
// save cur sel item
int lv_cur_sel = ListView_GetNextItem( hwndLV, -1, LVNI_SELECTED );
ListView_DeleteAllItems( hwndLV );
int i = 0, iCol = 0;
int added_idx;
TCHAR addstr[32] = {0};
for( i=0; i<USERINV_MAX_ITEMS; i++ )
{
if( inv->item[i].objectID == 0 ) continue;
iCol = 0;
// name
inv->item[i].getItemName( text, 128 );
added_idx = WULV_InsertItem( hwndLV, text, 0, (LPARAM)inv->item[i].objectID );
if( added_idx == -1 ) continue;
iCol++;
// count
wsprintf( text, TEXT("%I64d"), inv->item[i].count );
WULV_SetItem( hwndLV, text, added_idx, iCol );
iCol++;
// ext (equipped/quest)...
text[0] = 0;
if( inv->item[i].enchantLevel > 0 )
{
wsprintf( addstr, TEXT("+%d "), inv->item[i].enchantLevel );
lstrcat( text, addstr );
}
if( inv->item[i].isEquipped )
{
lstrcpy( addstr, TEXT("v") );
lstrcat( text, addstr );
}
if( inv->item[i].type2 == 3 )
{
lstrcpy( addstr, TEXT("Q") );
lstrcat( text, addstr );
}
WULV_SetItem( hwndLV, text, added_idx, iCol );
iCol++;
// itemID
wsprintf( text, TEXT("%d"), inv->item[i].itemID );
WULV_SetItem( hwndLV, text, added_idx, iCol );
iCol++;
}
// restore cur sel item
LVITEM lvi;
lvi.iItem = lv_cur_sel;
lvi.iSubItem = 0;
lvi.mask = LVIF_STATE;
lvi.stateMask = lvi.state = LVIS_SELECTED;
ListView_SetItem( hwndLV, &lvi );
} break;
case WM_COMMAND:
{
IL2Client *pcl = (IL2Client *)GetWindowLongPtr( hDlg, GWLP_USERDATA );
HWND hwndLV = GetDlgItem( hDlg, IDC_LIST1 );
int cur_sel = ListView_GetNextItem( hwndLV, -1, LVNI_SELECTED );
unsigned int objectID = 0;
if( cur_sel >= 0 ) objectID = (unsigned int)WULV_GetItemLPARAM( hwndLV, cur_sel );
switch( LOWORD( wParam ) )
{
case IDC_DESTROY:
{
if( cur_sel >= 0 )
{
UserInventoryItem it;
UserInventory *inv = pcl->get_Inventory();
inv->getItemInfoByObjectId( objectID, &it );
long long int count = UserInv_RequestItemCount( hDlg, &it );
if( count >= 1 ) pcl->game_DestroyItem( objectID, count );
}
} break;
case IDC_DROP:
{
if( cur_sel >= 0 )
{
int drop_dir = UserInv_RequestDropDir( hDlg );
if( drop_dir > 0 )
{
UserInventoryItem it;
UserInventory *inv = pcl->get_Inventory();
inv->getItemInfoByObjectId( objectID, &it );
long long int count = UserInv_RequestItemCount( hDlg, &it );
if( count >= 1 )
{
UserInfo *usr = pcl->get_UserInfo();
srand( GetTickCount() );
const int drop_dist = 20 + (rand() % 20);
int drop_x = usr->x;
int drop_y = usr->y;
int drop_z = usr->z;
switch( drop_dir )
{
case 1: { drop_x -= drop_dist; drop_y -= drop_dist; } break;
case 3: { drop_x += drop_dist; drop_y -= drop_dist; } break;
case 7: { drop_x -= drop_dist; drop_y += drop_dist; } break;
case 9: { drop_x += drop_dist; drop_y += drop_dist; } break;
case 4: { drop_x -= drop_dist; } break;
case 6: { drop_x += drop_dist; } break;
case 2: { drop_y -= drop_dist; } break;
case 8: { drop_y += drop_dist; } break;
// case 5: no changes :)
}
pcl->game_DropItem( objectID, count, drop_x, drop_y, drop_z );
}
}
}
} break;
case IDC_CRYSTALLIZE:
{
if( cur_sel >= 0 )
{
UserInventoryItem it;
UserInventory *inv = pcl->get_Inventory();
inv->getItemInfoByObjectId( objectID, &it );
long long int count = UserInv_RequestItemCount( hDlg, &it );
if( count >= 1 ) pcl->game_CrystallizeItem( objectID, count );
}
} break;
case IDC_GIVETOPET:
{
if( cur_sel >= 0 )
{
UserInventoryItem it;
UserInventory *inv = pcl->get_Inventory();
inv->getItemInfoByObjectId( objectID, &it );
long long int count = UserInv_RequestItemCount( hDlg, &it );
if( count >= 1 ) pcl->game_GiveItemToPet( objectID, count );
}
} break;
}
} break;
case WM_NOTIFY:
{
IL2Client *pcl = (IL2Client *)GetWindowLongPtr( hDlg, GWLP_USERDATA );
LPNMHDR phdr = (LPNMHDR)lParam;
HWND hwndLV = GetDlgItem( hDlg, IDC_LIST1 );
if( phdr->hwndFrom == hwndLV )
{
if( phdr->code == NM_DBLCLK )
{
LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE)lParam;
unsigned int objectID = (unsigned int)WULV_GetItemLPARAM( hwndLV, lpnmitem->iItem );
if( objectID > 0 )
{
//log_error( LOG_OK, "Use item oid %u\n", objectID );
pcl->game_UseItemByObjectId( objectID );
}
}
}
} break;
default: return FALSE; break;
}
return TRUE;
}
INT_PTR CALLBACK UserInv_RequestItemCount_Proc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
long long int UserInv_RequestItemCount( HWND hDlg, UserInventoryItem *it )
{
long long int save_count = it->count;
INT_PTR ret = DialogBoxParam( g_hInst, MAKEINTRESOURCE(IDD_USERINV_ITEMCOUNT),
hDlg, UserInv_RequestItemCount_Proc, (LPARAM)it );
if( ret == IDCANCEL )
{
it->count = save_count;
return 0;
}
long long int ret_count = it->count;
it->count = save_count;
return ret_count;
}
INT_PTR CALLBACK UserInv_RequestDropDir_Proc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
int UserInv_RequestDropDir( HWND hDlg )
{
int dir = 0;
INT_PTR ret = DialogBoxParam( g_hInst, MAKEINTRESOURCE(IDD_USERINV_DROPITEM),
hDlg, UserInv_RequestDropDir_Proc, (LPARAM)&dir );
if( ret == IDCANCEL ) return 0;
return dir;
}
INT_PTR CALLBACK UserInv_RequestItemCount_Proc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_INITDIALOG:
{
SetWindowLongPtrW( hDlg, GWLP_USERDATA, (LONG_PTR)lParam );
UserInventoryItem *it = (UserInventoryItem *)lParam;
wchar_t itemName[256] = {0};
it->getItemName( itemName, 256 );
SetDlgItemTextW( hDlg, IDC_ST_ITEMNAME, itemName );
WU_SetDlgItemInt64( hDlg, IDC_E_COUNT, it->count, FALSE );
} break;
case WM_COMMAND:
{
UserInventoryItem *it = (UserInventoryItem *)GetWindowLongPtrW( hDlg, GWLP_USERDATA );
switch( LOWORD( wParam ) )
{
case IDC_B_ALL:
{
WU_SetDlgItemInt64( hDlg, IDC_E_COUNT, it->count, FALSE );
} break;
case IDOK:
{
//it->count = GetDlgItemInt( hDlg, IDC_E_COUNT, NULL, FALSE );
it->count = WU_GetDlgItemInt64( hDlg, IDC_E_COUNT, FALSE );
EndDialog( hDlg, IDOK );
} break;
case IDCANCEL: EndDialog( hDlg, IDCANCEL ); break;
}
} break;
default: return FALSE; break;
}
return TRUE;
}
INT_PTR CALLBACK UserInv_RequestDropDir_Proc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_INITDIALOG:
{
SetWindowLongPtrW( hDlg, GWLP_USERDATA, (LONG_PTR)lParam );
int *res = (int *)lParam;
(*res) = 0;
} break;
case WM_COMMAND:
{
int *res = (int *)GetWindowLongPtrW( hDlg, GWLP_USERDATA );
switch( LOWORD( wParam ) )
{
case IDC_B_1: { (*res) = 1; EndDialog( hDlg, IDOK ); } break;
case IDC_B_2: { (*res) = 2; EndDialog( hDlg, IDOK ); } break;
case IDC_B_3: { (*res) = 3; EndDialog( hDlg, IDOK ); } break;
case IDC_B_4: { (*res) = 4; EndDialog( hDlg, IDOK ); } break;
case IDC_B_5: { (*res) = 5; EndDialog( hDlg, IDOK ); } break;
case IDC_B_6: { (*res) = 6; EndDialog( hDlg, IDOK ); } break;
case IDC_B_7: { (*res) = 7; EndDialog( hDlg, IDOK ); } break;
case IDC_B_8: { (*res) = 8; EndDialog( hDlg, IDOK ); } break;
case IDC_B_9: { (*res) = 9; EndDialog( hDlg, IDOK ); } break;
}
} break;
default: return FALSE; break;
}
return TRUE;
}