KRegion.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:31k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "KCore.h"
  2. #include "KNpc.h"
  3. #include "KNpcSet.h"
  4. #include "KMissleSet.h"
  5. #include "KObjSet.h"
  6. #include "KPlayerSet.h"
  7. #include "KPlayer.h"
  8. #include "KMissle.h"
  9. #include "KObj.h"
  10. #include "KWorldMsg.h"
  11. #include "KSubWorld.h"
  12. #ifdef _SERVER
  13. //#include "KNetServer.h"
  14. //#include "../MultiServer/Heaven/Interface/iServer.h"
  15. #endif
  16. #include "Scene/ObstacleDef.h"
  17. #include "Scene/SceneDataDef.h"
  18. #include "KRegion.h"
  19. #include "MyAssert.H"
  20. KRegion::KRegion()
  21. {
  22. m_nIndex = -1;
  23. m_RegionID = -1;
  24. m_nActive = 0;
  25. m_nNpcSyncCounter = 0;
  26. m_nObjSyncCounter = 0;
  27. m_nWidth = 0;
  28. m_nHeight = 0;
  29. ZeroMemory(m_nConnectRegion, 8 * sizeof(int));
  30. m_pNpcRef = NULL;
  31. m_pObjRef = NULL;
  32. m_pMslRef = NULL;
  33. #ifdef _SERVER
  34. memset(m_dwTrap, 0, sizeof(m_dwTrap));
  35. #endif
  36. }
  37. KRegion::~KRegion()
  38. {
  39. if (m_pMslRef)
  40. delete [] m_pMslRef;
  41. if (m_pNpcRef)
  42. delete [] m_pNpcRef;
  43. if (m_pObjRef)
  44. delete [] m_pObjRef;
  45. }
  46. BOOL KRegion::Init(int nWidth, int nHeight)
  47. {
  48. m_nWidth = nWidth;
  49. m_nHeight = nHeight;
  50. if (!m_pNpcRef)
  51. m_pNpcRef = new BYTE[nWidth * nHeight];
  52. if (!m_pNpcRef)
  53. return FALSE;
  54. ZeroMemory(m_pNpcRef, nWidth * nHeight);
  55. if (!m_pObjRef)
  56. m_pObjRef = new BYTE[nWidth * nHeight];
  57. if (!m_pObjRef)
  58. return FALSE;
  59. ZeroMemory(m_pObjRef, nWidth * nHeight);
  60. if (!m_pMslRef)
  61. m_pMslRef = new BYTE[nWidth * nHeight];
  62. if (!m_pMslRef)
  63. return FALSE;
  64. ZeroMemory(m_pMslRef, nWidth * nHeight);
  65. return TRUE;
  66. }
  67. BOOL KRegion::Load(int nX, int nY)
  68. {
  69. #ifndef _SERVER
  70. Close();
  71. #endif
  72. m_RegionID = MAKELONG(nX, nY);
  73. m_nRegionX = nX * 512;
  74. m_nRegionY = nY * 1024;
  75. // 下方
  76. m_nConRegionID[0] = MAKELONG(nX, nY + 1);
  77. // 左下方
  78. m_nConRegionID[1] = MAKELONG(nX - 1, nY + 1);
  79. // 左方
  80. m_nConRegionID[2] = MAKELONG(nX - 1, nY);
  81. // 左上方
  82. m_nConRegionID[3] = MAKELONG(nX - 1, nY - 1);
  83. // 上方
  84. m_nConRegionID[4] = MAKELONG(nX, nY - 1);
  85. // 右上方
  86. m_nConRegionID[5] = MAKELONG(nX + 1, nY - 1);
  87. // 右方
  88. m_nConRegionID[6] = MAKELONG(nX + 1, nY);
  89. // 右下方
  90. m_nConRegionID[7] = MAKELONG(nX + 1, nY + 1);
  91. return TRUE;
  92. }
  93. #ifdef _SERVER
  94. //----------------------------------------------------------------------
  95. // 功能:载入服务器端地图上本region 的 object数据(包括npc、trap、box等)
  96. // 注意:使用此函数之前必须保证当前路径是本地图路径
  97. //----------------------------------------------------------------------
  98. BOOL KRegion::LoadObject(int nSubWorld, int nX, int nY)
  99. {
  100. KPakFile cData;
  101. char szFilePath[80];
  102. char szFile[80];
  103. g_GetFilePath(szFile);
  104. sprintf(szFilePath, "\%sv_%03d", szFile, nY);
  105. // g_SetFilePath(szFilePath);
  106. sprintf(szFile, "%s\%03d_%s", szFilePath, nX, REGION_COMBIN_FILE_NAME_SERVER);
  107. if (cData.Open(szFile))
  108. {
  109. DWORD dwHeadSize;
  110. DWORD dwMaxElemFile = 0;
  111. KCombinFileSection sElemFile[REGION_ELEM_FILE_COUNT];
  112. if (cData.Size() < sizeof(DWORD) + sizeof(KCombinFileSection) * REGION_ELEM_FILE_COUNT)
  113. {
  114. ZeroMemory(m_Obstacle, sizeof(m_Obstacle));
  115. goto gotoCLOSE;
  116. }
  117. cData.Read(&dwMaxElemFile, sizeof(DWORD));
  118. if (dwMaxElemFile > REGION_ELEM_FILE_COUNT)
  119. {
  120. cData.Read(sElemFile, sizeof(sElemFile));
  121. cData.Seek(sizeof(KCombinFileSection) * (dwMaxElemFile - REGION_ELEM_FILE_COUNT), FILE_CURRENT);
  122. }
  123. else
  124. {
  125. cData.Read(sElemFile, sizeof(sElemFile));
  126. }
  127. dwHeadSize = sizeof(DWORD) + sizeof(KCombinFileSection) * dwMaxElemFile;
  128. // 载入障碍数据
  129. cData.Seek(dwHeadSize + sElemFile[REGION_OBSTACLE_FILE_INDEX].uOffset, FILE_BEGIN);
  130. LoadServerObstacle(&cData, sElemFile[REGION_OBSTACLE_FILE_INDEX].uLength);
  131. // 载入trap信息
  132. cData.Seek(dwHeadSize + sElemFile[REGION_TRAP_FILE_INDEX].uOffset, FILE_BEGIN);
  133. LoadServerTrap(&cData, sElemFile[REGION_TRAP_FILE_INDEX].uLength);
  134. // 载入npc数据
  135. cData.Seek(dwHeadSize + sElemFile[REGION_NPC_FILE_INDEX].uOffset, FILE_BEGIN);
  136. LoadServerNpc(nSubWorld, &cData, sElemFile[REGION_NPC_FILE_INDEX].uLength);
  137. // 载入obj数据
  138. cData.Seek(dwHeadSize + sElemFile[REGION_OBJ_FILE_INDEX].uOffset, FILE_BEGIN);
  139. LoadServerObj(nSubWorld, &cData, sElemFile[REGION_OBJ_FILE_INDEX].uLength);
  140. gotoCLOSE:
  141. cData.Close();
  142. }
  143. else
  144. {
  145. KPakFile cObstacle;
  146. // g_SetFilePath(szFilePath);
  147. sprintf(szFile, "%s\%03d_%s", szFilePath, nX, REGION_OBSTACLE_FILE);
  148. if (cObstacle.Open(szFile))
  149. {
  150. if (cObstacle.Size() != sizeof(m_Obstacle))
  151. ZeroMemory(m_Obstacle, sizeof(m_Obstacle));
  152. else
  153. cObstacle.Read((LPVOID)m_Obstacle, sizeof(m_Obstacle));
  154. cObstacle.Close();
  155. }
  156. else
  157. {
  158. ZeroMemory(m_Obstacle, sizeof(m_Obstacle));
  159. }
  160. KPakFile cTrapData, cNpcData;
  161. // 载入trap信息
  162. KTrapFileHead sTrapFileHead;
  163. KSPTrap sTrapCell;
  164. int i, j;
  165. // g_SetFilePath(szFilePath);
  166. sprintf(szFile, "%s\%03d_%s", szFilePath, nX, REGION_TRAP_FILE);
  167. memset(this->m_dwTrap, 0, sizeof(m_dwTrap));
  168. if (!cTrapData.Open(szFile))
  169. goto TRAP_CLOSE;
  170. if (cTrapData.Size() < sizeof(KTrapFileHead))
  171. goto TRAP_CLOSE;
  172. cTrapData.Read(&sTrapFileHead, sizeof(KTrapFileHead));
  173. if (sTrapFileHead.uNumTrap * sizeof(KSPTrap) + sizeof(KTrapFileHead) != cTrapData.Size())
  174. goto TRAP_CLOSE;
  175. for (i = 0; i < sTrapFileHead.uNumTrap; i++)
  176. {
  177. cTrapData.Read(&sTrapCell, sizeof(KSPTrap));
  178. if (sTrapCell.cY >= REGION_GRID_HEIGHT || sTrapCell.cX + sTrapCell.cNumCell - 1 >= REGION_GRID_WIDTH)
  179. continue;
  180. for (j = 0; j < sTrapCell.cNumCell; j++)
  181. {
  182. m_dwTrap[sTrapCell.cX + j][sTrapCell.cY] = sTrapCell.uTrapId;
  183. }
  184. }
  185. TRAP_CLOSE:
  186. cTrapData.Close();
  187. // 载入npc数据
  188. KNpcFileHead sNpcFileHead;
  189. KSPNpc sNpcCell;
  190. // g_SetFilePath(szFilePath);
  191. sprintf(szFile, "%s\%03d_%s", szFilePath, nX, REGION_NPC_FILE_SERVER);
  192. if (!cNpcData.Open(szFile))
  193. goto NPC_CLOSE;
  194. if (cNpcData.Size() < sizeof(KNpcFileHead))
  195. goto NPC_CLOSE;
  196. cNpcData.Read(&sNpcFileHead, sizeof(KNpcFileHead));
  197. for (i = 0; i < sNpcFileHead.uNumNpc; i++)
  198. {
  199. cNpcData.Read(&sNpcCell, sizeof(KSPNpc) - sizeof(sNpcCell.szScript));
  200. if (sNpcCell.nScriptNameLen < sizeof(sNpcCell.szScript))
  201. {
  202. cNpcData.Read(sNpcCell.szScript, sNpcCell.nScriptNameLen);
  203. sNpcCell.szScript[sNpcCell.nScriptNameLen] = 0;
  204. }
  205. else
  206. {
  207. sNpcCell.szScript[0] = 0;
  208. }
  209. NpcSet.Add(nSubWorld, &sNpcCell);
  210. }
  211. g_DebugLog("[TEST]Region%x have %d npc", m_RegionID, sNpcFileHead.uNumNpc);
  212. NPC_CLOSE:
  213. cNpcData.Close();
  214. // 载入obj数据
  215. ObjSet.ServerLoadRegionObj(szFilePath, nX, nY, nSubWorld);
  216. }
  217. return TRUE;
  218. }
  219. #endif
  220. #ifndef _SERVER
  221. //----------------------------------------------------------------------
  222. // 功能:载入客户端地图上本region 的 object数据(包括npc、box等)
  223. // 如果 bLoadNpcFlag == TRUE 需要载入 clientonly npc else 不载入
  224. //----------------------------------------------------------------------
  225. BOOL KRegion::LoadObject(int nSubWorld, int nX, int nY, char *lpszPath)
  226. {
  227. #ifdef TOOLVERSION
  228. return TRUE;
  229. #endif
  230. char szPath[FILE_NAME_LENGTH], szFile[FILE_NAME_LENGTH];
  231. if (!lpszPath || !lpszPath[0] || strlen(lpszPath) >= FILE_NAME_LENGTH)
  232. return FALSE;
  233. sprintf(szPath, "\%s\v_%03d", lpszPath, nY);
  234. // g_SetFilePath(szPath);
  235. // 载入npc数组中位于本地的 client npc
  236. NpcSet.InsertNpcToRegion(this->m_nIndex);
  237. KPakFile cData;
  238. sprintf(szFile, "%s\%03d_%s", szPath, nX, REGION_COMBIN_FILE_NAME_CLIENT);
  239. if (cData.Open(szFile))
  240. {
  241. DWORD dwHeadSize;
  242. DWORD dwMaxElemFile = 0;
  243. KCombinFileSection sElemFile[REGION_ELEM_FILE_COUNT];
  244. if (cData.Size() < sizeof(DWORD) + sizeof(KCombinFileSection) * REGION_ELEM_FILE_COUNT)
  245. goto gotoCLOSE;
  246. cData.Read(&dwMaxElemFile, sizeof(DWORD));
  247. if (dwMaxElemFile > REGION_ELEM_FILE_COUNT)
  248. {
  249. cData.Read(sElemFile, sizeof(sElemFile));
  250. cData.Seek(sizeof(KCombinFileSection) * (dwMaxElemFile - REGION_ELEM_FILE_COUNT), FILE_CURRENT);
  251. }
  252. else
  253. {
  254. cData.Read(sElemFile, sizeof(sElemFile));
  255. }
  256. dwHeadSize = sizeof(DWORD) + sizeof(KCombinFileSection) * dwMaxElemFile;
  257. // 载入npc数据
  258. cData.Seek(dwHeadSize + sElemFile[REGION_NPC_FILE_INDEX].uOffset, FILE_BEGIN);
  259. LoadClientNpc(&cData, sElemFile[REGION_NPC_FILE_INDEX].uLength);
  260. // 载入obj数据
  261. cData.Seek(dwHeadSize + sElemFile[REGION_OBJ_FILE_INDEX].uOffset, FILE_BEGIN);
  262. LoadClientObj(&cData, sElemFile[REGION_OBJ_FILE_INDEX].uLength);
  263. gotoCLOSE:
  264. cData.Close();
  265. }
  266. else
  267. {
  268. // 载入 Client npc 数据
  269. KPakFile cNpcData;
  270. KNpcFileHead sNpcFileHead;
  271. KSPNpc sNpcCell;
  272. DWORD i;
  273. KClientNpcID sTempID;
  274. int nNpcNo;
  275. // 载入地图文件里的 client npc
  276. // g_SetFilePath(szPath);
  277. sprintf(szFile, "%s\%03d_%s", szPath, nX, REGION_NPC_FILE_CLIENT);
  278. if (!cNpcData.Open(szFile))
  279. goto NPC_CLOSE;
  280. if (cNpcData.Size() < sizeof(KNpcFileHead))
  281. goto NPC_CLOSE;
  282. cNpcData.Read(&sNpcFileHead, sizeof(KNpcFileHead));
  283. for (i = 0; i < sNpcFileHead.uNumNpc; i++)
  284. {
  285. cNpcData.Read(&sNpcCell, sizeof(KSPNpc) - sizeof(sNpcCell.szScript));
  286. _ASSERT(sNpcCell.nScriptNameLen < sizeof(sNpcCell.szScript));
  287. if (sNpcCell.nScriptNameLen > 0)
  288. {
  289. cNpcData.Read(sNpcCell.szScript, sNpcCell.nScriptNameLen);
  290. sNpcCell.szScript[sNpcCell.nScriptNameLen] = 0;
  291. }
  292. else
  293. {
  294. sNpcCell.szScript[0] = 0;
  295. }
  296. sTempID.m_dwRegionID = MAKELONG(nX, nY);
  297. sTempID.m_nNo = i;
  298. nNpcNo = NpcSet.SearchClientID(sTempID);
  299. if (nNpcNo == 0)
  300. {
  301. int nIdx = NpcSet.AddClientNpc(sNpcCell.nTemplateID, nX, nY, sNpcCell.nPositionX, sNpcCell.nPositionY, i);
  302. if (nIdx > 0)
  303. {
  304. Npc[nIdx].m_Kind = sNpcCell.shKind;
  305. Npc[nIdx].SendCommand(do_stand);
  306. Npc[nIdx].m_Dir = Npc[nIdx].GetNormalNpcStandDir(sNpcCell.nCurFrame);
  307. }
  308. }
  309. }
  310. NPC_CLOSE:
  311. cNpcData.Close();
  312. // 载入ClientObject数据
  313. ObjSet.ClientLoadRegionObj(szPath, nX, nY, nSubWorld, this->m_nIndex);
  314. }
  315. return TRUE;
  316. }
  317. #endif
  318. #ifdef _SERVER
  319. //----------------------------------------------------------------------
  320. // 功能:载入服务器端地图上本 region 的障碍数据
  321. //----------------------------------------------------------------------
  322. BOOL KRegion::LoadServerObstacle(KPakFile *pFile, DWORD dwDataSize)
  323. {
  324. if (!pFile || dwDataSize != sizeof(this->m_Obstacle))
  325. {
  326. memset(m_Obstacle, 0, sizeof(m_Obstacle));
  327. return FALSE;
  328. }
  329. pFile->Read((LPVOID)m_Obstacle, sizeof(m_Obstacle));
  330. return TRUE;
  331. }
  332. #endif
  333. #ifdef _SERVER
  334. //----------------------------------------------------------------------
  335. // 功能:载入服务器端地图上本 region 的 trap 数据
  336. //----------------------------------------------------------------------
  337. BOOL KRegion::LoadServerTrap(KPakFile *pFile, DWORD dwDataSize)
  338. {
  339. memset(m_dwTrap, 0, sizeof(m_dwTrap));
  340. if (!pFile || dwDataSize < sizeof(KTrapFileHead))
  341. return FALSE;
  342. KTrapFileHead sTrapFileHead;
  343. KSPTrap sTrapCell;
  344. int i, j;
  345. pFile->Read(&sTrapFileHead, sizeof(KTrapFileHead));
  346. if (sTrapFileHead.uNumTrap * sizeof(KSPTrap) + sizeof(KTrapFileHead) != dwDataSize)
  347. return FALSE;
  348. for (i = 0; i < sTrapFileHead.uNumTrap; i++)
  349. {
  350. pFile->Read(&sTrapCell, sizeof(KSPTrap));
  351. if (sTrapCell.cY >= REGION_GRID_HEIGHT || sTrapCell.cX + sTrapCell.cNumCell - 1 >= REGION_GRID_WIDTH)
  352. continue;
  353. for (j = 0; j < sTrapCell.cNumCell; j++)
  354. {
  355. m_dwTrap[sTrapCell.cX + j][sTrapCell.cY] = sTrapCell.uTrapId;
  356. }
  357. }
  358. return TRUE;
  359. }
  360. #endif
  361. #ifdef _SERVER
  362. //----------------------------------------------------------------------
  363. // 功能:载入服务器端地图上本 region 的 npc 数据
  364. //----------------------------------------------------------------------
  365. BOOL KRegion::LoadServerNpc(int nSubWorld, KPakFile *pFile, DWORD dwDataSize)
  366. {
  367. if (!pFile || dwDataSize < sizeof(KNpcFileHead))
  368. return FALSE;
  369. KNpcFileHead sNpcFileHead;
  370. KSPNpc sNpcCell;
  371. pFile->Read(&sNpcFileHead, sizeof(KNpcFileHead));
  372. for (int i = 0; i < sNpcFileHead.uNumNpc; i++)
  373. {
  374. pFile->Read(&sNpcCell, sizeof(KSPNpc) - sizeof(sNpcCell.szScript));
  375. if (sNpcCell.nScriptNameLen < sizeof(sNpcCell.szScript))
  376. {
  377. pFile->Read(sNpcCell.szScript, sNpcCell.nScriptNameLen);
  378. sNpcCell.szScript[sNpcCell.nScriptNameLen] = 0;
  379. }
  380. else
  381. {
  382. sNpcCell.szScript[0] = 0;
  383. pFile->Seek(sNpcCell.nScriptNameLen, FILE_CURRENT);
  384. }
  385. NpcSet.Add(nSubWorld, &sNpcCell);
  386. }
  387. return TRUE;
  388. }
  389. #endif
  390. #ifdef _SERVER
  391. //----------------------------------------------------------------------
  392. // 功能:载入服务器端地图上本 region 的 obj 数据
  393. //----------------------------------------------------------------------
  394. BOOL KRegion::LoadServerObj(int nSubWorld, KPakFile *pFile, DWORD dwDataSize)
  395. {
  396. return ObjSet.ServerLoadRegionObj(nSubWorld, pFile, dwDataSize);
  397. }
  398. #endif
  399. #ifndef _SERVER
  400. //----------------------------------------------------------------------
  401. // 功能:载入客户端地图上本 region 的 clientonlynpc 数据
  402. //----------------------------------------------------------------------
  403. BOOL KRegion::LoadClientNpc(KPakFile *pFile, DWORD dwDataSize)
  404. {
  405. if (!pFile || dwDataSize < sizeof(KNpcFileHead))
  406. return FALSE;
  407. KNpcFileHead sNpcFileHead;
  408. KSPNpc sNpcCell;
  409. DWORD i;
  410. KClientNpcID sTempID;
  411. int nNpcNo;
  412. pFile->Read(&sNpcFileHead, sizeof(KNpcFileHead));
  413. for (i = 0; i < sNpcFileHead.uNumNpc; i++)
  414. {
  415. pFile->Read(&sNpcCell, sizeof(KSPNpc) - sizeof(sNpcCell.szScript));
  416. if (sNpcCell.nScriptNameLen < sizeof(sNpcCell.szScript))
  417. {
  418. pFile->Read(sNpcCell.szScript, sNpcCell.nScriptNameLen);
  419. sNpcCell.szScript[sNpcCell.nScriptNameLen] = 0;
  420. }
  421. else
  422. {
  423. sNpcCell.szScript[0] = 0;
  424. pFile->Seek(sNpcCell.nScriptNameLen, FILE_CURRENT);
  425. }
  426. sTempID.m_dwRegionID = m_RegionID;
  427. sTempID.m_nNo = i;
  428. nNpcNo = NpcSet.SearchClientID(sTempID);
  429. if (nNpcNo == 0)
  430. {
  431. int nIdx = NpcSet.AddClientNpc(sNpcCell.nTemplateID, LOWORD(m_RegionID), HIWORD(m_RegionID), sNpcCell.nPositionX, sNpcCell.nPositionY, i);
  432. if (nIdx > 0)
  433. {
  434. Npc[nIdx].m_Kind = sNpcCell.shKind;
  435. Npc[nIdx].SendCommand(do_stand);
  436. Npc[nIdx].m_Dir = Npc[nIdx].GetNormalNpcStandDir(sNpcCell.nCurFrame);
  437. }
  438. }
  439. }
  440. return TRUE;
  441. }
  442. #endif
  443. #ifndef _SERVER
  444. //----------------------------------------------------------------------
  445. // 功能:载入客户端地图上本 region 的 clientonlyobj 数据
  446. //----------------------------------------------------------------------
  447. BOOL KRegion::LoadClientObj(KPakFile *pFile, DWORD dwDataSize)
  448. {
  449. return ObjSet.ClientLoadRegionObj(pFile, dwDataSize);
  450. }
  451. #endif
  452. #ifndef _SERVER
  453. //----------------------------------------------------------------------
  454. // 功能:载入障碍数据给小地图
  455. //----------------------------------------------------------------------
  456. void KRegion::LoadLittleMapData(int nX, int nY, char *lpszPath, BYTE *lpbtObstacle)
  457. {
  458. if (!lpbtObstacle)
  459. return;
  460. char szPath[FILE_NAME_LENGTH], szFile[FILE_NAME_LENGTH];
  461. int i, j;
  462. if (!lpszPath || !lpszPath[0] || strlen(lpszPath) >= FILE_NAME_LENGTH)
  463. return ;
  464. sprintf(szPath, "\%s\v_%03d", lpszPath, nY);
  465. KPakFile cData;
  466. long nTempTable[REGION_GRID_WIDTH][REGION_GRID_HEIGHT]; // 地图障碍信息表
  467. // g_SetFilePath(szPath);
  468. sprintf(szFile, "%s\%03d_%s", szPath, nX, REGION_COMBIN_FILE_NAME_CLIENT);
  469. if (cData.Open(szFile))
  470. {
  471. DWORD dwHeadSize;
  472. DWORD dwMaxElemFile = 0;
  473. KCombinFileSection sElemFile[REGION_ELEM_FILE_COUNT];
  474. if (cData.Size() < sizeof(DWORD) + sizeof(KCombinFileSection) * REGION_ELEM_FILE_COUNT)
  475. {
  476. ZeroMemory(nTempTable, sizeof(nTempTable));
  477. }
  478. else
  479. {
  480. cData.Read(&dwMaxElemFile, sizeof(DWORD));
  481. if (dwMaxElemFile > REGION_ELEM_FILE_COUNT)
  482. {
  483. cData.Read(sElemFile, sizeof(sElemFile));
  484. cData.Seek(sizeof(KCombinFileSection) * (dwMaxElemFile - REGION_ELEM_FILE_COUNT), FILE_CURRENT);
  485. }
  486. else
  487. {
  488. cData.Read(sElemFile, sizeof(sElemFile));
  489. }
  490. if (sElemFile[REGION_OBSTACLE_FILE_INDEX].uLength == sizeof(nTempTable))
  491. {
  492. dwHeadSize = sizeof(DWORD) + sizeof(KCombinFileSection) * dwMaxElemFile;
  493. cData.Seek(dwHeadSize + sElemFile[REGION_OBSTACLE_FILE_INDEX].uOffset, FILE_BEGIN);
  494. cData.Read(nTempTable, sizeof(nTempTable));
  495. }
  496. else
  497. {
  498. ZeroMemory(nTempTable, sizeof(nTempTable));
  499. }
  500. }
  501. cData.Close();
  502. }
  503. else
  504. {
  505. sprintf(szFile, "%03d_%s", nX, REGION_OBSTACLE_FILE);
  506. if (cData.Open(szFile))
  507. cData.Read((LPVOID)nTempTable, sizeof(nTempTable));
  508. else
  509. ZeroMemory(nTempTable, sizeof(nTempTable));
  510. cData.Close();
  511. }
  512. for (i = 0; i < REGION_GRID_HEIGHT; i++)
  513. {
  514. for (j = 0; j < REGION_GRID_WIDTH; j++)
  515. {
  516. lpbtObstacle[i * REGION_GRID_WIDTH + j] = (BYTE)nTempTable[j][i];
  517. }
  518. }
  519. }
  520. #endif
  521. void KRegion::Activate()
  522. {
  523. KIndexNode *pNode = NULL;
  524. KIndexNode *pTmpNode = NULL;
  525. int nCounter = 0;
  526. pNode = (KIndexNode *)m_NpcList.GetHead();
  527. while(pNode)
  528. {
  529. pTmpNode = (KIndexNode *)pNode->GetNext();
  530. int nNpcIdx = pNode->m_nIndex;
  531. #ifdef _SERVER
  532. if ((nCounter == m_nNpcSyncCounter / 2) && (m_nNpcSyncCounter & 1))
  533. {
  534. // 发送同步信号
  535. Npc[nNpcIdx].NormalSync();
  536. }
  537. nCounter++;
  538. #endif
  539. //printf("Region [%03d:%03d] NPC %s active...n", m_nRegionX, m_nRegionY, Npc[nNpcIdx].Name); //[wxb 2003-7-29]
  540. Npc[nNpcIdx].Activate();
  541. pNode = pTmpNode;
  542. }
  543. m_nNpcSyncCounter++;
  544. if (m_nNpcSyncCounter > m_NpcList.GetNodeCount() * 2)
  545. {
  546. m_nNpcSyncCounter = 0;
  547. }
  548. nCounter = 0;
  549. pNode = (KIndexNode *)m_ObjList.GetHead();
  550. while(pNode)
  551. {
  552. pTmpNode = (KIndexNode *)pNode->GetNext();
  553. #ifdef _SERVER
  554. if ((nCounter == m_nObjSyncCounter / 2) && (m_nObjSyncCounter & 1))
  555. {
  556. Object[pNode->m_nIndex].SyncState();
  557. }
  558. nCounter++;
  559. #endif
  560. Object[pNode->m_nIndex].Activate();
  561. pNode = pTmpNode;
  562. }
  563. m_nObjSyncCounter++;
  564. if (m_nObjSyncCounter > m_ObjList.GetNodeCount() * 2)
  565. {
  566. m_nObjSyncCounter = 0;
  567. }
  568. pNode = (KIndexNode *)m_MissleList.GetHead();
  569. while(pNode)
  570. {
  571. pTmpNode = (KIndexNode *)pNode->GetNext();
  572. // g_DebugLog("[Missle]Missle%d,Activate,in R%d", pNode->m_nIndex, this->m_nIndex);
  573. Missle[pNode->m_nIndex].Activate();
  574. pNode = pTmpNode;
  575. }
  576. #ifdef _SERVER
  577. pNode = (KIndexNode *)m_PlayerList.GetHead();
  578. while(pNode)
  579. {
  580. pTmpNode = (KIndexNode *)pNode->GetNext();
  581. Player[pNode->m_nIndex].Active();
  582. pNode = pTmpNode;
  583. }
  584. #endif
  585. #ifndef _SERVER
  586. if (Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_RegionIndex == m_nIndex) // 是Player所在的Region
  587. {
  588. Player[CLIENT_PLAYER_INDEX].Active();
  589. }
  590. #endif
  591. }
  592. void KRegion::AddNpc(int nIdx)
  593. {
  594. if (nIdx > 0 && nIdx < MAX_NPC)
  595. {
  596. _ASSERT(Npc[nIdx].m_Node.m_Ref == 0);
  597. if (Npc[nIdx].m_Node.m_Ref == 0)
  598. {
  599. m_NpcList.AddTail(&Npc[nIdx].m_Node);
  600. Npc[nIdx].m_Node.AddRef();
  601. }
  602. }
  603. }
  604. void KRegion::RemoveNpc(int nIdx)
  605. {
  606. if (nIdx <= 0 || nIdx >= MAX_NPC)
  607. return;
  608. _ASSERT(Npc[nIdx].m_Node.m_Ref > 0);
  609. if (Npc[nIdx].m_Node.m_Ref > 0)
  610. {
  611. Npc[nIdx].m_Node.Remove();
  612. Npc[nIdx].m_Node.Release();
  613. }
  614. #ifndef _SERVER
  615. Npc[nIdx].RemoveRes();
  616. #endif
  617. }
  618. void KRegion::AddMissle(int nId)
  619. {
  620. if (nId > 0 && nId < MAX_MISSLE)
  621. {
  622. _ASSERT(Missle[nId].m_Node.m_Ref == 0);
  623. if (Missle[nId].m_Node.m_Ref == 0)
  624. {
  625. m_MissleList.AddTail(&Missle[nId].m_Node);
  626. Missle[nId].m_Node.AddRef();
  627. }
  628. }
  629. }
  630. void KRegion::RemoveMissle(int nId)
  631. {
  632. if (nId > 0 && nId < MAX_MISSLE)
  633. {
  634. // _ASSERT(Missle[nId].m_Node.m_Ref > 0);
  635. if (Missle[nId].m_Node.m_Ref > 0)
  636. {
  637. Missle[nId].m_Node.Remove();
  638. Missle[nId].m_Node.Release();
  639. }
  640. }
  641. }
  642. void KRegion::AddObj(int nIdx)
  643. {
  644. KIndexNode *pNode = NULL;
  645. pNode = new KIndexNode;
  646. pNode->m_nIndex = nIdx;
  647. m_ObjList.AddTail(pNode);
  648. if (Object[nIdx].m_nMapX >= 0 && Object[nIdx].m_nMapY >= 0)
  649. {
  650. AddRef(Object[nIdx].m_nMapX, Object[nIdx].m_nMapY, obj_object);
  651. }
  652. }
  653. void KRegion::RemoveObj(int nIdx)
  654. {
  655. KIndexNode *pNode = NULL;
  656. pNode = (KIndexNode *)m_ObjList.GetHead();
  657. while(pNode)
  658. {
  659. if (pNode->m_nIndex == nIdx)
  660. {
  661. pNode->Remove();
  662. delete pNode;
  663. break;
  664. }
  665. pNode = (KIndexNode *)pNode->GetNext();
  666. }
  667. if (Object[nIdx].m_nMapX > 0 && Object[nIdx].m_nMapY > 0)
  668. {
  669. DecRef(Object[nIdx].m_nMapX, Object[nIdx].m_nMapY, obj_object);
  670. }
  671. }
  672. DWORD KRegion::GetTrap(int nMapX, int nMapY)
  673. {
  674. #ifdef _SERVER
  675. if (nMapX < 0 || nMapY < 0 || nMapX >= REGION_GRID_WIDTH || nMapY >= REGION_GRID_HEIGHT)
  676. {
  677. return 0;
  678. }
  679. return m_dwTrap[nMapX][nMapY];
  680. #else
  681. return 0;
  682. #endif
  683. }
  684. BYTE KRegion::GetBarrier(int nMapX, int nMapY, int nDx, int nDy)
  685. {
  686. #ifdef _SERVER
  687. long lType, lInfo;
  688. long lRet = 0;
  689. lInfo = m_Obstacle[nMapX][nMapY];
  690. lRet = lInfo & 0x0000000f;
  691. lType = (lInfo >> 4) & 0x0000000f;
  692. switch(lType)
  693. {
  694. case Obstacle_LT:
  695. if (nDx + nDy > 32)
  696. lRet = Obstacle_NULL;
  697. break;
  698. case Obstacle_RT:
  699. if (nDx < nDy)
  700. lRet = Obstacle_NULL;
  701. break;
  702. case Obstacle_LB:
  703. if (nDx > nDy)
  704. lRet = Obstacle_NULL;
  705. break;
  706. case Obstacle_RB:
  707. if (nDx + nDy < 32)
  708. lRet = Obstacle_NULL;
  709. break;
  710. default:
  711. break;
  712. }
  713. if (lRet != Obstacle_NULL)
  714. return lRet;
  715. if (m_pNpcRef)
  716. {
  717. if (m_pNpcRef[nMapY * m_nWidth + nMapX] > 0)
  718. return Obstacle_JumpFly;
  719. }
  720. return Obstacle_NULL;
  721. #else
  722. if (m_pNpcRef)
  723. {
  724. if (m_pNpcRef[nMapY * m_nWidth + nMapX] > 0)
  725. return Obstacle_JumpFly;
  726. }
  727. return Obstacle_NULL;
  728. #endif
  729. }
  730. //----------------------------------------------------------------------------
  731. // 功能:按 像素点坐标 * 1024 的精度判断某个位置是否障碍
  732. // 参数:nGridX nGirdY :本region格子坐标
  733. // 参数:nOffX nOffY :格子内的偏移量(像素点 * 1024 精度)
  734. // 参数:bCheckNpc :是否判断npc形成的障碍
  735. // 返回值:障碍类型(if 类型 == Obstacle_NULL 无障碍)
  736. //----------------------------------------------------------------------------
  737. BYTE KRegion::GetBarrierMin(int nGridX, int nGridY, int nOffX, int nOffY, BOOL bCheckNpc)
  738. {
  739. #ifdef _SERVER
  740. _ASSERT(0 <= nGridX && nGridX < REGION_GRID_WIDTH && 0 <= nGridY && nGridY < REGION_GRID_HEIGHT);
  741. long lType;
  742. long lRet = Obstacle_NULL;
  743. lRet = m_Obstacle[nGridX][nGridY] & 0x0000000f;
  744. lType = (m_Obstacle[nGridX][nGridY] >> 4) & 0x0000000f;
  745. if (lRet == Obstacle_NULL)
  746. {
  747. if (bCheckNpc && m_pNpcRef)
  748. {
  749. if (m_pNpcRef[nGridY * m_nWidth + nGridX] > 0)
  750. return Obstacle_JumpFly;
  751. }
  752. return Obstacle_NULL;
  753. }
  754. switch(lType)
  755. {
  756. case Obstacle_LT:
  757. if (nOffX + nOffY > 32 * 1024)
  758. return Obstacle_NULL;
  759. break;
  760. case Obstacle_RT:
  761. if (nOffX < nOffY)
  762. return Obstacle_NULL;
  763. break;
  764. case Obstacle_LB:
  765. if (nOffX > nOffY)
  766. return Obstacle_NULL;
  767. break;
  768. case Obstacle_RB:
  769. if (nOffX + nOffY < 32 * 1024)
  770. return Obstacle_NULL;
  771. break;
  772. default:
  773. break;
  774. }
  775. return lRet;
  776. #else
  777. _ASSERT(0 <= nGridX && nGridX < REGION_GRID_WIDTH && 0 <= nGridY && nGridY < REGION_GRID_HEIGHT);
  778. if (bCheckNpc && m_pNpcRef)
  779. {
  780. if (m_pNpcRef[nGridY * m_nWidth + nGridX] > 0)
  781. return Obstacle_JumpFly;
  782. }
  783. return Obstacle_NULL;
  784. #endif
  785. }
  786. int KRegion::GetRef(int nMapX, int nMapY, MOVE_OBJ_KIND nType)
  787. {
  788. int nRet = 0;
  789. if (nMapX >= m_nWidth || nMapY >= m_nHeight)
  790. return 0;
  791. switch(nType)
  792. {
  793. case obj_npc:
  794. nRet = (int)m_pNpcRef[nMapY * m_nWidth + nMapX];
  795. break;
  796. case obj_object:
  797. nRet = (int)m_pObjRef[nMapY * m_nWidth + nMapX];
  798. break;
  799. case obj_missle:
  800. nRet = (int)m_pMslRef[nMapY * m_nWidth + nMapX];
  801. break;
  802. default:
  803. break;
  804. }
  805. return nRet;
  806. }
  807. BOOL KRegion::AddRef(int nMapX, int nMapY, MOVE_OBJ_KIND nType)
  808. {
  809. BYTE* pBuffer = NULL;
  810. int nRef = 0;
  811. if (nMapX >= m_nWidth || nMapY >= m_nHeight)
  812. return FALSE;
  813. switch(nType)
  814. {
  815. case obj_npc:
  816. pBuffer = m_pNpcRef;
  817. break;
  818. case obj_object:
  819. pBuffer = m_pObjRef;
  820. break;
  821. case obj_missle:
  822. pBuffer = m_pObjRef;
  823. break;
  824. default:
  825. break;
  826. }
  827. if (pBuffer)
  828. {
  829. nRef = (int)pBuffer[nMapY * m_nWidth + nMapX];
  830. if (nRef == 255)
  831. return FALSE;
  832. else
  833. {
  834. pBuffer[nMapY * m_nWidth + nMapX]++;
  835. return TRUE;
  836. }
  837. }
  838. else
  839. {
  840. return FALSE;
  841. }
  842. }
  843. BOOL KRegion::DecRef(int nMapX, int nMapY, MOVE_OBJ_KIND nType)
  844. {
  845. BYTE* pBuffer = NULL;
  846. int nRef = 0;
  847. if (nMapX >= m_nWidth || nMapY >= m_nHeight)
  848. return FALSE;
  849. switch(nType)
  850. {
  851. case obj_npc:
  852. pBuffer = m_pNpcRef;
  853. break;
  854. case obj_object:
  855. pBuffer = m_pObjRef;
  856. break;
  857. case obj_missle:
  858. pBuffer = m_pObjRef;
  859. break;
  860. default:
  861. break;
  862. }
  863. if (pBuffer)
  864. {
  865. nRef = (int)pBuffer[nMapY * m_nWidth + nMapX];
  866. if (nRef == 0)
  867. {
  868. // _ASSERT(0);
  869. return FALSE;
  870. }
  871. else
  872. {
  873. pBuffer[nMapY * m_nWidth + nMapX]--;
  874. return TRUE;
  875. }
  876. }
  877. else
  878. {
  879. return FALSE;
  880. }
  881. }
  882. BOOL KRegion::AddPlayer(int nIdx)
  883. {
  884. if (nIdx > 0 && nIdx < MAX_PLAYER)
  885. {
  886. _ASSERT(Player[nIdx].m_Node.m_Ref == 0);
  887. if (Player[nIdx].m_Node.m_Ref == 0)
  888. {
  889. m_PlayerList.AddTail(&Player[nIdx].m_Node);
  890. Player[nIdx].m_Node.AddRef();
  891. return TRUE;
  892. }
  893. }
  894. return FALSE;
  895. }
  896. BOOL KRegion::RemovePlayer(int nIdx)
  897. {
  898. if (nIdx > 0 && nIdx < MAX_PLAYER)
  899. {
  900. if (Player[nIdx].m_Node.m_Ref > 0)
  901. {
  902. Player[nIdx].m_Node.Remove();
  903. Player[nIdx].m_Node.Release();
  904. return TRUE;
  905. }
  906. }
  907. return FALSE;
  908. }
  909. //-------------------------------------------------------------------------
  910. // 功能:寻找本区域内是否有某个指定 id 的 npc
  911. //-------------------------------------------------------------------------
  912. int KRegion::SearchNpc(DWORD dwNpcID)
  913. {
  914. KIndexNode *pNode = NULL;
  915. pNode = (KIndexNode *)m_NpcList.GetHead();
  916. while(pNode)
  917. {
  918. if (Npc[pNode->m_nIndex].m_dwID == dwNpcID)
  919. return pNode->m_nIndex;
  920. pNode = (KIndexNode *)pNode->GetNext();
  921. }
  922. return 0;
  923. }
  924. int KRegion::FindObject(int nMapX, int nMapY)
  925. {
  926. KIndexNode *pNode = NULL;
  927. pNode = (KIndexNode *)m_ObjList.GetHead();
  928. while(pNode)
  929. {
  930. if (Object[pNode->m_nIndex].m_nMapX == nMapX && Object[pNode->m_nIndex].m_nMapY == nMapY)
  931. {
  932. return pNode->m_nIndex;
  933. }
  934. pNode = (KIndexNode *)pNode->GetNext();
  935. }
  936. return 0;
  937. }
  938. int KRegion::FindObject(int nObjID)
  939. {
  940. KIndexNode *pNode = NULL;
  941. pNode = (KIndexNode *)m_ObjList.GetHead();
  942. while(pNode)
  943. {
  944. if (Object[pNode->m_nIndex].m_nID == nObjID)
  945. {
  946. return pNode->m_nIndex;
  947. }
  948. pNode = (KIndexNode *)pNode->GetNext();
  949. }
  950. return 0;
  951. }
  952. int KRegion::FindEquip(int nMapX, int nMapY)
  953. {
  954. KIndexNode *pNode = NULL;
  955. pNode = (KIndexNode *)m_ObjList.GetHead();
  956. while(pNode)
  957. {
  958. if (Object[pNode->m_nIndex].m_nMapX == nMapX && Object[pNode->m_nIndex].m_nMapY == nMapY)
  959. {
  960. if (Object[pNode->m_nIndex].m_nKind == Obj_Kind_Item)
  961. {
  962. return pNode->m_nIndex;
  963. }
  964. }
  965. pNode = (KIndexNode *)pNode->GetNext();
  966. }
  967. return 0;
  968. }
  969. #ifdef _SERVER
  970. void KRegion::SendSyncData(int nClient)
  971. {
  972. KIndexNode *pNode = NULL;
  973. pNode = (KIndexNode *)m_NpcList.GetHead();
  974. while(pNode)
  975. {
  976. Npc[pNode->m_nIndex].SendSyncData(nClient);
  977. pNode = (KIndexNode *)pNode->GetNext();
  978. }
  979. pNode = (KIndexNode *)m_ObjList.GetHead();
  980. while(pNode)
  981. {
  982. Object[pNode->m_nIndex].SyncAdd(nClient);
  983. pNode = (KIndexNode *)pNode->GetNext();
  984. }
  985. }
  986. void KRegion::BroadCast(void* pBuffer, DWORD dwSize, int &nMaxCount, int nOX, int nOY)
  987. {
  988. #define MAX_SYNC_RANGE 25
  989. KIndexNode *pNode = NULL;
  990. pNode = (KIndexNode *)m_PlayerList.GetHead();
  991. while(pNode && nMaxCount > 0)
  992. {
  993. _ASSERT(pNode->m_nIndex > 0 && pNode->m_nIndex < MAX_PLAYER);
  994. int nPlayerIndex = pNode->m_nIndex;
  995. int nNpcIndex = Player[nPlayerIndex].m_nIndex;
  996. int nTX = Npc[nNpcIndex].m_MapX;
  997. int nTY = Npc[nNpcIndex].m_MapY;
  998. int nDX = nTX - nOX;
  999. int nDY = nTY - nOY;
  1000. if (Player[pNode->m_nIndex].m_nNetConnectIdx >= 0 
  1001. && (nDX * nDX + nDY * nDY) <= MAX_SYNC_RANGE * MAX_SYNC_RANGE
  1002. && Player[pNode->m_nIndex].m_bSleepMode == FALSE)
  1003. g_pServer->PackDataToClient(Player[pNode->m_nIndex].m_nNetConnectIdx, (BYTE*)pBuffer, dwSize);
  1004. nMaxCount--;
  1005. pNode = (KIndexNode *)pNode->GetNext();
  1006. }
  1007. }
  1008. //---------------------------------------------------------------------
  1009. // 查找该Region中NpcID为dwId的Player索引
  1010. //---------------------------------------------------------------------
  1011. int KRegion::FindPlayer(DWORD dwId)
  1012. {
  1013. KIndexNode *pNode = NULL;
  1014. int nRet = -1;
  1015. pNode = (KIndexNode *)m_PlayerList.GetHead();
  1016. while(pNode)
  1017. {
  1018. if (Npc[Player[pNode->m_nIndex].m_nIndex].m_dwID == dwId)
  1019. {
  1020. nRet = pNode->m_nIndex;
  1021. break;
  1022. }
  1023. pNode = (KIndexNode *)pNode->GetNext();
  1024. }
  1025. return nRet;
  1026. }
  1027. //---------------------------------------------------------------------
  1028. // 查找该Region中是否有索引为 nPlayerIdx 的玩家
  1029. //---------------------------------------------------------------------
  1030. BOOL KRegion::CheckPlayerIn(int nPlayerIdx)
  1031. {
  1032. if (nPlayerIdx <= 0)
  1033. return FALSE;
  1034. KIndexNode *pNode = NULL;
  1035. pNode = (KIndexNode *)m_PlayerList.GetHead();
  1036. while(pNode)
  1037. {
  1038. if (pNode->m_nIndex == nPlayerIdx)
  1039. return TRUE;
  1040. pNode = (KIndexNode *)pNode->GetNext();
  1041. }
  1042. return FALSE;
  1043. }
  1044. #endif
  1045. #ifndef _SERVER
  1046. void KRegion::Paint()
  1047. {
  1048. KIndexNode *pNode = NULL;
  1049. pNode = (KIndexNode *)m_NpcList.GetHead();
  1050. while(pNode)
  1051. {
  1052. Npc[pNode->m_nIndex].Paint();
  1053. pNode = (KIndexNode *)pNode->GetNext();
  1054. }
  1055. pNode = (KIndexNode *)m_MissleList.GetHead();
  1056. while(pNode)
  1057. {
  1058. Missle[pNode->m_nIndex].Paint();
  1059. pNode = (KIndexNode *)pNode->GetNext();
  1060. }
  1061. pNode = (KIndexNode *)m_ObjList.GetHead();
  1062. while(pNode)
  1063. {
  1064. // Object[pNode->m_nIndex].Paint(); need add -spe
  1065. pNode = (KIndexNode *)pNode->GetNext();
  1066. }
  1067. }
  1068. #endif
  1069. void* KRegion::GetObjNode(int nIdx)
  1070. {
  1071. KIndexNode *pNode = NULL;
  1072. pNode = (KIndexNode *)m_ObjList.GetHead();
  1073. while(pNode)
  1074. {
  1075. if (pNode->m_nIndex == nIdx)
  1076. {
  1077. break;
  1078. }
  1079. pNode = (KIndexNode *)pNode->GetNext();
  1080. }
  1081. return pNode;
  1082. }
  1083. void KRegion::Close() // 清除Region中的几个链表(所指向的内容没有被清除)
  1084. {
  1085. KIndexNode* pNode = NULL;
  1086. KIndexNode* pTempNode = NULL;
  1087. if (!m_nWidth || !m_nHeight)
  1088. return;
  1089. if (m_pNpcRef)
  1090. {
  1091. ZeroMemory(m_pNpcRef, m_nWidth * m_nHeight);
  1092. }
  1093. if (m_pObjRef)
  1094. {
  1095. ZeroMemory(m_pObjRef, m_nWidth * m_nHeight);
  1096. }
  1097. if (m_pMslRef)
  1098. {
  1099. ZeroMemory(m_pMslRef, m_nWidth * m_nHeight);
  1100. }
  1101. pNode = (KIndexNode *)m_NpcList.GetHead();
  1102. while(pNode)
  1103. {
  1104. pTempNode = pNode;
  1105. pNode = (KIndexNode *)pNode->GetNext();
  1106. // NpcSet.Remove(pTempNode->m_nIndex);
  1107. Npc[pTempNode->m_nIndex].m_RegionIndex = -1;
  1108. RemoveNpc(pTempNode->m_nIndex);
  1109. // delete pTempNode;
  1110. }
  1111. pNode = (KIndexNode *)m_MissleList.GetHead();
  1112. while(pNode)
  1113. {
  1114. pTempNode = pNode;
  1115. pNode = (KIndexNode *)pNode->GetNext();
  1116. // g_DebugLog("[Missle]Missle%dClose", pTempNode->m_nIndex);
  1117. MissleSet.Remove(pTempNode->m_nIndex);
  1118. Missle[pTempNode->m_nIndex].m_nRegionId = -1;
  1119. pTempNode->Remove();
  1120. pTempNode->Release();
  1121. }
  1122. // 同时清除 clientonly 类型的 obj ---- zroc add
  1123. pNode = (KIndexNode *)m_ObjList.GetHead();
  1124. while(pNode)
  1125. {
  1126. pTempNode = pNode;
  1127. pNode = (KIndexNode *)pNode->GetNext();
  1128. #ifndef _SERVER
  1129. // ObjSet.RemoveIfClientOnly(pTempNode->m_nIndex);
  1130. // zroc change 2003.07.01
  1131. // ObjSet.Remove(pTempNode->m_nIndex);
  1132. Object[pTempNode->m_nIndex].Remove(FALSE);
  1133. #endif
  1134. ObjSet.Remove(pTempNode->m_nIndex); // TODO:
  1135. Object[pTempNode->m_nIndex].m_nRegionIdx = -1;
  1136. pTempNode->Remove();
  1137. delete pTempNode;
  1138. }
  1139. pNode = (KIndexNode *)m_PlayerList.GetHead();
  1140. while(pNode)
  1141. {
  1142. pTempNode = pNode;
  1143. pNode = (KIndexNode *)pNode->GetNext();
  1144. //#ifdef _SERVER
  1145. // PlayerSet.Remove(pTempNode->m_nIndex);
  1146. //#else
  1147. // Player[CLIENT_PLAYER_INDEX].Release();
  1148. pTempNode->Remove();
  1149. pTempNode->Release();
  1150. // delete pTempNode;
  1151. //#endif
  1152. }
  1153. m_RegionID = -1;
  1154. m_nIndex = -1;
  1155. m_nActive = 0;
  1156. memset(m_nConnectRegion, -1, sizeof(m_nConnectRegion));
  1157. memset(m_nConRegionID, -1, sizeof(m_nConRegionID));
  1158. }