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

模拟服务器

开发平台:

C/C++

  1. #include "KCore.h"
  2. #include "KSortScript.h"
  3. #include "LuaFuns.h"
  4. #include "KFilePath.h"
  5. #include "KDebug.h"
  6. #ifndef WIN32
  7. #include <unistd.h>
  8. #include <sys/types.h>
  9. #include <dirent.h>
  10. #else 
  11. #include <io.h>
  12. #include <direct.h>
  13. #endif
  14. //#include "Shlwapi.h"
  15. KLuaScript g_ScriptSet[MAX_SCRIPT_IN_SET];
  16. KScriptBinTree g_ScriptBinTree;
  17. unsigned int   nCurrentScriptNum;
  18. char g_szCurScriptDir[MAX_PATH];
  19. void LoadScriptInDirectory(LPSTR lpszRootDir, LPSTR lpszSubDir);
  20. int operator<(KSortScriptNode ScriptLeft, KSortScriptNode ScriptRight)
  21. {
  22. return ScriptLeft.GetScriptID() < ScriptRight.GetScriptID();
  23. };
  24. int operator==(KSortScriptNode ScriptLeft, KSortScriptNode ScriptRight)
  25. {
  26. return ScriptLeft.GetScriptID() == ScriptRight.GetScriptID();
  27. };
  28. //将szFilePath目录下的所有脚本文件加载进ScriptBinTree二叉树中
  29. static unsigned long LoadAllScript(char * szFilePath)
  30. {
  31. g_SetFilePath("\");
  32. char szRootPath[100];
  33. char szOldRootPath[MAX_PATH];
  34. // GetCurrentDirectory(MAX_PATH, szOldRootPath);
  35. getcwd(szOldRootPath, MAXPATH);
  36. g_GetFullPath(szRootPath,szFilePath);
  37. LoadScriptInDirectory(szRootPath, "");
  38. chdir(szOldRootPath);
  39. // SetCurrentDirectory(szOldRootPath);
  40. return nCurrentScriptNum;
  41. }
  42. unsigned long g_IniScriptEngine()
  43. {
  44. g_szCurScriptDir[0] = 0;
  45. nCurrentScriptNum = 0;
  46. g_ScriptBinTree.ClearList();
  47. return LoadAllScript("\script");
  48. }
  49. const KScript * g_GetScript(DWORD dwScriptId)
  50. {
  51. KSortScriptNode ScriptNode;
  52. ScriptNode.SetScriptID(dwScriptId);
  53. if (g_ScriptBinTree.Find(ScriptNode))
  54. {
  55. return ScriptNode.GetScript();
  56. }
  57. return NULL;
  58. }
  59. const KScript * g_GetScript(const char * szRelativeScriptFile)
  60. {
  61. DWORD dwScriptId = g_FileName2Id((LPSTR)szRelativeScriptFile);
  62. return g_GetScript(dwScriptId);
  63. }
  64. extern int LuaIncludeFile(Lua_State * L);
  65. //加载脚本,该文件名参数为相对目录
  66. static BOOL LoadScriptToSortListA(char * szRelativeFile)
  67. {
  68. if (!szRelativeFile || !szRelativeFile[0]) return FALSE;
  69. KSortScriptNode ScriptNode ;
  70. ScriptNode.SetScriptID(g_FileName2Id(szRelativeFile));
  71. int t  =strlen(szRelativeFile);
  72. if (t >= 90)
  73. t ++;
  74. #ifdef _DEBUG
  75. //strcpy(ScriptNode.m_szScriptName, szRelativeFile);
  76. #endif
  77. if (nCurrentScriptNum < MAX_SCRIPT_IN_SET)
  78. {
  79. g_ScriptSet[nCurrentScriptNum].Init();
  80. g_ScriptSet[nCurrentScriptNum].RegisterFunctions(GameScriptFuns, g_GetGameScriptFunNum());
  81. g_StrCpyLen(g_ScriptSet[nCurrentScriptNum].m_szScriptName, szRelativeFile, 100);
  82. if (g_ScriptSet[nCurrentScriptNum].Load(szRelativeFile))
  83. {
  84. }
  85. else
  86. {
  87. g_DebugLog("[脚本]加载脚本%s,出错,该脚本无法加载!!请检查!!", szRelativeFile);
  88. return FALSE;
  89. }
  90. }
  91. else
  92. {
  93. g_DebugLog("[脚本]严重错误!脚本数量超限制%d!请立即解决!!", MAX_SCRIPT_IN_SET);
  94. return FALSE;
  95. }
  96. ScriptNode.SetScriptIndex(nCurrentScriptNum++);
  97. g_ScriptBinTree.Insert(ScriptNode);
  98. return TRUE;
  99. }
  100. //加载脚本,该文件名参数为实际目录
  101. static BOOL LoadScriptToSortList(char * szFileName)
  102. {
  103. if (!szFileName || !szFileName[0]) return FALSE;
  104. if (nCurrentScriptNum>= MAX_SCRIPT_IN_SET)
  105. {
  106. g_DebugLog("[Script]脚本总容量超过%d,严重错误请检查!",MAX_SCRIPT_IN_SET);
  107. return FALSE;
  108. }
  109. int nFileNameLen = strlen(szFileName);
  110. char szRootPath[MAX_PATH];
  111. g_GetRootPath(szRootPath);
  112. // char szRelativePath[MAX_PATH];
  113. char *szRelativePath;
  114. char szCurrentDirectory[MAX_PATH];
  115. // GetCurrentDirectory(MAX_PATH, szCurrentDirectory);
  116. getcwd(szCurrentDirectory, MAX_PATH);
  117. szRelativePath = szCurrentDirectory + strlen(szRootPath);
  118. // PathRelativePathTo(szRelativePath,szRootPath, FILE_ATTRIBUTE_DIRECTORY,szCurrentDirectory , FILE_ATTRIBUTE_NORMAL );
  119. char szRelativeFile[MAX_PATH];
  120. if (szRelativePath[0] == '.' && szRelativePath[1] == '\')
  121. sprintf(szRelativeFile, "%s\%s", szRelativePath + 1, szFileName);
  122. else
  123. sprintf(szRelativeFile, "%s\%s", szRelativePath, szFileName);
  124. g_StrLower(szRelativeFile);
  125. g_DebugLog("[Script]Loading Script %s %d", szRelativeFile, g_FileName2Id(szRelativeFile));
  126. //
  127. return LoadScriptToSortListA(szRelativeFile);
  128. // return FALSE;
  129. }
  130. void LoadScriptInDirectory(LPSTR lpszRootDir, LPSTR lpszSubDir)
  131. {
  132. int nFlag;
  133. char szRealDir[MAX_PATH];
  134. #ifdef WIN32
  135. sprintf(szRealDir, "%s\%s", lpszRootDir, lpszSubDir);
  136. #else
  137. sprintf(szRealDir, "%s/%s", lpszRootDir, lpszSubDir);
  138.         char *ptr = szRealDir;
  139.         while(*ptr) { if(*ptr == '\') *ptr = '/';  ptr++;  }
  140. #endif
  141. #ifdef WIN32
  142. if(chdir(szRealDir)) return;
  143. _finddata_t FindData;
  144. long dir = _findfirst("*.*", &FindData);
  145. while(dir != -1) {
  146. if(strcmp(FindData.name, ".") == 0 || strcmp(FindData.name, "..") == 0) {
  147. if(_findnext(dir, &FindData)) break;
  148. continue;
  149. }
  150. if(FindData.attrib == _A_SUBDIR)
  151. {
  152. LoadScriptInDirectory(szRealDir, FindData.name);
  153. }
  154. else
  155. {
  156. nFlag = 0;
  157. for (int i = 0; i < (int)strlen(FindData.name);  i++)
  158. {
  159. if (FindData.name[i] == '.')
  160. break;
  161. if (FindData.name[i] == '\')
  162. {
  163. nFlag = 1;
  164. break;
  165. }
  166. }
  167. if (nFlag == 1)
  168. {
  169. LoadScriptInDirectory(szRealDir, FindData.name);
  170. }
  171. else
  172. {
  173. char szExt[50];
  174. if (strlen(FindData.name) >= 4) 
  175. {
  176. strcpy(szExt, FindData.name + strlen(FindData.name) - 4);
  177. _strupr(szExt);
  178. if ( (!strcmp(szExt, ".LUA")) || (!strcmp(szExt, ".TXT")))
  179. if (!LoadScriptToSortList(FindData.name))
  180. g_DebugLog("加载%s文件出错", FindData.name);
  181. }
  182. }
  183. }
  184. if(_findnext(dir, &FindData)) break;
  185. _findclose(dir);
  186. chdir(lpszRootDir);
  187. #else
  188.      DIR *dp;
  189.      int i;
  190.      struct dirent *ep;
  191.      if(chdir(szRealDir)) return;
  192.      dp = opendir(".");
  193.      if(dp) {
  194.           while(ep = readdir(dp)) {
  195.             if(strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0) continue;
  196.             
  197.             if(ep->d_type ==4) {
  198.                 LoadScriptInDirectory(szRealDir, ep->d_name);
  199.             }
  200.             else {
  201. nFlag = 0;
  202. for (i = 0; i < (int)strlen(ep->d_name);  i++)
  203. {
  204. if (ep->d_name[i] == '.')
  205. break;
  206. if (ep->d_name[i] == '\')
  207. {
  208. nFlag = 1;
  209. break;
  210. }
  211. }
  212. if (nFlag == 1)
  213. {
  214. LoadScriptInDirectory(szRealDir,ep->d_name);
  215. }
  216. else
  217. {
  218. char szExt[50];
  219. if (strlen(ep->d_name) >= 4)
  220. {
  221. strcpy(szExt, ep->d_name + strlen(ep->d_name) - 4);
  222.                                         g_StrUpper(szExt);
  223. /// _strupr(szExt);
  224. if ( (!strcmp(szExt, ".LUA")) || (!strcmp(szExt, ".TXT")))
  225. if (!LoadScriptToSortList(ep->d_name))
  226. g_DebugLog("加载%s文件出错", ep->d_name);
  227. }
  228. }
  229. }
  230.           }
  231.           closedir(dp);
  232.      }
  233. chdir(lpszRootDir);
  234. #endif
  235. }
  236. void UnLoadScript(DWORD dwScriptID)
  237. {
  238. KSortScriptNode ScriptNode;
  239. ScriptNode.SetScriptID(dwScriptID);
  240. g_ScriptBinTree.Delete(ScriptNode);
  241. }
  242. BOOL ReLoadScript(const char * szRelativePathScript)
  243. {
  244. if (!szRelativePathScript || !szRelativePathScript[0])
  245. return FALSE;
  246. char script[MAX_PATH];
  247. strcpy(script, szRelativePathScript);
  248. // _strlwr(script);
  249.         g_StrLower(script);
  250. UnLoadScript(g_FileName2Id(script));
  251. return LoadScriptToSortListA(script);
  252. }
  253. unsigned long  ReLoadAllScript()
  254. {
  255. g_ScriptBinTree.ClearList();
  256. return g_IniScriptEngine();
  257. }