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

模拟服务器

开发平台:

C/C++

  1. #include "KCore.h"
  2. #include "KPlayer.h"
  3. #include "LuaFuns.h"
  4. #include "KGMCommand.h"
  5. #include "KSortScript.h"
  6. #define GMCMD_GENRE_PREFIX_LEN 3
  7. #define GM_CTRL_CMD_PREFIX '?'
  8. static TGameMaster_Command GM_Command[]=
  9. {
  10. {"DoSct", GMDoScriptAction}, //DoSct Say("abc");
  11. {"ds", GMDoScriptAction}, //DS Say("abc");
  12. {"dw", GMDoWorldScriptAction}, //dw AddNews("abc");
  13. {"RunSctFile", GMRunScriptFile}, //RunSctFile /Scripts/Abc.lua main 10
  14. {"RSF", GMRunScriptFile}, //RSF /Scripts/Abc.lua main 10
  15. {"ReLoadSct", GMReloadScriptFile}, //ReloadSct  /Scripts/Abc.lua
  16. {"RLS", GMReloadScriptFile},
  17. {"ReLoadAllSct", GMReloadAllScriptFile}, //ReloadAllSct
  18. {"RLAS", GMReloadAllScriptFile},
  19. };
  20. #ifdef _DEBUG
  21. CORE_API BOOL TextGMFilter(int nPlayerIdx, const char* pText, int nLen)
  22. #else
  23. BOOL TextGMFilter(int nPlayerIdx, const char* pText, int nLen)
  24. #endif
  25. {
  26. try
  27. {
  28. if (!pText) return FALSE;
  29. bool bHandled = false;
  30. if (nLen >= GMCMD_GENRE_PREFIX_LEN + 1 && pText[0] == GM_CTRL_CMD_PREFIX)
  31. {
  32. if ((*(unsigned int*)pText) == 0x206D673F || (*(unsigned int*)pText) == 0x204D473F) // 0x2067642F = "/gm " "/GM "
  33. {
  34. bHandled = (bool)(0 != TextMsgProcessGMCmd(nPlayerIdx, pText + GMCMD_GENRE_PREFIX_LEN + 1,
  35. nLen - GMCMD_GENRE_PREFIX_LEN - 1));
  36. return TRUE;
  37. }
  38. else
  39. {
  40. return FALSE;
  41. }
  42. }
  43. return FALSE;
  44. }
  45. catch(...)
  46. {
  47. printf("执行GM指令,发生异常!n");
  48. return FALSE;
  49. }
  50. }
  51. BOOL TextMsgProcessGMCmd(int nPlayerIdx, const char * pGMCmd, int nLen)
  52. {
  53. if (nLen <= 0 || !pGMCmd) return FALSE;
  54. char szCmd[20];
  55. char * pStart = strstr(pGMCmd," ");
  56. int nTempLen = nLen;
  57. if (NULL == pStart)
  58. {
  59. memcpy(szCmd, pGMCmd, nTempLen);
  60. szCmd[nLen] = 0;
  61. }
  62. else
  63. { nTempLen = pStart - pGMCmd;
  64. memcpy(szCmd, pGMCmd, nTempLen);
  65. szCmd[nTempLen] = 0;
  66. }
  67. for(int i  = 0; i < sizeof(GM_Command) / sizeof(TGameMaster_Command); i ++)
  68. {
  69. if (strcmp(GM_Command[i].Command, szCmd) == 0)
  70. return ProcessGMCommand(nPlayerIdx, GM_Command[i].eCommandId, pGMCmd + nTempLen + 1, nLen - nTempLen - 1);
  71. }
  72. return FALSE;
  73. }
  74. BOOL  ProcessGMCommand(int nPlayerIdx, EGameMasterCommand eCommand, const char * pParam, int nLen)
  75. {
  76. switch(eCommand)
  77. {
  78. case GMDoWorldScriptAction:
  79. {
  80. if (nLen <=0 || nLen >= 300)
  81. return FALSE;
  82. char szScriptAction[300];
  83. memcpy(szScriptAction, pParam, nLen);
  84. szScriptAction[nLen] = 0;
  85. BOOL bResult = FALSE;
  86. KLuaScript WorldScript;
  87. WorldScript.Init();
  88. WorldScript.RegisterFunctions(WorldScriptFuns, g_GetWorldScriptFunNum());
  89. if (WorldScript.LoadBuffer((PBYTE)szScriptAction, nLen))
  90. {
  91. bResult = WorldScript.ExecuteCode();
  92. }
  93. return bResult;
  94. }break;
  95. case GMDoScriptAction:
  96. {
  97. if (nLen <= 0 || nLen >= 300) 
  98. return FALSE;
  99. //检查nPlayerIdx的权限
  100. if (nPlayerIdx < 0 || Player[nPlayerIdx].m_dwID <= 0)
  101. return FALSE;
  102. char szScriptAction[300];
  103. memcpy(szScriptAction, pParam, nLen);
  104. szScriptAction[nLen] = 0;
  105. Player[nPlayerIdx].DoScript(szScriptAction);
  106. return TRUE;
  107. }break;
  108. case GMRunScriptFile:
  109. {
  110. if (nPlayerIdx < 0 || Player[nPlayerIdx].m_dwID <= 0)
  111. return FALSE;
  112. char szScriptFile[200];
  113. char szScriptFun[100];
  114. char szScriptParam[100];
  115. int nBufLen = GetNextUnit(pParam, ' ', nLen, szScriptFile);
  116. if (szScriptFile[0] == 0) return FALSE;
  117. int nBufLen1 = GetNextUnit(pParam + nBufLen, ' ', nLen - nBufLen, szScriptFun);
  118. if (szScriptFun[0] == 0) return FALSE;
  119. GetNextUnit(pParam + nBufLen + nBufLen1, ' ', nLen - nBufLen - nBufLen1, szScriptParam);
  120. return Player[nPlayerIdx].ExecuteScript(szScriptFile, szScriptFun, szScriptParam);
  121. }break;
  122. case GMReloadScriptFile:
  123. {
  124. if (nPlayerIdx < 0 || Player[nPlayerIdx].m_dwID <= 0) return FALSE;
  125. char szScriptFile[200];
  126. GetNextUnit(pParam, ' ', nLen, szScriptFile);
  127. if (szScriptFile[0] == 0) return FALSE;
  128. ReLoadScript(szScriptFile);
  129. return TRUE;
  130. }break;
  131. case GMReloadAllScriptFile:
  132. {
  133. return ReLoadAllScript();
  134. }break;
  135. }
  136. return FALSE;
  137. }
  138. int GetNextUnit(const char * szString , const char cDiv, int nLen, char * szResult)
  139. {
  140. szResult[0] = 0;
  141. if (nLen <= 0 || szString == NULL)
  142. return FALSE;
  143. char * pChar = (char *)szString;
  144. int i = 0;
  145. int j = 0;
  146. BOOL bFind = FALSE;
  147. while (*(pChar + i) == cDiv && i < nLen) i++;
  148. while(i  < nLen && *(pChar + i) != '')
  149. {
  150. if (*(pChar + i) == cDiv) 
  151. {
  152. szResult[j] = 0;
  153. return i;
  154. }
  155. else
  156. szResult[j++] = *(pChar + i);
  157. i ++;
  158. }
  159. szResult[j] = 0;
  160. return i;
  161. }