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

模拟服务器

开发平台:

C/C++

  1. #ifndef KRegionH
  2. #define KRegionH
  3. //-----------------------------------------------------------------------
  4. #include "KEngine.h"
  5. #include "KWorldMsg.h"
  6. //-----------------------------------------------------------------------
  7. #ifdef _SERVER
  8. #define MAX_BROADCAST_COUNT 100
  9. #else
  10. #define MAX_REGION 9
  11. #endif
  12. #define REGION_GRID_WIDTH 16
  13. #define REGION_GRID_HEIGHT 32
  14. enum MOVE_OBJ_KIND
  15. {
  16. obj_npc,
  17. obj_object,
  18. obj_missle,
  19. };
  20. #ifndef TOOLVERSION
  21. class KRegion
  22. #else
  23. class CORE_API KRegion
  24. #endif
  25. {
  26. friend class KSubWorld;
  27. public:
  28. int m_nIndex; // 地图索引
  29. int m_RegionID;
  30. KList m_NpcList; // 人物列表
  31. KList m_ObjList; // 物件列表
  32. KList m_MissleList; // 子弹列表
  33. KList m_PlayerList; // 玩家列表
  34. int m_nConnectRegion[8]; // 相邻的地图索引
  35. int m_nConRegionID[8]; // 相邻的地图ID
  36. int m_nRegionX; // 在世界中的位置X(象素点)
  37. int m_nRegionY; // 在世界中的位置Y(象素点)
  38. int m_nWidth;
  39. int m_nHeight;
  40. private:
  41. #ifdef _SERVER
  42. long m_Obstacle[REGION_GRID_WIDTH][REGION_GRID_HEIGHT]; // 地图障碍信息表
  43. DWORD m_dwTrap[REGION_GRID_WIDTH][REGION_GRID_HEIGHT]; // 地图trap信息表
  44. #endif
  45. int m_nNpcSyncCounter; // 同步计数器
  46. int m_nObjSyncCounter;
  47. int m_nActive; // 是否激活(是否有玩家在附近)
  48. BYTE* m_pNpcRef; // 每个格子上的NPC数目
  49. BYTE* m_pObjRef; // 每个格子上的OBJ数目
  50. BYTE* m_pMslRef; // 每个格子上的MISSLE数目
  51. public:
  52. KRegion();
  53. ~KRegion();
  54. BOOL Init(int nWidth, int nHeight);
  55. BOOL Load(int nX, int nY);
  56. #ifdef _SERVER
  57. // 载入服务器端地图上本region 的 object数据(包括npc、trap、box等)
  58. BOOL LoadObject(int nSubWorld, int nX, int nY);
  59. // 载入服务器端地图上本 region 的障碍数据
  60. BOOL LoadServerObstacle(KPakFile *pFile, DWORD dwDataSize);
  61. // 载入服务器端地图上本 region 的 trap 数据
  62. BOOL LoadServerTrap(KPakFile *pFile, DWORD dwDataSize);
  63. // 载入服务器端地图上本 region 的 npc 数据
  64. BOOL LoadServerNpc(int nSubWorld, KPakFile *pFile, DWORD dwDataSize);
  65. // 载入服务器端地图上本 region 的 obj 数据
  66. BOOL LoadServerObj(int nSubWorld, KPakFile *pFile, DWORD dwDataSize);
  67. #endif
  68. #ifndef _SERVER
  69. // 载入客户端地图上本region 的 object数据(包括npc、box等)
  70. // 如果 bLoadNpcFlag == TRUE 需要载入 clientonly npc else 不载入
  71. BOOL LoadObject(int nSubWorld, int nX, int nY, char *lpszPath);
  72. // 载入客户端地图上本 region 的 clientonlynpc 数据
  73. BOOL LoadClientNpc(KPakFile *pFile, DWORD dwDataSize);
  74. // 载入客户端地图上本 region 的 clientonlyobj 数据
  75. BOOL LoadClientObj(KPakFile *pFile, DWORD dwDataSize);
  76. // 载入障碍数据给小地图
  77. static void LoadLittleMapData(int nX, int nY, char *lpszPath, BYTE *lpbtObstacle);
  78. #endif
  79. void Close();
  80. void Activate();
  81. BYTE GetBarrier(int MapX, int MapY, int nDx, int nDy); // 地图高度
  82. // 按 像素点坐标 * 1024 的精度判断某个位置是否障碍
  83. // 参数:nGridX nGirdY :本region格子坐标
  84. // 参数:nOffX nOffY :格子内的偏移量(像素点 * 1024 精度)
  85. // 参数:bCheckNpc :是否判断npc形成的障碍
  86. // 返回值:障碍类型(if 类型 == Obstacle_NULL 无障碍)
  87. BYTE GetBarrierMin(int nGridX, int nGridY, int nOffX, int nOffY, BOOL bCheckNpc);
  88. DWORD GetTrap(int MapX, int MapY); // 得到Trap编号
  89. inline BOOL IsActive() 
  90. {
  91. #ifdef _SERVER
  92. return m_nActive; 
  93. #else
  94. return TRUE;
  95. #endif
  96. };
  97. int GetRef(int nMapX, int nMapY, MOVE_OBJ_KIND nType);
  98. BOOL AddRef(int nMapX, int nMapY, MOVE_OBJ_KIND nType);
  99. BOOL DecRef(int nMapX, int nMapY, MOVE_OBJ_KIND nType);
  100. int FindNpc(int nMapX, int nMapY, int nNpcIdx, int nRelation);
  101. int FindEquip(int nMapX, int nMapY);
  102. int FindObject(int nMapX, int nMapY);
  103. int FindObject(int nObjID);
  104. void* GetObjNode(int nIdx);
  105. int SearchNpc(DWORD dwNpcID); // 寻找本区域内是否有某个指定 id 的 npc (zroc add)
  106. #ifdef _SERVER
  107. void SendSyncData(int nClient);
  108. void BroadCast(void *pBuffer, DWORD dwSize, int &nMaxCount, int nX, int nY);
  109. int FindPlayer(DWORD dwId);
  110. BOOL CheckPlayerIn(int nPlayerIdx);
  111. #endif
  112. #ifndef _SERVER
  113. void Paint();
  114. #endif
  115. void AddNpc(int nIdx);
  116. void RemoveNpc(int nIdx);
  117. void AddMissle(int nIdx);
  118. void RemoveMissle(int nIdx);
  119. void AddObj(int nIdx);
  120. void RemoveObj(int nIdx);
  121. BOOL AddPlayer(int nIdx);
  122. BOOL RemovePlayer(int nIdx);
  123. };
  124. //--------------------------------------------------------------------------
  125. // Find Npc
  126. //--------------------------------------------------------------------------
  127. inline int KRegion::FindNpc(int nMapX, int nMapY, int nNpcIdx, int nRelation)
  128. {
  129. if (m_pNpcRef[nMapY * m_nWidth + nMapX] == 0)
  130. return 0;
  131. KIndexNode *pNode = NULL;
  132. pNode = (KIndexNode *)m_NpcList.GetHead();
  133. while(pNode)
  134. {
  135. if (Npc[pNode->m_nIndex].m_MapX == nMapX && Npc[pNode->m_nIndex].m_MapY == nMapY)
  136. {
  137. if (NpcSet.GetRelation(nNpcIdx, pNode->m_nIndex) & nRelation)
  138. {
  139. return pNode->m_nIndex;
  140. }
  141. }
  142. pNode = (KIndexNode *)pNode->GetNext();
  143. }
  144. return 0;
  145. }
  146. #endif