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

模拟服务器

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////
  2. // KMissle.h: interface for the KMissle class.
  3. //////////////////////////////////////////////////////////////////////
  4. #ifndef KMissleH
  5. #define KMissleH
  6. #ifdef  _SERVER
  7. #define MAX_MISSLE  20000
  8. #else
  9. #define MAX_MISSLE 500
  10. #endif
  11. #include "KCore.h"
  12. #include "SkillDef.h"
  13. #include "KObj.h"
  14. #ifndef _SERVER
  15. #include "KMissleRes.h"
  16. #endif
  17. #include "KNode.h"
  18. #include "KITabFile.h"
  19. #include "KSkills.h"
  20. #include "KNpcSet.h"
  21. #include "Scene/ObstacleDef.h"
  22. #include "KSubWorld.h"
  23. #include "KIndexNode.h"
  24. #include "GameDataDef.h"
  25. #ifdef _SERVER
  26. #include "KMissleMagicAttribsData.h"
  27. #endif
  28. enum 
  29. {
  30. Interupt_None,
  31. Interupt_EndNewMissleWhenMove,
  32. Interupt_EndOldMissleLifeWhenMove,
  33. };
  34. #ifndef _SERVER
  35. struct TMissleForShow
  36. {
  37. int nPX ;
  38. int nPY ;
  39. int nPZ ;
  40. int nNpcIndex;
  41. int nLauncherIndex;
  42. };
  43. #endif
  44. #ifndef TOOLVERSION
  45. class KMissle
  46. #else
  47. class CORE_API KMissle  
  48. #endif
  49. {
  50. friend class KSkill;
  51. private:
  52. public:
  53. // 子弹设定文件获得的数据
  54. KIndexNode m_Node;
  55. char m_szMissleName[30]; // 子弹的名称
  56. int m_nAction; // 当前行为
  57. BOOL m_bIsSlow; // 是否被减速
  58. BOOL m_bClientSend; // 是否需要
  59. BOOL m_bRemoving; // 获知需要下一个循环删除该子弹所有资源
  60. BOOL m_bIsMelee; // 子弹是否是近身攻击
  61. eMissleMoveKind m_eMoveKind; // 子弹运动类型(爆炸、直线飞行等……)
  62. eMissleFollowKind m_eFollowKind; // 子碟发出时的参照类型
  63. int m_nHeight; // 子弹高度
  64. int m_nHeightSpeed; // 子弹纵行的飞行速度
  65. int m_nLifeTime; // 生命周期
  66. int m_nSpeed; // 飞行速度
  67. int m_nSkillId; // 对应哪个技能
  68. BOOL m_bRangeDamage; // 是否为区域伤害,即是否多人受到伤害
  69. int m_eRelation; // 目标与发射者的关系
  70. BOOL m_bAutoExplode; //  Is Missle Would AutoExpode ItSelf For Collision When It's LiftTime Is Over;
  71. BOOL m_bTargetSelf;
  72. BOOL m_bBaseSkill; // 是否为最基本技能
  73. BOOL m_bByMissle; // 当由父技能产生时,是否是根据玩家为基点还是以当前的子弹为基点
  74. INT m_nInteruptTypeWhenMove; //子弹的激活是否受发送者的移动而中止
  75. BOOL m_bHeelAtParent; // 当子弹实际激活时,位置根据父当前位置而确定,而不是由产生那刻parent位置决定
  76. int m_nLauncherSrcPX;
  77. int m_nLauncherSrcPY;
  78. int m_nCollideRange; // 碰撞范围(简化多边形碰撞用)
  79. int m_nDamageRange; // 伤害范围
  80. BOOL m_bCollideVanish; // 碰撞后是否消亡
  81. BOOL m_bCollideFriend; // 是否会碰撞到同伴
  82. BOOL m_bCanSlow; // 是否会被减速(比如说Slow Missle类的技能)
  83. int m_nKnockBack; // 震退距离
  84. int m_nStunTime; // 晕眩时间
  85. BOOL m_bFlyEvent; // 整个飞行过程中的
  86. int m_nFlyEventTime;
  87. BOOL m_bSubEvent; // 是否需要在飞行过程消息发生是,调用相关回调函数
  88. BOOL m_bStartEvent; // 是否需要在技能第一次Active时,调用相关回调函数
  89. BOOL m_bCollideEvent; // 是否需要在子技能魔法碰撞时,调用相关回调函数
  90. BOOL m_bVanishedEvent; // 是否需要在子技能消亡时,调用相关的回调函数
  91. unsigned long m_ulDamageInterval; // 伤害计算的间隔时间,主要指对类型火墙技能
  92. BOOL m_bMustBeHit; //  必中,即子弹无特殊情况一定能打中对方,无论是否实际碰撞到对方.
  93. // 技能获得的数据
  94. int m_nCurrentLife; // 当前生命时间
  95. int m_nStartLifeTime; // 当技能发生后,第几帧开始
  96. int m_nCollideOrVanishTime; 
  97. int m_nCurrentMapX; // 当前的X坐标
  98. int m_nCurrentMapY; // 当前的Y坐标
  99. int m_nCurrentMapZ; // 当前的Z坐标
  100. int m_nXOffset; // 当前的X方向偏移
  101. int m_nYOffset; // 当前的Y方向偏移
  102. int m_nRefPX;
  103. int m_nRefPY;
  104. int m_nDesMapX; //单颗子单时,目的坐标
  105. int m_nDesMapY;
  106. int m_nDesRegion;
  107. BOOL m_bNeedReclaim; //是否已纠正过一次子单的方向问题
  108. TMisslePos m_NeedReclaimPos[4];
  109. BOOL m_bDoHurt; //受伤时是否需要作受伤动作
  110. //单一飞行子单时,精确命中!
  111. int m_nXFactor;
  112. int m_nYFactor;
  113. int m_nLevel; // 技能等级
  114. int m_nFollowNpcIdx; // 跟随谁
  115. DWORD m_dwFollowNpcID; //
  116. int m_nLauncher; // 发射者在NpcSet中的Index
  117. DWORD m_dwLauncherId; // 发射者的唯一ID
  118. int m_nParentMissleIndex;   // if 0 then means parent is npclauncher
  119. // 自生成的动态数据
  120. int m_nCurrentSpeed; // 当前速度(可能被减速)
  121. int m_nZAcceleration; // Z轴的加速度
  122. eMissleStatus m_eMissleStatus; // 子弹当前的状态
  123. int m_nMissleId; // 子弹在Missle中的ID
  124. int m_nSubWorldId; // 子世界ID
  125. int m_nRegionId; // 区域ID
  126. //各项伤害数据
  127. int m_nMaxDamage; // 最大伤害
  128. int m_nElementType; // 元素伤害类型
  129. int m_nMaxElementDamage; // 最大元素伤害(首次)
  130. int m_nElementTime; // 元素持续时间
  131. int m_nElementInterval; // 元素间隔时间
  132. int m_nElementPerDamage; // 元素伤害时,每次发作所受的伤害值
  133. int m_nParam1; // 参数一
  134. int m_nParam2; // 参数二
  135. int m_nParam3; // 参数三
  136. int m_nFirstReclaimTime;
  137. int m_nEndReclaimTime;
  138. int m_nTempParam1; // 运行期使用的参数
  139. int m_nTempParam2;
  140. int m_nDirIndex; // 当前运动方向的索引
  141. int m_nDir; // 当前的运行方向
  142. int m_nAngle; //
  143. DWORD m_dwBornTime; // 该子弹产生时的时间
  144. BOOL m_bUseAttackRating;
  145. #ifdef _SERVER
  146. unsigned long m_ulNextCalDamageTime; // 下一次计算伤害的游戏世界时间
  147. #endif
  148. #ifndef _SERVER
  149. BOOL m_bMultiShow; // 子弹有两个显示
  150. BOOL m_bFollowNpcWhenCollid; // 爆炸效果跟随被击中的人物
  151. int m_btRedLum;
  152. int m_btGreenLum;
  153. int m_btBlueLum;
  154. unsigned short m_usLightRadius;
  155. KMissleRes m_MissleRes; // 子弹的资源
  156. unsigned int m_SceneID;
  157. #endif
  158. private:
  159. BOOL Init( int nLauncher, int nMissleId, int nXFactor, int nYFactor, int nLevel);
  160. void OnVanish();//即将消失
  161. void OnCollision();//碰撞
  162. void OnFly();//飞行过程中
  163. void OnWait();
  164. void DoWait();
  165. void DoFly();
  166. BOOL PrePareFly();
  167. void DoVanish();
  168. void DoCollision();
  169. int CheckNearestCollision();
  170. friend class KMissleSet;
  171. void Release();
  172. int CheckCollision();//检测是否碰撞// 1表示正常碰撞到物体,0表示未碰撞到任何物体, -1表示落地
  173. BOOL CheckBeyondRegion(int nDOffsetX, int nDOffsetY);//检测是否越界   //FALSE表示越到一个无效的位置,TRUE表示OK
  174. int GetDir(int dx,int dy);
  175. KMissle& operator=(KMissle& Missle);
  176. DWORD GetCurrentSubWorldTime();
  177. BOOL ProcessDamage(int nNpcId);
  178. int ProcessCollision();//处理碰撞
  179. int ProcessCollision(int nLauncherIdx, int nRegionId, int nMapX, int nMapY, int nRange , int eRelation);
  180. inline void ZAxisMove()
  181. {
  182. if (m_nZAcceleration)
  183. {
  184. m_nHeight += m_nHeightSpeed;
  185. if (m_nHeight < 0) m_nHeight = 0;
  186. m_nHeightSpeed -= m_nZAcceleration;
  187. m_nCurrentMapZ = m_nHeight >> 10;
  188. }
  189. }
  190. //TRUE表示遇到障碍,FALSE表示未遇到,一切正常
  191. inline BOOL TestBarrier()
  192. {
  193. int nBarrierKind = SubWorld[m_nSubWorldId].TestBarrier(m_nRegionId, m_nCurrentMapX, m_nCurrentMapY, m_nXOffset, m_nYOffset, 0, 0);
  194. if (nBarrierKind == Obstacle_Normal || nBarrierKind == Obstacle_Jump)
  195. {
  196. return TRUE;
  197. }
  198. return FALSE;
  199. }
  200. public:
  201. KMissle();
  202. virtual ~KMissle();
  203. BOOL GetInfoFromTabFile(int nMissleId);
  204. BOOL GetInfoFromTabFile(KITabFile * pTabFile, int nMissleId);
  205. void GetMpsPos(int *pPosX, int *pPosY);
  206. int Activate();
  207. static BOOL GetOffsetAxis(int nSubWorld, int nSrcRegionId, int nSrcMapX, int nSrcMapY,
  208. int nOffsetMapX, int nOffsetMapY, 
  209. int &nDesRegionId, int &nDesMapX, int &nDesMapY);
  210. #ifdef _SERVER
  211. KMissleMagicAttribsData * m_pMagicAttribsData;
  212. int SetMagicAttribsData(KMissleMagicAttribsData * pData)
  213. {
  214. m_pMagicAttribsData = pData;
  215. if (pData)
  216. return pData->AddRef();
  217. else 
  218. return 0;
  219. };
  220. #endif
  221. #ifndef _SERVER
  222. void Paint();
  223. void GetLightInfo(KLightInfo * pLightInfo);
  224. BOOL CreateSpecialEffect(eMissleStatus eStatus,  int nPX, int nPY, int nPZ, int nNpcIndex = 0);
  225. static BOOL CreateMissleForShow(char * szMovie, char * szSprInfo, char * szSound, TMissleForShow * pShowParam);
  226. #endif //_SERVER
  227. };
  228. extern CORE_API KMissle Missle[MAX_MISSLE];
  229. extern CORE_API KMissle g_MisslesLib[MAX_MISSLESTYLE];//Base 1
  230. #endif