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

模拟服务器

开发平台:

C/C++

  1. #include "KCore.h"
  2. #include "KMissle.h"
  3. #include "KMissleSet.h"
  4. #include "KSubWorld.h"
  5. CORE_API KMissleSet MissleSet;
  6. void KMissleSet::Init()
  7. {
  8. m_FreeIdx.Init(MAX_MISSLE);
  9. m_UseIdx.Init(MAX_MISSLE);
  10. // 开始时所有的数组元素都为空
  11. for (int i = MAX_MISSLE - 1; i > 0; i--)
  12. {
  13. m_FreeIdx.Insert(i);
  14. Missle[i].m_Node.m_nIndex = i;
  15. }
  16. }
  17. int KMissleSet::FindFree()
  18. {
  19. return m_FreeIdx.GetNext(0);
  20. }
  21. int KMissleSet::Add(int nSubWorldId, int nRegionID,int nMapX, int nMapY, int nOffsetX , int nOffsetY)
  22. {
  23. if (nRegionID < 0 ) return -1;
  24. int nFreeIndex = FindFree();
  25. if (nFreeIndex <=0 ) return -1;
  26. Missle[nFreeIndex].m_nMissleId = nFreeIndex;
  27. Missle[nFreeIndex].m_nRegionId = nRegionID;
  28. Missle[nFreeIndex].m_nCurrentMapX = nMapX;
  29. Missle[nFreeIndex].m_nCurrentMapY = nMapY;
  30. Missle[nFreeIndex].m_nXOffset = nOffsetX;
  31. Missle[nFreeIndex].m_nYOffset = nOffsetY;
  32. Missle[nFreeIndex].m_nSubWorldId = nSubWorldId;
  33. m_FreeIdx.Remove(nFreeIndex);
  34. m_UseIdx.Insert(nFreeIndex);
  35. return nFreeIndex;
  36. }
  37. /*!*****************************************************************************
  38. // Function : KMissleSet::Add
  39. // Purpose : 
  40. // Return : int 
  41. // Argumant : int nSubWorldId
  42. // Argumant : int nPX
  43. // Argumant : int nPY
  44. // Comments :
  45. // Author : RomanDou
  46. *****************************************************************************/
  47. int KMissleSet::Add(int nSubWorldId, int nPX, int nPY)
  48. {
  49. if (nSubWorldId < 0) return -1;
  50. int nFreeIndex = FindFree();
  51. if (nFreeIndex <= 0) 
  52. {
  53. printf("MissleSet Have Full!!!, It Maybe A Error!");
  54. return -1;
  55. }
  56. SubWorld[nSubWorldId].Mps2Map(nPX, nPY, &Missle[nFreeIndex].m_nRegionId, &Missle[nFreeIndex].m_nCurrentMapX, &Missle[nFreeIndex].m_nCurrentMapY, &Missle[nFreeIndex].m_nXOffset, &Missle[nFreeIndex].m_nYOffset);
  57. if (Missle[nFreeIndex].m_nRegionId < 0) return -1;
  58. Missle[nFreeIndex].m_nMissleId = nFreeIndex;
  59. Missle[nFreeIndex].m_nCurrentMapZ = Missle[nFreeIndex].m_nHeight;
  60. Missle[nFreeIndex].m_nSubWorldId = nSubWorldId;
  61. Missle[nFreeIndex].m_bRemoving = FALSE;
  62. SubWorld[nSubWorldId].m_Region[Missle[nFreeIndex].m_nRegionId].AddMissle(nFreeIndex);//m_WorldMessage.Send(GWM_MISSLE_ADD, Missle[nFreeIndex].m_nRegionId, nFreeIndex );
  63. SubWorld[nSubWorldId].m_Region[Missle[nFreeIndex].m_nRegionId].AddRef(Missle[nFreeIndex].m_nCurrentMapX, Missle[nFreeIndex].m_nCurrentMapY, obj_missle);
  64. m_FreeIdx.Remove(nFreeIndex);
  65. m_UseIdx.Insert(nFreeIndex);
  66. g_DebugLog("[Missle]Missle%dAdd", nFreeIndex);
  67. return nFreeIndex;
  68. }
  69. int KMissleSet::CreateMissile(int nSkillId, int nMissleId, int nLauncher,  int nTargetId ,int nSubWorldId, int nPX, int nPY, int nDir)
  70. {
  71. int nMissleIndex = -1;
  72. if (nMissleIndex = Add(nSubWorldId, nPX, nPY) <= 0)
  73. return -1;
  74. return nMissleIndex;
  75. }
  76. /*!*****************************************************************************
  77. // Function : KMissleSet::Activate
  78. // Purpose : 
  79. // Return : int 
  80. // Comments :
  81. // Author : RomanDou
  82. *****************************************************************************/
  83. int KMissleSet::Activate()
  84. {
  85. for (int i = 1;i <= MAX_MISSLE;i ++)
  86. {
  87. Missle[i].Activate();
  88. }
  89. return 1;
  90. }
  91. void KMissleSet::Remove(int nIndex)
  92. {
  93. if (nIndex <= 0) return;
  94. if (Missle[nIndex].m_nMissleId < 0) return;
  95. Missle[nIndex].Release();
  96. #ifdef _DEBUG
  97. g_DebugLog("[Missle]Missle%dRemove", nIndex);
  98. g_DebugLog("[Missle]Count%d", GetCount());
  99. #endif
  100. m_FreeIdx.Insert(nIndex);
  101. m_UseIdx.Remove(nIndex);
  102. }
  103. void KMissleSet::Draw()
  104. {
  105. for (int i = 1;i <= MAX_MISSLE ;i ++)
  106. {
  107. #ifndef _SERVER
  108. Missle[i].Paint();
  109. #endif
  110. }
  111. }
  112. int KMissleSet::GetCount()
  113. {
  114. int nCount  = 0;
  115. for (int i = 0;i < MAX_MISSLE ;i ++)
  116. {
  117. if (Missle[i].m_nMissleId > 0)
  118. nCount ++;
  119. }
  120. return nCount;
  121. }
  122. void KMissleSet::ClearMissles()
  123. {
  124. int nUsedIndex = m_UseIdx.GetNext(0);
  125. while (nUsedIndex != 0)
  126. {
  127. Remove(nUsedIndex);
  128. nUsedIndex = m_UseIdx.GetNext(0);
  129. }
  130. }