Handler_Map.cpp
上传用户:tt_chan
上传日期:2009-12-03
资源大小:4523k
文件大小:18k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. BOOL jRegGetKey(LPCTSTR pSubKeyName, LPCTSTR pValueName, LPBYTE pValue);
  3. /* **************************************************************************************
  4. CMapCellInfo Class Members
  5.    **************************************************************************************/
  6. CMapCellInfo::CMapCellInfo()
  7. {
  8. // InitializeCriticalSection(&m_cs);
  9. }
  10. CMapCellInfo::~CMapCellInfo()
  11. {
  12. // DeleteCriticalSection(&m_cs);
  13. }
  14. /* **************************************************************************************
  15. CMirMap Global Function
  16.    **************************************************************************************/
  17. void LoadMap(CMapInfo* pMapInfo)
  18. {
  19. int nLen = memlen(pMapInfo->szMapFileName) - 1;
  20. int nLen2 = memlen(pMapInfo->szMapName) - 1;
  21. char szFullName[15];
  22. CMirMap* pMirMap = new CMirMap;
  23. if (pMirMap)
  24. {
  25. pMirMap->m_btSeries = pMapInfo->btMapSeries;
  26. pMirMap->m_btSeriesVal = pMapInfo->btMapSeriesValue;
  27. memcpy(pMirMap->m_szMapName, pMapInfo->szMapFileName, nLen);
  28. pMirMap->m_szMapName[nLen] = '';
  29. memcpy(pMirMap->m_szMapTextName, pMapInfo->szMapName, nLen2);
  30. pMirMap->m_szMapTextName[nLen2] = '';
  31. memcpy(szFullName, pMapInfo->szMapFileName, nLen);
  32. memcpy(&szFullName[nLen], ".map", 4);
  33. szFullName[nLen + 4] = '';
  34. pMirMap->LoadMapData(szFullName);
  35. }
  36. }
  37. CMirMap* GetMap(char *pszMapName)
  38. {
  39. PLISTNODE pListNode;
  40. CMirMap* pMirMap = NULL;
  41. if (g_xMirMapList.GetCount())
  42. {
  43. pListNode = g_xMirMapList.GetHead();
  44. while (pListNode)
  45. {
  46. pMirMap = g_xMirMapList.GetData(pListNode);
  47. if (memcmp(pMirMap->m_szMapName, pszMapName, memlen(pszMapName) -1) == 0)
  48. return pMirMap;
  49. pListNode = g_xMirMapList.GetNext(pListNode);
  50. } // while (pListNode)
  51. } // if (pMapCellInfo->m_pObjectList.GetCount())
  52. return NULL;
  53. }
  54. /* **************************************************************************************
  55. CMirMap Class Members
  56.    **************************************************************************************/
  57. CMirMap::CMirMap()
  58. {
  59. m_pMapCellInfo = NULL;
  60. }
  61. CMirMap::~CMirMap()
  62. {
  63. FreeMapData();
  64. }
  65. BOOL CMirMap::IsValidObject(int nX, int nY, int nCheckRange, CCharObject* pCharObject)
  66. {
  67. CMapCellInfo* pMapCellInfo = NULL;
  68. _LPTOSOBJECT pOSObject = NULL;
  69. for (int x = nX - nCheckRange; x <= nX + nCheckRange; x++)
  70. {
  71. for (int y = nY - nCheckRange; y <= nY + nCheckRange; y++)
  72. {
  73. pMapCellInfo = GetMapCellInfo(x, y);
  74. if (pMapCellInfo)
  75. {
  76. if (pMapCellInfo->m_xpObjectList)
  77. {
  78. if (pMapCellInfo->m_xpObjectList->GetCount())
  79. {
  80. PLISTNODE pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  81. while (pListNode)
  82. {
  83. pOSObject = (_LPTOSOBJECT)pMapCellInfo->m_xpObjectList->GetData(pListNode);
  84. if (pOSObject->btType == OS_MOVINGOBJECT)
  85. {
  86. if (pCharObject = (CCharObject*)pOSObject->pObject)
  87. return TRUE;
  88. }
  89. }
  90. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  91. } // while (pListNode)
  92. } // if (pMapCellInfo->m_pObjectList.GetCount())
  93. }
  94. }
  95. }
  96. return FALSE;
  97. }
  98. BOOL CMirMap::LoadMapData(char *pszName)
  99. {
  100. HANDLE hFile;
  101. LPCELLINFO pstCellInfo;
  102. TCHAR szMapName[15];
  103. TCHAR szMapFileName[256];
  104. TCHAR szPath[128];
  105. jRegGetKey(_GAME_SERVER_REGISTRY, _TEXT("MapFileLoc"), (LPBYTE)szPath);
  106. MultiByteToWideChar(CP_ACP, 0, pszName, -1, szMapName, sizeof(szMapName)/sizeof(TCHAR));
  107. lstrcpy(szMapFileName, szPath);
  108. lstrcat(szMapFileName, _TEXT("\"));
  109. lstrcat(szMapFileName, szMapName);
  110. hFile = CreateFile(szMapFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  111. if ( hFile != INVALID_HANDLE_VALUE )
  112. {
  113. DWORD dwReadLen;
  114. FreeMapData();
  115. ReadFile(hFile, &m_stMapFH, sizeof(MAPFILEHEADER), &dwReadLen, NULL);
  116. int nMapSize = m_stMapFH.shWidth * m_stMapFH.shHeight;
  117. SetFilePointer(hFile, sizeof(TILEINFO) * (nMapSize) / 4, 0, FILE_CURRENT);
  118. pstCellInfo = new CELLINFO[nMapSize];
  119. if (pstCellInfo)
  120. {
  121. ReadFile(hFile, pstCellInfo, sizeof(CELLINFO) * (nMapSize), &dwReadLen, NULL);
  122. CloseHandle(hFile);
  123. m_pMapCellInfo = new CMapCellInfo[nMapSize];
  124. if (m_pMapCellInfo)
  125. {
  126. for (int i = 0; i < nMapSize; i++)
  127. {
  128. m_pMapCellInfo[i].m_chFlag = pstCellInfo[i].cFlag;
  129. m_pMapCellInfo[i].m_sLightNEvent = pstCellInfo[i].shLigntNEvent;
  130. // if (m_pMapCellInfo[i].m_chFlag & 0x01)
  131. // m_pMapCellInfo[i].m_xpObjectList = new CWHList<_LPTOSOBJECT>;
  132. // else
  133. m_pMapCellInfo[i].m_xpObjectList = NULL;
  134. }
  135. }
  136. int nSize = sizeof(m_pMapCellInfo);
  137. delete [] pstCellInfo;
  138. pstCellInfo = NULL;
  139. InsertLogMsgParam(IDS_LOADMAPFILE_GOOD, szMapFileName, LOGPARAM_STR);
  140. g_xMirMapList.AddNewNode(this);
  141. return TRUE;
  142. }
  143. }
  144. InsertLogMsgParam(IDS_LOADMAPFILE_FAIL, szMapFileName, LOGPARAM_STR);
  145. return FALSE;
  146. }
  147. VOID CMirMap::FreeMapData()
  148. {
  149. ZeroMemory(&m_stMapFH, sizeof(MAPFILEHEADER));
  150. if (m_pMapCellInfo)
  151. {
  152. int nMapSize = m_stMapFH.shWidth * m_stMapFH.shHeight;
  153. for (int i = 0; i < nMapSize; i++)
  154. {
  155. if (m_pMapCellInfo[i].m_xpObjectList)
  156. {
  157. delete m_pMapCellInfo[i].m_xpObjectList;
  158. m_pMapCellInfo[i].m_xpObjectList = NULL;
  159. }
  160. }
  161. delete [] m_pMapCellInfo;
  162. m_pMapCellInfo = NULL;
  163. }
  164. }
  165. BOOL CMirMap::CanMove(int nX, int nY, BOOL fFlag)
  166. {
  167. BOOL fRet = FALSE;
  168. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  169. CCharObject* pCharObject;
  170. _LPTOSOBJECT pOSObject;
  171. if (pMapCellInfo)
  172. {
  173. if (pMapCellInfo->m_chFlag & 0x01)
  174. {
  175. fRet = TRUE;
  176. // EnterCriticalSection(&pMapCellInfo->m_cs);
  177. if (pMapCellInfo->m_xpObjectList)
  178. {
  179. if (pMapCellInfo->m_xpObjectList->GetCount())
  180. {
  181. PLISTNODE pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  182. while (pListNode)
  183. {
  184. pOSObject = (_LPTOSOBJECT)pMapCellInfo->m_xpObjectList->GetData(pListNode);
  185. if (pOSObject->btType == OS_MOVINGOBJECT)
  186. {
  187. if (pCharObject = (CCharObject*)pOSObject->pObject)
  188. {
  189. if (!pCharObject->m_fIsDead && !pCharObject->m_fInspector && !pCharObject->m_fHideMode)
  190. {
  191. if (!fFlag) 
  192. {
  193. fRet = FALSE;
  194. break;
  195. }
  196. }
  197. }
  198. }
  199. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  200. } // while (pListNode)
  201. } // if (pMapCellInfo->m_pObjectList.GetCount())
  202. }
  203. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  204. }
  205. }
  206. return fRet;
  207. }
  208. int CMirMap::CheckDoorEvent(int nX, int nY, int &nEvent)
  209. {
  210. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  211. if (pMapCellInfo)
  212. {
  213. if (pMapCellInfo->m_sLightNEvent & 0x02) // Door Event
  214. {
  215. nEvent = ((pMapCellInfo->m_sLightNEvent & 0x3FFF) >> 4);
  216. if (pMapCellInfo->m_sLightNEvent & 0x08) // Event
  217. {
  218. if (pMapCellInfo->m_sLightNEvent & 0xC000)
  219. return _DOOR_MAPMOVE_BACK;
  220. else
  221. return _DOOR_MAPMOVE_FRONT;
  222. }
  223. return _DOOR_OPEN;
  224. }
  225. }
  226. return _DOOR_NOT;
  227. }
  228. int CMirMap::CheckEvent(int nX, int nY)
  229. {
  230. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  231. if (pMapCellInfo)
  232. {
  233. if (pMapCellInfo->m_sLightNEvent & 0x04) // Event
  234. return ((pMapCellInfo->m_sLightNEvent & 0xC000) >> 4);
  235. }
  236. return 0;
  237. }
  238. BOOL CMirMap::MoveToMovingObject(int nX, int nY, int nTargetX, int nTargetY, CCharObject* pObject)
  239. {
  240. BOOL fRet = FALSE;
  241. // CMapCellInfo* pMapTargetCellInfo = GetMapCellInfo(nTargetX, nTargetY);
  242. // CMapCellInfo* pMapCurrCellInfo = GetMapCellInfo(nX, nY);
  243. // if (pMapCurrCellInfo && pMapTargetCellInfo)
  244. // {
  245. // if (pMapTargetCellInfo->m_chFlag & 0x01)
  246. // {
  247. // if (pMapTargetCellInfo->m_xpObjectList->GetCount())
  248. // fRet = FALSE;
  249. // else
  250. // {
  251. if (RemoveObject(nX, nY, OS_MOVINGOBJECT, pObject))
  252. {
  253. if (AddNewObject(nTargetX, nTargetY, OS_MOVINGOBJECT, pObject))
  254. fRet = TRUE;
  255. else
  256. fRet = FALSE;
  257. }
  258. else
  259. {
  260. #ifdef _DEBUG
  261. _RPT4(_CRT_WARN, "Remove Failed : %d, %d, %d, %d", nX, nY, nTargetX, nTargetY);
  262. #endif
  263. fRet = FALSE;
  264. }
  265. // }
  266. // } // if ((pMapCellInfo->m_chFlag & 0x01)
  267. // } // if (pMapCurrCellInfo && pMapTargetCellInfo)
  268. return fRet;
  269. }
  270. BOOL CMirMap::RemoveObject(int nX, int nY, BYTE btType, VOID* pRemoveObject)
  271. {
  272. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  273. PLISTNODE pListNode;
  274. _LPTOSOBJECT pOSObject;
  275. if (pMapCellInfo)
  276. {
  277. // EnterCriticalSection(&pMapCellInfo->m_cs);
  278. if (!pMapCellInfo->m_xpObjectList) 
  279. return FALSE;
  280. if (pMapCellInfo->m_xpObjectList->GetCount())
  281. {
  282. pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  283. while (pListNode)
  284. {
  285. pOSObject = (_LPTOSOBJECT)pMapCellInfo->m_xpObjectList->GetData(pListNode);
  286. if (pOSObject)
  287. {
  288. if ((pOSObject->pObject == pRemoveObject) && (pOSObject->btType == btType))
  289. {
  290. pListNode = pMapCellInfo->m_xpObjectList->RemoveNode(pListNode);
  291. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  292. return TRUE;
  293. }
  294. }
  295. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  296. } // while (pListNode)
  297. } // if (pMapCellInfo->m_pObjectList.GetCount())
  298. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  299. }
  300. return FALSE;
  301. }
  302. BOOL CMirMap::AddNewObject(int nX, int nY, BYTE btType, VOID* pAddObject)
  303. {
  304. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  305. if (pMapCellInfo)
  306. {
  307. if (pMapCellInfo->m_chFlag & 0x01)
  308. {
  309. if (!pMapCellInfo->m_xpObjectList)
  310. pMapCellInfo->m_xpObjectList = new CWHList<_LPTOSOBJECT>;
  311. _LPTOSOBJECT pOSObject = new _TOSOBJECT;
  312. if (pOSObject)
  313. {
  314. // EnterCriticalSection(&pMapCellInfo->m_cs);
  315. pOSObject->btType = btType;
  316. pOSObject->pObject = pAddObject;
  317. pOSObject->dwAddTime = GetTickCount();
  318. pMapCellInfo->m_xpObjectList->AddNewNode(pOSObject);
  319. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  320. return TRUE;
  321. }
  322. }
  323. }
  324. return FALSE;
  325. }
  326. CCharObject* CMirMap::GetObject(int nX, int nY)
  327. {
  328. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  329. _LPTOSOBJECT pOSObject;
  330. PLISTNODE pListNode;
  331. if (pMapCellInfo)
  332. {
  333. if (!(pMapCellInfo->m_chFlag & 0x01))
  334. return NULL;
  335. // EnterCriticalSection(&pMapCellInfo->m_cs);
  336. if (pMapCellInfo->m_xpObjectList)
  337. {
  338. if (pMapCellInfo->m_xpObjectList->GetCount())
  339. {
  340. pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  341. while (pListNode)
  342. {
  343. pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  344. if (pOSObject)
  345. {
  346. if (pOSObject->btType == OS_MOVINGOBJECT)
  347. {
  348. CCharObject* pCharObject = (CCharObject*)pOSObject->pObject;
  349. if (!pCharObject->m_fIsDead && !pCharObject->m_fIsGhost)
  350. {
  351. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  352. return pCharObject;
  353. }
  354. }
  355. }
  356. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  357. } // while (pListNode)
  358. } // if (pMapCellInfo->m_pObjectList.GetCount())
  359. }
  360. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  361. }
  362. return NULL;
  363. }
  364. void CMirMap::GetMapObject(int nX, int nY, int nArea, CWHList<CCharObject*>* pList)
  365. {
  366. int nStartX = nX - nArea;
  367. int nEndX = nX + nArea;
  368. int nStartY = nY - nArea;
  369. int nEndY = nY + nArea;
  370. _LPTOSOBJECT pOSObject;
  371. __try
  372. {
  373. for (int x = nStartX; x <= nEndX; x++)
  374. {
  375. for (int y = nStartY; y <= nEndY; y++)
  376. {
  377. if (CMapCellInfo* pMapCellInfo = GetMapCellInfo(x, y))
  378. {
  379. // EnterCriticalSection(&pMapCellInfo->m_cs);
  380. if (pMapCellInfo->m_xpObjectList)
  381. {
  382. if (pMapCellInfo->m_xpObjectList->GetCount())
  383. {
  384. PLISTNODE pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  385. while (pListNode)
  386. {
  387. pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  388. if (pOSObject->btType == OS_MOVINGOBJECT)
  389. {
  390. CCharObject* pCharObject = (CCharObject*)pOSObject->pObject;
  391. if (!pCharObject->m_fIsGhost && !pCharObject->m_fIsDead )
  392. pList->AddNewNode(pCharObject);
  393. }
  394. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  395. } // while (pListNode)
  396. } // if (pMapCellInfo->m_pObjectList.GetCount())
  397. }
  398. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  399. } // if (pMapCellInfo)
  400. }// for (y)
  401. } // for (x)
  402. }
  403. __finally
  404. {
  405. }
  406. }
  407. void CMirMap::GetAllObject(int nX, int nY, CWHList<CCharObject*>* pList)
  408. {
  409. _LPTOSOBJECT pOSObject;
  410. if (CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY))
  411. {
  412. // EnterCriticalSection(&pMapCellInfo->m_cs);
  413. if (pMapCellInfo->m_xpObjectList)
  414. {
  415. if (pMapCellInfo->m_xpObjectList->GetCount())
  416. {
  417. PLISTNODE pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  418. while (pListNode)
  419. {
  420. pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  421. if (pOSObject->btType == OS_MOVINGOBJECT)
  422. {
  423. CCharObject* pCharObject = (CCharObject*)pOSObject->pObject;
  424. if (!pCharObject->m_fIsGhost && !pCharObject->m_fIsDead )
  425. pList->AddNewNode(pCharObject);
  426. }
  427. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  428. } // while (pListNode)
  429. } // if (pMapCellInfo->m_pObjectList.GetCount())
  430. }
  431. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  432. } // if (pMapCellInfo)
  433. }
  434. int CMirMap::GetDupCount(int nX, int nY)
  435. {
  436. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  437. _LPTOSOBJECT pOSObject;
  438. PLISTNODE pListNode;
  439. int nCount = 0;
  440. if (pMapCellInfo)
  441. {
  442. // EnterCriticalSection(&pMapCellInfo->m_cs);
  443. if (pMapCellInfo->m_xpObjectList)
  444. {
  445. if (pMapCellInfo->m_xpObjectList->GetCount())
  446. {
  447. pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  448. while (pListNode)
  449. {
  450. pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  451. if (pOSObject)
  452. {
  453. if (pOSObject->btType == OS_MOVINGOBJECT)
  454. {
  455. CCharObject* pCharObject = (CCharObject*)pOSObject->pObject;
  456. if (!pCharObject->m_fIsDead && !pCharObject->m_fIsGhost && !pCharObject->m_fHideMode)
  457. nCount++;
  458. }
  459. }
  460. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  461. } // while (pListNode)
  462. } // if (pMapCellInfo->m_pObjectList.GetCount())
  463. }
  464. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  465. }
  466. return nCount;
  467. }
  468. CMapItem* CMirMap::GetItem(int nX, int nY)
  469. {
  470. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  471. _LPTOSOBJECT pOSObject;
  472. PLISTNODE pListNode;
  473. if (pMapCellInfo)
  474. {
  475. // EnterCriticalSection(&pMapCellInfo->m_cs);
  476. if (!(pMapCellInfo->m_chFlag & 0x01))
  477. return NULL;
  478. if (pMapCellInfo->m_xpObjectList)
  479. {
  480. if (pMapCellInfo->m_xpObjectList->GetCount())
  481. {
  482. pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  483. while (pListNode)
  484. {
  485. pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  486. if (pOSObject)
  487. {
  488. if (pOSObject->btType == OS_ITEMOBJECT)
  489. {
  490. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  491. return (CMapItem*)pOSObject->pObject;
  492. }
  493. }
  494. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  495. } // while (pListNode)
  496. } // if (pMapCellInfo->m_pObjectList.GetCount())
  497. }
  498. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  499. }
  500. return NULL;
  501. }
  502. BOOL CMirMap::GetDropPosition(int nOrgX, int nOrgY, int nRange, int &nX, int &nY)
  503. {
  504. int nLoonCnt = (4 * nRange) * (nRange + 1);
  505. for (int i = 0; i < nLoonCnt; i++)
  506. {
  507. nX = nOrgX + g_SearchTable[i].x;
  508. nY = nOrgY + g_SearchTable[i].y;
  509. if (GetItem(nX, nY) == NULL)
  510. return TRUE;
  511. }
  512. nX = nOrgX;
  513. nY = nOrgY;
  514. return FALSE;
  515. }
  516. CEvent* CMirMap::GetEvent(int nX, int nY)
  517. {
  518. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  519. _LPTOSOBJECT pOSObject;
  520. PLISTNODE pListNode;
  521. if (pMapCellInfo)
  522. {
  523. // EnterCriticalSection(&pMapCellInfo->m_cs);
  524. if (!(pMapCellInfo->m_chFlag & 0x01))
  525. return NULL;
  526. if (pMapCellInfo->m_xpObjectList)
  527. {
  528. if (pMapCellInfo->m_xpObjectList->GetCount())
  529. {
  530. pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  531. while (pListNode)
  532. {
  533. pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  534. if (pOSObject)
  535. {
  536. if (pOSObject->btType == OS_EVENTOBJECT)
  537. {
  538. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  539. return (CEvent*)pOSObject->pObject;
  540. }
  541. }
  542. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  543. } // while (pListNode)
  544. } // if (pMapCellInfo->m_pObjectList.GetCount())
  545. }
  546. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  547. }
  548. return NULL;
  549. }
  550. BOOL CMirMap::CanSafeWalk(int nX, int nY)
  551. {
  552. CMapCellInfo* pMapCellInfo = GetMapCellInfo(nX, nY);
  553. _LPTOSOBJECT pOSObject;
  554. PLISTNODE pListNode;
  555. if (pMapCellInfo)
  556. {
  557. // EnterCriticalSection(&pMapCellInfo->m_cs);
  558. if (!(pMapCellInfo->m_chFlag & 0x01))
  559. return NULL;
  560. if (pMapCellInfo->m_xpObjectList)
  561. {
  562. if (pMapCellInfo->m_xpObjectList->GetCount())
  563. {
  564. pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  565. while (pListNode)
  566. {
  567. pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  568. if (pOSObject)
  569. {
  570. if (pOSObject->btType == OS_EVENTOBJECT)
  571. {
  572. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  573. if (((CEvent*)pOSObject->pObject)->m_nDamage > 0)
  574. return FALSE;
  575. }
  576. }
  577. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  578. } // while (pListNode)
  579. } // if (pMapCellInfo->m_pObjectList.GetCount())
  580. }
  581. // LeaveCriticalSection(&pMapCellInfo->m_cs);
  582. }
  583. return TRUE;
  584. }