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

898 lines
25 KiB
C++

#include "stdafx.h"
#include "Logger.h"
#include "RadarDllWnd.h"
#include "WorldObjectTree.h"
#include "CharArray.h"
#include "NpcArray.h"
#include "utils.h"
#include "GameClient.h"
extern GameClient *g_game_client;
#include "ConfigIni.h"
extern CConfig g_cfg;
#include "windowUtils.h"
void RadarWnd_AddChar( unsigned int objectId ) { PostMessage( g_radardll_hwnd, WMMY_ADD_OBJECT, MSG_PC, (LPARAM)objectId ); }
void RadarWnd_UpdChar( unsigned int objectId ) { PostMessage( g_radardll_hwnd, WMMY_UPDATE_OBJECT, MSG_PC, (LPARAM)objectId ); }
void RadarWnd_DelChar( unsigned int objectId ) { PostMessage( g_radardll_hwnd, WMMY_DEL_OBJECT, MSG_PC, (LPARAM)objectId ); }
void RadarWnd_AddNpc( unsigned int objectId ) { PostMessage( g_radardll_hwnd, WMMY_ADD_OBJECT, MSG_NPC, (LPARAM)objectId ); }
void RadarWnd_UpdNpc( unsigned int objectId ) { PostMessage( g_radardll_hwnd, WMMY_UPDATE_OBJECT, MSG_NPC, (LPARAM)objectId ); }
void RadarWnd_DelNpc( unsigned int objectId ) { PostMessage( g_radardll_hwnd, WMMY_DEL_OBJECT, MSG_NPC, (LPARAM)objectId ); }
// forwards
void RW_DeleteCharFromEnemiesList( unsigned int objectID );
void RW_UpdateCharInEnemiesList( L2Player *cha );
extern HWND g_rw_hWndCL; // chars ListView window
extern HWND g_rw_hWndNPC; // npcs ListView window
extern HWND g_rw_hWndEnemies; // enemies ListView window
extern bool g_radarwnd_npc_displayEnable;
LRESULT RW_OnAddObject( HWND hWnd, WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER(hWnd);
// do not add npc if not displaying
if( wParam == MSG_NPC && !g_radarwnd_npc_displayEnable ) return 0;
unsigned int objectId = (unsigned int)lParam;
L2OBJECT_TYPE objType = L2OT_NONE;
int index = -1;
if( !WorldObjectTree_GetInfoByObjectID( objectId, &objType, &index ) )
{
log_error( LOG_WARNING, "RW_OnAddObject(): cannot get info about object [%u] to add\n", objectId );
return 0;
}
int user_z = g_game_client->ai.usr.z;
switch( wParam )
{
case MSG_PC:
{
if( objType != L2OT_PC )
{
log_error( LOG_WARNING, "RW_OnAddObject(): object [%u]: adding player, but in WOT incorrect type %d\n",
objectId, (int)objType );
return 0;
}
L2Player *cha = chars_array[index];
if( !cha )
{
log_error( LOG_ERROR, "RW_OnAddObject(): player found in WOT, but is NULL in array? O_o\n" );
return 0;
}
if( cha->isUnused() )
{
log_error( LOG_ERROR, "RW_OnAddObject(): player is unused in array! O_o\n" );
return 0;
}
// ok, adding
bool isEnemy = false;
bool is2sidewar = false;
TCHAR colText[128] = {0};
TCHAR szBuf1[128] = {0};
TCHAR szBuf2[128] = {0};
// detect clan war
utils_detectClanWar( cha->relation, &isEnemy, &is2sidewar );
// name
lstrcpy( colText, cha->getName() );
int iImage = -1;
if( isEnemy )
{
iImage = 0;
if( !is2sidewar ) iImage = 3;
}
if( g_game_client->ai.party.isInParty( cha->objectID, NULL ) ) iImage = 1;
if( cha->isAlikeDead ) iImage = 2;
int added_item = -1;
int added_item2 = -1;
added_item = WULV_InsertItem2( g_rw_hWndCL, colText, 999, iImage, (LPARAM)cha->objectID );
if( added_item == -1 ) return 0;
if( isEnemy ) // add enemies also to enemies tab
added_item2 = WULV_InsertItem2( g_rw_hWndEnemies, colText, 999, iImage, (LPARAM)cha->objectID );
// baseClass
szBuf2[0] = szBuf1[0] = 0;
cha->getClassStr( szBuf1 );
if( cha->classID != cha->baseClassID )
{
cha->getBaseClassStr( szBuf2 );
wsprintfW( colText, L"%s / %s", szBuf1, szBuf2 );
}
else wsprintfW( colText, L"%s", szBuf1 );
WULV_SetItem( g_rw_hWndCL, colText, added_item, 1 );
if( isEnemy ) // add enemies info also to enemies tab
WULV_SetItem( g_rw_hWndEnemies, colText, added_item2, 1 );
// clan
ClanList_GetClanNameByID( cha->clanID, colText ); // max 127 chars
WULV_SetItem( g_rw_hWndCL, colText, added_item, 2 );
if( isEnemy ) // add enemies info also to enemies tab
WULV_SetItem( g_rw_hWndEnemies, colText, added_item2, 2 );
// dZ
wsprintf( colText, TEXT("%d"), (user_z - cha->z) );
WULV_SetItem( g_rw_hWndCL, colText, added_item, 3 );
if( isEnemy ) // add enemies info also to enemies tab
WULV_SetItem( g_rw_hWndEnemies, colText, added_item2, 3 );
// clanwar state
colText[0] = 0;
if( isEnemy && !is2sidewar ) lstrcpy( colText, TEXT("<") );
if( isEnemy && is2sidewar ) lstrcpy( colText, TEXT("<>") );
WULV_SetItem( g_rw_hWndCL, colText, added_item, 4 );
if( isEnemy ) // add enemies info also to enemies tab
WULV_SetItem( g_rw_hWndEnemies, colText, added_item2, 4 );
} break;
case MSG_NPC:
{
if( g_radarwnd_npc_displayEnable == 0 ) return 0; // NPC display disabled
if( objType != L2OT_NPC )
{
log_error( LOG_WARNING, "RW_OnAddObject(): object [%u]: adding NPC, but in WOT incorrect type %d\n",
objectId, (int)objType );
return 0;
}
L2Npc *npc = npc_array[index];
if( !npc )
{
log_error( LOG_ERROR, "RW_OnAddObject(): NPC found in WOT, but is NULL in array? O_o\n" );
return 0;
}
if( npc->isUnused() )
{
log_error( LOG_ERROR, "RW_OnAddObject(): NPC is unused in array! O_o\n" );
return 0;
}
TCHAR colText[128] = {0};
wchar_t wName[128] = {0}; char aname[128] = {0};
wchar_t wTitle[128] = {0}; char atitle[128] = {0};
// NPC name
aname[0] = atitle[0] = 0;
wName[0] = wTitle[0] = 0;
lstrcpy( colText, npc->getName() );
if( colText[0] == 0 )
{
if( L2Data_DB_GetNPCNameTitleByID( npc->templateID, aname, atitle ) )
{
MultiByteToWideChar( CP_ACP, 0, aname, -1, wName, 127 );
MultiByteToWideChar( CP_ACP, 0, atitle, -1, wTitle, 127 );
npc->setName( wName );
lstrcpy( colText, wName );
}
}
int iImage = -1;
if( npc->isAlikeDead ) iImage = 2;
int added_item = WULV_InsertItem2( g_rw_hWndNPC, colText, 999, iImage, (LPARAM)npc->objectID );
if( added_item == -1 ) return 0;
// NPC title
wcscpy( colText, npc->getTitle() );
if( (colText[0] == 0) && (wTitle[0]) )
{
lstrcpy( colText, wTitle );
npc->setTitle( wTitle );
}
WULV_SetItem( g_rw_hWndNPC, colText, added_item, 1 );
// NPC dZ
wsprintf( colText, TEXT("%d"), (user_z - npc->z) );
WULV_SetItem( g_rw_hWndNPC, colText, added_item, 2 );
// NPC templateID
wsprintf( colText, TEXT("%d"), npc->templateID );
WULV_SetItem( g_rw_hWndNPC, colText, added_item, 3 );
} break;
}
return 0;
}
LRESULT RW_OnUpdObject( HWND hWnd, WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER(hWnd);
// do not update npc if not displaying
if( wParam == MSG_NPC && !g_radarwnd_npc_displayEnable ) return 0;
unsigned int objectId = (unsigned int)lParam;
L2OBJECT_TYPE objType = L2OT_NONE;
int index = -1;
if( !WorldObjectTree_GetInfoByObjectID( objectId, &objType, &index ) )
{
log_error( LOG_WARNING, "RW_OnUpdObject(): cannot get info about object [%u] to add\n", objectId );
return 0;
}
int user_z = g_game_client->ai.usr.z;
HWND hWndLV = g_rw_hWndCL; // default: from char list
if( wParam == MSG_NPC ) hWndLV = g_rw_hWndNPC;
// find listview itemId to update
int iItem = -1;
LVITEM lvi;
memset( &lvi, 0, sizeof(lvi) );
int idx = -1;
do
{
idx = ListView_GetNextItem( hWndLV, idx, LVNI_ALL );
if( idx == -1 ) break;
lvi.iItem = idx;
lvi.iSubItem = 0;
lvi.mask = LVIF_PARAM;
if( ListView_GetItem( hWndLV, &lvi ) )
{
if( ((unsigned int)lvi.lParam) == objectId )
{
iItem = lvi.iItem;
break;
}
}
} while( idx >= 0 );
if( iItem == -1 )
{
// not found
switch( wParam )
{
case MSG_PC: log_error( LOG_WARNING, "RW_OnUpdObject(): cannot find player objectId [%u] in LV to update\n", objectId ); break;
case MSG_NPC: log_error( LOG_WARNING, "RW_OnUpdObject(): cannot find NPC objectId [%u] in LV to update\n", objectId ); break;
}
return 0;
}
memset( &lvi, 0, sizeof(lvi) );
lvi.iItem = iItem;
lvi.lParam = (LPARAM)objectId;
switch( wParam )
{
case MSG_PC:
{
if( objType != L2OT_PC )
{
log_error( LOG_WARNING, "RW_OnUpdObject(): object [%u]: update player, but in WOT incorrect type %d\n",
objectId, (int)objType );
return 0;
}
L2Player *cha = chars_array[index];
if( !cha )
{
log_error( LOG_ERROR, "RW_OnUpdObject(): player found in WOT, but is NULL in array? O_o\n" );
return 0;
}
if( cha->isUnused() )
{
log_error( LOG_ERROR, "RW_OnUpdObject(): player is unused in array! O_o\n" );
return 0;
}
// ok, adding
bool isEnemy = false;
bool is2sidewar = false;
TCHAR colText[128] = {0};
TCHAR szBuf1[128] = {0};
TCHAR szBuf2[128] = {0};
memset( &lvi, 0, sizeof(lvi) );
lvi.cchTextMax = 128;
lvi.pszText = colText;
// detect clan war
utils_detectClanWar( cha->relation, &isEnemy, &is2sidewar );
// name
lstrcpy( colText, cha->getName() );
lvi.pszText = colText;
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
lvi.iItem = iItem;
lvi.iSubItem = 0;
lvi.lParam = cha->objectID;
// image
lvi.iImage = -1;
if( isEnemy )
{
lvi.iImage = 0; // RED CIRC
if( !is2sidewar ) lvi.iImage = 3; // HALF RED CIRC
}
if( g_game_client->ai.party.isInParty( cha->objectID, NULL ) ) lvi.iImage = 1;
if( cha->isAlikeDead ) lvi.iImage = 2;
SendMessage( g_rw_hWndCL, LVM_SETITEM, 0, (LPARAM)&lvi );
lvi.iImage = 0;
// baseClass
szBuf2[0] = szBuf1[0] = 0;
cha->getClassStr( szBuf1 );
if( cha->classID != cha->baseClassID )
{
cha->getBaseClassStr( szBuf2 );
wsprintfW( colText, L"%s / %s", szBuf1, szBuf2 );
}
else wsprintfW( colText, L"%s", szBuf1 );
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 1;
lvi.pszText = colText;
SendMessage( g_rw_hWndCL, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// clan
ClanList_GetClanNameByID( cha->clanID, colText ); // max 127 chars
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 2;
lvi.pszText = colText;
SendMessage( g_rw_hWndCL, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// dZ
wsprintf( colText, TEXT("%d"), (user_z - cha->z) );
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 3;
lvi.pszText = colText;
SendMessage( g_rw_hWndCL, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// clanwar state
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 4;
lvi.pszText = colText;
if( isEnemy )
{
colText[0] = 0;
if( !is2sidewar ) lstrcpy( colText, TEXT("<") );
if( is2sidewar ) lstrcpy( colText, TEXT("<>") );
}
SendMessage( g_rw_hWndCL, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// update enemies also in enemies list
if( isEnemy ) RW_UpdateCharInEnemiesList( cha );
} break;
case MSG_NPC:
{
L2Npc *npc = npc_array[index];
if( !npc )
{
log_error( LOG_ERROR, "RW_OnUpdObject(): NPC found in WOT, but is NULL in array? O_o\n" );
return 0;
}
if( npc->isUnused() )
{
log_error( LOG_ERROR, "RW_OnUpdObject(): NPC is unused in array! O_o\n" );
return 0;
}
TCHAR colText[128] = {0};
wchar_t wName[128] = {0}; char aname[128] = {0};
wchar_t wTitle[128] = {0}; char atitle[128] = {0};
memset( &lvi, 0, sizeof(lvi) );
lvi.cchTextMax = 128;
lvi.pszText = colText;
// NPC name
aname[0] = atitle[0] = 0;
wName[0] = wTitle[0] = 0;
lstrcpy( colText, npc->getName() );
if( colText[0] == 0 )
{
if( L2Data_DB_GetNPCNameTitleByID( npc->templateID, aname, atitle ) )
{
MultiByteToWideChar( CP_ACP, 0, aname, -1, wName, 127 );
MultiByteToWideChar( CP_ACP, 0, atitle, -1, wTitle, 127 );
npc->setName( wName );
lstrcpy( colText, wName );
}
}
lvi.pszText = colText;
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
lvi.iItem = iItem;
lvi.iSubItem = 0;
lvi.lParam = npc->objectID;
lvi.iImage = -1;
if( npc->isAlikeDead ) lvi.iImage = 2;
//log_error_np( LOG_OK, "Updating NPC %S, setting iImage = %d\n", npc->charName, lvi.iImage );
SendMessage( g_rw_hWndNPC, LVM_SETITEM, 0, (LPARAM)&lvi );
lvi.iImage = 0;
// NPC title
wcscpy( colText, npc->getTitle() );
if( (colText[0] == 0) && (wTitle[0]) )
{
lstrcpy( colText, wTitle );
npc->setTitle( wTitle );
}
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 1;
lvi.pszText = colText;
SendMessage( g_rw_hWndNPC, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// NPC dZ
wsprintf( colText, TEXT("%d"), (user_z - npc->z) );
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 2;
lvi.pszText = colText;
SendMessage( g_rw_hWndNPC, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// NPC templateID
wsprintf( colText, TEXT("%d"), npc->templateID );
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 3;
lvi.pszText = colText;
SendMessage( g_rw_hWndNPC, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
} break;
}
return 0;
}
LRESULT RW_OnDelObject( HWND hWnd, WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER(hWnd);
// do not del npc if do not display
if( wParam == MSG_NPC && !g_radarwnd_npc_displayEnable ) return 0;
bool deleteOK = false;
HWND hWndLV = g_rw_hWndCL; // by default: delete from PC list
if( wParam == MSG_NPC ) hWndLV = g_rw_hWndNPC; // if NPC, delete from NPC list
unsigned int objectId = (unsigned int)lParam;
LVITEM lvi;
memset( &lvi, 0, sizeof(lvi) );
int idx = -1;
do
{
idx = ListView_GetNextItem( hWndLV, idx, LVNI_ALL );
if( idx == -1 ) break;
lvi.iItem = idx;
lvi.iSubItem = 0;
lvi.mask = LVIF_PARAM;
if( ListView_GetItem( hWndLV, &lvi ) )
{
if( ((unsigned int)lvi.lParam) == objectId )
{
ListView_DeleteItem( hWndLV, lvi.iItem );
deleteOK = true;
if( wParam == MSG_NPC ) return 0;
if( wParam == MSG_PC ) break;
}
}
} while( idx >= 0 );
if( deleteOK )
{
// delete also enemies from enemies list (if enemy)
if( wParam == MSG_PC )
{
//log_error( LOG_OK, "RW_OnDelObject(): MSG_PC: deleting PC\n" );
//unsigned int RELATION_MUTUAL_WAR = 0x08000;
//unsigned int RELATION_1SIDED_WAR = 0x10000;
//if( g_cfg.L2_version == L2_VERSION_T23 )
//{
// RELATION_MUTUAL_WAR = 0x04000; // gracia final constants changed
// RELATION_1SIDED_WAR = 0x08000;
//}
//L2OBJECT_TYPE objType = L2OT_NONE;
//int index = -1;
//if( WorldObjectTree_GetInfoByObjectID( objectId, &objType, &index ) )
//{
// int relation = chars_array[index]->relation;
// log_error( LOG_OK, "RW_OnDelObject(): MSG_PC: deleting PC %S relation 0x%08X\n",
// chars_array[index]->charName, chars_array[index]->relation );
// if( (relation & RELATION_1SIDED_WAR) || (relation & RELATION_MUTUAL_WAR) )
RW_DeleteCharFromEnemiesList( objectId );
//}
}
return 0;
}
// if we here, objectId not found
log_error( LOG_WARNING, "RW_OnDelObject(): cannot find oid [%u] in List-View\n", objectId );
return 0;
}
void RW_DeleteCharFromEnemiesList( unsigned int objectID )
{
LVITEM lvi;
memset( &lvi, 0, sizeof(lvi) );
int idx = -1;
do
{
idx = ListView_GetNextItem( g_rw_hWndEnemies, idx, LVNI_ALL );
if( idx == -1 ) break;
lvi.iItem = idx;
lvi.iSubItem = 0;
lvi.mask = LVIF_PARAM;
if( ListView_GetItem( g_rw_hWndEnemies, &lvi ) )
{
if( ((unsigned int)lvi.lParam) == objectID )
{
ListView_DeleteItem( g_rw_hWndEnemies, lvi.iItem );
log_error( LOG_OK, "RW_DeleteCharFromEnemiesList(): oid [%u] del OK\n", objectID );
return;
}
}
} while( idx >= 0 );
// if we here, objectId not found
// this is not error
//log_error( LOG_WARNING, "RW_DeleteCharFromEnemiesList(): cannot find char oid [%u] in List-View\n",
// cha->objectID, cha->charName );
return;
}
void RW_UpdateCharInEnemiesList( L2Player *cha )
{
int user_z = g_game_client->ai.usr.z;
// find listview itemId to update
int iItem = -1;
LVITEM lvi;
memset( &lvi, 0, sizeof(lvi) );
int idx = -1;
do
{
idx = ListView_GetNextItem( g_rw_hWndEnemies, idx, LVNI_ALL );
if( idx == -1 ) break;
lvi.iItem = idx;
lvi.iSubItem = 0;
lvi.mask = LVIF_PARAM;
if( ListView_GetItem( g_rw_hWndEnemies, &lvi ) )
{
if( ((unsigned int)lvi.lParam) == cha->objectID )
{
iItem = lvi.iItem;
break;
}
}
} while( idx >= 0 );
if( iItem == -1 )
{
// not found
log_error( LOG_WARNING, "RW_UpdateCharInEnemiesList(): cannot find objectId [%u] in Enemies LV to update\n",
cha->objectID );
return;
}
memset( &lvi, 0, sizeof(lvi) );
lvi.iItem = iItem;
lvi.lParam = (LPARAM)(cha->objectID);
// ok, adding
bool isEnemy = false;
bool is2sidewar = false;
TCHAR colText[128] = {0};
TCHAR szBuf1[128] = {0};
TCHAR szBuf2[128] = {0};
memset( &lvi, 0, sizeof(lvi) );
lvi.cchTextMax = 128;
lvi.pszText = colText;
// detect clan war
utils_detectClanWar( cha->relation, &isEnemy, &is2sidewar );
// name
lstrcpy( colText, cha->getName() );
lvi.pszText = colText;
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
lvi.iItem = iItem;
lvi.iSubItem = 0;
lvi.lParam = cha->objectID;
// image
lvi.iImage = -1;
if( isEnemy )
{
lvi.iImage = 0;
if( !is2sidewar ) lvi.iImage = 3;
}
if( g_game_client->ai.party.isInParty( cha->objectID, NULL ) ) lvi.iImage = 1;
if( cha->isAlikeDead ) lvi.iImage = 2;
SendMessage( g_rw_hWndEnemies, LVM_SETITEM, 0, (LPARAM)&lvi );
lvi.iImage = 0;
// baseClass
szBuf2[0] = szBuf1[0] = 0;
cha->getClassStr( szBuf1 );
if( cha->classID != cha->baseClassID )
{
cha->getBaseClassStr( szBuf2 );
wsprintfW( colText, L"%s / %s", szBuf1, szBuf2 );
}
else wsprintfW( colText, L"%s", szBuf1 );
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 1;
lvi.pszText = colText;
SendMessage( g_rw_hWndEnemies, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// clan
ClanList_GetClanNameByID( cha->clanID, colText ); // max 127 chars
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 2;
lvi.pszText = colText;
SendMessage( g_rw_hWndEnemies, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// dZ
wsprintf( colText, TEXT("%d"), (user_z - cha->z) );
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 3;
lvi.pszText = colText;
SendMessage( g_rw_hWndEnemies, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
// clanwar state
lvi.mask = LVIF_TEXT;
lvi.iItem = iItem;
lvi.iSubItem = 4;
lvi.pszText = colText;
if( isEnemy )
{
colText[0] = 0;
if( !is2sidewar ) lstrcpy( colText, TEXT("<") );
if( is2sidewar ) lstrcpy( colText, TEXT("<>") );
}
SendMessage( g_rw_hWndEnemies, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)&lvi );
}
void RadarWnd_ForceUpdateCharsList()
{
PostMessage( g_radardll_hwnd, WMMY_FORCE_UPDATE_LIST, FORCE_UPDATE_CHARS_LIST, 0 );
}
void RadarWnd_ForceUpdateNpcsList()
{
PostMessage( g_radardll_hwnd, WMMY_FORCE_UPDATE_LIST, FORCE_UPDATE_NPCS_LIST, 0 );
}
LRESULT RW_OnUpdateCharsList( HWND hWnd )
{
UNREFERENCED_PARAMETER(hWnd);
// window is visible?
//if( bRadarWindowIsVisible == FALSE ) return 0;
// check too fast updates timeout
//DWORD dwCurTickTime = GetTickCount();
//if( dwCurTickTime < (dwRadarDllLastCharListUpdateTime + 1000) ) return 0;
//dwRadarDllLastCharListUpdateTime = dwCurTickTime;
// IN_GAME?
//if( g_game_client->getState() != GCST_IN_GAME ) return 0;
// delete all items from list-view
SendMessage( g_rw_hWndCL, LVM_DELETEALLITEMS, 0, 0 );
// delete all items from enemies list-view
SendMessage( g_rw_hWndEnemies, LVM_DELETEALLITEMS, 0, 0 );
//
int user_z;
user_z = g_game_client->ai.usr.z;
int i;
TCHAR colText[128] = {0};
TCHAR szBuf1[128] = {0};
TCHAR szBuf2[128] = {0};
LVITEM lvi;
memset( &lvi, 0, sizeof(lvi) );
lvi.cchTextMax = 128;
lvi.pszText = colText;
bool isEnemy = false;
bool is2sidewar = false;
for( i=0; i<CHARARRAY_MAX_CHARS; i++ )
{
L2Player *cha = chars_array[i];
if( !cha ) continue;
if( cha->isUnused() ) continue;
isEnemy = false;
is2sidewar = false;
utils_detectClanWar( cha->relation, &isEnemy, &is2sidewar );
// name
lstrcpy( colText, cha->getName() );
lvi.pszText = colText;
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
lvi.iItem = 999;
lvi.iSubItem = 0;
lvi.lParam = cha->objectID;
// image
lvi.iImage = -1;
if( isEnemy )
{
lvi.iImage = 0;
if( !is2sidewar ) lvi.iImage = 3;
}
if( g_game_client->ai.party.isInParty( cha->objectID, NULL ) ) lvi.iImage = 1;
if( cha->isAlikeDead ) lvi.iImage = 2;
int added_item = -1;
int added_item2 = -1;
added_item = (int)SendMessage( g_rw_hWndCL, LVM_INSERTITEM, 0, (LPARAM)&lvi );
if( added_item == -1 ) continue;
if( isEnemy )
{
// add enemies also to enemies tab
added_item2 = (int)SendMessage( g_rw_hWndEnemies, LVM_INSERTITEM, 0, (LPARAM)&lvi );
}
lvi.iImage = 0;
// baseClass
#ifdef UNICODE
szBuf2[0] = szBuf1[0] = 0;
cha->getClassStr( szBuf1 );
if( cha->classID != cha->baseClassID )
{
cha->getBaseClassStr( szBuf2 );
wsprintfW( colText, L"%s / %s", szBuf1, szBuf2 );
}
else wsprintfW( colText, L"%s", szBuf1 );
#else
//wsprintfA( colText, "%s/%s", cha->classStr(), cha->baseClassStr() );
#endif
lvi.mask = LVIF_TEXT;
lvi.iItem = added_item;
lvi.iSubItem = 1;
lvi.pszText = colText;
SendMessage( g_rw_hWndCL, LVM_SETITEM, 0, (LPARAM)&lvi );
if( isEnemy )
{
// add enemies info also to enemies tab
lvi.iItem = added_item2;
SendMessage( g_rw_hWndEnemies, LVM_SETITEM, 0, (LPARAM)&lvi );
}
// clan
ClanList_GetClanNameByID( cha->clanID, colText ); // max 127 chars
lvi.mask = LVIF_TEXT;
lvi.iItem = added_item;
lvi.iSubItem = 2;
lvi.pszText = colText;
SendMessage( g_rw_hWndCL, LVM_SETITEM, 0, (LPARAM)&lvi );
if( isEnemy )
{
// add enemies info also to enemies tab
lvi.iItem = added_item2;
SendMessage( g_rw_hWndEnemies, LVM_SETITEM, 0, (LPARAM)&lvi );
}
// dZ
wsprintf( colText, TEXT("%d"), (user_z - cha->z) );
lvi.mask = LVIF_TEXT;
lvi.iItem = added_item;
lvi.iSubItem = 3;
lvi.pszText = colText;
SendMessage( g_rw_hWndCL, LVM_SETITEM, 0, (LPARAM)&lvi );
if( isEnemy )
{
// add enemies info also to enemies tab
lvi.iItem = added_item2;
SendMessage( g_rw_hWndEnemies, LVM_SETITEM, 0, (LPARAM)&lvi );
}
// clanwar state
if( isEnemy )
{
lvi.mask = LVIF_TEXT;
lvi.iItem = added_item;
lvi.iSubItem = 4;
lvi.pszText = colText;
colText[0] = 0;
if( isEnemy && !is2sidewar ) lstrcpy( colText, TEXT("<") );
if( isEnemy && is2sidewar ) lstrcpy( colText, TEXT("<>") );
if( colText[0] )
{
SendMessage( g_rw_hWndCL, LVM_SETITEM, 0, (LPARAM)&lvi );
// add enemies info also to enemies tab
lvi.iItem = added_item2;
SendMessage( g_rw_hWndEnemies, LVM_SETITEM, 0, (LPARAM)&lvi );
}
}
}
return 0;
}
LRESULT RW_OnUpdateNpcsList( HWND hWnd )
{
UNREFERENCED_PARAMETER(hWnd);
// in game?
if( g_game_client->getState() != GCST_IN_GAME ) return 0;
// clear ListView
SendMessage( g_rw_hWndNPC, LVM_DELETEALLITEMS, 0, 0 );
if( g_radarwnd_npc_displayEnable == 0 ) return 0;
//
int user_z;
user_z = g_game_client->ai.usr.z;
int i;
TCHAR colText[128] = {0};
wchar_t wName[128] = {0}; char aname[128] = {0};
wchar_t wTitle[128] = {0}; char atitle[128] = {0};
LVITEM lvi;
memset( &lvi, 0, sizeof(lvi) );
lvi.cchTextMax = 128;
lvi.pszText = colText;
for( i=0; i<NPCA_MAX_NPCS; i++ )
{
//
aname[0] = atitle[0] = 0;
wName[0] = wTitle[0] = 0;
//
L2Npc *npc = npc_array[i];
if( !npc ) continue;
if( npc->isUnused() ) continue;
// name
lstrcpy( colText, npc->getName() );
if( colText[0] == 0 )
{
if( L2Data_DB_GetNPCNameTitleByID( npc->templateID, aname, atitle ) )
{
MultiByteToWideChar( CP_ACP, 0, aname, -1, wName, 127 );
MultiByteToWideChar( CP_ACP, 0, atitle, -1, wTitle, 127 );
npc->setName( wName );
//npc->setTitle( wTitle );
lstrcpy( colText, wName );
}
}
lvi.pszText = colText;
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
lvi.iItem = 999;
lvi.iSubItem = 0;
lvi.lParam = npc->objectID;
lvi.iImage = -1;
if( npc->isAlikeDead ) lvi.iImage = 2;
int added_item = (int)SendMessage( g_rw_hWndNPC, LVM_INSERTITEM, 0, (LPARAM)&lvi );
if( added_item == -1 ) continue;
lvi.iImage = 0;
// title
#ifdef UNICODE
wcscpy( colText, npc->getTitle() );
if( (colText[0] == 0) && (wTitle[0]) )
{
lstrcpy( colText, wTitle );
npc->setTitle( wTitle );
}
#else
wsprintfA( colText, "%S", npc->getTitle() );
#endif
lvi.mask = LVIF_TEXT;
lvi.iItem = added_item;
lvi.iSubItem = 1;
lvi.pszText = colText;
SendMessage( g_rw_hWndNPC, LVM_SETITEM, 0, (LPARAM)&lvi );
// dZ
wsprintf( colText, TEXT("%d"), (user_z - npc->z) );
lvi.mask = LVIF_TEXT;
lvi.iItem = added_item;
lvi.iSubItem = 2;
lvi.pszText = colText;
SendMessage( g_rw_hWndNPC, LVM_SETITEM, 0, (LPARAM)&lvi );
// templateID
wsprintf( colText, TEXT("%d"), npc->templateID );
lvi.mask = LVIF_TEXT;
lvi.iItem = added_item;
lvi.iSubItem = 3;
lvi.pszText = colText;
SendMessage( g_rw_hWndNPC, LVM_SETITEM, 0, (LPARAM)&lvi );
}
return 0;
}