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

模拟服务器

开发平台:

C/C++

  1. // -------------------------------------------------------------------------
  2. // 文件名 : DoScript.cpp
  3. // 创建者 : 万里
  4. // 创建时间 : 2003-9-16 21:07:01
  5. // 功能描述 :
  6. //
  7. // -------------------------------------------------------------------------
  8. #include "stdafx.h"
  9. #include "DoScript.h"
  10. #include "Global.h"
  11. #include "S3Relay.h"
  12. DWORD g_ExecuteIP = 0;
  13. DWORD g_ExecuteRelayID = 0;
  14. void BroadGlobal(const void* pData, size_t size, DWORD nFromIP, DWORD nFromRelayID)
  15. {
  16. if (pData == NULL || size == 0)
  17. return;
  18. RELAY_DATA data;
  19. data.ProtocolFamily = pf_relay;
  20. data.ProtocolID = relay_c2c_data;
  21. data.nToIP = 0;
  22. data.nToRelayID = 0;
  23. data.nFromIP = nFromIP;
  24. data.nFromRelayID = nFromRelayID;
  25. data.routeDateLength = 1 + size;
  26. size_t pckgsize = sizeof(RELAY_DATA) + data.routeDateLength;
  27. void* pRelayData = _alloca(pckgsize);
  28. char* pOData = (char*)pRelayData;
  29. memcpy(pOData, &data, sizeof(RELAY_DATA));
  30. pOData += sizeof(RELAY_DATA);
  31. *pOData = s2s_execute;
  32. pOData++;
  33. memcpy(pOData, pData, size);
  34. pOData += size;
  35. g_HostServer.BroadPackage(pRelayData, pckgsize);
  36. }
  37. void BroadGame(DWORD nToIP, const void* pData, size_t size, DWORD nFromIP, DWORD nFromRelayID)
  38. {
  39. if (pData == NULL || size == 0 || nToIP == 0)
  40. return;
  41. CNetSockDupEx sockdup = dealrelay::FindRelaySockByIP(nToIP);
  42. if (!sockdup.IsValid())
  43. return;
  44. RELAY_DATA data;
  45. data.ProtocolFamily = pf_relay;
  46. data.ProtocolID = relay_c2c_data;
  47. data.nToIP = 0;
  48. data.nToRelayID = 0;
  49. data.nFromIP = nFromIP;
  50. data.nFromRelayID = nFromRelayID;
  51. data.routeDateLength = 1 + size;
  52. size_t pckgsize = sizeof(RELAY_DATA) + data.routeDateLength;
  53. void* pRelayData = _alloca(pckgsize);
  54. char* pOData = (char*)pRelayData;
  55. memcpy(pOData, &data, sizeof(RELAY_DATA));
  56. pOData += sizeof(RELAY_DATA);
  57. *pOData = s2s_execute;
  58. pOData++;
  59. memcpy(pOData, pData, size);
  60. pOData += size;
  61. sockdup.SendPackage(pRelayData, pckgsize);
  62. }
  63. void RootSend(DWORD nToIP, DWORD nToRelayID, const void* pData, size_t size)
  64. {
  65. if (pData == NULL || size == 0)
  66. return;
  67. RELAY_DATA data;
  68. data.ProtocolFamily = pf_relay;
  69. data.ProtocolID = relay_c2c_data;
  70. data.nToIP = nToIP;
  71. data.nToRelayID = nToRelayID;
  72. data.nFromIP = 0;
  73. data.nFromRelayID = 0;
  74. data.routeDateLength = size;
  75. size_t pckgsize = sizeof(RELAY_DATA) + data.routeDateLength;
  76. void* pRelayData = _alloca(pckgsize);
  77. char* pOData = (char*)pRelayData;
  78. memcpy(pOData, &data, sizeof(RELAY_DATA));
  79. pOData += sizeof(RELAY_DATA);
  80. memcpy(pOData, pData, size);
  81. pOData += size;
  82. g_RootClient.SendPackage(pRelayData, pckgsize);
  83. }
  84. KLuaScript gs_Script;
  85. int LuaGlobalExecute(Lua_State * L)
  86. {
  87. if (Lua_GetTopIndex(L) != 1)
  88. return 0;
  89. const char * szMsg = Lua_ValueToString(L, 1);
  90. if (szMsg && szMsg[0])
  91. {
  92. int nszLen = strlen(szMsg);
  93. GM_EXECUTE_COMMAND exe;
  94. exe.ProtocolFamily = pf_gamemaster;
  95. exe.ProtocolType = gm_c2s_execute;
  96. strncpy(exe.AccountName , "GM", 32);
  97. exe.wLength = nszLen;
  98. exe.wExecuteID = 1;
  99. size_t pckgsize = sizeof(GM_EXECUTE_COMMAND) + exe.wLength;
  100. void* pRelayData = _alloca(pckgsize);
  101. char* pOData = (char*)pRelayData;
  102. memcpy(pOData, &exe, sizeof(GM_EXECUTE_COMMAND));
  103. pOData += sizeof(GM_EXECUTE_COMMAND);
  104. memcpy(pOData, szMsg, nszLen);
  105. pOData += nszLen;
  106. BroadGlobal(pRelayData, pckgsize, g_ExecuteIP, g_ExecuteRelayID);
  107. }
  108. return 0;
  109. }
  110. int LuaGameExecute(Lua_State * L)
  111. {
  112. if (Lua_GetTopIndex(L) != 2)
  113. return 0;
  114. const char * szIP = Lua_ValueToString(L, 1);
  115. const char * szMsg = Lua_ValueToString(L, 2);
  116. DWORD nIP = _a2ip(szIP);
  117. if (nIP == 0)
  118. return 0;
  119. if (szMsg)
  120. {
  121. int nszLen = strlen(szMsg);
  122. GM_EXECUTE_COMMAND exe;
  123. exe.ProtocolFamily = pf_gamemaster;
  124. exe.ProtocolType = gm_c2s_execute;
  125. strncpy(exe.AccountName , "GM", 32);
  126. exe.wLength = nszLen;
  127. exe.wExecuteID = 1;
  128. size_t pckgsize = sizeof(GM_EXECUTE_COMMAND) + exe.wLength;
  129. void* pRelayData = _alloca(pckgsize);
  130. char* pOData = (char*)pRelayData;
  131. memcpy(pOData, &exe, sizeof(GM_EXECUTE_COMMAND));
  132. pOData += sizeof(GM_EXECUTE_COMMAND);
  133. memcpy(pOData, szMsg, nszLen);
  134. pOData += nszLen;
  135. BroadGame(nIP, pRelayData, pckgsize, g_ExecuteIP, g_ExecuteRelayID);
  136. }
  137. return 0;
  138. }
  139. int LuaMsg2IP(Lua_State * L)
  140. {
  141. int nParamCount = Lua_GetTopIndex(L);
  142. if ( nParamCount < 3 ) 
  143. return 0;
  144. int nIP = 0;
  145. const char * szIP = Lua_ValueToString(L, 1) ;
  146. nIP = _a2ip(szIP);
  147. if (nIP == 0)
  148. return 0;
  149. int nID = (int) Lua_ValueToNumber(L, 2);
  150. const char * szMsg = Lua_ValueToString(L, 3) ;
  151. if (!szMsg) 
  152. return 0;
  153. int nParamID = 0;
  154. if (nParamCount < 4)
  155. {
  156. nParamID = 0;
  157. }
  158. else
  159. {
  160. nParamID = (int) Lua_ValueToNumber(L, 4);
  161. }
  162. if (szMsg && szMsg[0])
  163. {
  164. int nszLen = strlen(szMsg);
  165. char szID[32];
  166. itoa(nParamID, szID, 10);
  167. CHAT_MSG_EX ChatMsgEx;
  168. ChatMsgEx.ProtocolFamily = pf_playercommunity;
  169. ChatMsgEx.ProtocolID = playercomm_channelchat;
  170. strcpy(ChatMsgEx.m_szSourceName, szID);
  171. strcpy(ChatMsgEx.m_szAccountName, "GM");
  172. ChatMsgEx.SentenceLength = nszLen;
  173. size_t pckgsize = sizeof(ChatMsgEx) + ChatMsgEx.SentenceLength;
  174. void* pRelayData = _alloca(pckgsize);
  175. char* pOData = (char*)pRelayData;
  176. memcpy(pOData, &ChatMsgEx, sizeof(CHAT_MSG_EX));
  177. pOData += sizeof(CHAT_MSG_EX);
  178. memcpy(pOData, szMsg, nszLen);
  179. pOData += nszLen;
  180. RootSend(nIP, nID, pRelayData, pckgsize);
  181. }
  182. return 0;
  183. }
  184. int LuaGetIP(Lua_State * L)
  185. {
  186. int nParamCount = Lua_GetTopIndex(L);
  187. if ( nParamCount < 1 ) 
  188. return 0;
  189. int nParamID = (int) Lua_ValueToNumber(L, 1);
  190. char szDesMsg[200];
  191. szDesMsg[0] = 0;
  192. if (nParamID == 0)
  193. {
  194. strcpy(szDesMsg, _ip2a(gGetHostIP(local_adapt)));
  195. }
  196. else if (nParamID == 1)
  197. {
  198. strcpy(szDesMsg, _ip2a(gGetHostIP(global_adapt)));
  199. }
  200. else
  201. {
  202. strcpy(szDesMsg, "0.0.0.0");
  203. }
  204. Lua_PushString(L, szDesMsg);
  205. return 1;
  206. }
  207. TLua_Funcs GameScriptFuns[] = 
  208. {
  209. {"GlobalExecute", LuaGlobalExecute}, //GlobalExecute通知整个服务组执行一个脚本
  210. {"GameExecute", LuaGameExecute}, //GameExecute通知一个游戏世界执行一个脚本
  211. {"Msg2IP", LuaMsg2IP}, //Msg2IP返回结果值到发出通知的地方
  212. {"GetIP", LuaGetIP}, //GetIP(index)
  213. };
  214. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  215. int g_GetGameScriptFunNum()
  216. {
  217. return sizeof(GameScriptFuns)  / sizeof(TLua_Funcs);
  218. }
  219. BOOL InitScript()
  220. {
  221. if (gs_Script.Init() && gs_Script.RegisterFunctions(GameScriptFuns, g_GetGameScriptFunNum()))
  222. {
  223. return TRUE;
  224. }
  225. return FALSE;
  226. }
  227. BOOL ExcuteScript(DWORD nIP, DWORD nRelayID, const char * ScriptCommand)
  228. {
  229. if (ScriptCommand && ScriptCommand[0] != 0)
  230. {
  231. if (gs_Script.LoadBuffer((PBYTE)ScriptCommand, strlen(ScriptCommand)))
  232. {
  233. g_ExecuteIP = nIP;
  234. g_ExecuteRelayID = nRelayID;
  235. return gs_Script.ExecuteCode();
  236. }
  237. }
  238. return FALSE;
  239. }
  240. BOOL UninitScript()
  241. {
  242. return TRUE;
  243. }