#include "stdafx.h" #include "Logger.h" #include "CharArray.h" #include "WorldObjectTree.h" #include "RadarDllWnd.h" // to post updates class L2Player *chars_array[CHARARRAY_MAX_CHARS]; CRITICAL_SECTION charArray_cs; //HWND charArray_updateHWND; //UINT charArray_updateMSG; UINT charArray_count; void CharArray_Init() { charArray_count = 0; //charArray_updateHWND = NULL; //charArray_updateMSG = 0; InitializeCriticalSection( &charArray_cs ); EnterCriticalSection( &charArray_cs ); int i; for( i=0; isetUnused(); } LeaveCriticalSection( &charArray_cs ); } void CharArray_Lock() { EnterCriticalSection( &charArray_cs ); } void CharArray_Unlock() { LeaveCriticalSection( &charArray_cs ); } //void CharArray_SetUpdateCommand( HWND hWnd, UINT uMsg ) //{ // charArray_updateHWND = hWnd; // charArray_updateMSG = uMsg; //} // //void CharArray_PostUpdateMessage() //{ // if( !charArray_updateHWND ) return; // if( charArray_updateMSG < WM_USER ) return; // PostMessage( charArray_updateHWND, charArray_updateMSG, 0, 0 ); //} void CharArray_Free() { int i; CharArray_Lock(); for( i=0; i %u]... ", // name, oid, // L2Data_getRace( race ), L2Data_getSex( sex ), L2Data_getClass( baseClass ), // x,y,z, heading ); CharArray_Lock(); // first try to find existing char in world object tree int idx = -1; L2OBJECT_TYPE objType = L2OT_NONE; WorldObjectTree_GetInfoByObjectID( cha->objectID, &objType, &idx ); if( (idx>=0) && (idxname() ); // update in radar window RadarWnd_UpdChar( cha->objectID ); } else // add new { idx = CharArray_FindFreeIndex(); if( idx >= 0 ) { //chars_array[idx]->setFromOther( cha ); memcpy( chars_array[idx], cha, sizeof(class L2Player) ); charArray_count++; // add char to world object tree WorldObjectTree_AddObject( cha->objectID, L2OT_PC, idx ); //log_error( LOG_USERAI, "Char: added new [%S] to idx[%d]\n", cha->name(), idx ); // add to radar window RadarWnd_AddChar( cha->objectID ); } else log_error( LOG_ERROR, "Error adding character [%S] to chars array! idx = %d\n", cha->getName(), idx ); } CharArray_Unlock(); } void CharArray_DeleteCharByObjectID( unsigned int objectID ) { CharArray_Lock(); BOOL bDelOK = 0; int idx = CharArray_FindCharByObjectID( objectID ); if( (idx>=0) && (idxsetUnused(); bDelOK = TRUE; charArray_count--; } CharArray_Unlock(); if( bDelOK ) //CharArray_PostUpdateMessage(); RadarWnd_DelChar( objectID ); } void CharArray_DeleteCharByIdx( int idx ) { BOOL bDelOK = FALSE; CharArray_Lock(); if( (idx>=0) && (idxobjectID; //log_error( LOG_USERAI, "Char: Deleted [%S] from [%d]\n", chars_array[idx]->name(), idx ); chars_array[idx]->setUnused(); bDelOK = TRUE; charArray_count--; // delete from WorldObjectTree WorldObjectTree_DelObject( objectID ); RadarWnd_DelChar( objectID ); } } CharArray_Unlock(); //if( bDelOK ) CharArray_PostUpdateMessage(); } void CharArray_DeleteAll() { CharArray_Lock(); int i; for( i=0; isetUnused(); } charArray_count = 0; CharArray_Unlock(); } /*void CharList_Display( FILE *f ) { if( !f || !bt_chars ) return; CharList_Lock(); fprintf( f, "===== Chars list =====\n" ); BinTreeNode *root = bt_chars->getRoot(); if( !root ) fprintf( f, "Chars list empty!\n" ); else CharList_displayNode( f, root ); fprintf( f, "======================\n" ); //bt_chars->printTree( f ); CharList_Unlock(); }*/ unsigned int CharArray_GetCount() { return charArray_count; } int CharArray_FindCharByObjectID( unsigned int objectID ) { int ret = -1; int i; CharArray_Lock(); for( i=0; iobjectID == objectID ) { ret = i; break; } } CharArray_Unlock(); return ret; } int CharArray_FindFreeIndex() { int i; CharArray_Lock(); for( i=0; isetUnused(); // and set as unused CharArray_Unlock(); return i; } if( chars_array[i]->isUnused() ) { CharArray_Unlock(); // just return index... return i; } } CharArray_Unlock(); return -1; }