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

模拟服务器

开发平台:

C/C++

  1. #ifndef KNpcSetH
  2. #define KNpcSetH
  3. //#include "KFindBinTree.h"
  4. #include "KLinkArray.h"
  5. #include "KNpc.h"
  6. #include "GameDataDef.h"
  7. #include "KNpcGold.h"
  8. #ifndef _SERVER
  9. #define MAX_NPC_REQUEST 20
  10. #endif
  11. /*
  12. enum NPC_ENCHANT
  13. {
  14. enchant_treasure = 0, // 掉的装备更多
  15. enchant_aura, // 光环技能
  16. enchant_lifeenhance, // 生命更长
  17. enchant_lifereplenish, // 自动回血
  18. enchant_attackratingenhance, // 打得更准
  19. enchant_defenseenhance, // 防御加强
  20. enchant_damageenhance, // 伤害更高
  21. enchant_speedenhance, // 速度更快
  22. enchant_selfresist, // 自己的五行属性的抗性为100%
  23. enchant_conquerresist, // 相生的五行属性的抗性为100%
  24. enchant_num,
  25. };
  26. */
  27. #ifndef _SERVER
  28. #define MAX_INSTANT_STATE 20
  29. #define MAX_INSTANT_SOUND 30
  30. class KInstantSpecial
  31. {
  32. private:
  33. int m_nLoadFlag;
  34. char m_szSprName[MAX_INSTANT_STATE][FILE_NAME_LENGTH];
  35. char m_szSoundName[MAX_INSTANT_SOUND][FILE_NAME_LENGTH];
  36. KCacheNode *m_pSoundNode; // 声效指针
  37. KWavSound *m_pWave; // 声效wav指针
  38. private:
  39. void LoadSprName();
  40. void LoadSoundName();
  41. public:
  42. KInstantSpecial();
  43. void GetSprName(int nNo, char *lpszName, int nLength);
  44. void PlaySound(int nNo);
  45. };
  46. #endif
  47. typedef struct
  48. {
  49. DWORD dwRequestId;
  50. DWORD dwRequestTime;
  51. } RequestNpc;
  52. typedef struct
  53. {
  54. #ifndef _SERVER
  55. int nStandFrame[2];
  56. int nWalkFrame[2];
  57. int nRunFrame[2];
  58. #endif
  59. int nWalkSpeed;
  60. int nRunSpeed;
  61. int nAttackFrame;
  62. int nHurtFrame;
  63. } PlayerBaseValue;
  64. class KNpcSet
  65. {
  66. public:
  67. KNpcGoldTemplate m_cGoldTemplate; // 黄金怪物模板
  68. PlayerBaseValue m_cPlayerBaseValue; // 玩家标准数据
  69. #ifdef _SERVER
  70. int m_nPKDamageRate; // PK时伤害乘一个系数
  71. int m_nFactionPKFactionAddPKValue; // 三大阵营之间PK,等级差太大时PK者PK值增加
  72. int m_nKillerPKFactionAddPKValue; // 杀手与三大阵营PK,等级差太大时PK者PK值增加
  73. int m_nEnmityAddPKValue; // 仇杀时PK者PK值增加
  74. int m_nBeKilledAddPKValue; // 被PK致死着PK值增加,应该是个负数
  75. int m_nLevelDistance; // 等级差多少算是PK新手
  76. #endif
  77. #ifndef _SERVER
  78. KInstantSpecial m_cInstantSpecial;
  79. #endif
  80. private:
  81. DWORD m_dwIDCreator; // 游戏世界中的ID计数器
  82. KLinkArray m_FreeIdx; // 可用表
  83. KLinkArray m_UseIdx; // 已用表
  84. #ifndef _SERVER
  85. enum
  86. {
  87. PATE_CHAT = 0x01,
  88. PATE_NAME = 0x02,
  89. PATE_LIFE = 0x04,
  90. PATE_MANA = 0x08,
  91. };
  92. int m_nShowPateFlag; // 是否全部显示玩家的名字在头顶上 zroc add
  93. RequestNpc m_RequestNpc[MAX_NPC_REQUEST]; // 向服务器申请的ID表
  94. KLinkArray m_RequestFreeIdx; // 向服务器申请可用表
  95. KLinkArray m_RequestUseIdx; // 向服务器申请空闲表
  96. #endif
  97. public:
  98. KNpcSet();
  99. void Init();
  100. int GetNpcCount(int nKind = -1, int nCamp = -1);
  101. int SearchName(LPSTR szName);
  102. int SearchID(DWORD dwID);
  103. int SearchNameID(DWORD dwID);
  104. BOOL IsNpcExist(int nIdx, DWORD dwId);
  105. int Add(int nNpcSetingIdxInfo, int nSubWorld, int nRegion, int nMapX, int nMapY, int nOffX = 0, int nOffY = 0);
  106. int Add(int nNpcSetingIdxInfo, int nSubWorld, int nMpsX, int nMpsY);
  107. int Add(int nSubWorld, void* pNpcInfo);
  108. void Remove(int nIdx);
  109. void RemoveAll();
  110. NPC_RELATION GetRelation(int nIdx1, int nIdx2);
  111. int GetNearestNpc(int nMapX, int nMapY, int nId, int nRelation);
  112. static int GetDistance(int nIdx1, int nIdx2);
  113. static int GetDistanceSquare(int nIdx1, int nIdx2);
  114. int GetNextIdx(int nIdx);
  115. // 把所有npc的 bActivateFlag 设为 FALSE (每次游戏循环处理所有npc的activate之前做这个处理)
  116. void ClearActivateFlagOfAllNpc();
  117. void LoadPlayerBaseValue(LPSTR szFile);
  118. int GetPlayerWalkSpeed() { return m_cPlayerBaseValue.nWalkSpeed; };
  119. int GetPlayerRunSpeed() { return m_cPlayerBaseValue.nRunSpeed; };
  120. int GetPlayerAttackFrame() { return m_cPlayerBaseValue.nAttackFrame; };
  121. int GetPlayerHurtFrame() { return m_cPlayerBaseValue.nHurtFrame; };
  122. #ifndef _SERVER
  123. int GetPlayerStandFrame(BOOL bMale) 
  124. if (bMale)
  125. return m_cPlayerBaseValue.nStandFrame[0];
  126. else
  127. return m_cPlayerBaseValue.nStandFrame[1];
  128. };
  129. int GetPlayerWalkFrame(BOOL bMale)
  130. {
  131. if (bMale)
  132. return m_cPlayerBaseValue.nWalkFrame[0];
  133. else
  134. return m_cPlayerBaseValue.nWalkFrame[1];
  135. };
  136. int GetPlayerRunFrame(BOOL bMale)
  137. {
  138. if (bMale)
  139. return m_cPlayerBaseValue.nRunFrame[0];
  140. else
  141. return m_cPlayerBaseValue.nRunFrame[1];
  142. };
  143. BOOL IsNpcRequestExist(DWORD dwID);
  144. void InsertNpcRequest(DWORD dwID);
  145. void RemoveNpcRequest(DWORD dwID);
  146. int GetRequestIndex(DWORD dwID);
  147. // 添加一个客户端npc(需要设定ClientNpcID)
  148. int AddClientNpc(int nTemplateID, int nRegionX, int nRegionY, int nMpsX, int nMpsY, int nNo);
  149. // 从npc数组中寻找属于某个region的 client npc ,添加进去
  150. void InsertNpcToRegion(int nRegionIdx);
  151. // 查找某个ClientID的npc是否存在
  152. int SearchClientID(KClientNpcID sClientID);
  153. // 某座标上精确查找Npc,客户端专用
  154. int SearchNpcAt(int nX, int nY, int nRelation, int nRange);
  155. void CheckBalance();
  156. int GetAroundPlayerForTeamInvite(KUiPlayerItem *pList, int nCount); // 获得周围玩家列表(用于队伍邀请列表)
  157. void GetAroundOpenCaptain(int nCamp); // 获得周围同阵营的已开放队伍队长列表
  158. int GetAroundPlayer(KUiPlayerItem *pList, int nCount); // 获得周围玩家列表(用于列表)
  159. // 设定是否全部显示玩家的名字  bFlag == TRUE 显示,bFlag == FALSE 不显示 zroc add
  160. void SetShowNameFlag(BOOL bFlag);
  161. // 判断是否全部显示玩家的名字  返回值 TRUE 显示,FALSE 不显示
  162. BOOL CheckShowName();
  163. // 设定是否全部显示玩家的聊天  bFlag == TRUE 显示,bFlag == FALSE 不显示 zroc add
  164. void SetShowChatFlag(BOOL bFlag);
  165. // 判断是否全部显示玩家的聊天  返回值 TRUE 显示,FALSE 不显示
  166. BOOL CheckShowChat();
  167. // 设定是否全部显示玩家的血  bFlag == TRUE 显示,bFlag == FALSE 不显示 zroc add
  168. void SetShowLifeFlag(BOOL bFlag);
  169. // 判断是否全部显示玩家的血  返回值 TRUE 显示,FALSE 不显示
  170. BOOL CheckShowLife();
  171. // 设定是否全部显示玩家的内力  bFlag == TRUE 显示,bFlag == FALSE 不显示 zroc add
  172. void SetShowManaFlag(BOOL bFlag);
  173. // 判断是否全部显示玩家的内力  返回值 TRUE 显示,FALSE 不显示
  174. BOOL CheckShowMana();
  175. #endif
  176. #ifdef _SERVER
  177. BOOL SyncNpc(DWORD dwID, int nClientIdx);
  178. #endif
  179. private:
  180. void SetID(int m_nIndex);
  181. int FindFree();
  182.     // Add By Freeway Chen in 2003.7.14
  183. private:
  184.     // [第一个NPC.m_Kind][第二个NPC.m_Kind][第一个NPC.m_CurrentCamp][第二个个NPC.m_CurrentCamp]
  185.     unsigned char m_RelationTable[kind_num][kind_num][camp_num][camp_num];
  186.     // 生成关系表
  187.     int GenRelationTable();
  188.     NPC_RELATION GenOneRelation(NPCKIND Kind1, NPCKIND Kind2, NPCCAMP Camp1, NPCCAMP Camp2);
  189. };
  190. // modify by Freeway Chen in 2003.7.14
  191. // 确定两个NPC之间的战斗关系
  192. extern KNpcSet NpcSet;
  193. #endif